From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1K5Puc-0006MP-SV for mharc-grub-devel@gnu.org; Sun, 08 Jun 2008 14:46:42 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K5Pub-0006L8-DE for grub-devel@gnu.org; Sun, 08 Jun 2008 14:46:41 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K5PuZ-0006Jy-5R for grub-devel@gnu.org; Sun, 08 Jun 2008 14:46:40 -0400 Received: from [199.232.76.173] (port=41944 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K5PuZ-0006Jv-1K for grub-devel@gnu.org; Sun, 08 Jun 2008 14:46:39 -0400 Received: from ug-out-1314.google.com ([66.249.92.170]:20326) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K5PuY-00015u-8M for grub-devel@gnu.org; Sun, 08 Jun 2008 14:46:38 -0400 Received: by ug-out-1314.google.com with SMTP id l31so1004124ugc.48 for ; Sun, 08 Jun 2008 11:46:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:in-reply-to :references:content-type:date:message-id:mime-version:x-mailer; bh=hSpu2YZeYpPqslQjyB1Q44CEU5YihSrgAGJ1Lpq/pmg=; b=tXhE7SxGW6FIZnAsopNaWtGGbvFUJ+TghkalBLpzaypB1F76OpyTsRZkUgEiK4ZeP5 LJp1rzg6GFon88LQ6mgVhP1AupWR2nd8FvaGdHiZGA5iEch8AsDNr7M7CGSrtx00bT9I dMxoZhXnrM2O962K/w4TA9zQ0HaaFXSFpGJnM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:in-reply-to:references:content-type:date:message-id :mime-version:x-mailer; b=tqOkXFJyhZzmmLEpDArHVPj1xGOCTfn1awGegiE/1skR9agdxkbuTqKmUKI3zk40jJ Or48TpJBGxlVApAt08iOs2+c12RAEATXcEFPBIdF9FtB8d2FM7H69o3TnE7NFJeQUqYy 5CccL3Klsxa4oFsiG5v5XAVty3jxrNPRMMAB0= Received: by 10.67.106.13 with SMTP id i13mr1137253ugm.75.1212950796590; Sun, 08 Jun 2008 11:46:36 -0700 (PDT) Received: from ?192.168.1.101? ( [213.37.137.93]) by mx.google.com with ESMTPS id y7sm4676840ugc.3.2008.06.08.11.46.33 (version=SSLv3 cipher=RC4-MD5); Sun, 08 Jun 2008 11:46:35 -0700 (PDT) From: Javier =?ISO-8859-1?Q?Mart=EDn?= To: The development of GRUB 2 In-Reply-To: <484AA2ED.3040709@nic.fi> References: <1212701730.3141.25.camel@localhost> <48496649.6060905@nic.fi> <1212843337.13883.20.camel@localhost> <484AA2ED.3040709@nic.fi> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-l2tGI5Smu1HkQGErpo1/" Date: Sun, 08 Jun 2008 20:47:15 +0200 Message-Id: <1212950835.19228.29.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.22.2 X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) Subject: Re: [PATCH] Reimplementing the legacy "map" command X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Jun 2008 18:46:41 -0000 --=-l2tGI5Smu1HkQGErpo1/ Content-Type: multipart/mixed; boundary="=-/XOvuCZPuDOc+LIJH+cj" --=-/XOvuCZPuDOc+LIJH+cj Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ok, new version of the patch here. Followed as many of your suggestions as I could in one day: removed unused code, put verbose, unneeded printfs under a conditional compilation DEBUG symbol, removed the .mk file from the patch and moved everything out of the kernel and into the drivemap module. What I didn't do is replacing the abort_on_error bit, mostly because I don't know that to replace it with. Cheers! (I hope I didn't leave anything out this time) Habbit Huge PS: This patch may be useful, but in its current state it's no panacea. An important feature is still unimplemented, and I have no clue as to how to do so without breaking modularity: replacing the "boot drive number" passed in DL to the booted OS with its mapped version. This is not required for the system to work, but without it it's a bit tough to get it functional. An example, booting FreeDOS in QEMU: Disk 0x80 - 64 MiB, 1 primary partition (FAT16), some random data =EF=BB=BFDisk 0x81 - 2 GiB, 1 primary partition (FAT32), FreeDOS installati= on with MBR, VBR and system files (note: remember that drivemap does not affect GRUB drive numbers) Case #1: booting without drivemap =EF=BB=BF set root=3D(hd1,1) chainloader +1 boot In order to just boot FreeDOS, drivemap isn't even needed, as its loader obeys the 0x81 passed in DL by GRUB and loads KERNEL.SYS from the right hard disk. However, the rest of the OS expects to get its system partition as C:, which does not happen as (hd1,1) becomes D:. We get a "enter command shell" prompt, which is not a completely borked system (just entering d:\command.com solves it, though it doesn't load CONFIG.SYS or AUTOEXEC.BAT) but isn't a pleasant view either. Case #2: booting with drivemap, simplest drivemap (hd1) 0x80 chainloader (hd1,1)+1 boot This works fine and boots FreeDOS: I don't know what the kernel gets in DL when the root var is not set (FF, the code seems to say), but it boots and loads the OS fine. The problem is we've lost access to our first disk, since C: and D: are exactly the same partition (hd1,1) and (hd0) is nowhere. =EF=BB=BFCase #3: booting with drivemap and both disks, first try drivemap (hd1) 0x80 =EF=BB=BF drivemap (hd0) 0x81 chainloader (hd1,1)+1 boot This doesn't work, as the kernel tries to boot from 0x81 and doesn't find KERNEL.SYS. However, as for why does it try this, I don't know, since it seems to be getting FF in DL. =EF=BB=BFCase #4: booting with drivemap and both disks, second try drivemap (hd1) 0x80 =EF=BB=BF drivemap (hd0) 0x81 set root=3D(hd0) chainloader (hd1,1)+1 boot This gets us what we wont: a working system with (hd1,1)=3DC: and (hd0,1)=3DD:. The problem is that chainloader thinks that the true root is (hd0), so it passes 0x80 in DL (good) but no pointer to the root partition table entry as it would if root were (hd1,1). FreeDOS seems not to use this pointer, but an OS using it would be either querying the wrong table (if root=3D(hd0,1)) or no table at all (if root=3D(hd0) as in this example). Obviously, the Good Thing (tm) would be to set root to (hd1,1) and then modify the boot_drive stored by chainloader, setting it to the mapped number. However, as I stated before, I don't know how to do this without breaking modularity. --=-/XOvuCZPuDOc+LIJH+cj Content-Disposition: attachment; filename=drivemap.patch Content-Type: text/x-patch; name=drivemap.patch; charset=utf-8 Content-Transfer-Encoding: base64 SW5kZXg6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6 IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KZGlmZiAtTiBjb21tYW5kcy9pMzg2L3BjL2Ry aXZlbWFwLmMNCi0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMA0KKysrIGNv bW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYwk4IEp1biAyMDA4IDE4OjA5OjE0IC0wMDAwDQpAQCAt MCwwICsxLDM0OCBAQA0KKy8qIGRyaXZlbWFwLmMgLSBjb21tYW5kIHRvIG1hbmFnZSB0aGUgQklP UyBkcml2ZSBtYXBwaW5ncy4gICovDQorLyoNCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQg Qm9vdGxvYWRlcg0KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLg0KKyAqDQorICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBv cg0KKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqDQorICogIEdS VUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisg KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggR1JVQi4g IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCisgKi8NCisNCisj aW5jbHVkZSA8Z3J1Yi9ub3JtYWwuaD4NCisjaW5jbHVkZSA8Z3J1Yi9kbC5oPg0KKyNpbmNsdWRl IDxncnViL21tLmg+DQorI2luY2x1ZGUgPGdydWIvbWlzYy5oPg0KKyNpbmNsdWRlIDxncnViL2Rp c2suaD4NCisjaW5jbHVkZSA8Z3J1Yi9sb2FkZXIuaD4NCisjaW5jbHVkZSA8Z3J1Yi9tYWNoaW5l L2xvYWRlci5oPg0KKyNpbmNsdWRlIDxncnViL21hY2hpbmUvYmlvc2Rpc2suaD4NCisNCisvKiBV bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgb3V0cHV0ICov DQorLyogI2RlZmluZSBEUklWRU1BUF9ERUJVRyAqLw0KKw0KKyNpZmRlZiBEUklWRU1BUF9ERUJV Rw0KKyMgZGVmaW5lIERCR19QUklOVEYoLi4uKSBncnViX3ByaW50ZihfX1ZBX0FSR1NfXykNCisj ZWxzZQ0KKyMgZGVmaW5lIERCR19QUklOVEYoLi4uKQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZ3J1Yl9hcmdfb3B0aW9uIG9wdGlvbnNbXSA9DQorICB7DQorICAgIHsibGlzdCIs ICdsJywgMCwgInNob3cgdGhlIGN1cnJlbnQgbWFwcGluZ3MiLCAwLCAwfSwNCisgICAgeyJyZXNl dCIsICdyJywgMCwgInJlc2V0IGFsbCBtYXBwaW5ncyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMiLCAw LCAwfSwNCisgICAgezAsIDAsIDAsIDAsIDAsIDB9DQorICB9Ow0KKw0KKy8qIEFTU0VNQkxZIFNZ TUJPTFMvVkFSUy9GVU5DUyAtIHN0YXJ0ICovDQorDQorLyogcmVhbG1vZGUgZmFyIHB0ciA9IDIg KiAxNmIgKi8NCitleHRlcm4gZ3J1Yl91aW50MzJfdCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBf aW50MTNfb2xkaGFuZGxlcik7DQorLyogU2l6ZSBvZiB0aGUgc2VjdGlvbiB0byBiZSBjb3BpZWQg Ki8NCitleHRlcm4gZ3J1Yl91aW50MTZfdCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBfaW50MTNf c2l6ZSk7DQorDQorLyogTk9UIGEgdHlwbyAtIGp1c3QgbmVlZCB0aGUgc3ltYm9sJ3MgYWRkcmVz cyB3aXRoICZzeW1ib2wgKi8NCit0eXBlZGVmIHZvaWQgZ3J1Yl9zeW1ib2xfdDsNCitleHRlcm4g Z3J1Yl9zeW1ib2xfdCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcl9iYXNl KTsNCitleHRlcm4gZ3J1Yl9zeW1ib2xfdCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBfaW50MTNf bWFwc3RhcnQpOw0KKw0KK3ZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9kcml2ZW1hcF9pbnQxM19oYW5k bGVyKSh2b2lkKTsNCisNCisvKiBBU1NFTUJMWSBTWU1CT0xTL1ZBUlMvRlVOQ1MgLSBlbmQgKi8N CisNCitzdGF0aWMgZ3J1Yl9wcmVib290X2hvb2tpZCBpbnN0aGFuZGxlcl9ob29rID0gMDsNCisN Cit0eXBlZGVmIHN0cnVjdCBkcml2ZW1hcF9ub2RlDQorew0KKyAgZ3J1Yl91aW50OF90IG5ld2Ry aXZlOw0KKyAgZ3J1Yl91aW50OF90IHJlZGlydG87DQorICBzdHJ1Y3QgZHJpdmVtYXBfbm9kZSAq bmV4dDsNCit9IGRyaXZlbWFwX25vZGVfdDsNCisNCitzdGF0aWMgZHJpdmVtYXBfbm9kZV90ICpk cml2ZW1hcCA9IDA7DQorc3RhdGljIGdydWJfZXJyX3QgZHJpdmVtYXBfaW5zdGFsbF9pbnQxM19o YW5kbGVyKHZvaWQpOw0KKw0KK3N0YXRpYyBncnViX2Vycl90DQorZHJpdmVtYXBfc2V0IChncnVi X3VpbnQ4X3QgbmV3ZHJpdmUsIGdydWJfdWludDhfdCByZWRpcnRvKQ0KKyAgLyogUHV0cyB0aGUg c3BlY2lmaWVkIG1hcHBpbmcgaW50byB0aGUgdGFibGUsIHJlcGxhY2luZyBhbiBleGlzdGluZyBt YXBwaW5nDQorICAgKiBmb3IgbmV3ZHJpdmUgb3IgYWRkaW5nIGEgbmV3IG9uZSBpZiByZXF1aXJl ZC4gKi8NCit7DQorICBkcml2ZW1hcF9ub2RlX3QgKm1hcHBpbmcgPSAwLCAqc2VhcmNoID0gZHJp dmVtYXA7DQorICB3aGlsZSAoc2VhcmNoKQ0KKyAgICB7DQorICAgICAgaWYgKHNlYXJjaC0+bmV3 ZHJpdmUgPT0gbmV3ZHJpdmUpDQorICAgICAgICB7DQorICAgICAgICAgIG1hcHBpbmcgPSBzZWFy Y2g7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIHNlYXJjaCA9IHNlYXJj aC0+bmV4dDsNCisgICAgfQ0KKw0KKyAgaWYgKG1hcHBpbmcpICAvKiBUaGVyZSB3YXMgYSBtYXBw aW5nIGFscmVhZHkgaW4gcGxhY2UsIG1vZGlmeSBpdCAqLw0KKyAgICBtYXBwaW5nLT5yZWRpcnRv ID0gcmVkaXJ0bzsNCisgIGVsc2UgIC8qIENyZWF0ZSBhIG5ldyBtYXBwaW5nIGFuZCBhZGQgaXQg dG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8NCisgICAgew0KKyAgICAgIG1hcHBpbmcgPSBncnVi X21hbGxvYyAoc2l6ZW9mIChkcml2ZW1hcF9ub2RlX3QpKTsNCisgICAgICBpZiAoIW1hcHBpbmcp DQorICAgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwgImNh bm5vdCBhbGxvY2F0ZSBtYXAgZW50cnkiKTsNCisgICAgICBtYXBwaW5nLT5uZXdkcml2ZSA9IG5l d2RyaXZlOw0KKyAgICAgIG1hcHBpbmctPnJlZGlydG8gPSByZWRpcnRvOw0KKyAgICAgIG1hcHBp bmctPm5leHQgPSBkcml2ZW1hcDsNCisgICAgICBkcml2ZW1hcCA9IG1hcHBpbmc7DQorICAgIH0N CisgIHJldHVybiBHUlVCX0VSUl9OT05FOw0KK30NCisNCitzdGF0aWMgdm9pZA0KK2RyaXZlbWFw X3JlbW92ZSAoZ3J1Yl91aW50OF90IG5ld2RyaXZlKQ0KKyAgLyogUmVtb3ZlcyB0aGUgbWFwcGlu ZyBmb3IgbmV3ZHJpdmUgZnJvbSB0aGUgdGFibGUuIElmIHRoZXJlIGlzIG5vIG1hcHBpbmcsDQor ICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIGEgbm8tb3Agb24gdGhlIG1hcC4g Ki8NCit7DQorICBkcml2ZW1hcF9ub2RlX3QgKm1hcHBpbmcgPSAwLCAqc2VhcmNoID0gZHJpdmVt YXAsICpwcmV2aW91cyA9IDA7DQorICB3aGlsZSAoc2VhcmNoKQ0KKyAgICB7DQorICAgICAgaWYg KHNlYXJjaC0+bmV3ZHJpdmUgPT0gbmV3ZHJpdmUpDQorICAgICAgICB7DQorICAgICAgICAgIG1h cHBpbmcgPSBzZWFyY2g7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIHBy ZXZpb3VzID0gc2VhcmNoOw0KKyAgICAgIHNlYXJjaCA9IHNlYXJjaC0+bmV4dDsNCisgICAgfQ0K KyAgaWYgKG1hcHBpbmcpIC8qIEZvdW5kICovDQorICAgIHsNCisgICAgICBpZiAocHJldmlvdXMp DQorICAgICAgICBwcmV2aW91cy0+bmV4dCA9IG1hcHBpbmctPm5leHQ7DQorICAgICAgZWxzZSBk cml2ZW1hcCA9IG1hcHBpbmctPm5leHQ7IC8qIEVudHJ5IHdhcyBoZWFkIG9mIGxpc3QgKi8NCisg ICAgICBncnViX2ZyZWUgKG1hcHBpbmcpOw0KKyAgICB9DQorfQ0KKw0KK3N0YXRpYyBncnViX2Vy cl90IHBhcnNlX2Jpb3NkaXNrIChjb25zdCBjaGFyICpuYW1lLCBncnViX3VpbnQ4X3QgKmRpc2tu dW0pDQorew0KKyAgaWYgKCFuYW1lKSByZXR1cm4gR1JVQl9FUlJfQkFEX0FSR1VNRU5UOw0KKyAg aWYgKG5hbWVbMF0gPT0gJygnKQ0KKyAgICBuYW1lKys7IC8qIFNraXAgdGhlIGZpcnN0ICggaW4g KGhkMCkgLSBkaXNrX29wZW4gd2FudHMganVzdCB0aGUgbmFtZSEgKi8NCisgIGdydWJfZGlza190 IGRpc2sgPSBncnViX2Rpc2tfb3BlbiAobmFtZSk7DQorICBpZiAoIWRpc2spDQorICAgIHJldHVy biBHUlVCX0VSUl9VTktOT1dOX0RFVklDRTsNCisgIGVsc2UNCisgICAgew0KKyAgICAgIGVudW0g Z3J1Yl9kaXNrX2Rldl9pZCBpZCA9IGRpc2stPmRldi0+aWQ7DQorICAgICAgaWYgKGRpc2tudW0p DQorICAgICAgICAqZGlza251bSA9IGRpc2stPmlkOyAgIC8qIE9ubHkgdmFsaWQsIG9mIGNvdXJz ZSBpZiBpdCdzIGEgYmlvc2Rpc2sgKi8NCisgICAgICBncnViX2Rpc2tfY2xvc2UgKGRpc2spOw0K KyAgICAgIHJldHVybiAoR1JVQl9ESVNLX0RFVklDRV9CSU9TRElTS19JRCAhPSBpZCkgPw0KKyAg ICAgICAgICBHUlVCX0VSUl9CQURfREVWSUNFIDogR1JVQl9FUlJfTk9ORTsNCisgICAgfQ0KK30N CisNCitzdGF0aWMgZ3J1Yl9lcnJfdCByZXZwYXJzZV9iaW9zZGlzayhjb25zdCBncnViX3VpbnQ4 X3QgZG51bSwgY29uc3QgY2hhciAqKm91dHB1dCkNCit7DQorICBncnViX2Vycl90IHJldHZhbCA9 IEdSVUJfRVJSX1VOS05PV05fREVWSUNFOw0KKyAgYXV0byBpbnQgZmluZCAoY29uc3QgY2hhciAq bmFtZSk7DQorICBpbnQgZmluZCAoY29uc3QgY2hhciAqbmFtZSkNCisgIHsNCisgICAgZ3J1Yl9k aXNrX3QgZGlzayA9IGdydWJfZGlza19vcGVuIChuYW1lKTsNCisgICAgaWYgKCFkaXNrKQ0KKyAg ICAgIHJldHVybiAwOw0KKyAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaW50IGZvdW5kID0g MDsNCisgICAgICAgIGlmIChkbnVtID09IGRpc2stPmlkICYmIEdSVUJfRElTS19ERVZJQ0VfQklP U0RJU0tfSUQgPT0gZGlzay0+ZGV2LT5pZCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGZv dW5kID0gMTsNCisgICAgICAgICAgICAqb3V0cHV0ID0gbmFtZTsNCisgICAgICAgICAgICByZXR2 YWwgPSBHUlVCX0VSUl9OT05FOw0KKyAgICAgICAgICB9DQorICAgICAgICBncnViX2Rpc2tfY2xv c2UgKGRpc2spOw0KKyAgICAgICAgcmV0dXJuIGZvdW5kOw0KKyAgICAgIH0NCisgIH0NCisNCisg IGdydWJfZGlza19kZXZfaXRlcmF0ZSAoJmZpbmQpOw0KKyAgcmV0dXJuIHJldHZhbDsNCit9DQor DQorc3RhdGljIGdydWJfZXJyX3QNCitncnViX2NtZF9kcml2ZW1hcCAoc3RydWN0IGdydWJfYXJn X2xpc3QgKnN0YXRlLCBpbnQgYXJnYywgY2hhciAqKmFyZ3MpDQorew0KKyAgaWYgKHN0YXRlWzBd LnNldCkgLyogU2hvdzogbGlzdCBtYXBwaW5ncyAqLw0KKyAgICB7DQorICAgICAgaWYgKCFkcml2 ZW1hcCkNCisgICAgICAgIGdydWJfcHJpbnRmICgiTm8gZHJpdmVzIGhhdmUgYmVlbiByZW1hcHBl ZCIpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgZ3J1Yl9wcmludGYgKCJT aG93aW5nIG9ubHkgcmVtYXBwZWQgZHJpdmVzLiBEcml2ZXMgdGhhdCBoYXZlIGhhZCAiDQorICAg ICAgICAgICAgICAgICAgICAgICAidGhlaXIgc2xvdCBhc3NpZ25lZCB0byBhbm90aGVyIG9uZSBh bmQgaGF2ZSBub3QgYmVlbiAiDQorICAgICAgICAgICAgICAgICAgICAgICAidGhlbXNlbHZlcyBy ZW1hcHBlZCB3aWxsIGJlY29tZSBpbmFjY2Vzc2libGUgdGhyb3VnaCAiDQorICAgICAgICAgICAg ICAgICAgICAgICAidGhlIEJJT1Mgcm91dGluZXMgdG8gdGhlIGJvb3RlZCBPUy5cblxuIik7DQor ICAgICAgICAgIGdydWJfcHJpbnRmICgiTWFwcGVkXHRHUlVCXG4iKTsNCisgICAgICAgICAgZHJp dmVtYXBfbm9kZV90ICpjdXJub2RlID0gZHJpdmVtYXA7DQorICAgICAgICAgIHdoaWxlIChjdXJu b2RlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRuYW1lID0g MDsNCisgICAgICAgICAgICAgIGdydWJfZXJyX3QgZXJyID0gcmV2cGFyc2VfYmlvc2Rpc2sgKGN1 cm5vZGUtPnJlZGlydG8sICZkbmFtZSk7DQorICAgICAgICAgICAgICBpZiAoZXJyICE9IEdSVUJf RVJSX05PTkUpDQorICAgICAgICAgICAgICAgIHJldHVybiBncnViX2Vycm9yIChlcnIsICJpbnZh bGlkIG1hcHBpbmc6IG5vbi1leGlzdGVudCBkaXNrIG9yIg0KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAibm90IG1hbmFnZWQgYnkgdGhlIEJJT1MiKTsNCisgICAgICAg ICAgICAgIGdydWJfcHJpbnRmKCIweCUwMnhcdCU0c1xuIiwgY3Vybm9kZS0+bmV3ZHJpdmUsIGRu YW1lKTsNCisgICAgICAgICAgICAgIGN1cm5vZGUgPSBjdXJub2RlLT5uZXh0Ow0KKyAgICAgICAg ICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgZWxzZSBpZiAoc3RhdGVbMV0uc2V0KSAvKiBS ZXNldDoganVzdCBkZWxldGUgYWxsIG1hcHBpbmdzICovDQorICAgIHsNCisgICAgICBpZiAoZHJp dmVtYXApDQorICAgICAgICB7DQorICAgICAgICAgIGRyaXZlbWFwX25vZGVfdCAqY3Vybm9kZSA9 IGRyaXZlbWFwLCAqcHJldm5vZGUgPSAwOw0KKyAgICAgICAgICB3aGlsZSAoY3Vybm9kZSkNCisg ICAgICAgICAgICB7DQorICAgICAgICAgICAgICBwcmV2bm9kZSA9IGN1cm5vZGU7DQorICAgICAg ICAgICAgICBjdXJub2RlID0gY3Vybm9kZS0+bmV4dDsNCisgICAgICAgICAgICAgIGdydWJfZnJl ZSAocHJldm5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgZHJpdmVtYXAgPSAwOw0K KyAgICAgICAgfQ0KKyAgICB9DQorICBlbHNlDQorICAgIHsNCisgICAgICBpZiAoYXJnYyAhPSAy KQ0KKyAgICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwgInR3 byBhcmd1bWVudHMgcmVxdWlyZWQiKTsNCisgICAgICBncnViX3VpbnQ4X3QgbWFwZnJvbSA9IDA7 DQorICAgICAgZ3J1Yl9lcnJfdCBlcnIgPSBwYXJzZV9iaW9zZGlzayAoYXJnc1swXSwgJm1hcGZy b20pOw0KKyAgICAgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkNCisgICAgICAgIHJldHVybiBn cnViX2Vycm9yIChlcnIsICJpbnZhbGlkIGRpc2sgb3Igbm90IG1hbmFnZWQgYnkgdGhlIEJJT1Mi KTsNCisNCisgICAgICBncnViX2Vycm5vID0gR1JVQl9FUlJfTk9ORTsNCisgICAgICB1bnNpZ25l ZCBsb25nIG1hcHRvID0gZ3J1Yl9zdHJ0b3VsIChhcmdzWzFdLCAwLCAwKTsNCisgICAgICBpZiAo Z3J1Yl9lcnJubyAhPSBHUlVCX0VSUl9OT05FKQ0KKyAgICAgICAgcmV0dXJuIGdydWJfZXJyb3Ig KGdydWJfZXJybm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAiQklPUyBkaXNrIG51bWJl ciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1Iik7DQorICAgICAgZWxzZSBpZiAobWFwdG8gPT0g bWFwZnJvbSkgIC8qIFJlc2V0IHRvIGRlZmF1bHQgKi8gICAgICANCisgICAgICAgIHsNCisgICAg ICAgICAgREJHX1BSSU5URiAoIlJlbW92aW5nIHRoZSBtYXBwaW5nIGZvciAlcyAoJTAyeCkiLCBh cmdzWzBdLCBtYXBmcm9tKTsNCisgICAgICAgICAgZHJpdmVtYXBfcmVtb3ZlIChtYXBmcm9tKTsN CisgICAgICAgIH0NCisgICAgICBlbHNlICAvKiBNYXAgKi8NCisgICAgICAgIHsNCisgICAgICAg ICAgREJHX1BSSU5URiAoIk1hcHBpbmcgJXMgKCUwMngpIHRvICUwMnhcbiIsIGFyZ3NbMF0sIG1h cGZyb20sIG1hcHRvKTsNCisgICAgICAgICAgcmV0dXJuIGRyaXZlbWFwX3NldCAoKGdydWJfdWlu dDhfdCltYXB0bywgbWFwZnJvbSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgIHJldHVybiBH UlVCX0VSUl9OT05FOw0KK30NCisNCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFj a2VkKSkgaW50MTNtYXBfbm9kZQ0KK3sNCisgIGdydWJfdWludDhfdCBkaXNrbnVtOw0KKyAgZ3J1 Yl91aW50OF90IG1hcHRvOw0KK30gaW50MTNtYXBfbm9kZV90Ow0KKw0KKy8qIFRoZSBtaW4gYW1v dW50IG9mIG1lbSB0aGF0IG11c3QgcmVtYWluIGZyZWUgYWZ0ZXIgaW5zdGFsbGluZyB0aGUgaGFu ZGxlci4NCisgKiAzMiBLaUIgaXMganVzdCBhYm92ZSAweDdDMDAtMHg3RTAwLCB3aGVyZSB0aGUg Ym9vdHNlY3RvciBpcyBsb2FkZWQuICAqLw0KKyNkZWZpbmUgTUlOX0ZSRUVfTUVNX0tCIDMyDQor I2RlZmluZSBJTlQxM0hfT0ZGU0VUKHgpICggKChncnViX3VpbnQ4X3QqKSh4KSkgLSAoKGdydWJf dWludDhfdCopJmdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcl9iYXNlKSApDQorI2RlZmluZSBJ TlQxM0hfUkVCQVNFKHgpICggKHZvaWQqKSAoKChncnViX3VpbnQ4X3QqKWhhbmRsZXJfYmFzZSkg KyAoeCkpICkNCisjZGVmaW5lIElOVDEzSF9UT05FV0FERFIoeCkgSU5UMTNIX1JFQkFTRSggSU5U MTNIX09GRlNFVCggeCApICkNCisvKiBJbnQxM2ggaGFuZGxlciBpbnN0YWxsZXIgLSByZXNlcnZl cyBjb252ZW50aW9uYWwgbWVtb3J5IGZvciB0aGUgaGFuZGxlciwNCisgKiBjb3BpZXMgaXQgb3Zl ciBhbmQgc2V0cyB0aGUgSVZUIGVudHJ5IGZvciBpbnQxM2guDQorICogVGhpcyBjb2RlIHJlc3Rz IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgR1JVQiBkb2VzIG5vdCBhY3RpdmF0ZSBhbnkga2luZCBv Zg0KKyAqIG1lbW9yeSBtYXBwaW5nLCBzaW5jZSBpdCBhY2Nlc3NlcyByZWFsbW9kZSBzdHJ1Y3R1 cmVzIGJ5IHRoZWlyIGFic29sdXRlDQorICogYWRkcmVzc2VzLCBsaWtlIHRoZSBJVlQgYXQgMCBv ciB0aGUgQkRBIGF0IDB4NDAwICovDQorc3RhdGljIGdydWJfZXJyX3QgZHJpdmVtYXBfaW5zdGFs bF9pbnQxM19oYW5kbGVyKHZvaWQpDQorew0KKyAgZ3J1Yl9zaXplX3QgZW50cmllcyA9IDA7DQor ICBkcml2ZW1hcF9ub2RlX3QgKmN1cmVudHJ5ID0gZHJpdmVtYXA7DQorICB3aGlsZSAoY3VyZW50 cnkpICAvKiBDb3VudCBlbnRyaWVzIHRvIHByZXBhcmUgYSBjb250aWd1b3VzIG1hcCBibG9jayAq Lw0KKyAgICB7DQorICAgICAgZW50cmllcysrOw0KKyAgICAgIGN1cmVudHJ5ID0gY3VyZW50cnkt Pm5leHQ7DQorICAgIH0NCisgIGlmICgwID09IGVudHJpZXMpDQorICAgIHsNCisgICAgICBEQkdf UFJJTlRGICgiZHJpdmVtYXA6IE5vIGRyaXZlcyByZW1hcHBlZCwgaW50MTNoIGhhbmRsZXIgbm90 IGluc3RhbGxlZCIpOw0KKyAgICAgIHJldHVybiBHUlVCX0VSUl9OT05FOyAgLyogTm8gbmVlZCB0 byBpbnN0YWxsIHRoZSBpbnQxM2ggaGFuZGxlciAqLw0KKyAgICB9DQorICBlbHNlDQorICAgIHsN CisgICAgICBEQkdfUFJJTlRGICgiZHJpdmVtYXA6IEluc3RhbGxpbmcgaW50MTNoIGhhbmRsZXIu Li5cbiIpOw0KKyAgICAgIGdydWJfdWludDMyX3QgKml2dHNsb3QgPSAoZ3J1Yl91aW50MzJfdCop MHgwMDAwMDA0YzsNCisgICAgICANCisgICAgICAvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBv bGQgaW50MTNoIGhhbmRsZXIgKi8gICAgDQorICAgICAgZ3J1Yl9kcml2ZW1hcF9pbnQxM19vbGRo YW5kbGVyID0gKml2dHNsb3Q7DQorICAgICAgREJHX1BSSU5URiAoIk9sZCBpbnQxMyBoYW5kbGVy IGF0ICUwNHg6JTA0eFxuIiwNCisgICAgICAgICAgICAgICAgICAoZ3J1Yl9kcml2ZW1hcF9pbnQx M19vbGRoYW5kbGVyID4+IDE2KSAmIDB4MGZmZmYsDQorICAgICAgICAgICAgICAgICAgZ3J1Yl9k cml2ZW1hcF9pbnQxM19vbGRoYW5kbGVyICYgMHgwZmZmZik7DQorDQorICAgICAgLyogUmVzZXJ2 ZSBhIHNlY3Rpb24gb2YgY29udmVudGlvbmFsIG1lbW9yeSBhcyAiQklPUyBtZW1vcnkiIGZvciBo YW5kbGVyOg0KKyAgICAgICAqIEJEQSBvZmZzZXQgMHgxMyBjb250YWlucyB0aGUgdG9wIG9mIHN1 Y2ggbWVtb3J5ICovDQorICAgICAgZ3J1Yl91aW50MTZfdCAqYnBhTWVtSW5LYiA9IChncnViX3Vp bnQxNl90KikweDAwMDAwNDEzOw0KKyAgICAgIERCR19QUklOVEYgKCJUb3Agb2YgY29udmVudGlv bmFsIG1lbW9yeTogJXUgS2lCXG4iLCAqYnBhTWVtSW5LYik7DQorICAgICAgZ3J1Yl9zaXplX3Qg dG90YWxTaXplID0gZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXplDQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICsgKGVudHJpZXMgKyAxKSAqIHNpemVvZihpbnQxM21hcF9ub2RlX3QpOw0KKyAg ICAgIGdydWJfdWludDE2X3QgcGF5bG9hZFNpemVLYiA9ICh0b3RhbFNpemUgPj4gMTApICsNCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh0b3RhbFNpemUgJSAxMDI0KSA9 PSAwKSA/IDAgOiAxKTsNCisgICAgICBpZiAoKCpicGFNZW1JbktiIC0gcGF5bG9hZFNpemVLYikg PCBNSU5fRlJFRV9NRU1fS0IpDQorICAgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf T1VUX09GX01FTU9SWSwgInJlZnVzaW5nIHRvIGluc3RhbGwgaW50MTMgaGFuZGxlciwgbm90IGVu b3VnaCBmcmVlIG1lbW9yeSBhZnRlciIpOw0KKyAgICAgIERCR19QUklOVEYgKCJQYXlsb2FkIGlz ICV1IGIgbG9uZywgcmVzZXJ2aW5nICV1IEtiXG4iLCB0b3RhbFNpemUsIHBheWxvYWRTaXplS2Ip Ow0KKyAgICAgICpicGFNZW1JbktiIC09IHBheWxvYWRTaXplS2I7DQorDQorICAgICAgLyogQ29w eSBpbnQxM2ggaGFuZGxlciBjaHVuayB0byByZXNlcnZlZCBhcmVhICovDQorICAgICAgZ3J1Yl91 aW50OF90ICpoYW5kbGVyX2Jhc2UgPSAoZ3J1Yl91aW50OF90KikoKmJwYU1lbUluS2IgPDwgMTAp Ow0KKyAgICAgIERCR19QUklOVEYgKCJDb3B5aW5nIGludDEzIGhhbmRsZXIgdG86ICVwXG4iLCBo YW5kbGVyX2Jhc2UpOw0KKyAgICAgIGdydWJfbWVtY3B5IChoYW5kbGVyX2Jhc2UsICZncnViX2Ry aXZlbWFwX2ludDEzX2hhbmRsZXJfYmFzZSwgZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXplKTsNCisN CisgICAgICAvKiBDb3B5IHRoZSBtYXBwaW5ncyB0byB0aGUgcmVzZXJ2ZWQgYXJlYSAqLw0KKyAg ICAgIGN1cmVudHJ5ID0gZHJpdmVtYXA7DQorICAgICAgZ3J1Yl9zaXplX3QgaTsNCisgICAgICBp bnQxM21hcF9ub2RlX3QgKmhhbmRsZXJfbWFwID0gKGludDEzbWFwX25vZGVfdCopIElOVDEzSF9U T05FV0FERFIoJmdydWJfZHJpdmVtYXBfaW50MTNfbWFwc3RhcnQpOw0KKyAgICAgIERCR19QUklO VEYgKCJUYXJnZXQgbWFwIGF0ICVwLCBjb3B5aW5nIG1hcHBpbmdzLi4uXG4iLCBoYW5kbGVyX21h cCk7DQorICAgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXMgJiYgY3VyZW50cnk7IGkrKywgY3Vy ZW50cnkgPSBjdXJlbnRyeS0+bmV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgaGFuZGxlcl9t YXBbaV0uZGlza251bSA9IGN1cmVudHJ5LT5uZXdkcml2ZTsNCisgICAgICAgICAgaGFuZGxlcl9t YXBbaV0ubWFwdG8gPSBjdXJlbnRyeS0+cmVkaXJ0bzsNCisgICAgICAgICAgREJHX1BSSU5URiAo Ilx0IyVkOiAweCUwMnggPC0gMHglMDJ4XG4iLCBpLCBoYW5kbGVyX21hcFtpXS5kaXNrbnVtLCBo YW5kbGVyX21hcFtpXS5tYXB0byk7DQorICAgICAgICB9DQorICAgICAgLyogU2lnbmFsIGVuZC1v Zi1tYXAgKi8NCisgICAgICBoYW5kbGVyX21hcFtpXS5kaXNrbnVtID0gMDsNCisgICAgICBoYW5k bGVyX21hcFtpXS5tYXB0byA9IDA7DQorICAgICAgREJHX1BSSU5URiAoIlx0IyVkOiAweCUwMngg PC0gMHglMDJ4IChlbmQpXG4iLCBpLCBoYW5kbGVyX21hcFtpXS5kaXNrbnVtLCBoYW5kbGVyX21h cFtpXS5tYXB0byk7DQorDQorICAgICAgLyogSW5zdGFsbCBvdXIgZnVuY3Rpb24gYXMgdGhlIGlu dDEzaCBoYW5kbGVyIGluIHRoZSBJVlQgKi8NCisgICAgICBncnViX3VpbnQzMl90IGl2dGVudHJ5 ID0gKChncnViX3VpbnQzMl90KWhhbmRsZXJfYmFzZSkgPDwgMTI7IC8qIFNlZ21lbnQgYWRkcmVz cyAqLw0KKyAgICAgIGl2dGVudHJ5IHw9IChncnViX3VpbnQxNl90KSBJTlQxM0hfT0ZGU0VUKGdy dWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcik7DQorICAgICAgREJHX1BSSU5URiAoIk5ldyBpbnQx MyBoYW5kbGVyIElWVCBwb2ludGVyOiAlMDR4OiUwNHhcbiIsDQorICAgICAgICAgICAgICAgICAg KGl2dGVudHJ5ID4+IDE2KSAmIDB4MGZmZmYsIGl2dGVudHJ5ICYgMHgwZmZmZik7DQorICAgICAg Kml2dHNsb3QgPSBpdnRlbnRyeTsNCisgICAgICANCisgICAgICByZXR1cm4gR1JVQl9FUlJfTk9O RTsNCisgICAgfQ0KK30NCisjdW5kZWYgSU5UMTNIX1RPTkVXQUREUg0KKyN1bmRlZiBJTlQxM0hf UkVCQVNFDQorI3VuZGVmIElOVDEzSF9PRkZTRVQNCisNCitHUlVCX01PRF9JTklUKGRyaXZlbWFw KQ0KK3sNCisgICh2b2lkKW1vZDsJCQkvKiBUbyBzdG9wIHdhcm5pbmcuICovDQorICBncnViX3Jl Z2lzdGVyX2NvbW1hbmQgKCJkcml2ZW1hcCIsIGdydWJfY21kX2RyaXZlbWFwLCBHUlVCX0NPTU1B TkRfRkxBR19CT1RILA0KKwkJCSAiZHJpdmVtYXAgLXMgfCAtciB8IChoZFgpIG5ld2RyaXZlbnVt IiwgIk1hbmFnZSB0aGUgQklPUyBkcml2ZSBtYXBwaW5ncyIsIG9wdGlvbnMpOw0KKyAgaW5zdGhh bmRsZXJfaG9vayA9IGdydWJfbG9hZGVyX3JlZ2lzdGVyX3ByZWJvb3QgKCZkcml2ZW1hcF9pbnN0 YWxsX2ludDEzX2hhbmRsZXIsIDEpOw0KK30NCisNCitHUlVCX01PRF9GSU5JKGRyaXZlbWFwKQ0K K3sNCisgIGdydWJfbG9hZGVyX3VucmVnaXN0ZXJfcHJlYm9vdCAoaW5zdGhhbmRsZXJfaG9vayk7 DQorICBpbnN0aGFuZGxlcl9ob29rID0gMDsNCisgIGdydWJfdW5yZWdpc3Rlcl9jb21tYW5kICgi ZHJpdmVtYXAiKTsNCit9DQpJbmRleDogY29tbWFuZHMvaTM4Ni9wYy9kcml2ZW1hcF9pbnQxM2gu Uw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXBfaW50MTNo LlMNCmRpZmYgLU4gY29tbWFuZHMvaTM4Ni9wYy9kcml2ZW1hcF9pbnQxM2guUw0KLS0tIC9kZXYv bnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwDQorKysgY29tbWFuZHMvaTM4Ni9wYy9kcml2 ZW1hcF9pbnQxM2guUwk4IEp1biAyMDA4IDE4OjA5OjE0IC0wMDAwDQpAQCAtMCwwICsxLDEyOCBA QA0KKy8qDQorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXINCisgKiAgQ29w eXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNSwyMDA2LDIwMDcsMjAwOCBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqICBHUlVCIGlzIGZyZWUgc29m dHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiAgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkNCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24g MyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4NCisgKg0KKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAq ICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uDQorICovDQorDQorDQorLyoNCisgKiBOb3RlOiBUaGVzZSBmdW5jdGlvbnMgZGVmaW5l ZCBpbiB0aGlzIGZpbGUgbWF5IGJlIGNhbGxlZCBmcm9tIEMuDQorICogICAgICAgQmUgY2FyZWZ1 bCBvZiB0aGF0IHlvdSBtdXN0IG5vdCBtb2RpZnkgc29tZSByZWdpc3RlcnMuIFF1b3RlDQorICog ICAgICAgZnJvbSBnY2MtMi45NS4yL2djYy9jb25maWcvaTM4Ni9pMzg2Lmg6DQorDQorICAgMSBm b3IgcmVnaXN0ZXJzIG5vdCBhdmFpbGFibGUgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzLg0KKyAgIFRo ZXNlIG11c3QgaW5jbHVkZSB0aGUgRklYRURfUkVHSVNURVJTIGFuZCBhbHNvIGFueQ0KKyAgIHJl Z2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYmVpbmcgc2F2ZWQuDQorICAgVGhlIGxh dHRlciBtdXN0IGluY2x1ZGUgdGhlIHJlZ2lzdGVycyB3aGVyZSB2YWx1ZXMgYXJlIHJldHVybmVk DQorICAgYW5kIHRoZSByZWdpc3RlciB3aGVyZSBzdHJ1Y3R1cmUtdmFsdWUgYWRkcmVzc2VzIGFy ZSBwYXNzZWQuDQorICAgQXNpZGUgZnJvbSB0aGF0LCB5b3UgY2FuIGluY2x1ZGUgYXMgbWFueSBv dGhlciByZWdpc3RlcnMgYXMgeW91IGxpa2UuDQorDQorICBheCxkeCxjeCxieCxzaSxkaSxicCxz cCxzdCxzdDEsc3QyLHN0MyxzdDQsc3Q1LHN0NixzdDcsYXJnDQoreyAgMSwgMSwgMSwgMCwgMCwg MCwgMCwgMSwgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxIH0NCisgKi8NCisNCisv Kg0KKyAqIE5vdGU6IEdSVUIgaXMgY29tcGlsZWQgd2l0aCB0aGUgb3B0aW9ucyAtbXJ0ZCBhbmQg LW1yZWdwYXJtPTMuDQorICogICAgICAgU28gdGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhcmUg cGFzc2VkIGluICVlYXgsICVlZHgsIGFuZCAlZWN4LA0KKyAqICAgICAgIHJlc3BlY3RpdmVseSwg YW5kIGlmIGEgZnVuY3Rpb24gaGFzIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cw0KKyAqICAg ICAgIGFuZCB0aGUgbnVtYmVyIGlmIGdyZWF0ZXIgdGhhbiB0aHJlZSwgdGhlIGZ1bmN0aW9uIG11 c3QgcmV0dXJuDQorICogICAgICAgd2l0aCAicmV0ICROIiB3aGVyZSBOIGlzICgodGhlIG51bWJl ciBvZiBhcmd1bWVudHMpIC0gMykgKiA0Lg0KKyAqLw0KKw0KKy8qDQorICogIFRoaXMgaXMgdGhl IGFyZWEgZm9yIGFsbCBvZiB0aGUgc3BlY2lhbCB2YXJpYWJsZXMuDQorICovDQorDQorI2luY2x1 ZGUgPGdydWIvc3ltYm9sLmg+DQorDQorI2RlZmluZSBHUlVCX0RSSVZFTUFQX0lOVDEzSF9PRkZT RVQoeCkgKCh4KSAtIGdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcl9iYXNlKQ0KKw0KKy8qIENv cHkgc3RhcnRzIGhlcmUuIFdoZW4gZGVwbG95ZWQsIHRoaXMgbGFiZWwgbXVzdCBiZSBzZWdtZW50 LWFsaWduZWQgKi8NCitWQVJJQUJMRShncnViX2RyaXZlbWFwX2ludDEzX2hhbmRsZXJfYmFzZSkg IA0KKw0KK1ZBUklBQkxFKGdydWJfZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlcikNCisgIC53b3Jk IDB4ZGVhZCwgMHhiZWVmDQorLyogRHJpdmVtYXAgbW9kdWxlIC0gSU5UIDEzaCBoYW5kbGVyIC0g QklPUyBIRCBtYXAgKi8NCisvKiBXZSBuZWVkIHRvIHVzZSByZWxhdGl2ZSBhZGRyZXNzaW5nLCBh bmQgd2l0aCBDUyB0byB0b3AgaXQgYWxsLCBzaW5jZSB3ZQ0KKyAqIG11c3QgbWFrZSBhcyBmZXcg Y2hhbmdlcyB0byB0aGUgcmVnaXN0ZXJzIGFzIHBvc3NpYmxlLiBQaXR5IHdlJ3JlIG5vdCBvbg0K KyAqIGFtZDY0OiBySVAtcmVsYXRpdmUgYWRkcmVzc2luZyB3b3VsZCBtYWtlIGxpZmUgZWFzaWVy IGhlcmUuDQorICovDQorLmNvZGUxNg0KK0ZVTkNUSU9OKGdydWJfZHJpdmVtYXBfaW50MTNfaGFu ZGxlcikNCisgIHB1c2ggJWJwDQorICBtb3YgJXNwLCAlYnANCisgIHB1c2ggJWF4ICAvKiBXZSds bCBuZWVkIGl0IGxhdGVyIHRvIGRldGVybWluZSB0aGUgdXNlZCBCSU9TIGZ1bmN0aW9uICovDQor DQorICAvKiBNYXAgdGhlIGRyaXZlIG51bWJlciAoYWx3YXlzIGluIERMPykgKi8NCisgIHB1c2gg JWF4DQorICBwdXNoICVieA0KKyAgcHVzaCAlc2kNCisgIG1vdiAkR1JVQl9EUklWRU1BUF9JTlQx M0hfT0ZGU0VUKGdydWJfZHJpdmVtYXBfaW50MTNfbWFwc3RhcnQpLCAlYngNCisgIHhvciAlc2ks ICVzaQ0KKzE6bW92dyAlY3M6KCVieCwlc2kpLCAlYXgNCisgIGNtcCAlYWgsICVhbA0KKyAganog M2YgLyogRFJWPURTVCA9PiBtYXAgZW5kIC0gZHJpdmUgbm90IHJlbWFwcGVkLCBsZWF2ZSBETCBh cy1pcyAqLw0KKyAgY21wICVkbCwgJWFsDQorICBqeiAyZiAvKiBGb3VuZCAtIGRyaXZlIHJlbWFw cGVkLCBtb2RpZnkgREwgKi8NCisgIGFkZCAkMiwgJXNpDQorICBqbXAgMWIgLyogTm90IGZvdW5k LCBidXQgbW9yZSByZW1haW5pbmcsIGxvb3AgICovDQorMjptb3YgJWFoLCAlZGwNCiszOnBvcCAl c2kNCisgIHBvcCAlYngNCisgIHhjaGd3ICVheCwgLTQoJWJwKSAvKiBSZWNvdmVyIHRoZSBvbGQg QVggYW5kIHNhdmUgdGhlIG1hcCBlbnRyeSBmb3IgbGF0ZXIgKi8NCisgIA0KKyAgcHVzaCAlYnAg IA0KKyAgLyogU2ltdWxhdGUgaW50ZXJydXB0IGNhbGw6IHB1c2ggZmxhZ3MgYW5kIGRvIGEgZmFy IGNhbGwgaW4gb3JkZXIgdG8gc2V0DQorICAgKiB0aGUgc3RhY2sgdGhlIHdheSB0aGUgb2xkIGhh bmRsZXIgZXhwZWN0cyBpdCBzbyB0aGF0IGl0cyBpcmV0IHdvcmtzICovDQorICBwdXNoIDYoJWJw KQ0KKyAgbW92dyAoJWJwKSwgJWJwICAvKiBSZXN0b3JlIHRoZSBjYWxsZXIgQlAgKGlzIHRoaXMg bmVlZGVkIGFuZC9vciBzZW5zaWJsZT8pICovDQorICBsY2FsbCAqJWNzOkdSVUJfRFJJVkVNQVBf SU5UMTNIX09GRlNFVChncnViX2RyaXZlbWFwX2ludDEzX29sZGhhbmRsZXIpDQorICBwb3AgJWJw IC8qIFRoZSBwdXNoZWQgZmxhZ3Mgd2VyZSByZW1vdmVkIGJ5IGlyZXQgKi8NCisgIC8qIFNldCB0 aGUgc2F2ZWQgZmxhZ3MgdG8gd2hhdCB0aGUgaW50MTNoIGhhbmRsZXIgcmV0dXJuZWQgKi8NCisg IHB1c2ggJWF4DQorICBwdXNoZg0KKyAgcG9wICVheA0KKyAgbW92dyAlYXgsIDYoJWJwKQ0KKyAg cG9wICVheA0KKw0KKyAgLyogUmV2ZXJzZSBtYXAgYW55IHJldHVybmVkIGRyaXZlIG51bWJlciBp ZiB0aGUgZGF0YSByZXR1cm5lZCBpbmNsdWRlcyBpdC4NCisgICAqIFRoZSBvbmx5IGZ1bmMgdGhh dCBkb2VzIHRoaXMgc2VlbXMgdG8gYmUgb3JpZ0FIID0gMHgwOCwgYnV0IG1hbnkgQklPUw0KKyAg ICogcmVmcyBzYXkgcmV0REwgPSAjIG9mIGRyaXZlcyBjb25uZWN0ZWQuIEhvd2V2ZXIsIHRoZSBH UlVCIExlZ2FjeSBjb2RlDQorICAgKiB0cmVhdHMgdGhpcyBhcyB0aGUgX2RyaXZlIG51bWJlcl8g YW5kICJ1bmRvZXMiIHRoZSByZW1hcHBpbmcuIFRodXMsDQorICAgKiB0aGlzIHNlY3Rpb24gaGFz IGJlZW4gZGlzYWJsZWQgZm9yIHRlc3RpbmcgaWYgaXQncyByZXF1aXJlZCAqLw0KKyMgIGNtcGIg JDB4MDgsIC0xKCVicCkgLyogQ2FsbGVyJ3MgQUggKi8NCisjICBqbmUgNGYNCisjICBwdXNoICVl cw0KKyMgIHB1c2hhbA0KKyMgIG1vdiAkMCwgJWRpDQorIyAgbW92ICQweGI4MDAsICVieA0KKyMg IG1vdiAlYngsICVlcw0KKyMgIHhjaGd3ICVheCwgLTQoJWJwKSAvKiBNYXAgZW50cnkgdXNlZCAq Lw0KKyMgIGNtcCAlYWgsICVhbCAgLyogRFJWPURTVCA9PiBkcml2ZSBub3QgcmVtYXBwZWQgKi8N CisjICBqZSA0Zg0KKyMgIG1vdiAlYWgsICVkbCAgLyogVW5kbyByZW1hcCAqLw0KKw0KKzQ6bW92 ICVicCwgJXNwDQorICBwb3AgJWJwDQorICBpcmV0DQorLyogVGhpcyBsYWJlbCBNVVNUIGJlIGF0 IHRoZSBlbmQgb2YgdGhlIGNvcGllZCBibG9jaywgc2luY2UgdGhlIGluc3RhbGxlciBjb2RlDQor ICogcmVzZXJ2ZXMgYWRkaXRpb25hbCBzcGFjZSBmb3IgbWFwcGluZ3MgYXQgcnVudGltZSBhbmQg Y29waWVzIHRoZW0gb3ZlciBpdCAqLw0KKy5hbGlnbiAyDQorVkFSSUFCTEUoZ3J1Yl9kcml2ZW1h cF9pbnQxM19tYXBzdGFydCkNCisgIC5zcGFjZSAwDQorLmNvZGUzMiAvKiBDb3B5IHN0b3BzIGhl cmUgKi8NCitWQVJJQUJMRShncnViX2RyaXZlbWFwX2ludDEzX3NpemUpDQorICAud29yZCBHUlVC X0RSSVZFTUFQX0lOVDEzSF9PRkZTRVQoZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXplKQ0KKyN1bmRl ZiBHUlVCX0RSSVZFTUFQX0lOVDEzSF9PRkZTRVQNCkluZGV4OiBjb25mL2kzODYtcGMucm1rDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnViMi9jb25mL2kzODYtcGMucm1r LHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMTkNCmRpZmYgLXUgLXAgLXIxLjExOSBpMzg2LXBj LnJtaw0KLS0tIGNvbmYvaTM4Ni1wYy5ybWsJMzAgTWF5IDIwMDggMDQ6MjA6NDcgLTAwMDAJMS4x MTkNCisrKyBjb25mL2kzODYtcGMucm1rCTggSnVuIDIwMDggMTg6MDk6MjIgLTAwMDANCkBAIC0x NTIsNyArMTUyLDcgQEAgcGtnbGliX01PRFVMRVMgPSBiaW9zZGlzay5tb2QgX2NoYWluLm1vZA0K IAl2YmUubW9kIHZiZXRlc3QubW9kIHZiZWluZm8ubW9kIHZpZGVvLm1vZCBnZnh0ZXJtLm1vZCBc DQogCXZpZGVvdGVzdC5tb2QgcGxheS5tb2QgYml0bWFwLm1vZCB0Z2EubW9kIGNwdWlkLm1vZCBz ZXJpYWwubW9kCVwNCiAJYXRhLm1vZCB2Z2EubW9kIG1lbWRpc2subW9kIGpwZWcubW9kIHBuZy5t b2QgcGNpLm1vZCBsc3BjaS5tb2QgXA0KLQlhb3V0Lm1vZCBfYnNkLm1vZCBic2QubW9kDQorCWFv dXQubW9kIF9ic2QubW9kIGJzZC5tb2QgZHJpdmVtYXAubW9kDQogDQogIyBGb3IgYmlvc2Rpc2su bW9kLg0KIGJpb3NkaXNrX21vZF9TT1VSQ0VTID0gZGlzay9pMzg2L3BjL2Jpb3NkaXNrLmMNCkBA IC0zMTksNCArMzE5LDExIEBAIGJzZF9tb2RfU09VUkNFUyA9IGxvYWRlci9pMzg2L2JzZF9ub3Jt YWwNCiBic2RfbW9kX0NGTEFHUyA9ICQoQ09NTU9OX0NGTEFHUykNCiBic2RfbW9kX0xERkxBR1Mg PSAkKENPTU1PTl9MREZMQUdTKQ0KIA0KKyMgRm9yIGRyaXZlbWFwLm1vZC4NCitkcml2ZW1hcF9t b2RfU09VUkNFUyA9IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYyBcDQorICAgICAgICAgICAg ICAgICAgICAgICBjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwX2ludDEzaC5TDQorZHJpdmVtYXBf bW9kX0FTRkxBR1MgPSAkKENPTU1PTl9BU0ZMQUdTKQ0KK2RyaXZlbWFwX21vZF9DRkxBR1MgPSAk KENPTU1PTl9DRkxBR1MpDQorZHJpdmVtYXBfbW9kX0xERkxBR1MgPSAkKENPTU1PTl9MREZMQUdT KQ0KKw0KIGluY2x1ZGUgJChzcmNkaXIpL2NvbmYvY29tbW9uLm1rDQpJbmRleDogaW5jbHVkZS9n cnViL2xvYWRlci5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnViMi9p bmNsdWRlL2dydWIvbG9hZGVyLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjkNCmRpZmYgLXUg LXAgLXIxLjkgbG9hZGVyLmgNCi0tLSBpbmNsdWRlL2dydWIvbG9hZGVyLmgJMjEgSnVsIDIwMDcg MjM6MzI6MjIgLTAwMDAJMS45DQorKysgaW5jbHVkZS9ncnViL2xvYWRlci5oCTggSnVuIDIwMDgg MTg6MDk6MjIgLTAwMDANCkBAIC0zNyw2ICszNywxOSBAQCB2b2lkIEVYUE9SVF9GVU5DKGdydWJf bG9hZGVyX3NldCkgKGdydWJfDQogLyogVW5zZXQgY3VycmVudCBsb2FkZXIsIGlmIGFueS4gICov DQogdm9pZCBFWFBPUlRfRlVOQyhncnViX2xvYWRlcl91bnNldCkgKHZvaWQpOw0KIA0KK3R5cGVk ZWYgc3RydWN0IGhvb2tsaXN0X25vZGUgKmdydWJfcHJlYm9vdF9ob29raWQ7DQorDQorLyogUmVn aXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBib290IGhvb2suIFJldHVy bnMgYW4gaWQgdGhhdA0KKyAgIGNhbiBiZSBsYXRlciB1c2VkIHRvIHVucmVnaXN0ZXIgdGhlIHBy ZWJvb3QgKGkuZS4gaWYgbW9kdWxlIHVubG9hZGVkKS4gSWYNCisgICBhYm9ydF9vbl9lcnJvciBp cyBzZXQsIHRoZSBib290IHNlcXVlbmNlIHdpbGwgYWJvcnQgaWYgYW55IG9mIHRoZSByZWdpc3Rl cmVkDQorICAgZnVuY3Rpb25zIHJldHVybiBhbnl0aGluZyBlbHNlIHRoYW4gR1JVQl9FUlJfTk9O RSAqLw0KK2dydWJfcHJlYm9vdF9ob29raWQgRVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfcmVnaXN0 ZXJfcHJlYm9vdCkNCisgICAgICAgICAgIChncnViX2Vycl90ICgqaG9vaykgKHZvaWQpLCBpbnQg YWJvcnRfb25fZXJyb3IpOyANCisNCisvKiBVbnJlZ2lzdGVyIGEgcHJlYm9vdCBob29rIGJ5IHRo ZSBpZCByZXR1cm5lZCBieSBsb2FkZXJfcmVnaXN0ZXJfcHJlYm9vdC4NCisgICBUaGlzIGZ1bmN0 aW9ucyBiZWNvbWVzIGEgbm8tb3AgaWYgbm8gc3VjaCBmdW5jdGlvbiBpcyByZWdpc3RlcmVkICov DQordm9pZCBFWFBPUlRfRlVOQyhncnViX2xvYWRlcl91bnJlZ2lzdGVyX3ByZWJvb3QpIChncnVi X3ByZWJvb3RfaG9va2lkIGlkKTsNCisNCiAvKiBDYWxsIHRoZSBib290IGhvb2sgaW4gY3VycmVu dCBsb2FkZXIuIFRoaXMgbWF5IG9yIG1heSBub3QgcmV0dXJuLA0KICAgIGRlcGVuZGluZyBvbiB0 aGUgc2V0dGluZyBieSBncnViX2xvYWRlcl9zZXQuICAqLw0KIGdydWJfZXJyX3QgRVhQT1JUX0ZV TkMoZ3J1Yl9sb2FkZXJfYm9vdCkgKHZvaWQpOw0KSW5kZXg6IGtlcm4vbG9hZGVyLmMNCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NClJDUyBmaWxlOiAvc291cmNlcy9ncnViL2dydWIyL2tlcm4vbG9hZGVyLmMsdg0KcmV0 cmlldmluZyByZXZpc2lvbiAxLjkNCmRpZmYgLXUgLXAgLXIxLjkgbG9hZGVyLmMNCi0tLSBrZXJu L2xvYWRlci5jCTIxIEp1bCAyMDA3IDIzOjMyOjI2IC0wMDAwCTEuOQ0KKysrIGtlcm4vbG9hZGVy LmMJOCBKdW4gMjAwOCAxODowOToyMiAtMDAwMA0KQEAgLTYxLDExICs2MSw3OCBAQCBncnViX2xv YWRlcl91bnNldCh2b2lkKQ0KICAgZ3J1Yl9sb2FkZXJfbG9hZGVkID0gMDsNCiB9DQogDQorc3Ry dWN0IGhvb2tsaXN0X25vZGUNCit7DQorICBncnViX2Vycl90ICgqaG9vaykgKHZvaWQpOw0KKyAg aW50IGFib3J0X29uX2Vycm9yOw0KKyAgc3RydWN0IGhvb2tsaXN0X25vZGUgKm5leHQ7DQorfTsN CisNCitzdGF0aWMgc3RydWN0IGhvb2tsaXN0X25vZGUgKnByZWJvb3RfaG9va3MgPSAwOw0KKw0K K2dydWJfcHJlYm9vdF9ob29raWQNCitncnViX2xvYWRlcl9yZWdpc3Rlcl9wcmVib290KGdydWJf ZXJyX3QgKCpob29rKSAodm9pZCksIGludCBhYm9ydF9vbl9lcnJvcikNCit7DQorICBpZiAoMCA9 PSBob29rKQ0KKyAgICB7DQorICAgICAgZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5U LCAicHJlYm9vdCBob29vayBtdXN0IG5vdCBiZSBudWxsIik7DQorICAgICAgcmV0dXJuIDA7DQor ICAgIH0NCisgIGdydWJfcHJlYm9vdF9ob29raWQgbmV3ZW50cnkgPSBncnViX21hbGxvYyAoc2l6 ZW9mIChzdHJ1Y3QgaG9va2xpc3Rfbm9kZSkpOw0KKyAgaWYgKCFuZXdlbnRyeSkNCisgICAgew0K KyAgICAgIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksICJjYW5ub3QgYWxsb2Mg YSBob29raW5mbyBzdHJ1Y3R1cmUiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgZWxz ZQ0KKyAgICB7DQorICAgICAgbmV3ZW50cnktPmhvb2sgPSBob29rOw0KKyAgICAgIG5ld2VudHJ5 LT5hYm9ydF9vbl9lcnJvciA9IGFib3J0X29uX2Vycm9yOw0KKyAgICAgIG5ld2VudHJ5LT5uZXh0 ID0gcHJlYm9vdF9ob29rczsNCisgICAgICBwcmVib290X2hvb2tzID0gbmV3ZW50cnk7DQorICAg ICAgcmV0dXJuIG5ld2VudHJ5Ow0KKyAgICB9DQorfQ0KKw0KK3ZvaWQNCitncnViX2xvYWRlcl91 bnJlZ2lzdGVyX3ByZWJvb3QoZ3J1Yl9wcmVib290X2hvb2tpZCBpZCkNCit7DQorICBpZiAoMCA9 PSBpZCkNCisgICAgcmV0dXJuOw0KKyAgZ3J1Yl9wcmVib290X2hvb2tpZCBlbnRyeSA9IDAsIHNl YXJjaCA9IHByZWJvb3RfaG9va3MsIHByZXZpb3VzID0gMDsNCisgIHdoaWxlIChzZWFyY2gpDQor ICAgIHsNCisgICAgICBpZiAoc2VhcmNoID09IGlkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBl bnRyeSA9IHNlYXJjaDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgcHJl dmlvdXMgPSBzZWFyY2g7DQorICAgICAgc2VhcmNoID0gc2VhcmNoLT5uZXh0Ow0KKyAgICB9DQor ICBpZiAoZW50cnkpIC8qIEZvdW5kICovDQorICAgIHsNCisgICAgICBpZiAocHJldmlvdXMpDQor ICAgICAgICBwcmV2aW91cy0+bmV4dCA9IGVudHJ5LT5uZXh0Ow0KKyAgICAgIGVsc2UgcHJlYm9v dF9ob29rcyA9IGVudHJ5LT5uZXh0OyAvKiBFbnRyeSB3YXMgaGVhZCBvZiBsaXN0ICovDQorICAg ICAgZ3J1Yl9mcmVlIChlbnRyeSk7DQorICAgIH0NCit9DQorDQogZ3J1Yl9lcnJfdA0KIGdydWJf bG9hZGVyX2Jvb3QgKHZvaWQpDQogew0KICAgaWYgKCEgZ3J1Yl9sb2FkZXJfbG9hZGVkKQ0KICAg ICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfTk9fS0VSTkVMLCAibm8gbG9hZGVkIGtlcm5l bCIpOw0KKyAgDQorICBncnViX3ByZWJvb3RfaG9va2lkIGVudHJ5ID0gcHJlYm9vdF9ob29rczsN CisgIHdoaWxlIChlbnRyeSkNCisgICAgew0KKyAgICAgIGdydWJfZXJyX3QgcmV0VmFsID0gZW50 cnktPmhvb2soKTsNCisgICAgICBpZiAocmV0VmFsICE9IEdSVUJfRVJSX05PTkUgJiYgZW50cnkt PmFib3J0X29uX2Vycm9yKQ0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsNCisgICAgICBlbnRyeSA9 IGVudHJ5LT5uZXh0Ow0KKyAgICB9DQogDQogICBpZiAoZ3J1Yl9sb2FkZXJfbm9yZXR1cm4pDQog ICAgIGdydWJfbWFjaGluZV9maW5pICgpOw0K --=-/XOvuCZPuDOc+LIJH+cj-- --=-l2tGI5Smu1HkQGErpo1/ Content-Type: application/pgp-signature; name=signature.asc Content-Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQIVAwUASEwpM6Sl+Fbdeo72AQIQlA//VPu3Uxg1sGunG/UpcXaofAI/Ands6iet hGa1dqr4Ka8GpAGwlag128gVLnPLS/7ThLCh5fAf916fF7nXA+xZUqM9iE+hahGr 6Cj9CNAm25hS1ppV32uwxdFZ7T5Q0h9TeHioklS/dPTHByIYmCWWrz4/TMO9b50C 2hB3/4nTxHkh0UVm5Yi9wg0C8ZvVP3Qb1e+kOpxNgDKnZEvxSiGMqyy7sIzXd9KF ZE0Bkm+6OD3gdzd9LSl2IedV/gp3A6fA43BPBf2/Wgo57US6esgU8LuPU1mJJKfa gPH3ifB2dyI4brHeNg/XuYcA3RengQ0ZbDhJZBxMaBcXO6riCgCyw94AbQFP4u3x GD4DMummsUs4EdM5EozNLxfjv1k7qg8fdaHvqLJ7drs0GbiDbWZyJ2ykknDz1XyK 4H6QCPFoYOGn8uWU+MvlIgv/Pow4qzZ0YXg9PF4lsXn8lP1digfedWyLdvgLI6bO agwLRIHqnhQUXDC7lTQGGkzDwEc4A9vVqKQOMJVSIzvu49tPf79eG0rUgRT6HF3j cbtpNakwDv/9JUI4v61hz0X+929xb9LYoWa42McToVu/ORMWiRuAzEyieoZyl9+F /ZMvRuSuZ1V182RF6ZG9zirWa6DbbqxVBwecCmn3YBw3Egv0U8HZJP2rt6e7tpKV /WTxSchUUTw= =01/Y -----END PGP SIGNATURE----- --=-l2tGI5Smu1HkQGErpo1/--