From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1KPmyo-0003aD-1Y for mharc-grub-devel@gnu.org; Sun, 03 Aug 2008 19:27:14 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KPmyl-0003Zu-8b for grub-devel@gnu.org; Sun, 03 Aug 2008 19:27:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KPmyi-0003Zi-Mj for grub-devel@gnu.org; Sun, 03 Aug 2008 19:27:09 -0400 Received: from [199.232.76.173] (port=59652 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KPmyi-0003Zf-GE for grub-devel@gnu.org; Sun, 03 Aug 2008 19:27:08 -0400 Received: from ik-out-1112.google.com ([66.249.90.181]:25623) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KPmyi-0002rB-Bw for grub-devel@gnu.org; Sun, 03 Aug 2008 19:27:09 -0400 Received: by ik-out-1112.google.com with SMTP id c21so2183797ika.2 for ; Sun, 03 Aug 2008 16:27:05 -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=RJItDYEsUp6x0DixqwWTANou6ejNBf1rq824GtBskJ0=; b=MxanpxGJ/PADodszltVL9Zbw/gJOIT+c/NmkPeJMSIZkgZd/d2ijIrZIp5ZOw2RkAl Cv1UHOxo3b4tD5PTEI4cMDdojCqv4qAb5aZJjwLxGPro4IVXfuEUslNSrIxe/wLSkDHy 5h95A4uNxps2xx0Kl3TvqH5CooiKmJjSc2aw4= 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=a6yu/JpfB4Nmhbw13ZyyWQNES2xo2K2+qSyCcZSZfj7KlvAL7QTyKCbXDI6Nnmurq7 EtaCoNvHYcYs5awJV+tA+VEB/PwLpv0F6loreXnDsj9q4ouNwjRc0k88ldP7O/iYf58Q egqYonUB9dOd6BSG8U/cUenRXoX70ZZ+7E2qI= Received: by 10.210.133.2 with SMTP id g2mr255405ebd.195.1217806025492; Sun, 03 Aug 2008 16:27:05 -0700 (PDT) Received: from ?192.168.1.100? ( [213.37.137.93]) by mx.google.com with ESMTPS id g9sm9107457gvc.0.2008.08.03.16.27.01 (version=SSLv3 cipher=RC4-MD5); Sun, 03 Aug 2008 16:27:03 -0700 (PDT) From: Javier =?ISO-8859-1?Q?Mart=EDn?= To: The development of GRUB 2 In-Reply-To: <877ib1khe9.fsf@xs4all.nl> References: <1215137528.26019.58.camel@localhost> <87bq0sibu0.fsf@xs4all.nl> <1216601741.8334.122.camel@localhost> <877ib1khe9.fsf@xs4all.nl> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-3aTDMDPyowcWgZG0BjVn" Date: Mon, 04 Aug 2008 01:29:09 +0200 Message-Id: <1217806150.9634.24.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) Subject: Re: [PATCH] Drivemap module 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, 03 Aug 2008 23:27:11 -0000 --=-3aTDMDPyowcWgZG0BjVn Content-Type: multipart/mixed; boundary="=-jjPm7cTT9Fl9b2D0v07D" --=-jjPm7cTT9Fl9b2D0v07D Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable After your latest replay, I "reevaluated" my stubbornness WRT some of your advices, and I've changed a few things: - Variables are now declared (and, if possible, initialized) before precondition checks, even simple ones. The install_int13_handler function has not been modified, however, since I find it a bit nonsensical to put bunch of declarations without an obvious meaning just after the "else" line: grub_uint32_t *ivtslot; grub_uint16_t *bpa_freekb; grub_size_t total_size; grub_uint16_t payload_sizekb; grub_uint8_t *handler_base; int13map_node_t *handler_map; grub_uint32_t ivtentry; - Only one declaration per line: even though C is a bit absurd in not recognizing T* as a first class type and instead thinking of * as a qualifier to the variable name; and even though my code does not incur into such ambiguities. - Comments moved as you required, reworded as needed - Extensive printf showing quasi-help in the "show" mode trimmed down to just the first sentence. - Internal helper functions now use the standard error handling, i.e. return grub_error (err, fmt, ...) - Comment about the strange "void" type instead of "void*" rephrased to be clearer There is, however, one point in which I keep my objection: comparisons between a variable and a constant should be of the form CONSTANT =3D=3D variable and not in the reverse order, since an erroneous but quite possible change of =3D=3D for =3D results in a compile-time error instead o= f a _extremely_ difficult to trace runtime bug. Such kind of bugs are quite excruciating to find in userspace applications within an IDE, so I can't even consider the pain to debug them in a bootloader. WRT accepting raw BIOS disk numbers, I agree with you in principle, but I'm keeping the functionality for now, since I don't quite like the "drivemap (hd0) (hd1)" syntax - which device is which?. I'd rather have something akin to "drivemap (hd0) (bios:hd1)", but I want to hear the opinions of people in this list. The new version of the patch is attached, and here is my suggested CLog: 2008-08-XX Javier Martin =EF=BB=BF* commands/i386/pc/drivemap.c : New file. * commands/i386/pc/drivemap_int13h.S : New file. =EF=BB=BF* conf/i386-pc.rmk (pkglib_MODULES) : Added drivemap.mod (drivemap_mod_SOURCES) : New variable (drivemap_mod_ASFLAGS) : Likewise =EF=BB=BF(drivemap_mod_CFLAGS) : Likewise =EF=BB=BF(drivemap_mod_LDFLAGS) : Likewise =EF=BB=BF* include/grub/loader.h (grub_loader_register_preboot) : N= ew function prototype. Register a new pre-boot handler (grub_loader_unregister_preboot) : Likewise. Unregister handler (grub_preboot_hookid) : New typedef. Registered hook "handle" =EF=BB=BF* kern/loader.c =EF=BB=BF(grub_loader_register_preboot) : = New function. (grub_loader_unregister_preboot) : Likewise. (preboot_hooks) : New variable. Linked list of preboot hooks (grub_loader_boot) : Call the list of preboot-hooks before the actual loader --=-jjPm7cTT9Fl9b2D0v07D Content-Disposition: attachment; filename=drivemap.patch.4 Content-Type: text/x-patch; name=drivemap.patch.4; charset=utf-8 Content-Transfer-Encoding: base64 SW5kZXg6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGNvbW1h bmRzL2kzODYvcGMvZHJpdmVtYXAuYwkocmV2aXNpw7NuOiAwKQ0KKysrIGNvbW1hbmRzL2kzODYv cGMvZHJpdmVtYXAuYwkocmV2aXNpw7NuOiAwKQ0KQEAgLTAsMCArMSw0MTcgQEANCisvKiBkcml2 ZW1hcC5jIC0gY29tbWFuZCB0byBtYW5hZ2UgdGhlIEJJT1MgZHJpdmUgbWFwcGluZ3MuICAqLw0K Ky8qDQorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXINCisgKiAgQ29weXJp Z2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqICBH UlVCIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkNCisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg ZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKg0KKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisg KiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAq ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQorICovDQorDQorI2luY2x1ZGUgPGdydWIvbm9ybWFsLmg+ DQorI2luY2x1ZGUgPGdydWIvZGwuaD4NCisjaW5jbHVkZSA8Z3J1Yi9tbS5oPg0KKyNpbmNsdWRl IDxncnViL21pc2MuaD4NCisjaW5jbHVkZSA8Z3J1Yi9kaXNrLmg+DQorI2luY2x1ZGUgPGdydWIv bG9hZGVyLmg+DQorI2luY2x1ZGUgPGdydWIvbWFjaGluZS9sb2FkZXIuaD4NCisjaW5jbHVkZSA8 Z3J1Yi9tYWNoaW5lL2Jpb3NkaXNrLmg+DQorDQorI2RlZmluZSBNT0ROQU1FICJkcml2ZW1hcCIN CisNCitzdGF0aWMgY29uc3Qgc3RydWN0IGdydWJfYXJnX29wdGlvbiBvcHRpb25zW10gPSB7DQor ICB7Imxpc3QiLCAnbCcsIDAsICJzaG93IHRoZSBjdXJyZW50IG1hcHBpbmdzIiwgMCwgMH0sDQor ICB7InJlc2V0IiwgJ3InLCAwLCAicmVzZXQgYWxsIG1hcHBpbmdzIHRvIHRoZSBkZWZhdWx0IHZh bHVlcyIsIDAsIDB9LA0KKyAgezAsIDAsIDAsIDAsIDAsIDB9DQorfTsNCisNCisvKiBTeW1zL3Zh cnMvZnVuY3MgZXhwb3J0ZWQgZnJvbSBkcml2ZW1hcF9pbnQxM2guUyAtIHN0YXJ0LiAgKi8NCisN CisvKiBSZWFsbW9kZSBmYXIgcHRyID0gMiAqIDE2YiAqLw0KK2V4dGVybiBncnViX3VpbnQzMl90 IGdydWJfZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlcjsNCisvKiBTaXplIG9mIHRoZSBzZWN0aW9u IHRvIGJlIGNvcGllZCAqLw0KK2V4dGVybiBncnViX3VpbnQxNl90IGdydWJfZHJpdmVtYXBfaW50 MTNfc2l6ZTsNCisNCisvKiBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgaW1wb3J0ZWQgYXNzZW1ibHkg bGFiZWxzLCB0YWtlcyBubyBzdG9yYWdlIGFuZCBpcyBvbmx5DQorICAgdXNlZCB0byB0YWtlIHRo ZSBzeW1ib2wgYWRkcmVzcyB3aXRoICZsYWJlbC4gIERvIE5PVCBwdXQgdm9pZCogaGVyZS4gICov DQordHlwZWRlZiB2b2lkIGdydWJfc3ltYm9sX3Q7DQorZXh0ZXJuIGdydWJfc3ltYm9sX3QgZ3J1 Yl9kcml2ZW1hcF9pbnQxM19oYW5kbGVyX2Jhc2U7DQorZXh0ZXJuIGdydWJfc3ltYm9sX3QgZ3J1 Yl9kcml2ZW1hcF9pbnQxM19tYXBzdGFydDsNCisNCit2b2lkIGdydWJfZHJpdmVtYXBfaW50MTNf aGFuZGxlciAodm9pZCk7DQorDQorLyogU3ltcy92YXJzL2Z1bmNzIGV4cG9ydGVkIGZyb20gZHJp dmVtYXBfaW50MTNoLlMgLSBlbmQuICAqLw0KKw0KKw0KK3N0YXRpYyBncnViX3ByZWJvb3RfaG9v a2lkIGluc3RoYW5kbGVyX2hvb2s7DQorDQordHlwZWRlZiBzdHJ1Y3QgZHJpdmVtYXBfbm9kZQ0K K3sNCisgIGdydWJfdWludDhfdCBuZXdkcml2ZTsNCisgIGdydWJfdWludDhfdCByZWRpcnRvOw0K KyAgc3RydWN0IGRyaXZlbWFwX25vZGUgKm5leHQ7DQorfSBkcml2ZW1hcF9ub2RlX3Q7DQorDQor c3RhdGljIGRyaXZlbWFwX25vZGVfdCAqZHJpdmVtYXAgPSAwOw0KK3N0YXRpYyBncnViX2Vycl90 IGluc3RhbGxfaW50MTNfaGFuZGxlciAodm9pZCk7DQorDQorLyogUHV0cyB0aGUgc3BlY2lmaWVk IG1hcHBpbmcgaW50byB0aGUgdGFibGUsIHJlcGxhY2luZyBhbiBleGlzdGluZyBtYXBwaW5nDQor ICAgZm9yIG5ld2RyaXZlIG9yIGFkZGluZyBhIG5ldyBvbmUgaWYgcmVxdWlyZWQuICAqLw0KK3N0 YXRpYyBncnViX2Vycl90DQorZHJpdmVtYXBfc2V0IChncnViX3VpbnQ4X3QgbmV3ZHJpdmUsIGdy dWJfdWludDhfdCByZWRpcnRvKQ0KKw0KK3sNCisgIGRyaXZlbWFwX25vZGVfdCAqbWFwcGluZyA9 IDA7DQorICBkcml2ZW1hcF9ub2RlX3QgKnNlYXJjaCA9IGRyaXZlbWFwOw0KKyAgd2hpbGUgKHNl YXJjaCkNCisgICAgew0KKyAgICAgIGlmIChzZWFyY2gtPm5ld2RyaXZlID09IG5ld2RyaXZlKQ0K KyAgICAgICAgew0KKyAgICAgICAgICBtYXBwaW5nID0gc2VhcmNoOw0KKyAgICAgICAgICBicmVh azsNCisgICAgICAgIH0NCisgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7DQorICAgIH0NCisN CisgIA0KKyAgLyogQ2hlY2sgZm9yIHByZS1leGlzdGluZyBtYXBwaW5ncyB0byBtb2RpZnkgYmVm b3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4gICovDQorICBpZiAobWFwcGluZykNCisgICAgbWFwcGlu Zy0+cmVkaXJ0byA9IHJlZGlydG87DQorICBlbHNlIA0KKyAgICB7DQorICAgICAgbWFwcGluZyA9 IGdydWJfbWFsbG9jIChzaXplb2YgKGRyaXZlbWFwX25vZGVfdCkpOw0KKyAgICAgIGlmICghbWFw cGluZykNCisgICAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZ LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYWxsb2NhdGUgbWFwIGVudHJ5 LCBub3QgZW5vdWdoIG1lbW9yeSIpOw0KKyAgICAgIG1hcHBpbmctPm5ld2RyaXZlID0gbmV3ZHJp dmU7DQorICAgICAgbWFwcGluZy0+cmVkaXJ0byA9IHJlZGlydG87DQorICAgICAgbWFwcGluZy0+ bmV4dCA9IGRyaXZlbWFwOw0KKyAgICAgIGRyaXZlbWFwID0gbWFwcGluZzsNCisgICAgfQ0KKyAg cmV0dXJuIEdSVUJfRVJSX05PTkU7DQorfQ0KKw0KKy8qIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9y IG5ld2RyaXZlIGZyb20gdGhlIHRhYmxlLiAgSWYgdGhlcmUgaXMgbm8gbWFwcGluZywNCisgICB0 aGVuIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIGEgbm8tb3Agb24gdGhlIG1hcC4gICovDQor c3RhdGljIHZvaWQNCitkcml2ZW1hcF9yZW1vdmUgKGdydWJfdWludDhfdCBuZXdkcml2ZSkNCit7 DQorICBkcml2ZW1hcF9ub2RlX3QgKm1hcHBpbmcgPSAwOw0KKyAgZHJpdmVtYXBfbm9kZV90ICpz ZWFyY2ggPSBkcml2ZW1hcDsNCisgIGRyaXZlbWFwX25vZGVfdCAqcHJldmlvdXMgPSAwOw0KKyAg d2hpbGUgKHNlYXJjaCkNCisgICAgew0KKyAgICAgIGlmIChzZWFyY2gtPm5ld2RyaXZlID09IG5l d2RyaXZlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBtYXBwaW5nID0gc2VhcmNoOw0KKyAgICAg ICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICBwcmV2aW91cyA9IHNlYXJjaDsNCisgICAg ICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7DQorICAgIH0NCisgIGlmIChtYXBwaW5nKSAvKiBGb3Vu ZC4gICovDQorICAgIHsNCisgICAgICBpZiAocHJldmlvdXMpDQorICAgICAgICBwcmV2aW91cy0+ bmV4dCA9IG1hcHBpbmctPm5leHQ7DQorICAgICAgZWxzZSAvKiBFbnRyeSB3YXMgaGVhZCBvZiBs aXN0LiAgKi8NCisgICAgICAgIGRyaXZlbWFwID0gbWFwcGluZy0+bmV4dDsNCisgICAgICBncnVi X2ZyZWUgKG1hcHBpbmcpOw0KKyAgICB9DQorfQ0KKw0KKy8qIEdpdmVuIGEgZGV2aWNlIG5hbWUs IHJlc29sdmVzIGl0cyBCSU9TIGRpc2sgbnVtYmVyIGFuZCBzdG9yZXMgaXQgaW4gdGhlDQorICAg cGFzc2VkIGxvY2F0aW9uLCB3aGljaCBzaG91bGQgb25seSBiZSB0cnVzdGVkIGlmIEVSUl9OT05F IGlzIHJldHVybmVkLiAgKi8NCitzdGF0aWMgZ3J1Yl9lcnJfdA0KK3BhcnNlX2Jpb3NkaXNrIChj b25zdCBjaGFyICpuYW1lLCBncnViX3VpbnQ4X3QgKmRpc2tudW0pDQorew0KKyAgZ3J1Yl9kaXNr X3QgZGlzazsNCisgIGlmICghbmFtZSB8fCAwID09ICpuYW1lKQ0KKyAgICByZXR1cm4gZ3J1Yl9l cnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULCAiZGV2aWNlIG5hbWUgZW1wdHkiKTsNCisgIC8q IFNraXAgdGhlIGZpcnN0ICggaW4gKGhkMCkgLSBkaXNrX29wZW4gd2FudHMganVzdCB0aGUgbmFt ZS4gICovDQorICBpZiAoKm5hbWUgPT0gJygnKQ0KKyAgICBuYW1lKys7DQorICANCisgIGRpc2sg PSBncnViX2Rpc2tfb3BlbiAobmFtZSk7DQorICBpZiAoIWRpc2spDQorICAgIHJldHVybiBncnVi X2Vycm9yIChHUlVCX0VSUl9VTktOT1dOX0RFVklDRSwgInVua25vd24gZGV2aWNlIFwiJXNcIiIs IG5hbWUpOw0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgY29uc3QgZW51bSBncnViX2Rpc2tfZGV2 X2lkIGlkID0gZGlzay0+ZGV2LT5pZDsNCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGFzc2lnbm1l bnQgaXMgb25seSBzb3VuZCBpZiB0aGUgZGV2aWNlIGlzIGluZGVlZCBhDQorICAgICAgICAgYmlv c2Rpc2suICBUaGUgY2FsbGVyIG11c3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZS4gICovDQorICAg ICAgaWYgKGRpc2tudW0pDQorICAgICAgICAqZGlza251bSA9IGRpc2stPmlkOw0KKyAgICAgIGdy dWJfZGlza19jbG9zZSAoZGlzayk7DQorICAgICAgaWYgKEdSVUJfRElTS19ERVZJQ0VfQklPU0RJ U0tfSUQgPT0gaWQpDQorICAgICAgICByZXR1cm4gR1JVQl9FUlJfTk9ORTsNCisgICAgICBlbHNl IHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfREVWSUNFLCAiJXMgaXMgbm90IGEgQklP UyBkaXNrIiwgbmFtZSk7DQorICAgIH0NCit9DQorDQorLyogR2l2ZW4gYSBCSU9TIGRpc2sgbnVt YmVyLCByZXR1cm5zIGl0cyBHUlVCIGRldmljZSBuYW1lIGlmIGl0IGV4aXN0cy4NCisgICBGb3Ig bm9uZXhpc3RpbmcgQklPUyBkbnVtcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIEVSUl9VTktOT1dO X0RFVklDRS4gICovDQorc3RhdGljIGdydWJfZXJyX3QNCityZXZwYXJzZV9iaW9zZGlzayhjb25z dCBncnViX3VpbnQ4X3QgZG51bSwgY29uc3QgY2hhciAqKm91dHB1dCkNCit7DQorICBpbnQgZm91 bmQgPSAwOw0KKyAgYXV0byBpbnQgZmluZCAoY29uc3QgY2hhciAqbmFtZSk7DQorICBpbnQgZmlu ZCAoY29uc3QgY2hhciAqbmFtZSkNCisgIHsNCisgICAgY29uc3QgZ3J1Yl9kaXNrX3QgZGlzayA9 IGdydWJfZGlza19vcGVuIChuYW1lKTsNCisgICAgaWYgKCFkaXNrKQ0KKyAgICAgIHJldHVybiAw Ow0KKyAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaWYgKGRpc2stPmlkID09IGRudW0gJiYg R1JVQl9ESVNLX0RFVklDRV9CSU9TRElTS19JRCA9PSBkaXNrLT5kZXYtPmlkKQ0KKyAgICAgICAg ICB7DQorICAgICAgICAgICAgZm91bmQgPSAxOw0KKyAgICAgICAgICAgIGlmIChvdXRwdXQpDQor ICAgICAgICAgICAgICAqb3V0cHV0ID0gbmFtZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgZ3J1 Yl9kaXNrX2Nsb3NlIChkaXNrKTsNCisgICAgICAgIHJldHVybiBmb3VuZDsNCisgICAgICB9DQor ICB9DQorDQorICBncnViX2Rpc2tfZGV2X2l0ZXJhdGUgKGZpbmQpOw0KKyAgaWYgKGZvdW5kKQ0K KyAgICByZXR1cm4gR1JVQl9FUlJfTk9ORTsNCisgIGVsc2UgcmV0dXJuIGdydWJfZXJyb3IgKEdS VUJfRVJSX1VOS05PV05fREVWSUNFLCAiQklPUyBkaXNrICVkIG5vdCBmb3VuZCIsIGRudW0pOw0K K30NCisNCisvKiBHaXZlbiBhIEdSVUItbGlrZSBkZXZpY2UgbmFtZSBhbmQgYSBjb252ZW5pZW50 IGxvY2F0aW9uLCBzdG9yZXMgdGhlIHJlbGF0ZWQNCisgICBCSU9TIGRpc2sgbnVtYmVyLiAgQWNj ZXB0cyBkZXZpY2VzIGxpa2UgXCgoZnxoKWROXCksIHdpdGggMCA8PSBOIDwgMTI4LiAgKi8NCitz dGF0aWMgZ3J1Yl9lcnJfdA0KK3RyeXBhcnNlX2Rpc2tzdHJpbmcgKGNvbnN0IGNoYXIgKnN0ciwg Z3J1Yl91aW50OF90ICpvdXRwdXQpDQorew0KKyAgaWYgKCFzdHIgfHwgMCA9PSAqc3RyKQ0KKyAg ICBnb3RvIGZhaWw7DQorICAvKiBTa2lwIG9wZW5pbmcgcGFyZW4gaW4gb3JkZXIgdG8gYWxsb3cg Ym90aCAoaGQwKSBhbmQgaGQwLiAgKi8NCisgIGlmICgqc3RyID09ICcoJykNCisgICAgc3RyKys7 DQorICBpZiAoKHN0clswXSA9PSAnZicgfHwgc3RyWzBdID09ICdoJykgJiYgc3RyWzFdID09ICdk JykNCisgICAgew0KKyAgICAgIGdydWJfdWludDhfdCBiaW9zX251bSA9IChzdHJbMF0gPT0gJ2gn KT8gMHg4MCA6IDB4MDA7DQorICAgICAgZ3J1Yl9lcnJubyA9IEdSVUJfRVJSX05PTkU7DQorICAg ICAgdW5zaWduZWQgbG9uZyBkcml2ZW51bSA9IGdydWJfc3RydG91bCAoc3RyICsgMiwgMCwgMCk7 DQorICAgICAgaWYgKGdydWJfZXJybm8gIT0gR1JVQl9FUlJfTk9ORSB8fCBkcml2ZW51bSA+IDEy NykNCisgICAgICAgIC8qIE4gbm90IGEgbnVtYmVyIG9yIG91dCBvZiByYW5nZSAqLw0KKyAgICAg ICAgZ290byBmYWlsOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgYmlvc19u dW0gfD0gZHJpdmVudW07DQorICAgICAgICAgIGlmIChvdXRwdXQpDQorICAgICAgICAgICAgKm91 dHB1dCA9IGJpb3NfbnVtOw0KKyAgICAgICAgICByZXR1cm4gR1JVQl9FUlJfTk9ORTsNCisgICAg ICAgIH0NCisgICAgfQ0KKyAgZWxzZSBnb3RvIGZhaWw7DQorDQorZmFpbDoNCisgIHJldHVybiBn cnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsICJkZXZpY2UgZm9ybWF0IFwiJXNcIiBp bnZhbGlkOiBtdXN0Ig0KKyAgICAgICAgICAgICAgICAgICAgICJiZSAoZnxoKWROLCB3aXRoIDAg PD0gTiA8IDEyOCIsIHN0cik7DQorfQ0KKw0KK3N0YXRpYyBncnViX2Vycl90DQorZ3J1Yl9jbWRf ZHJpdmVtYXAgKHN0cnVjdCBncnViX2FyZ19saXN0ICpzdGF0ZSwgaW50IGFyZ2MsIGNoYXIgKiph cmdzKQ0KK3sNCisgIGlmIChzdGF0ZVswXS5zZXQpDQorICAgIHsNCisgICAgICAvKiBTaG93OiBs aXN0IG1hcHBpbmdzLiAgKi8NCisgICAgICBpZiAoIWRyaXZlbWFwKQ0KKyAgICAgICAgZ3J1Yl9w cmludGYgKCJObyBkcml2ZXMgaGF2ZSBiZWVuIHJlbWFwcGVkIik7DQorICAgICAgZWxzZQ0KKyAg ICAgICAgew0KKyAgICAgICAgICBncnViX3ByaW50ZiAoIlNob3dpbmcgb25seSByZW1hcHBlZCBk cml2ZXMuXG4iKTsNCisgICAgICAgICAgZ3J1Yl9wcmludGYgKCJNYXBwZWRcdEdSVUJcbiIpOw0K KyAgICAgICAgICBkcml2ZW1hcF9ub2RlX3QgKmN1cm5vZGUgPSBkcml2ZW1hcDsNCisgICAgICAg ICAgd2hpbGUgKGN1cm5vZGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgY29uc3Qg Y2hhciAqZG5hbWUgPSAwOw0KKyAgICAgICAgICAgICAgZ3J1Yl9lcnJfdCBlcnIgPSByZXZwYXJz ZV9iaW9zZGlzayAoY3Vybm9kZS0+cmVkaXJ0bywgJmRuYW1lKTsNCisgICAgICAgICAgICAgIGlm IChlcnIgIT0gR1JVQl9FUlJfTk9ORSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIGdydWJfZXJy b3IgKGVyciwgImludmFsaWQgbWFwcGluZzogbm9uLWV4aXN0ZW50IGRpc2siDQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBub3QgbWFuYWdlZCBieSB0aGUgQklP UyIpOw0KKyAgICAgICAgICAgICAgZ3J1Yl9wcmludGYoIjB4JTAyeFx0JTRzXG4iLCBjdXJub2Rl LT5uZXdkcml2ZSwgZG5hbWUpOw0KKyAgICAgICAgICAgICAgY3Vybm9kZSA9IGN1cm5vZGUtPm5l eHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICBlbHNlIGlmIChzdGF0 ZVsxXS5zZXQpDQorICAgIHsNCisgICAgICAvKiBSZXNldDoganVzdCBkZWxldGUgYWxsIG1hcHBp bmdzLCBmcmVlaW5nIHRoZWlyIG1lbW9yeS4gICovDQorICAgICAgZHJpdmVtYXBfbm9kZV90ICpj dXJub2RlID0gZHJpdmVtYXA7DQorICAgICAgZHJpdmVtYXBfbm9kZV90ICpwcmV2bm9kZSA9IDA7 DQorICAgICAgd2hpbGUgKGN1cm5vZGUpDQorICAgICAgICB7DQorICAgICAgICAgIHByZXZub2Rl ID0gY3Vybm9kZTsNCisgICAgICAgICAgY3Vybm9kZSA9IGN1cm5vZGUtPm5leHQ7DQorICAgICAg ICAgIGdydWJfZnJlZSAocHJldm5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIGRyaXZlbWFwID0g MDsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgLyogTmVpdGhlciBmbGFnOiBwdXQg bWFwcGluZyAqLw0KKyAgICAgIGdydWJfdWludDhfdCBtYXBmcm9tID0gMDsNCisgICAgICBncnVi X3VpbnQ4X3QgbWFwdG8gPSAweEZGOw0KKyAgICAgIGdydWJfZXJyX3QgZXJyOw0KKyAgICAgIA0K KyAgICAgIGlmIChhcmdjICE9IDIpDQorICAgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9F UlJfQkFEX0FSR1VNRU5ULCAidHdvIGFyZ3VtZW50cyByZXF1aXJlZCIpOw0KKw0KKyAgICAgIGVy ciA9IHBhcnNlX2Jpb3NkaXNrIChhcmdzWzBdLCAmbWFwZnJvbSk7DQorICAgICAgaWYgKGVyciAh PSBHUlVCX0VSUl9OT05FKQ0KKyAgICAgICAgcmV0dXJuIGVycjsNCisNCisgICAgICBlcnIgPSB0 cnlwYXJzZV9kaXNrc3RyaW5nIChhcmdzWzFdLCAmbWFwdG8pOw0KKyAgICAgIGlmIChlcnIgIT0g R1JVQl9FUlJfTk9ORSkgLyogTm90IGEgZGlzayBzdHJpbmcuIE1heWJlIGEgcmF3IG51bSB0aGVu PyAgKi8NCisgICAgICAgIHsgICAgDQorICAgICAgICAgIGdydWJfZXJybm8gPSBHUlVCX0VSUl9O T05FOw0KKyAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bSA9IGdydWJfc3RydG91bCAoYXJnc1sx XSwgMCwgMCk7DQorICAgICAgICAgIGlmIChncnViX2Vycm5vICE9IEdSVUJfRVJSX05PTkUgfHwg bnVtID4gMHhGRikgIC8qIE5vdCBhIHJhdyBudW0gb3IgdG9vIGhpZ2guICAqLw0KKyAgICAgICAg ICAgIHJldHVybiBncnViX2Vycm9yIChncnViX2Vycm5vLA0KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJUYXJnZXQgc3BlY2lmaWVyIG11c3QgYmUgb2YgdGhlIGZvcm0gKGZkTikgb3Ig Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoaGROKSwgd2l0aCAwIDw9IE4gPCAx Mjg7IG9yIGEgcGxhaW4gZGVjL2hleCAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Im51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NSIpOw0KKyAgICAgICAgICBlbHNlIG1hcHRvID0gKGdy dWJfdWludDhfdCludW07DQorICAgICAgICB9DQorICAgICAgDQorICAgICAgaWYgKG1hcHRvID09 IG1hcGZyb20pICAvKiBSZXNldCB0byBkZWZhdWx0LiAgKi8NCisgICAgICAgIHsNCisgICAgICAg ICAgZ3J1Yl9kcHJpbnRmIChNT0ROQU1FLCAiUmVtb3ZpbmcgdGhlIG1hcHBpbmcgZm9yICVzICgl MDJ4KSIsIGFyZ3NbMF0sIG1hcGZyb20pOw0KKyAgICAgICAgICBkcml2ZW1hcF9yZW1vdmUgKG1h cGZyb20pOw0KKyAgICAgICAgfQ0KKyAgICAgIGVsc2UgIC8qIE1hcC4gICovDQorICAgICAgICB7 DQorICAgICAgICAgIGdydWJfZHByaW50ZiAoTU9ETkFNRSwgIk1hcHBpbmcgJXMgKCUwMngpIHRv ICUwMnhcbiIsIGFyZ3NbMF0sIG1hcGZyb20sIG1hcHRvKTsNCisgICAgICAgICAgcmV0dXJuIGRy aXZlbWFwX3NldCAoKGdydWJfdWludDhfdCltYXB0bywgbWFwZnJvbSk7DQorICAgICAgICB9DQor ICAgIH0NCisNCisgIHJldHVybiBHUlVCX0VSUl9OT05FOw0KK30NCisNCit0eXBlZGVmIHN0cnVj dCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW50MTNtYXBfbm9kZQ0KK3sNCisgIGdydWJfdWlu dDhfdCBkaXNrbnVtOw0KKyAgZ3J1Yl91aW50OF90IG1hcHRvOw0KK30gaW50MTNtYXBfbm9kZV90 Ow0KKw0KKy8qIFRoZSBtaW4gYW1vdW50IG9mIG1lbSB0aGF0IG11c3QgcmVtYWluIGZyZWUgYWZ0 ZXIgaW5zdGFsbGluZyB0aGUgaGFuZGxlci4NCisgICAzMiBLaUIgaXMganVzdCBhYm92ZSAweDdD MDAtMHg3RTAwLCB3aGVyZSB0aGUgYm9vdHNlY3RvciBpcyBsb2FkZWQuICAqLw0KKyNkZWZpbmUg TUlOX0ZSRUVfTUVNX0tCIDMyDQorI2RlZmluZSBJTlQxM0hfT0ZGU0VUKHgpICggKChncnViX3Vp bnQ4X3QqKSh4KSkgLSAoKGdydWJfdWludDhfdCopJmdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxl cl9iYXNlKSApDQorI2RlZmluZSBJTlQxM0hfUkVCQVNFKHgpICggKHZvaWQqKSAoKChncnViX3Vp bnQ4X3QqKWhhbmRsZXJfYmFzZSkgKyAoeCkpICkNCisjZGVmaW5lIElOVDEzSF9UT05FV0FERFIo eCkgSU5UMTNIX1JFQkFTRSggSU5UMTNIX09GRlNFVCggeCApICkNCisNCisvKiBJbnQxM2ggaGFu ZGxlciBpbnN0YWxsZXIgLSByZXNlcnZlcyBjb252ZW50aW9uYWwgbWVtb3J5IGZvciB0aGUgaGFu ZGxlciwNCisgICBjb3BpZXMgaXQgb3ZlciBhbmQgc2V0cyB0aGUgSVZUIGVudHJ5IGZvciBpbnQx M2guICANCisgICBUaGlzIGNvZGUgcmVzdHMgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBHUlVCIGRv ZXMgbm90IGFjdGl2YXRlIGFueSBraW5kIG9mDQorICAgbWVtb3J5IG1hcHBpbmcgYXBhcnQgZnJv bSBpZGVudGl0eSBwYWdpbmcsIHNpbmNlIGl0IGFjY2Vzc2VzIHJlYWxtb2RlDQorICAgc3RydWN0 dXJlcyBieSB0aGVpciBhYnNvbHV0ZSBhZGRyZXNzZXMsIGxpa2UgdGhlIElWVCBhdCAwIG9yIHRo ZSBCREEgYXQNCisgICAweDQwMDsgYW5kIHRyYW5zZm9ybXMgYSBwbW9kZSBwb2ludGVyIGludG8g YSBybW9kZSBzZWc6b2ZmIGZhciBwdHIuICAqLw0KK3N0YXRpYyBncnViX2Vycl90DQoraW5zdGFs bF9pbnQxM19oYW5kbGVyICh2b2lkKQ0KK3sNCisgIGdydWJfc2l6ZV90IGVudHJpZXMgPSAwOw0K KyAgZHJpdmVtYXBfbm9kZV90ICpjdXJlbnRyeSA9IGRyaXZlbWFwOw0KKyAgd2hpbGUgKGN1cmVu dHJ5KSAgLyogQ291bnQgZW50cmllcyB0byBwcmVwYXJlIGEgY29udGlndW91cyBtYXAgYmxvY2su ICAqLw0KKyAgICB7DQorICAgICAgZW50cmllcysrOw0KKyAgICAgIGN1cmVudHJ5ID0gY3VyZW50 cnktPm5leHQ7DQorICAgIH0NCisgIGlmICgwID09IGVudHJpZXMpDQorICAgIHsNCisgICAgICBn cnViX2RwcmludGYgKE1PRE5BTUUsICJObyBkcml2ZXMgbWFya2VkIGFzIHJlbWFwcGVkLCBpbnN0 YWxsYXRpb24gb2YiDQorICAgICAgICAgICAgICAgICAgImFuIGludDEzaCBoYW5kbGVyIGlzIG5v dCByZXF1aXJlZC4iKTsNCisgICAgICByZXR1cm4gR1JVQl9FUlJfTk9ORTsgIC8qIE5vIG5lZWQg dG8gaW5zdGFsbCB0aGUgaW50MTNoIGhhbmRsZXIuICAqLw0KKyAgICB9DQorICBlbHNlDQorICAg IHsNCisgICAgICBncnViX2RwcmludGYgKE1PRE5BTUUsICJJbnN0YWxsaW5nIGludDEzaCBoYW5k bGVyLi4uXG4iKTsNCisgICAgICBncnViX3VpbnQzMl90ICppdnRzbG90ID0gKGdydWJfdWludDMy X3QqKTB4MDAwMDAwNGM7DQorICAgICAgDQorICAgICAgLyogU2F2ZSB0aGUgcG9pbnRlciB0byB0 aGUgb2xkIGludDEzaCBoYW5kbGVyLiAgKi8NCisgICAgICBncnViX2RyaXZlbWFwX2ludDEzX29s ZGhhbmRsZXIgPSAqaXZ0c2xvdDsNCisgICAgICBncnViX2RwcmludGYgKE1PRE5BTUUsICJPbGQg aW50MTMgaGFuZGxlciBhdCAlMDR4OiUwNHhcbiIsDQorICAgICAgICAgICAgICAgICAgKGdydWJf ZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlciA+PiAxNikgJiAweDBmZmZmLA0KKyAgICAgICAgICAg ICAgICAgIGdydWJfZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlciAmIDB4MGZmZmYpOw0KKw0KKyAg ICAgIC8qIFJlc2VydmUgYSBzZWN0aW9uIG9mIGNvbnZlbnRpb25hbCBtZW1vcnkgYXMgIkJJT1Mg bWVtb3J5IiBmb3IgaGFuZGxlcjoNCisgICAgICAgICBCREEgb2Zmc2V0IDB4MTMgY29udGFpbnMg dGhlIHRvcCBvZiBzdWNoIG1lbW9yeS4gICovDQorICAgICAgZ3J1Yl91aW50MTZfdCAqYnBhX2Zy ZWVrYiA9IChncnViX3VpbnQxNl90KikweDAwMDAwNDEzOw0KKyAgICAgIGdydWJfZHByaW50ZiAo TU9ETkFNRSwgIlRvcCBvZiBjb252ZW50aW9uYWwgbWVtb3J5OiAldSBLaUJcbiIsICpicGFfZnJl ZWtiKTsNCisgICAgICBncnViX3NpemVfdCB0b3RhbF9zaXplID0gZ3J1Yl9kcml2ZW1hcF9pbnQx M19zaXplDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGVudHJpZXMgKyAxKSAqIHNp emVvZihpbnQxM21hcF9ub2RlX3QpOw0KKyAgICAgIGdydWJfdWludDE2X3QgcGF5bG9hZF9zaXpl a2IgPSAodG90YWxfc2l6ZSA+PiAxMCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgoKHRvdGFsX3NpemUgJSAxMDI0KSA9PSAwKSA/IDAgOiAxKTsNCisgICAgICBpZiAo KCpicGFfZnJlZWtiIC0gcGF5bG9hZF9zaXpla2IpIDwgTUlOX0ZSRUVfTUVNX0tCKQ0KKyAgICAg ICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksICJyZWZ1c2luZyB0 byBpbnN0YWxsIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQxMyBoYW5kbGVyLCBu b3QgZW5vdWdoIGZyZWUgbWVtb3J5IGFmdGVyIik7DQorICAgICAgZ3J1Yl9kcHJpbnRmIChNT0RO QU1FLCAiUGF5bG9hZCBpcyAldSBiIGxvbmcsIHJlc2VydmluZyAldSBLYlxuIiwNCisJCQkJCXRv dGFsX3NpemUsIHBheWxvYWRfc2l6ZWtiKTsNCisgICAgICAqYnBhX2ZyZWVrYiAtPSBwYXlsb2Fk X3NpemVrYjsNCisNCisgICAgICAvKiBDb3B5IGludDEzaCBoYW5kbGVyIGNodW5rIHRvIHJlc2Vy dmVkIGFyZWEuICAqLw0KKyAgICAgIGdydWJfdWludDhfdCAqaGFuZGxlcl9iYXNlID0gKGdydWJf dWludDhfdCopKCpicGFfZnJlZWtiIDw8IDEwKTsNCisgICAgICBncnViX2RwcmludGYgKE1PRE5B TUUsICJDb3B5aW5nIGludDEzIGhhbmRsZXIgdG86ICVwXG4iLCBoYW5kbGVyX2Jhc2UpOw0KKyAg ICAgIGdydWJfbWVtY3B5IChoYW5kbGVyX2Jhc2UsICZncnViX2RyaXZlbWFwX2ludDEzX2hhbmRs ZXJfYmFzZSwNCisgICAgICAgICAgICAgICAgICAgZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXplKTsN CisNCisgICAgICAvKiBDb3B5IHRoZSBtYXBwaW5ncyB0byB0aGUgcmVzZXJ2ZWQgYXJlYS4gICov DQorICAgICAgY3VyZW50cnkgPSBkcml2ZW1hcDsNCisgICAgICBncnViX3NpemVfdCBpOw0KKyAg ICAgIGludDEzbWFwX25vZGVfdCAqaGFuZGxlcl9tYXAgPSAoaW50MTNtYXBfbm9kZV90KikNCisg ICAgICAgICAgICAgICAgICAgICAgSU5UMTNIX1RPTkVXQUREUiAoJmdydWJfZHJpdmVtYXBfaW50 MTNfbWFwc3RhcnQpOw0KKyAgICAgIGdydWJfZHByaW50ZiAoTU9ETkFNRSwgIlRhcmdldCBtYXAg YXQgJXAsIGNvcHlpbmcgbWFwcGluZ3MuLi5cbiIsIGhhbmRsZXJfbWFwKTsNCisgICAgICBmb3Ig KGkgPSAwOyBpIDwgZW50cmllcyAmJiBjdXJlbnRyeTsgaSsrLCBjdXJlbnRyeSA9IGN1cmVudHJ5 LT5uZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBoYW5kbGVyX21hcFtpXS5kaXNrbnVtID0g Y3VyZW50cnktPm5ld2RyaXZlOw0KKyAgICAgICAgICBoYW5kbGVyX21hcFtpXS5tYXB0byA9IGN1 cmVudHJ5LT5yZWRpcnRvOw0KKyAgICAgICAgICBncnViX2RwcmludGYgKE1PRE5BTUUsICJcdCMl ZDogMHglMDJ4IDwtIDB4JTAyeFxuIiwgaSwNCisJCQkJCQloYW5kbGVyX21hcFtpXS5kaXNrbnVt LCBoYW5kbGVyX21hcFtpXS5tYXB0byk7DQorICAgICAgICB9DQorICAgICAgLyogU2lnbmFsIGVu ZC1vZi1tYXAuICAqLw0KKyAgICAgIGhhbmRsZXJfbWFwW2ldLmRpc2tudW0gPSAwOw0KKyAgICAg IGhhbmRsZXJfbWFwW2ldLm1hcHRvID0gMDsNCisgICAgICBncnViX2RwcmludGYgKE1PRE5BTUUs ICJcdCMlZDogMHglMDJ4IDwtIDB4JTAyeCAoZW5kKVxuIiwgaSwNCisJCQkJCWhhbmRsZXJfbWFw W2ldLmRpc2tudW0sIGhhbmRsZXJfbWFwW2ldLm1hcHRvKTsNCisNCisgICAgICAvKiBJbnN0YWxs IG91ciBmdW5jdGlvbiBhcyB0aGUgaW50MTNoIGhhbmRsZXIgaW4gdGhlIElWVC4gICovDQorICAg ICAgZ3J1Yl91aW50MzJfdCBpdnRlbnRyeSA9ICgoZ3J1Yl91aW50MzJfdCloYW5kbGVyX2Jhc2Up IDw8IDEyOyAvKiBTZWdtZW50IGFkZHJlc3MuICAqLw0KKyAgICAgIGl2dGVudHJ5IHw9IChncnVi X3VpbnQxNl90KSBJTlQxM0hfT0ZGU0VUKGdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcik7DQor ICAgICAgZ3J1Yl9kcHJpbnRmIChNT0ROQU1FLCAiTmV3IGludDEzIGhhbmRsZXIgSVZUIHBvaW50 ZXI6ICUwNHg6JTA0eFxuIiwNCisgICAgICAgICAgICAgICAgICAoaXZ0ZW50cnkgPj4gMTYpICYg MHgwZmZmZiwgaXZ0ZW50cnkgJiAweDBmZmZmKTsNCisgICAgICAqaXZ0c2xvdCA9IGl2dGVudHJ5 Ow0KKyAgICAgIA0KKyAgICAgIHJldHVybiBHUlVCX0VSUl9OT05FOw0KKyAgICB9DQorfQ0KKw0K K0dSVUJfTU9EX0lOSVQgKGRyaXZlbWFwKQ0KK3sNCisgICh2b2lkKSBtb2Q7CQkJLyogU3RvcCB3 YXJuaW5nLiAgKi8NCisgIGdydWJfcmVnaXN0ZXJfY29tbWFuZCAoTU9ETkFNRSwgZ3J1Yl9jbWRf ZHJpdmVtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEdSVUJfQ09NTUFORF9GTEFHX0JP VEgsDQorCQkJICAgICAgICAgICAgICAgICAgIE1PRE5BTUUgIiAtcyB8IC1yIHwgKGhkWCkgbmV3 ZHJpdmVudW0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiTWFuYWdlIHRoZSBCSU9TIGRy aXZlIG1hcHBpbmdzIiwgb3B0aW9ucyk7DQorICBpbnN0aGFuZGxlcl9ob29rID0gZ3J1Yl9sb2Fk ZXJfcmVnaXN0ZXJfcHJlYm9vdCAoJmluc3RhbGxfaW50MTNfaGFuZGxlciwgMSk7DQorfQ0KKw0K K0dSVUJfTU9EX0ZJTkkgKGRyaXZlbWFwKQ0KK3sNCisgIGdydWJfbG9hZGVyX3VucmVnaXN0ZXJf cHJlYm9vdCAoaW5zdGhhbmRsZXJfaG9vayk7DQorICBpbnN0aGFuZGxlcl9ob29rID0gMDsNCisg IGdydWJfdW5yZWdpc3Rlcl9jb21tYW5kIChNT0ROQU1FKTsNCit9DQorDQpJbmRleDogY29tbWFu ZHMvaTM4Ni9wYy9kcml2ZW1hcF9pbnQxM2guUw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGNvbW1hbmRzL2kz ODYvcGMvZHJpdmVtYXBfaW50MTNoLlMJKHJldmlzacOzbjogMCkNCisrKyBjb21tYW5kcy9pMzg2 L3BjL2RyaXZlbWFwX2ludDEzaC5TCShyZXZpc2nDs246IDApDQpAQCAtMCwwICsxLDExOCBAQA0K Ky8qDQorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXINCisgKiAgQ29weXJp Z2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNSwyMDA2LDIwMDcsMjAwOCBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqICBHUlVCIGlzIGZyZWUgc29mdHdh cmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiAgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkNCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBv ZiB0aGUgTGljZW5zZSwgb3INCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4NCisgKg0KKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBh bG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uDQorICovDQorDQorDQorLyoNCisgKiBOb3RlOiBUaGVzZSBmdW5jdGlvbnMgZGVmaW5lZCBp biB0aGlzIGZpbGUgbWF5IGJlIGNhbGxlZCBmcm9tIEMuDQorICogICAgICAgQmUgY2FyZWZ1bCBv ZiB0aGF0IHlvdSBtdXN0IG5vdCBtb2RpZnkgc29tZSByZWdpc3RlcnMuIFF1b3RlDQorICogICAg ICAgZnJvbSBnY2MtMi45NS4yL2djYy9jb25maWcvaTM4Ni9pMzg2Lmg6DQorDQorICAgMSBmb3Ig cmVnaXN0ZXJzIG5vdCBhdmFpbGFibGUgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzLg0KKyAgIFRoZXNl IG11c3QgaW5jbHVkZSB0aGUgRklYRURfUkVHSVNURVJTIGFuZCBhbHNvIGFueQ0KKyAgIHJlZ2lz dGVycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYmVpbmcgc2F2ZWQuDQorICAgVGhlIGxhdHRl ciBtdXN0IGluY2x1ZGUgdGhlIHJlZ2lzdGVycyB3aGVyZSB2YWx1ZXMgYXJlIHJldHVybmVkDQor ICAgYW5kIHRoZSByZWdpc3RlciB3aGVyZSBzdHJ1Y3R1cmUtdmFsdWUgYWRkcmVzc2VzIGFyZSBw YXNzZWQuDQorICAgQXNpZGUgZnJvbSB0aGF0LCB5b3UgY2FuIGluY2x1ZGUgYXMgbWFueSBvdGhl ciByZWdpc3RlcnMgYXMgeW91IGxpa2UuDQorDQorICBheCxkeCxjeCxieCxzaSxkaSxicCxzcCxz dCxzdDEsc3QyLHN0MyxzdDQsc3Q1LHN0NixzdDcsYXJnDQoreyAgMSwgMSwgMSwgMCwgMCwgMCwg MCwgMSwgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxIH0NCisgKi8NCisNCisvKg0K KyAqIE5vdGU6IEdSVUIgaXMgY29tcGlsZWQgd2l0aCB0aGUgb3B0aW9ucyAtbXJ0ZCBhbmQgLW1y ZWdwYXJtPTMuDQorICogICAgICAgU28gdGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhcmUgcGFz c2VkIGluICVlYXgsICVlZHgsIGFuZCAlZWN4LA0KKyAqICAgICAgIHJlc3BlY3RpdmVseSwgYW5k IGlmIGEgZnVuY3Rpb24gaGFzIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cw0KKyAqICAgICAg IGFuZCB0aGUgbnVtYmVyIGlmIGdyZWF0ZXIgdGhhbiB0aHJlZSwgdGhlIGZ1bmN0aW9uIG11c3Qg cmV0dXJuDQorICogICAgICAgd2l0aCAicmV0ICROIiB3aGVyZSBOIGlzICgodGhlIG51bWJlciBv ZiBhcmd1bWVudHMpIC0gMykgKiA0Lg0KKyAqLw0KKw0KKyNpbmNsdWRlIDxncnViL3N5bWJvbC5o Pg0KKw0KKyNkZWZpbmUgR1JVQl9EUklWRU1BUF9JTlQxM0hfT0ZGU0VUKHgpICgoeCkgLSBncnVi X2RyaXZlbWFwX2ludDEzX2hhbmRsZXJfYmFzZSkNCisNCisvKiBDb3B5IHN0YXJ0cyBoZXJlLiBX aGVuIGRlcGxveWVkLCB0aGlzIGxhYmVsIG11c3QgYmUgc2VnbWVudC1hbGlnbmVkICovDQorVkFS SUFCTEUoZ3J1Yl9kcml2ZW1hcF9pbnQxM19oYW5kbGVyX2Jhc2UpDQorDQorVkFSSUFCTEUoZ3J1 Yl9kcml2ZW1hcF9pbnQxM19vbGRoYW5kbGVyKQ0KKyAgLndvcmQgMHhkZWFkLCAweGJlZWYNCisv KiBEcml2ZW1hcCBtb2R1bGUgLSBJTlQgMTNoIGhhbmRsZXIgLSBCSU9TIEhEIG1hcCAqLw0KKy8q IFdlIG5lZWQgdG8gdXNlIHJlbGF0aXZlIGFkZHJlc3NpbmcsIGFuZCB3aXRoIENTIHRvIHRvcCBp dCBhbGwsIHNpbmNlIHdlDQorICAgbXVzdCBtYWtlIGFzIGZldyBjaGFuZ2VzIHRvIHRoZSByZWdp c3RlcnMgYXMgcG9zc2libGUuICBJUC1yZWxhdGl2ZQ0KKyAgIGFkZHJlc3NpbmcgbGlrZSBvbiBh bWQ2NCB3b3VsZCBtYWtlIGxpZmUgd2F5IGVhc2llciBoZXJlLiAqLw0KKy5jb2RlMTYNCitGVU5D VElPTihncnViX2RyaXZlbWFwX2ludDEzX2hhbmRsZXIpDQorICBwdXNoICVicA0KKyAgbW92ICVz cCwgJWJwDQorICBwdXNoICVheCAgLyogV2UnbGwgbmVlZCBpdCBsYXRlciB0byBkZXRlcm1pbmUg dGhlIHVzZWQgQklPUyBmdW5jdGlvbiAqLw0KKw0KKyAgLyogTWFwIHRoZSBkcml2ZSBudW1iZXIg KGFsd2F5cyBpbiBETD8pICovDQorICBwdXNoICVheA0KKyAgcHVzaCAlYngNCisgIHB1c2ggJXNp DQorICBtb3YgJEdSVUJfRFJJVkVNQVBfSU5UMTNIX09GRlNFVChncnViX2RyaXZlbWFwX2ludDEz X21hcHN0YXJ0KSwgJWJ4DQorICB4b3IgJXNpLCAlc2kNCisxOm1vdncgJWNzOiglYngsJXNpKSwg JWF4DQorICBjbXAgJWFoLCAlYWwNCisgIGp6IDNmIC8qIERSVj1EU1QgPT4gbWFwIGVuZCAtIGRy aXZlIG5vdCByZW1hcHBlZCwgbGVhdmUgREwgYXMtaXMgKi8NCisgIGNtcCAlZGwsICVhbA0KKyAg anogMmYgLyogRm91bmQgLSBkcml2ZSByZW1hcHBlZCwgbW9kaWZ5IERMICovDQorICBhZGQgJDIs ICVzaQ0KKyAgam1wIDFiIC8qIE5vdCBmb3VuZCwgYnV0IG1vcmUgcmVtYWluaW5nLCBsb29wICAq Lw0KKzI6bW92ICVhaCwgJWRsDQorMzpwb3AgJXNpDQorICBwb3AgJWJ4DQorICB4Y2hndyAlYXgs IC00KCVicCkgLyogUmVjb3ZlciB0aGUgb2xkIEFYIGFuZCBzYXZlIHRoZSBtYXAgZW50cnkgZm9y IGxhdGVyICovDQorICANCisgIHB1c2ggJWJwDQorICAvKiBTaW11bGF0ZSBpbnRlcnJ1cHQgY2Fs bDogcHVzaCBmbGFncyBhbmQgZG8gYSBmYXIgY2FsbCBpbiBvcmRlciB0byBzZXQNCisgICAgIHRo ZSBzdGFjayB0aGUgd2F5IHRoZSBvbGQgaGFuZGxlciBleHBlY3RzIGl0IHNvIHRoYXQgaXRzIGly ZXQgd29ya3MgKi8NCisgIHB1c2ggNiglYnApDQorICBtb3Z3ICglYnApLCAlYnAgIC8qIFJlc3Rv cmUgdGhlIGNhbGxlciBCUCAoaXMgdGhpcyBuZWVkZWQgYW5kL29yIHNlbnNpYmxlPykgKi8NCisg IGxjYWxsIColY3M6R1JVQl9EUklWRU1BUF9JTlQxM0hfT0ZGU0VUKGdydWJfZHJpdmVtYXBfaW50 MTNfb2xkaGFuZGxlcikNCisgIHBvcCAlYnAgLyogVGhlIHB1c2hlZCBmbGFncyB3ZXJlIHJlbW92 ZWQgYnkgaXJldCAqLw0KKyAgLyogU2V0IHRoZSBzYXZlZCBmbGFncyB0byB3aGF0IHRoZSBpbnQx M2ggaGFuZGxlciByZXR1cm5lZCAqLw0KKyAgcHVzaCAlYXgNCisgIHB1c2hmDQorICBwb3AgJWF4 DQorICBtb3Z3ICVheCwgNiglYnApDQorICBwb3AgJWF4DQorDQorICAvKiBSZXZlcnNlIG1hcCBh bnkgcmV0dXJuZWQgZHJpdmUgbnVtYmVyIGlmIHRoZSBkYXRhIHJldHVybmVkIGluY2x1ZGVzIGl0 LiAgDQorICAgICBUaGUgb25seSBmdW5jIHRoYXQgZG9lcyB0aGlzIHNlZW1zIHRvIGJlIG9yaWdB SCA9IDB4MDgsIGJ1dCBtYW55IEJJT1MNCisgICAgIHJlZnMgc2F5IHJldERMID0gIyBvZiBkcml2 ZXMgY29ubmVjdGVkLiAgSG93ZXZlciwgdGhlIEdSVUIgTGVnYWN5IGNvZGUNCisgICAgIHRyZWF0 cyB0aGlzIGFzIHRoZSBfZHJpdmUgbnVtYmVyXyBhbmQgInVuZG9lcyIgdGhlIHJlbWFwcGluZy4g IFRodXMsDQorICAgICB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gZGlzYWJsZWQgZm9yIHRlc3Rpbmcg aWYgaXQncyByZXF1aXJlZCAqLw0KKyMgIGNtcGIgJDB4MDgsIC0xKCVicCkgLyogQ2FsbGVyJ3Mg QUggKi8NCisjICBqbmUgNGYNCisjICB4Y2hndyAlYXgsIC00KCVicCkgLyogTWFwIGVudHJ5IHVz ZWQgKi8NCisjICBjbXAgJWFoLCAlYWwgIC8qIERSVj1EU1QgPT4gZHJpdmUgbm90IHJlbWFwcGVk ICovDQorIyAgamUgNGYNCisjICBtb3YgJWFoLCAlZGwgIC8qIFVuZG8gcmVtYXAgKi8NCisNCis0 Om1vdiAlYnAsICVzcA0KKyAgcG9wICVicA0KKyAgaXJldA0KKy8qIFRoaXMgbGFiZWwgTVVTVCBi ZSBhdCB0aGUgZW5kIG9mIHRoZSBjb3BpZWQgYmxvY2ssIHNpbmNlIHRoZSBpbnN0YWxsZXIgY29k ZQ0KKyAgIHJlc2VydmVzIGFkZGl0aW9uYWwgc3BhY2UgZm9yIG1hcHBpbmdzIGF0IHJ1bnRpbWUg YW5kIGNvcGllcyB0aGVtIG92ZXIgaXQgKi8NCisuYWxpZ24gMg0KK1ZBUklBQkxFKGdydWJfZHJp dmVtYXBfaW50MTNfbWFwc3RhcnQpDQorLyogQ29weSBzdG9wcyBoZXJlICovDQorLmNvZGUzMg0K K1ZBUklBQkxFKGdydWJfZHJpdmVtYXBfaW50MTNfc2l6ZSkNCisgIC53b3JkIEdSVUJfRFJJVkVN QVBfSU5UMTNIX09GRlNFVChncnViX2RyaXZlbWFwX2ludDEzX3NpemUpDQorDQpJbmRleDogY29u Zi9pMzg2LXBjLnJtaw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGNvbmYvaTM4Ni1wYy5ybWsJKHJldmlzacOz bjogMTc2NikNCisrKyBjb25mL2kzODYtcGMucm1rCShjb3BpYSBkZSB0cmFiYWpvKQ0KQEAgLTE1 OCw3ICsxNTgsNyBAQA0KIAl2YmUubW9kIHZiZXRlc3QubW9kIHZiZWluZm8ubW9kIHZpZGVvLm1v ZCBnZnh0ZXJtLm1vZCBcDQogCXZpZGVvdGVzdC5tb2QgcGxheS5tb2QgYml0bWFwLm1vZCB0Z2Eu bW9kIGNwdWlkLm1vZCBzZXJpYWwubW9kCVwNCiAJYXRhLm1vZCB2Z2EubW9kIG1lbWRpc2subW9k IGpwZWcubW9kIHBuZy5tb2QgcGNpLm1vZCBsc3BjaS5tb2QgXA0KLQlhb3V0Lm1vZCBfYnNkLm1v ZCBic2QubW9kDQorCWFvdXQubW9kIF9ic2QubW9kIGJzZC5tb2QgZHJpdmVtYXAubW9kDQogDQog IyBGb3IgYmlvc2Rpc2subW9kLg0KIGJpb3NkaXNrX21vZF9TT1VSQ0VTID0gZGlzay9pMzg2L3Bj L2Jpb3NkaXNrLmMNCkBAIC0zMjUsNCArMzI1LDExIEBADQogYnNkX21vZF9DRkxBR1MgPSAkKENP TU1PTl9DRkxBR1MpDQogYnNkX21vZF9MREZMQUdTID0gJChDT01NT05fTERGTEFHUykNCiANCisj IEZvciBkcml2ZW1hcC5tb2QuDQorZHJpdmVtYXBfbW9kX1NPVVJDRVMgPSBjb21tYW5kcy9pMzg2 L3BjL2RyaXZlbWFwLmMgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMvaTM4Ni9w Yy9kcml2ZW1hcF9pbnQxM2guUw0KK2RyaXZlbWFwX21vZF9BU0ZMQUdTID0gJChDT01NT05fQVNG TEFHUykNCitkcml2ZW1hcF9tb2RfQ0ZMQUdTID0gJChDT01NT05fQ0ZMQUdTKQ0KK2RyaXZlbWFw X21vZF9MREZMQUdTID0gJChDT01NT05fTERGTEFHUykNCisNCiBpbmNsdWRlICQoc3JjZGlyKS9j b25mL2NvbW1vbi5taw0KSW5kZXg6IGluY2x1ZGUvZ3J1Yi9sb2FkZXIuaA0KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K LS0tIGluY2x1ZGUvZ3J1Yi9sb2FkZXIuaAkocmV2aXNpw7NuOiAxNzY2KQ0KKysrIGluY2x1ZGUv Z3J1Yi9sb2FkZXIuaAkoY29waWEgZGUgdHJhYmFqbykNCkBAIC0zNyw2ICszNywyMiBAQA0KIC8q IFVuc2V0IGN1cnJlbnQgbG9hZGVyLCBpZiBhbnkuICAqLw0KIHZvaWQgRVhQT1JUX0ZVTkMoZ3J1 Yl9sb2FkZXJfdW5zZXQpICh2b2lkKTsNCiANCit0eXBlZGVmIHN0cnVjdCBob29rbGlzdF9ub2Rl ICpncnViX3ByZWJvb3RfaG9va2lkOw0KKw0KKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUg Y2FsbGVkIGJlZm9yZSB0aGUgYm9vdCBob29rLiAgUmV0dXJucyBhbiBpZCB0aGF0DQorICAgY2Fu IGJlIGxhdGVyIHVzZWQgdG8gdW5yZWdpc3RlciB0aGUgcHJlYm9vdCAoaS5lLiBvbiBtb2R1bGUg dW5sb2FkKS4gIElmDQorICAgYWJvcnRfb25fZXJyb3IgaXMgc2V0LCB0aGUgYm9vdCBzZXF1ZW5j ZSB3aWxsIGFib3J0IGlmIGFueSBvZiB0aGUgcmVnaXN0ZXJlZA0KKyAgIGZ1bmN0aW9ucyByZXR1 cm4gYW55dGhpbmcgZWxzZSB0aGFuIEdSVUJfRVJSX05PTkUuDQorICAgT24gZXJyb3IsIHRoZSBy ZXR1cm4gdmFsdWUgd2lsbCBjb21wYXJlIGVxdWFsIHRvIDAgYW5kIHRoZSBlcnJvciBpbmZvcm1h dGlvbg0KKyAgIHdpbGwgYmUgYXZhaWxhYmxlIGluIGVycm5vIGFuZCBlcnJtc2cuICBIb3dldmVy LCBpZiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsDQorICAgdGhvc2UgdmFyaWFibGVzIGFyZSBfbm90 XyBtb2RpZmllZC4gKi8NCitncnViX3ByZWJvb3RfaG9va2lkIEVYUE9SVF9GVU5DKGdydWJfbG9h ZGVyX3JlZ2lzdGVyX3ByZWJvb3QpDQorICAgICAgICAgICAoZ3J1Yl9lcnJfdCAoKmhvb2spICh2 b2lkKSwgaW50IGFib3J0X29uX2Vycm9yKTsNCisNCisvKiBVbnJlZ2lzdGVyIGEgcHJlYm9vdCBo b29rIGJ5IHRoZSBpZCByZXR1cm5lZCBieSBsb2FkZXJfcmVnaXN0ZXJfcHJlYm9vdC4NCisgICBU aGlzIGZ1bmN0aW9ucyBiZWNvbWVzIGEgbm8tb3AgaWYgbm8gc3VjaCBmdW5jdGlvbiBpcyByZWdp c3RlcmVkICovDQordm9pZCBFWFBPUlRfRlVOQyhncnViX2xvYWRlcl91bnJlZ2lzdGVyX3ByZWJv b3QpIChncnViX3ByZWJvb3RfaG9va2lkIGlkKTsNCisNCiAvKiBDYWxsIHRoZSBib290IGhvb2sg aW4gY3VycmVudCBsb2FkZXIuIFRoaXMgbWF5IG9yIG1heSBub3QgcmV0dXJuLA0KICAgIGRlcGVu ZGluZyBvbiB0aGUgc2V0dGluZyBieSBncnViX2xvYWRlcl9zZXQuICAqLw0KIGdydWJfZXJyX3Qg RVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfYm9vdCkgKHZvaWQpOw0KSW5kZXg6IGtlcm4vbG9hZGVy LmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCi0tLSBrZXJuL2xvYWRlci5jCShyZXZpc2nDs246IDE3NjYpDQorKysg a2Vybi9sb2FkZXIuYwkoY29waWEgZGUgdHJhYmFqbykNCkBAIC02MSwxMSArNjEsODIgQEANCiAg IGdydWJfbG9hZGVyX2xvYWRlZCA9IDA7DQogfQ0KIA0KK3N0cnVjdCBob29rbGlzdF9ub2RlDQor ew0KKyAgZ3J1Yl9lcnJfdCAoKmhvb2spICh2b2lkKTsNCisgIGludCBhYm9ydF9vbl9lcnJvcjsN CisgIHN0cnVjdCBob29rbGlzdF9ub2RlICpuZXh0Ow0KK307DQorDQorc3RhdGljIHN0cnVjdCBo b29rbGlzdF9ub2RlICpwcmVib290X2hvb2tzID0gMDsNCisNCitncnViX3ByZWJvb3RfaG9va2lk DQorZ3J1Yl9sb2FkZXJfcmVnaXN0ZXJfcHJlYm9vdChncnViX2Vycl90ICgqaG9vaykgKHZvaWQp LCBpbnQgYWJvcnRfb25fZXJyb3IpDQorew0KKyAgaWYgKCFob29rKQ0KKyAgICB7DQorICAgICAg Z3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULCAicHJlYm9vdCBob29rIG11c3Qgbm90 IGJlIE5VTEwiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgZ3J1Yl9wcmVib290X2hv b2tpZCBuZXdlbnRyeSA9IGdydWJfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBob29rbGlzdF9ub2Rl KSk7DQorICBpZiAoIW5ld2VudHJ5KQ0KKyAgICB7DQorICAgICAgZ3J1Yl9lcnJvciAoR1JVQl9F UlJfT1VUX09GX01FTU9SWSwgImNhbm5vdCBhbGxvYyBhIGhvb2tpbmZvIHN0cnVjdHVyZSIpOw0K KyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICBlbHNlDQorICAgIHsNCisgICAgICBuZXdlbnRy eS0+aG9vayA9IGhvb2s7DQorICAgICAgbmV3ZW50cnktPmFib3J0X29uX2Vycm9yID0gYWJvcnRf b25fZXJyb3I7DQorICAgICAgbmV3ZW50cnktPm5leHQgPSBwcmVib290X2hvb2tzOw0KKyAgICAg IHByZWJvb3RfaG9va3MgPSBuZXdlbnRyeTsNCisgICAgICByZXR1cm4gbmV3ZW50cnk7DQorICAg IH0NCit9DQorDQordm9pZA0KK2dydWJfbG9hZGVyX3VucmVnaXN0ZXJfcHJlYm9vdChncnViX3By ZWJvb3RfaG9va2lkIGlkKQ0KK3sNCisgIGdydWJfcHJlYm9vdF9ob29raWQgZW50cnkgPSAwOw0K KyAgZ3J1Yl9wcmVib290X2hvb2tpZCBzZWFyY2ggPSBwcmVib290X2hvb2tzOw0KKyAgZ3J1Yl9w cmVib290X2hvb2tpZCBwcmV2aW91cyA9IDA7DQorDQorICBpZiAoMCA9PSBpZCkNCisgICAgcmV0 dXJuOw0KKw0KKyAgd2hpbGUgKHNlYXJjaCkNCisgICAgew0KKyAgICAgIGlmIChzZWFyY2ggPT0g aWQpDQorICAgICAgICB7DQorICAgICAgICAgIGVudHJ5ID0gc2VhcmNoOw0KKyAgICAgICAgICBi cmVhazsNCisgICAgICAgIH0NCisgICAgICBwcmV2aW91cyA9IHNlYXJjaDsNCisgICAgICBzZWFy Y2ggPSBzZWFyY2gtPm5leHQ7DQorICAgIH0NCisgIGlmIChlbnRyeSkgLyogRm91bmQgKi8NCisg ICAgew0KKyAgICAgIGlmIChwcmV2aW91cykNCisgICAgICAgIHByZXZpb3VzLT5uZXh0ID0gZW50 cnktPm5leHQ7DQorICAgICAgZWxzZSBwcmVib290X2hvb2tzID0gZW50cnktPm5leHQ7IC8qIEVu dHJ5IHdhcyBoZWFkIG9mIGxpc3QgKi8NCisgICAgICBncnViX2ZyZWUgKGVudHJ5KTsNCisgICAg fQ0KK30NCisNCiBncnViX2Vycl90DQogZ3J1Yl9sb2FkZXJfYm9vdCAodm9pZCkNCiB7DQogICBp ZiAoISBncnViX2xvYWRlcl9sb2FkZWQpDQogICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VS Ul9OT19LRVJORUwsICJubyBsb2FkZWQga2VybmVsIik7DQorICANCisgIGdydWJfcHJlYm9vdF9o b29raWQgZW50cnkgPSBwcmVib290X2hvb2tzOw0KKyAgd2hpbGUgKGVudHJ5KQ0KKyAgICB7DQor ICAgICAgZ3J1Yl9lcnJfdCBwb3NzaWJsZV9lcnJvciA9IGVudHJ5LT5ob29rKCk7DQorICAgICAg aWYgKHBvc3NpYmxlX2Vycm9yICE9IEdSVUJfRVJSX05PTkUgJiYgZW50cnktPmFib3J0X29uX2Vy cm9yKQ0KKyAgICAgICAgcmV0dXJuIHBvc3NpYmxlX2Vycm9yOw0KKyAgICAgIGVudHJ5ID0gZW50 cnktPm5leHQ7DQorICAgIH0NCiANCiAgIGlmIChncnViX2xvYWRlcl9ub3JldHVybikNCiAgICAg Z3J1Yl9tYWNoaW5lX2ZpbmkgKCk7DQo= --=-jjPm7cTT9Fl9b2D0v07D-- --=-3aTDMDPyowcWgZG0BjVn 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) iQIVAwUASJY/RaSl+Fbdeo72AQLd+Q//SVOHd3rF57OcI4e/vyjlxosMEWLk+fxX 243IbLgniItflF1ClBe/M06XKmfwV961GxzVctKF4xlzjtSr8POvBnu4IRkKe/0H hIQfF0eOf13x0GbRw5P8ZEbea9GKcYzt5+UeNYBrcgw0bzfnUwgQnl5J/ZKyM5u3 SYZy5cksXyBqIiRYe934e4wxnagCyq6OEGkhPAQYdZU7MKAgYDJap9dss/h6Tzj0 gFao+4D3Md2ifQMhZVQ2l3yVdPZyTxtWHZfuQcaHIGrJzOxqaxfummmuj6ie6FEU 9QPEj5qp33z1J1BzYEEvDCyOFNgFIrceyzGu+yvjkf2W9FLfpyGHJs9PLBqorH8y Exy4NoF57L0hQRxuVO2rf2ObGQ0nFtJ0T+UGbw9jjSDBKOuuNYZFqDw2kBEzs9m/ by67bbRAJpbGAjPxk3oCgR2oL1CPFBFHQ1QDTBwdZKCvIefEevtub/DIt2/wy73j QW2oOuE4ibpHmWBjmx6AgFL/2epYrlPVKcaZ6q1aQ8HrHyk/9DN1ZYBgh6h8Hfaf FwSYf9Nm5Y/EAxfSRxnGXJcu0+a/XBvBRloLu3sJlTsTq8bBeqjd0IQdx0fdcGu4 xmc0nsYwLhYAYXS41GWSEREhVYiza9AcuzqERtqUvoGbW2OfaL5b9hm5TnP9KSMA OpTQJlDW65c= =uH+4 -----END PGP SIGNATURE----- --=-3aTDMDPyowcWgZG0BjVn--