From mboxrd@z Thu Jan 1 00:00:00 1970 From: Subash Abhinov Kasiviswanathan Subject: Re: Qualcomm rmnet driver and qmi_wwan Date: Tue, 05 Jun 2018 11:38:51 -0600 Message-ID: References: <2a96c941b6699827ea6ac1ce3603fae5@codeaurora.org> <9786ab4bf4e425566f55a0654911ab788f3f1a38.camel@redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_3f93595a1e805a560a1fe6bdbe813855" Cc: netdev@vger.kernel.org To: Dan Williams , Daniele Palmas Return-path: Received: from smtp.codeaurora.org ([198.145.29.96]:60280 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751788AbeFERi5 (ORCPT ); Tue, 5 Jun 2018 13:38:57 -0400 In-Reply-To: <9786ab4bf4e425566f55a0654911ab788f3f1a38.camel@redhat.com> Sender: netdev-owner@vger.kernel.org List-ID: --=_3f93595a1e805a560a1fe6bdbe813855 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2018-06-05 08:54, Dan Williams wrote: > On Tue, 2018-06-05 at 11:38 +0200, Daniele Palmas wrote: >> Hi, >> >> 2018-02-21 20:47 GMT+01:00 Subash Abhinov Kasiviswanathan >> : >> > On 2018-02-21 04:38, Daniele Palmas wrote: >> > > >> > > Hello, >> > > >> > > in rmnet kernel documentation I read: >> > > >> > > "This driver can be used to register onto any physical network >> > > device in >> > > IP mode. Physical transports include USB, HSIC, PCIe and IP >> > > accelerator." >> > > >> > > Does this mean that it can be used in association with the >> > > qmi_wwan >> > > driver? >> > > >> > > If yes, can someone give me an hint on the steps to follow? >> > > >> > > If not, does anyone know if it is possible to modify qmi_wwan in >> > > order >> > > to take advantage of the features provided by the rmnet driver? >> > > >> > > In this case hint on the changes for modifying qmi_wwan are >> > > welcome. >> > > >> > > Thanks in advance, >> > > Daniele >> > >> > >> > Hi >> > >> > I havent used qmi_wwan so the following comment is based on code >> > inspection. >> > qmimux_register_device() is creating qmimux devices with usb net >> > device as >> > real_dev. The Multiplexing and aggregation header (qmimux_hdr) is >> > stripped >> > off >> > in qmimux_rx_fixup() and the packet is passed on to stack. >> > >> > You could instead create rmnet devices with the usb netdevice as >> > real dev. >> > The packets from the usb net driver can be queued to network stack >> > directly >> > as rmnet driver will setup a RX handler. rmnet driver will process >> > the >> > packets >> > further and then queue to network stack. >> > >> >> in kernel documentation I read that rmnet user space configuration is >> done through librmnetctl available at >> >> https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource >> /dataservices/tree/rmnetctl >> >> However it seems to me that this is a bit outdated (e.g. it does not >> properly build since it is looking for kernel header >> linux/rmnet_data.h that, as far as I understand, is no more present). >> >> Is there available a more recent version of the tool? Hi Daniele The attached patch should have an updated version of the tool. Usage - rmnetcli -n newlink wwan0 rmnet0 1 1 where wwan0 is the physical device rmnet0 is the virtual device to be created 1 is the mux id the other 1 is the flag to configure DL de-aggregation by default To delete a device - ip link delete rmnet0 > > I'd expect that somebody (Subash?) would add support for the > rmnet/qmimux options to iproute2 via 'ip link' like exists for most > other device types. Hi Dan Yes, I can do that and update the documentation to point to using iproute2. -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project --=_3f93595a1e805a560a1fe6bdbe813855 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-librmnetctl-add-initial-library-code.patch Content-Disposition: attachment; filename=0001-librmnetctl-add-initial-library-code.patch; size=97800 RnJvbSA5NGFiYjU4OWE4ZTYwYzQ5ZDljYzQ1OThhMjdiNTBjOWY3NTdiNjIzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTdWJhc2ggQWJoaW5vdiBLYXNpdmlzd2FuYXRoYW4gPHN1YmFz aGFiQGNvZGVhdXJvcmEub3JnPgpEYXRlOiBUdWUsIDUgSnVuIDIwMTggMTE6MjA6NTYgLTA2MDAK U3ViamVjdDogW1BBVENIXSBsaWJybW5ldGN0bDogYWRkIGluaXRpYWwgbGlicmFyeSBjb2RlCgpB ZGQgaW5pdGlhbCBzbmFwc2hvdCBvZiBSbW5ldCBDb250cm9sIGxpYnJhcnkgZm9yCnVwc3RyZWFt IHJtbmV0IGRyaXZlci4KCi0tLQogcm1uZXRsaWIvTWFrZWZpbGUuYW0gICAgICAgICAgICB8ICAg IDIgKwogcm1uZXRsaWIvY2xpL01ha2VmaWxlLmFtICAgICAgICB8ICAgMTIgKwogcm1uZXRsaWIv Y2xpL3JtbmV0Y2xpLmMgICAgICAgICB8ICA1MDIgKysrKysrKysrKysrKysKIHJtbmV0bGliL2Ns aS9ybW5ldGNsaS5oICAgICAgICAgfCAgIDYxICsrCiBybW5ldGxpYi9pbmMvbGlicm1uZXRjdGwu aCAgICAgIHwgIDYwNCArKysrKysrKysrKysrKysrKwogcm1uZXRsaWIvaW5jL2xpYnJtbmV0Y3Rs X2huZGwuaCB8ICAgNjUgKysKIHJtbmV0bGliL3NyYy9NYWtlZmlsZS5hbSAgICAgICAgfCAgIDE0 ICsKIHJtbmV0bGliL3NyYy9saWJybW5ldGN0bC5jICAgICAgfCAxMzY5ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogOCBmaWxlcyBjaGFuZ2VkLCAyNjI5IGluc2VydGlv bnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBybW5ldGxpYi9NYWtlZmlsZS5hbQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHJtbmV0bGliL2NsaS9NYWtlZmlsZS5hbQogY3JlYXRlIG1vZGUgMTAwNjQ0IHJt bmV0bGliL2NsaS9ybW5ldGNsaS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgcm1uZXRsaWIvY2xpL3Jt bmV0Y2xpLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBybW5ldGxpYi9pbmMvbGlicm1uZXRjdGwuaAog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJtbmV0bGliL2luYy9saWJybW5ldGN0bF9obmRsLmgKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBybW5ldGxpYi9zcmMvTWFrZWZpbGUuYW0KIGNyZWF0ZSBtb2RlIDEwMDY0 NCBybW5ldGxpYi9zcmMvbGlicm1uZXRjdGwuYwoKZGlmZiAtLWdpdCBhL3JtbmV0bGliL01ha2Vm aWxlLmFtIGIvcm1uZXRsaWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uN2NhZmE4MgotLS0gL2Rldi9udWxsCisrKyBiL3JtbmV0bGliL01ha2VmaWxlLmFt CkBAIC0wLDAgKzEsMiBAQAorU1VCRElSUz1zcmMgY2xpCisKZGlmZiAtLWdpdCBhL3JtbmV0bGli L2NsaS9NYWtlZmlsZS5hbSBiL3JtbmV0bGliL2NsaS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTllZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvcm1uZXRs aWIvY2xpL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKK0FNX0NGTEFHUyA9ICQoQ09ERV9D T1ZFUkFHRV9DRkxBR1MpCitBTV9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvciAtV3VuZGVmIC1Xc3Ry aWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWcKK0FNX0NGTEFHUyArPSAtSS4vLi4vaW5j CitBTV9MREZMQUdTID0gJChDT0RFX0NPVkVSQUdFX0xERkxBR1MpCisKK3JtbmV0Y2xpX1NPVVJD RVMgPSBybW5ldGNsaS5jCitiaW5fUFJPR1JBTVMgPSBybW5ldGNsaQorcmVxdWlyZWRsaWJzID0g Li4vc3JjL2xpYnJtbmV0Y3RsLmxhCitybW5ldGNsaV9MREFERCA9ICQocmVxdWlyZWRsaWJzKQor TE9DQUxfTU9EVUxFIDo9IGxpYnJtbmV0Y3RsCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxz ZQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvcm1uZXRsaWIv Y2xpL3JtbmV0Y2xpLmMgYi9ybW5ldGxpYi9jbGkvcm1uZXRjbGkuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi5kYzgxMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvcm1uZXRsaWIv Y2xpL3JtbmV0Y2xpLmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK KworCQkJUiBNIE4gRSBUIEMgTCBJIC4gQworCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgMjAx Ny0yMDE4IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRp c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp dGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs b3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKwkqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJICBub3RpY2UsIHRoaXMgbGlz dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisJKiBSZWRpc3Ry aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisJICBjb3B5 cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwor CSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkCisJICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisJKiBOZWl0aGVyIHRoZSBuYW1l IG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisJICBjb250cmli dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQK KwkgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy bWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQ UkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorQVJFIERJU0NMQUlN RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9S UworQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB TCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorQlVTSU5FU1MgSU5URVJSVVBU SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVU SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH TElHRU5DRQorT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg U1VDSCBEQU1BR0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgorCisgIEBmaWxlICAgIHJtbmV0Y2xpLmMKKyAgQGJyaWVmICAgY29tbWFuZCBsaW5l IGludGVyZmFjZSB0byBleHBvc2Ugcm1uZXQgY29udHJvbCBBUEkncworCisgIERFU0NSSVBUSU9O CisgIEZpbGUgY29udGFpbmluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIGlu dGVyZmFjZSB0byBleHBvc2UgdGhlCisgIHJtbmV0IGNvbnRyb2wgY29uZmlndXJhdGlvbiAuCisK KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQlJTkNM VURFIEZJTEVTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5o PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNs dWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgor I2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInJtbmV0Y2xpLmgiCisjaW5jbHVkZSAibGli cm1uZXRjdGwuaCIKKworI2RlZmluZSBSTU5FVF9NQVhfU1RSX0xFTiAgMTYKKworI2RlZmluZSBf Uk1ORVRDTElfQ0hFQ0tOVUxMKFgpCQlkbyB7IGlmICghWCkgeyAgICAgICAgICAgICAgICAgICAg ICAgICBcCitwcmludF9ybW5ldF9hcGlfc3RhdHVzKFJNTkVUQ1RMX0lOVkFMSURfQVJHLCBSTU5F VENUTF9DRkdfRkFJTFVSRV9OT19DT01NQU5EKTsgXAorCQkJCXJtbmV0Y3RsX2NsZWFudXAoaGFu ZGxlKTsgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXJldHVybiBSTU5FVENUTF9JTlZBTElE X0FSRzsgICAgICAgICAgICAgICAgICAgXAorCQl9IH0gd2hpbGUgKDApOworI2RlZmluZSBfU1RS VE9VSTMyKFgpICAgICAgICAgICAodWludDMyX3Qpc3RydG91bChYLCBOVUxMLCAwKQorI2RlZmlu ZSBfU1RSVE9VSTE2KFgpICAgICAgICAgICAodWludDE2X3Qpc3RydG91bChYLCBOVUxMLCAwKQor I2RlZmluZSBfU1RSVE9VSTgoWCkgICAgICAgICAgICh1aW50OF90KXN0cnRvdWwoWCwgTlVMTCwg MCkKKyNkZWZpbmUgX1NUUlRPSTMyKFgpICAgICAgICAgICAoaW50MzJfdClzdHJ0b2woWCwgTlVM TCwgMCkKKworI2RlZmluZSBfNVRBQlMgCQkiXG5cdFx0XHRcdFx0IgorI2RlZmluZSBfMlRBQlMg CQkiXG5cdFx0IgorCisvKiEKKyogQGJyaWVmIENvbnRhaW5zIGEgbGlzdCBvZiBlcnJvciBtZXNz YWdlIGZyb20gQ0xJCisqLworY2hhciBybW5ldGNmZ19lcnJvcl9jb2RlX3RleHQKK1tSTU5FVENG R19UT1RBTF9FUlJfTVNHU11bUk1ORVRDVExfRVJSX01TR19TSVpFXSA9IHsKKwkiSGVscCBvcHRp b24gU3BlY2lmaWVkIiwKKwkiRVJST1I6IE5vXFxJbnZhbGlkIGNvbW1hbmQgd2FzIHNwZWNpZmll ZFxuIiwKKwkiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZm9yIEVncmVzcyBkZXZp Y2VcbiIKK307CisKKy8qIQorKiBAYnJpZWYgTWV0aG9kIHRvIGRpc3BsYXkgdGhlIHN5bnRheCBm b3IgdGhlIGNvbW1hbmRzCisqIEBkZXRhaWxzIERpc3BsYXlzIHRoZSBzeW50YXggYW5kIHVzYWdl IGZvciB0aGUgY29tbWFuZHMKKyogQHBhcmFtIHZvaWQKKyogQHJldHVybiB2b2lkCisqLworc3Rh dGljIHZvaWQgcm1uZXRfYXBpX3VzYWdlKHZvaWQpCit7CisJcHJpbnRmKCJSbU5ldCBBUEkgVXNh Z2U6XG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgaGVscCAgICAgICAgICAgICAgICAgICAgICAg ICAgICBEaXNwbGF5cyB0aGlzIGhlbHBcbiIpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoInJt bmV0Y2xpIGFzc29jbmV0ZGV2IDxkZXZfbmFtZT4gICAgICAgICAgUmVnaXN0ZXJzIHRoZSBSbU5l dCIpOworCXByaW50ZihfNVRBQlMiIGRhdGEgZHJpdmVyIG9uIGEgcGFydGljdWxhciIpOworCXBy aW50ZihfNVRBQlMiIGRldmljZS5kZXZfbmFtZSBjYW5ub3QiKTsKKwlwcmludGYoXzVUQUJTIiBi ZSBsYXJnZXIgdGhhbiAxNSIpOworCXByaW50ZihfNVRBQlMiIGNoYXJhY3RlcnMuIFJldHVybnMi KTsKKwlwcmludGYoXzVUQUJTIiB0aGUgc3RhdHVzIGNvZGUuXG5cbiIpOworCXByaW50Zigicm1u ZXRjbGkgdW5hc3NvY25ldGRldiA8ZGV2X25hbWU+ICAgICAgICBVbnJlZ2lzdGVycyB0aGUiKTsK KwlwcmludGYoXzVUQUJTIiBSbU5ldCBkYXRhIGRyaXZlciBvbiBhIHBhcnRpY3VsYXIiKTsKKwlw cmludGYoXzVUQUJTIiBkZXZpY2UuIGRldl9uYW1lIGNhbm5vdCIpOworCXByaW50ZihfNVRBQlMi IGJlIGxhcmdlciB0aGFuIDE1Iik7CisJcHJpbnRmKF81VEFCUyIgY2hhcmFjdGVycy4gUmV0dXJu cyIpOworCXByaW50ZihfNVRBQlMiIHRoZSBzdGF0dXMgY29kZS5cblxuIik7CisJcHJpbnRmKCJy bW5ldGNsaSBnZXRuZXRkZXZhc3NvYyA8ZGV2X25hbWU+ICAgICAgIEdldCBpZiB0aGUgUm1OZXQi KTsKKwlwcmludGYoXzVUQUJTIiBkYXRhIGRyaXZlciBpcyByZWdpc3RlcmVkIG9uIik7CisJcHJp bnRmKF81VEFCUyIgYSBwYXJ0aWN1bGFyIGRldmljZS4iKTsKKwlwcmludGYoXzVUQUJTIiBkZXZf bmFtZSBjYW5ub3QgYmUiKTsKKwlwcmludGYoXzVUQUJTIiBsYXJnZXIgdGhhbiAxNSIpOworCXBy aW50ZihfNVRBQlMiIGNoYXJhY3RlcnMuIFJldHVybnMgMSIpOworCXByaW50ZihfNVRBQlMiIGlm IGlzIHJlZ2lzdGVyZWQgYW5kIik7CisJcHJpbnRmKF81VEFCUyIgMCBpZiBpdCBpcyBub3QiKTsK KwlwcmludGYoXzVUQUJTIiByZWdpc3RlcmVkXG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgc2V0 bGVkZiA8ZWdyZXNzX2ZsYWdzPiAgICAgICAgICBTZXRzIHRoZSBlZ3Jlc3MgZGF0YSIpOworCXBy aW50ZihfMlRBQlMiIDxhZ2dfc2l6ZT4gICAgICAgICAgICAgIGZvcm1hdCBmb3IgYSBwYXJ0aWN1 bGFyIGxpbmsuIik7CisJcHJpbnRmKF8yVEFCUyIgPGFnZ19jb3VudD4gICAgICAgICAgICAgZGV2 X25hbWUgY2Fubm90IGJlIGxhcmdlciIpOworCXByaW50ZihfMlRBQlMiIDxkZXZfbmFtZT4gICAg ICAgICAgICAgIHRoYW4gMTUgY2hhcmFjdGVycy4iKTsKKwlwcmludGYoXzVUQUJTIiBSZXR1cm5z IHRoZSBzdGF0dXMgY29kZVxuXG4iKTsKKwlwcmludGYoInJtbmV0Y2xpIGdldGxlZGYgPGRldl9u YW1lPiAgICAgICAgICAgICAgR2V0cyB0aGUgZWdyZXNzIGRhdGEiKTsKKwlwcmludGYoXzVUQUJT IiBmb3JtYXQgZm9yIGEgcGFydGljdWxhciBsaW5rLiIpOworCXByaW50ZihfNVRBQlMiIGRldl9u YW1lIGNhbm5vdCBiZSBsYXJnZXIiKTsKKwlwcmludGYoXzVUQUJTIiB0aGFuIDE1LiBSZXR1cm5z IHRoZSA0Iik7CisJcHJpbnRmKF81VEFCUyIgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIik7CisJcHJp bnRmKF81VEFCUyIgZWdyZXNzX2ZsYWdzXG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgc2V0bGlk ZiA8aW5ncmVzc19mbGFncz4gICAgICAgICBTZXRzIHRoZSBpbmdyZXNzIik7CisJcHJpbnRmKF8y VEFCUyIgPHRhaWxfc3BhY2luZz4gICAgICAgICAgZGF0YSBmb3JtYXQgZm9yIGEgcGFydGljdWxh ciIpOworCXByaW50ZihfMlRBQlMiIDxkZXZfbmFtZT4gICAgICAgICAgICAgIGxpbmsuIGluZ3Jl c3NfZmxhZ3MgaXMgNCIpOworCXByaW50ZihfNVRBQlMiIGJ5dGUgdW5zaWduZWQgaW50ZWdlci4i KTsKKwlwcmludGYoXzVUQUJTIiB0YWlsX3NwYWNpbmcgaXMgYSBvbmUuIik7CisJcHJpbnRmKF81 VEFCUyIgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLiIpOworCXByaW50ZihfNVRBQlMiIGRldl9uYW1l IGNhbm5vdCBiZSIpOworCXByaW50ZihfNVRBQlMiIGxhcmdlciB0aGFuIDE1LiIpOworCXByaW50 ZihfNVRBQlMiIGNoYXJhY3RlcnMuIFJldHVybnMiKTsKKwlwcmludGYoXzVUQUJTIiB0aGUgc3Rh dHVzIGNvZGVcblxuIik7CisJcHJpbnRmKCJybW5ldGNsaSBnZXRsaWRmIDxkZXZfbmFtZT4gICAg ICAgICAgICAgIEdldHMgdGhlIGluZ3Jlc3MiKTsKKwlwcmludGYoXzVUQUJTIiBkYXRhIGZvcm1h dCBmb3IgYSBwYXJ0aWN1bGFyIik7CisJcHJpbnRmKF81VEFCUyIgbGluay4gZGV2X25hbWUgY2Fu bm90IGJlIik7CisJcHJpbnRmKF81VEFCUyIgbGFyZ2VyIHRoYW4gMTUuIFJldHVybnMiKTsKKwlw cmludGYoXzVUQUJTIiB0aGUgNCBieXRlIHVuc2lnbmVkIik7CisJcHJpbnRmKF81VEFCUyIgaW50 ZWdlciBpbmdyZXNzX2ZsYWdzXG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgc2V0bGVwYyA8bG9n aWNhbF9lcF9pZD4gICAgICAgICBTZXRzIHRoZSBsb2dpY2FsIik7CisJcHJpbnRmKF8yVEFCUyIg PHJtbmV0X21vZGU+ICAgICAgICAgICAgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmb3IiKTsKKwlw cmludGYoXzJUQUJTIiA8ZGV2X25hbWU+ICAgICAgICAgICAgICBhIHBhcnRpY3VsYXIgbGluay4i KTsKKwlwcmludGYoXzJUQUJTIiA8ZWdyZXNzX2Rldl9uYW1lPiAgICAgICBsb2dpY2FsX2VwX2lk IGFyZSAzMmJpdCIpOworCXByaW50ZihfNVRBQlMiIGludGVnZXJzIGZyb20gLTEgdG8gMzEuIik7 CisJcHJpbnRmKF81VEFCUyIgcm1uZXRfbW9kZSBpcyBhIDEgYnl0ZSIpOworCXByaW50ZihfNVRB QlMiIHVuc2lnbmVkIGludGVnZXIgb2YiKTsKKwlwcmludGYoXzVUQUJTIiB2YWx1ZSBub25lLCB2 bmQgb3IiKTsKKwlwcmludGYoXzVUQUJTIiBicmlkZ2VkLiBkZXZfbmFtZSIpOworCXByaW50Zihf NVRBQlMiIGFuZCBlZ3Jlc3NfZGV2X25hbWUiKTsKKwlwcmludGYoXzVUQUJTIiBjYW5ub3QgYmUg bGFyZ2VyIik7CisJcHJpbnRmKF81VEFCUyIgdGhhbiAxNSBjaGFyYWN0ZXJzIik7CisJcHJpbnRm KF81VEFCUyIgUmV0dXJucyB0aGUgc3RhdHVzIGNvZGVcblxuIik7CisJcHJpbnRmKCJybW5ldGNs aSB1bnNldGxlcGMgPGxvZ2ljYWxfZXBfaWQ+ICAgICAgIFVuLXNldHMgdGhlIGxvZ2ljYWwiKTsK KwlwcmludGYoXzJUQUJTIiAgPGRldl9uYW1lPiAgICAgICAgICAgICAgZW5kcG9pbnQgY29uZmln dXJhdGlvbiBmb3IiKTsKKwlwcmludGYoXzVUQUJTIiBhIHBhcnRpY3VsYXIgbGluay4iKTsKKwlw cmludGYoXzVUQUJTIiBpbnRlZ2VycyBmcm9tIC0xIHRvIDMxLiIpOworCXByaW50ZihfNVRBQlMi IGRldl9uYW1lIGNhbm5vdCBiZSBsYXJnZXIiKTsKKwlwcmludGYoXzVUQUJTIiB0aGFuIDE1IGNo YXJhY3RlcnMiKTsKKwlwcmludGYoXzVUQUJTIiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZVxuXG4i KTsKKwlwcmludGYoInJtbmV0Y2xpIGdldGxlcGMgPGxvZ2ljYWxfZXBfaWQ+ICAgICAgICAgU2V0 cyB0aGUgbG9naWNhbCIpOworCXByaW50ZihfMlRBQlMiIDxkZXZfbmFtZT4gICAgICAgICAgICAg IGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZm9yIGEiKTsKKwlwcmludGYoXzVUQUJTIiBwYXJ0aWN1 bGFyIGxpbmsuIik7CisJcHJpbnRmKF81VEFCUyIgbG9naWNhbF9lcF9pZCBhcmUgMzJiaXQiKTsK KwlwcmludGYoXzVUQUJTIiBpbnRlZ2VycyBmcm9tIC0xIHRvIDMxLiIpOworCXByaW50ZihfNVRB QlMiIFJldHVybnMgdGhlIHJtbmV0X21vZGUiKTsKKwlwcmludGYoXzVUQUJTIiBhbmQgZWdyZXNz X2Rldl9uYW1lLiIpOworCXByaW50ZihfNVRBQlMiIHJtbmV0X21vZGUgaXMgYSAxIik7CisJcHJp bnRmKF81VEFCUyIgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIik7CisJcHJpbnRmKF81VEFCUyIgb2Yg dmFsdWUgbm9uZSwgdm5kIG9yIik7CisJcHJpbnRmKF81VEFCUyIgYnJpZGdlZC4gZGV2X25hbWUg YW5kIik7CisJcHJpbnRmKF81VEFCUyIgZWdyZXNzX2Rldl9uYW1lIGNhbm5vdCBiZSIpOworCXBy aW50ZihfNVRBQlMiIGxhcmdlciB0aGFuIDE1ICIpOworCXByaW50ZihfNVRBQlMiIGNoYXJhY3Rl cnMuIFJldHVybnMgdGhlIik7CisJcHJpbnRmKF81VEFCUyIgc3RhdHVzIGNvZGVcblxuIik7CisJ cHJpbnRmKCJybW5ldGNsaSBuZXd2bmQgPGRldl9pZD4gICAgICAgICAgICAgICAgIENyZWF0ZXMg YSBuZXciKTsKKwlwcmludGYoXzVUQUJTIiB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlIG5vZGUuIik7 CisJcHJpbnRmKF81VEFCUyIgZGV2X2lkIGlzIGFuIGludCIpOworCXByaW50ZihfNVRBQlMiIGxl c3MgdGhhbiAzMi4gUmV0dXJucyIpOworCXByaW50ZihfNVRBQlMiIHRoZSBzdGF0dXMgY29kZVxu XG4iKTsKKwlwcmludGYoInJtbmV0Y2xpIG5ld3ZuZHByZWZpeCA8ZGV2X2lkPiA8bmFtZV9wcmVm aXg+ICAgQ3JlYXRlcyIpOworCXByaW50ZihfNVRBQlMiIHZpcnR1YWwgbmV0d29yayBkZXZpY2Ug bm9kZS4iKTsKKwlwcmludGYoXzVUQUJTIiBkZXZfaWQgaXMgYW4gaW50Iik7CisJcHJpbnRmKF81 VEFCUyIgbGVzcyB0aGFuIDMyLiBQcmVmaXgiKTsKKwlwcmludGYoXzVUQUJTIiBtdXN0IGJlIGxl c3MgdGhhbiIpOworCXByaW50ZihfNVRBQlMiIDE1IGNoYXJzLiBSZXR1cm5zIik7CisJcHJpbnRm KF81VEFCUyIgdGhlIHN0YXR1cyBjb2RlXG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgbmV3dm5k bmFtZSA8ZGV2X2lkPiA8bmFtZV9wcmVmaXg+ICAgQ3JlYXRlcyIpOworCXByaW50ZihfNVRBQlMi IHZpcnR1YWwgbmV0d29yayBkZXZpY2Ugbm9kZS4iKTsKKwlwcmludGYoXzVUQUJTIiBkZXZfaWQg aXMgYW4gaW50Iik7CisJcHJpbnRmKF81VEFCUyIgbGVzcyB0aGFuIDMyLiBOYW1lIik7CisJcHJp bnRmKF81VEFCUyIgbXVzdCBiZSBsZXNzIHRoYW4iKTsKKwlwcmludGYoXzVUQUJTIiAxNSBjaGFy cy4gUmV0dXJucyIpOworCXByaW50ZihfNVRBQlMiIHRoZSBzdGF0dXMgY29kZVxuXG4iKTsKKwlw cmludGYoInJtbmV0Y2xpIGdldHZuZG5hbWUgPGRldl9pZD4gICAgICAgICAgICAgIEdldCBuYW1l IG9mIik7CisJcHJpbnRmKF81VEFCUyIgbmV0d29yayBkZXZpY2Ugbm9kZSBmcm9tIGlkXG5cbiIp OworCXByaW50Zigicm1uZXRjbGkgZnJlZXZuZCA8ZGV2X2lkPiAgICAgICAgICAgICAgUmVtb3Zl cyB2aXJ0dWFsIik7CisJcHJpbnRmKF81VEFCUyIgbmV0d29yayBkZXZpY2Ugbm9kZS4gZGV2X25h bWUiKTsKKwlwcmludGYoXzVUQUJTIiBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gMTUuIik7CisJcHJp bnRmKF81VEFCUyIgUmV0dXJucyB0aGUgc3RhdHVzIGNvZGVcblxuIik7CisJcHJpbnRmKCJybW5l dGNsaSBhZGR2bmN0Y2Zsb3cgPGRldl9pZD4gICAgICAgICAgICBBZGQgYSBtb2RlbSBmbG93Iik7 CisJcHJpbnRmKF8yVEFCUyIgPG1kbV9mbG93X2huZGw+ICAgICAgICAgaGFuZGxlIC0gdGMgZmxv dyBoYW5kbGUiKTsKKwlwcmludGYoXzJUQUJTIiA8dGNfZmxvd19obmRsPiAgICAgICAgICBtYXBw aW5nIGZvciBhIHZpcnR1YWwgbmV0d29yayIpOworCXByaW50ZihfMlRBQlMiIGRldmljZSBub2Rl XG5cbiIpOworCXByaW50Zigicm1uZXRjbGkgZGVsdm5jdGNmbG93IDxkZXZfaWQ+ICAgICAgICAg ICAgRGVsZXRlIGEgbW9kZW0gZmxvdyIpOworCXByaW50ZihfMlRBQlMiIDxtZG1fZmxvd19obmRs PiAgICAgICAgIGhhbmRsZSAtIHRjIGZsb3cgaGFuZGxlIik7CisJcHJpbnRmKF8yVEFCUyIgPHRj X2Zsb3dfaG5kbD4gICAgICAgICAgbWFwcGluZyBmb3IgYSB2aXJ0dWFsIG5ldHdvcmsiKTsKKwlw cmludGYoXzJUQUJTIiBkZXZpY2Ugbm9kZVxuXG4iKTsKKwlwcmludGYoIioqKioqKioqKioqKioq KioqKioqKioqKioqXG4iKTsKKwlwcmludGYoIlJtTmV0IFJUTV9ORVRMSU5LIEFQSSBVc2FnZTpc blxuIik7CisJcHJpbnRmKCJybW5ldGNsaSAtbiBuZXdsaW5rICA8ZGV2X2lkPiAgICAgICAgICAg IEFkZCBhIHZuZCB3LyBuZXdsaW5rIik7CisJcHJpbnRmKF8yVEFCUyIgPHZuZD4gICAgICAgICAg ICAgICAgICAgc3RyaW5nIC0gdm5kIGRldmljZV9uYW1lIik7CisJcHJpbnRmKF8yVEFCUyIgPHZu ZCBpZD4gICAgICAgICAgICAgICAgaW50IC0gbmV3IHZuZCBpZCIpOworCXByaW50ZihfMlRBQlMi IFtmbGFnc10gICAgICAgICAgICAgICAgIGludCAtIHN0YXJ0aW5nIGZsYWcgY29uZmlnXG5cbiIp OworCXByaW50Zigicm1uZXRjbGkgLW4gY2hhbmdlbGluayAgPGRldl9pZD4gICAgICAgICBDaGFu Z2UgYSB2bmQncyBmbGFncyIpOworCXByaW50ZihfMlRBQlMiIDx2bmQ+ICAgICAgICAgICAgICAg ICAgIHN0cmluZyAtIHZuZCBkZXZpY2VfbmFtZSIpOworCXByaW50ZihfMlRBQlMiIDx2bmQgaWQ+ ICAgICAgICAgICAgICAgIGludCAtIG5ldyB2bmQgaWQiKTsKKwlwcmludGYoXzJUQUJTIiA8Zmxh Z3M+ICAgICAgICAgICAgICAgICBpbnQgLSBuZXcgZmxhZyBjb25maWdcblxuIik7CisJcHJpbnRm KCJybW5ldGNsaSAtbiBkZWxsaW5rIDxkZXZfbmFtZT4gICAgICAgICAgIERlbGV0ZSBhIHZuZCIp OworCXByaW50ZihfMlRBQlMiICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGlucHV0dGluZyBk ZXYgbmFtZVxuXG4iKTsKKwlwcmludGYoInJtbmV0Y2xpIC1uIGJyaWRnZWxpbmsgIDxkZXZfbmFt ZT4gICAgICAgQnJpZGdlIGEgdm5kIGFuZCBhIGRldiIpOworCXByaW50ZihfMlRBQlMiIDx2bmQg aWQ+ICAgICAgICAgICAgICAgIGJ5IHNwZWNpZnlpbmcgZGV2IGlkIGFuZCB2bmQgaWRcblxuIik7 CisKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcm1uZXRjdGxfbGliX2Vycm9ycyh1aW50MTZfdCBl cnJvcl9udW1iZXIpCit7CisJaWYgKChlcnJvcl9udW1iZXIgPiBSTU5FVENUTF9BUElfU1VDQ0VT UykgJiYKKwkJKGVycm9yX251bWJlciA8IFJNTkVUQ1RMX0FQSV9FUlJfRU5VTV9MRU5HVEgpKSB7 CisJCXByaW50ZigiJXMiLCBybW5ldGN0bF9lcnJvcl9jb2RlX3RleHRbZXJyb3JfbnVtYmVyXSk7 CisJfQorCWlmICgoZXJyb3JfbnVtYmVyID49IFJNTkVUQ0ZHX0VSUl9OVU1fU1RBUlQpICYmCisJ KGVycm9yX251bWJlciA8IFJNTkVUQ0ZHX0VSUl9OVU1fU1RBUlQgKyBSTU5FVENGR19UT1RBTF9F UlJfTVNHUykpIHsKKwkJcHJpbnRmKCIlcyIsIHJtbmV0Y2ZnX2Vycm9yX2NvZGVfdGV4dAorCQkJ W2Vycm9yX251bWJlciAtIFJNTkVUQ0ZHX0VSUl9OVU1fU1RBUlRdKTsKKwkJaWYgKChlcnJvcl9u dW1iZXIgPT0gUk1ORVRDVExfQ0ZHX1NVQ0NFU1NfSEVMUF9DT01NQU5EKSB8fAorCQkJKGVycm9y X251bWJlciA9PSBSTU5FVENUTF9DRkdfRkFJTFVSRV9OT19DT01NQU5EKSkKKwkJCXJtbmV0X2Fw aV91c2FnZSgpOworCX0KK30KKworLyohCisqIEBicmllZiBNZXRob2QgdG8gY2hlY2sgdGhlIGVy cm9yIG51bWJlcnMgZ2VuZXJhdGVkIGZyb20gQVBJIGNhbGxzCisqIEBkZXRhaWxzIERpc3BsYXlz IHRoZSBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlYWNoIGVycm9yIGNvZGUKKyogQHBhcmFtIGVy cm9yX251bWJlciBFcnJvciBudW1iZXIgcmV0dXJuZWQgZnJvbSB0aGUgQVBJIGFuZCB0aGUgQ0xJ CisqIEByZXR1cm4gdm9pZAorKi8KK3N0YXRpYyB2b2lkIHByaW50X3JtbmV0X2FwaV9zdGF0dXMo aW50IHJldHVybl9jb2RlLCB1aW50MTZfdCBlcnJvcl9udW1iZXIpCit7CisJaWYgKHJldHVybl9j b2RlID09IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCXByaW50ZigiU1VDQ0VTU1xuIik7CisJZWxzZSBp ZiAocmV0dXJuX2NvZGUgPT0gUk1ORVRDVExfTElCX0VSUikgeworCQlwcmludGYoIkxJQlJBUlkg Iik7CisJCXByaW50X3JtbmV0Y3RsX2xpYl9lcnJvcnMoZXJyb3JfbnVtYmVyKTsKKwl9IGVsc2Ug aWYgKHJldHVybl9jb2RlID09IFJNTkVUQ1RMX0tFUk5FTF9FUlIpIHsKKwkJaWYgKGVycm9yX251 bWJlciA8IFJNTkVUQ1RMX0FQSV9FUlJfRU5VTV9MRU5HVEgpCisJCQlwcmludGYoIktFUk5FTCBF UlJPUjogU3lzdGVtIG9yIHJtbmV0IGVycm9yICVkXG4iLAorCQkJICAgICAgIGVycm9yX251bWJl cik7CisJfQorCWVsc2UgaWYgKHJldHVybl9jb2RlID09IFJNTkVUQ1RMX0lOVkFMSURfQVJHKQor CQlwcmludGYoIklOVkFMSURfQVJHXG4iKTsKK30KKworLyohCisqIEBicmllZiBNZXRob2QgdG8g bWFrZSB0aGUgQVBJIGNhbGxzCisqIEBkZXRhaWxzIENoZWNrcyBmb3IgZWFjaCB0eXBlIG9mIHBh cmFtZXRlciBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCisqIGZ1bmN0aW9uIGJhc2VkIG9uIHRo ZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgcGFyYW1ldGVyIHR5cGUKKyogQHBhcmFtIGFyZ2Mg TnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCB2YXJ5IGJhc2VkIG9uIHRoZSBjb21tYW5kcworKiBA cGFyYW0gYXJndiBWYWx1ZSBvZiB0aGUgYXJndW1lbnRzIHdoaWNoIHZhcnkgYmFzZWQgb24gdGhl IGNvbW1hbmRzCisqIEByZXR1cm4gUk1ORVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLiBSZWxl dmFudCBkYXRhIG1pZ2h0IGJlIHByaW50ZWQKKyogYmFzZWQgb24gdGhlIG1lc3NhZ2UgdHlwZQor KiBAcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4g RXJyb3IgY29kZSB3aWxsIGJlCisqIHByaW50ZWQKKyogQHJldHVybiBSTU5FVENUTF9LRVJORUxf RVJSIGlmIHRoZXJlIHdhcyBhIGVycm9yIGluIHRoZSBrZXJuZWwuIEVycm9yIGNvZGUgd2lsbCBi ZQorKiBwcmludGVkCisqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBh cmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorKi8KKworc3RhdGljIGludCBybW5ldF9h cGlfY2FsbChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBybW5ldGN0bF9obmRs X3MgKmhhbmRsZSA9IE5VTEw7CisJdWludDE2X3QgZXJyb3JfbnVtYmVyID0gUk1ORVRDVExfQ0ZH X0ZBSUxVUkVfTk9fQ09NTUFORDsKKwlpbnQgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJS OworCXVpbnQzMl90IGZsYWdzID0gMDsKKwl1aW50OF90IHJtbmV0X21vZGU7CisJY2hhciAqZWdy ZXNzX2Rldl9uYW1lOworCWlmICgoIWFyZ2MpIHx8ICghKmFyZ3YpKSB7CisJCXByaW50X3JtbmV0 X2FwaV9zdGF0dXMoUk1ORVRDVExfTElCX0VSUiwKKwkJUk1ORVRDVExfQ0ZHX0ZBSUxVUkVfTk9f Q09NTUFORCk7CisJCXJldHVybiBSTU5FVENUTF9MSUJfRVJSOworCX0KKwlpZiAoIXN0cmNtcCgq YXJndiwgImhlbHAiKSkgeworCQlwcmludF9ybW5ldF9hcGlfc3RhdHVzKFJNTkVUQ1RMX0xJQl9F UlIsCisJCVJNTkVUQ1RMX0NGR19TVUNDRVNTX0hFTFBfQ09NTUFORCk7CisJCXJldHVybiBSTU5F VENUTF9MSUJfRVJSOworCX0KKworCWlmICghc3RyY21wKCphcmd2LCAiLW4iKSkgeworCQlyZXR1 cm5fY29kZSA9IHJ0cm1uZXRfY3RsX2luaXQoJmhhbmRsZSwgJmVycm9yX251bWJlcik7CisJCWlm IChyZXR1cm5fY29kZSAhPSBSTU5FVENUTF9TVUNDRVNTKSB7CisJCQlwcmludF9ybW5ldF9hcGlf c3RhdHVzKHJldHVybl9jb2RlLCBlcnJvcl9udW1iZXIpOworCQkJcmV0dXJuIFJNTkVUQ1RMX0xJ Ql9FUlI7CisJCX0KKwkJZXJyb3JfbnVtYmVyID0gUk1ORVRDVExfQ0ZHX0ZBSUxVUkVfTk9fQ09N TUFORDsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOworCQlhcmd2Kys7CisJCWFy Z2MtLTsKKwkJaWYgKCghYXJnYykgfHwgKCEqYXJndikpIHsKKwkJCXByaW50X3JtbmV0X2FwaV9z dGF0dXMoUk1ORVRDVExfTElCX0VSUiwKKwkJCVJNTkVUQ1RMX0NGR19GQUlMVVJFX05PX0NPTU1B TkQpOworCQkJcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlI7CisJCX0KKwkJaWYgKCFzdHJjbXAoKmFy Z3YsICJuZXdsaW5rIikpIHsKKwkJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlsxXSk7CisJCQlf Uk1ORVRDTElfQ0hFQ0tOVUxMKGFyZ3ZbMl0pOworCQkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2 WzNdKTsKKwkJCS8qIElmIG9wdGlvbmFsIGZsYWcgd2FzIHVzZWQgcGFzcyBpdCBvbiovCisJCQlp ZiAoYXJndls0XSkKKwkJCQlmbGFncyA9IF9TVFJUT0kzMihhcmd2WzRdKTsKKworCQkJcmV0dXJu X2NvZGUgPSBydHJtbmV0X2N0bF9uZXd2bmQoaGFuZGxlLCBhcmd2WzFdLAorCQkJCQkJCSBhcmd2 WzJdLAorCQkJCQkJCSAmZXJyb3JfbnVtYmVyLAorCQkJCQkJCSBfU1RSVE9JMzIoYXJndlszXSks CisJCQkJCQkJIGZsYWdzKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiY2hhbmdlbGlu ayIpKSB7CisJCQlfUk1ORVRDTElfQ0hFQ0tOVUxMKGFyZ3ZbMV0pOworCQkJX1JNTkVUQ0xJX0NI RUNLTlVMTChhcmd2WzJdKTsKKwkJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlszXSk7CisJCQlf Uk1ORVRDTElfQ0hFQ0tOVUxMKGFyZ3ZbNF0pOworCisJCQlyZXR1cm5fY29kZSA9IHJ0cm1uZXRf Y3RsX2NoYW5nZXZuZChoYW5kbGUsIGFyZ3ZbMV0sCisJCQkJCQkJICAgIGFyZ3ZbMl0sCisJCQkJ CQkJICAgICZlcnJvcl9udW1iZXIsCisJCQkJCQkJICAgIF9TVFJUT0kzMihhcmd2WzNdKSwKKwkJ CQkJCQkgICAgX1NUUlRPSTMyKGFyZ3ZbNF0pKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2 LCAiZGVsbGluayIpKSB7CisJCQlfUk1ORVRDTElfQ0hFQ0tOVUxMKGFyZ3ZbMV0pOworCQkJCXJl dHVybl9jb2RlID0gcnRybW5ldF9jdGxfZGVsdm5kKGhhbmRsZSwgYXJndlsxXSwKKwkJCQkJCQkJ ICZlcnJvcl9udW1iZXIpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJicmlkZ2UiKSkg eworCQkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsKKwkJCV9STU5FVENMSV9DSEVDS05V TEwoYXJndlsyXSk7CisJCQlyZXR1cm5fY29kZSA9IHJ0cm1uZXRfY3RsX2JyaWRnZXZuZChoYW5k bGUsIGFyZ3ZbMV0sCisJCQkJCQkJICAgIGFyZ3ZbMl0sCisJCQkJCQkJICAgICZlcnJvcl9udW1i ZXIpOworCQl9CisJCWdvdG8gZW5kOworCX0gZWxzZSB7CisJCXJldHVybl9jb2RlID0gcm1uZXRj dGxfaW5pdCgmaGFuZGxlLCAmZXJyb3JfbnVtYmVyKTsKKwkJaWYgKHJldHVybl9jb2RlICE9IFJN TkVUQ1RMX1NVQ0NFU1MpIHsKKwkJCXByaW50X3JtbmV0X2FwaV9zdGF0dXMocmV0dXJuX2NvZGUs IGVycm9yX251bWJlcik7CisJCQlyZXR1cm4gUk1ORVRDVExfTElCX0VSUjsKKwkJfQorCisJfQor CWVycm9yX251bWJlciA9IFJNTkVUQ1RMX0NGR19GQUlMVVJFX05PX0NPTU1BTkQ7CisJcmV0dXJu X2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOworCWlmICghc3RyY21wKCphcmd2LCAiYXNzb2NuZXRk ZXYiKSkgeworCQlyZXR1cm5fY29kZSA9IHJtbmV0X2Fzc29jaWF0ZV9uZXR3b3JrX2RldmljZSho YW5kbGUsCisJCWFyZ3ZbMV0sICZlcnJvcl9udW1iZXIsIFJNTkVUQ1RMX0RFVklDRV9BU1NPQ0lB VEUpOworCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgInVuYXNzb2NuZXRkZXYiKSkgeworCQly ZXR1cm5fY29kZSA9IHJtbmV0X2Fzc29jaWF0ZV9uZXR3b3JrX2RldmljZShoYW5kbGUsCisJCWFy Z3ZbMV0sICZlcnJvcl9udW1iZXIsIFJNTkVUQ1RMX0RFVklDRV9VTkFTU09DSUFURSk7CisJfSBl bHNlIGlmICghc3RyY21wKCphcmd2LCAiZ2V0bmV0ZGV2YXNzb2MiKSkgeworCQlpbnQgcmVnaXN0 ZXJfc3RhdHVzOworCQlyZXR1cm5fY29kZSA9IHJtbmV0X2dldF9uZXR3b3JrX2RldmljZV9hc3Nv Y2lhdGVkKGhhbmRsZSwKKwkJYXJndlsxXSwgJnJlZ2lzdGVyX3N0YXR1cywgJmVycm9yX251bWJl cik7CisJCWlmIChyZXR1cm5fY29kZSA9PSBSTU5FVENUTF9TVUNDRVNTKQorCQkJcHJpbnRmKCJy ZWdpc3Rlcl9zdGF0dXMgaXMgJWRcbiIsIHJlZ2lzdGVyX3N0YXR1cyk7CisJfSBlbHNlIGlmICgh c3RyY21wKCphcmd2LCAiZ2V0bGVkZiIpKSB7CisJCXVpbnQzMl90IGVncmVzc19mbGFnczsKKwkJ dWludDE2X3QgYWdnX3NpemUsIGFnZ19jb3VudDsKKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9nZXRf bGlua19lZ3Jlc3NfZGF0YV9mb3JtYXQoaGFuZGxlLAorCQlhcmd2WzFdLCAmZWdyZXNzX2ZsYWdz LCAmYWdnX3NpemUsICZhZ2dfY291bnQsICZlcnJvcl9udW1iZXIpOworCQlpZiAocmV0dXJuX2Nv ZGUgPT0gUk1ORVRDVExfU1VDQ0VTUykgeworCQkJcHJpbnRmKCJlZ3Jlc3NfZmxhZ3MgaXMgJXVc biIsIGVncmVzc19mbGFncyk7CisJCQlwcmludGYoImFnZ19zaXplIGlzICV1XG4iLCBhZ2dfc2l6 ZSk7CisJCQlwcmludGYoImFnZ19jb3VudCBpcyAldVxuIiwgYWdnX2NvdW50KTsKKwkJfQorCX0g ZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImdldGxpZGYiKSkgeworCQl1aW50MzJfdCBpbmdyZXNz X2ZsYWdzOworCQl1aW50OF90ICB0YWlsX3NwYWNpbmc7CisJCXJldHVybl9jb2RlID0gcm1uZXRf Z2V0X2xpbmtfaW5ncmVzc19kYXRhX2Zvcm1hdF90YWlsc3BhY2UoCisJCWhhbmRsZSwgYXJndlsx XSwgJmluZ3Jlc3NfZmxhZ3MsICZ0YWlsX3NwYWNpbmcsICZlcnJvcl9udW1iZXIpOworCQlpZiAo cmV0dXJuX2NvZGUgPT0gUk1ORVRDVExfU1VDQ0VTUykgeworCQkJcHJpbnRmKCJpbmdyZXNzX2Zs YWdzIGlzICV1XG4iLCBpbmdyZXNzX2ZsYWdzKTsKKwkJCXByaW50ZigidGFpbF9zcGFjaW5nIGlz ICV1XG4iLCB0YWlsX3NwYWNpbmcpOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAi bmV3dm5kcHJlZml4IikpIHsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsKKwkJX1JN TkVUQ0xJX0NIRUNLTlVMTChhcmd2WzJdKTsKKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9uZXdfdm5k X3ByZWZpeChoYW5kbGUsCisJCV9TVFJUT1VJMzIoYXJndlsxXSksICZlcnJvcl9udW1iZXIsIFJN TkVUQ1RMX05FV19WTkQsIGFyZ3ZbMl0pOworCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIm5l d3ZuZG5hbWUiKSkgeworCQlfUk1ORVRDTElfQ0hFQ0tOVUxMKGFyZ3ZbMV0pOworCQlfUk1ORVRD TElfQ0hFQ0tOVUxMKGFyZ3ZbMl0pOworCQlyZXR1cm5fY29kZSA9IHJtbmV0X25ld192bmRfbmFt ZShoYW5kbGUsCisJCV9TVFJUT1VJMzIoYXJndlsxXSksICZlcnJvcl9udW1iZXIsIGFyZ3ZbMl0p OworCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIm5ld3ZuZCIpKSB7CisJCV9STU5FVENMSV9D SEVDS05VTEwoYXJndlsxXSk7CisJCXJldHVybl9jb2RlID0gcm1uZXRfbmV3X3ZuZChoYW5kbGUs CisJCV9TVFJUT1VJMzIoYXJndlsxXSksICZlcnJvcl9udW1iZXIsIFJNTkVUQ1RMX05FV19WTkQp OworCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImdldHZuZG5hbWUiKSkgeworCQljaGFyIGJ1 ZmZlclszMl07CisJCW1lbXNldChidWZmZXIsIDAsIDMyKTsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVM TChhcmd2WzFdKTsKKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9nZXRfdm5kX25hbWUoaGFuZGxlLCBf U1RSVE9VSTMyKGFyZ3ZbMV0pLAorCQkJICAgICAgICAgICAmZXJyb3JfbnVtYmVyLCBidWZmZXIs IDMyKTsKKwkJaWYgKHJldHVybl9jb2RlID09IFJNTkVUQ1RMX1NVQ0NFU1MpIHsKKwkJCXByaW50 ZigiVk5EIG5hbWU6ICVzXG4iLCBidWZmZXIpOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCph cmd2LCAiZnJlZXZuZCIpKSB7CisJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlsxXSk7CisJCXJl dHVybl9jb2RlID0gcm1uZXRfbmV3X3ZuZChoYW5kbGUsCisJCV9TVFJUT1VJMzIoYXJndlsxXSks ICZlcnJvcl9udW1iZXIsIFJNTkVUQ1RMX0ZSRUVfVk5EKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAo KmFyZ3YsICJzZXRsaWRmIikpIHsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsKKwkJ X1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzJdKTsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2 WzNdKTsKKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9zZXRfbGlua19pbmdyZXNzX2RhdGFfZm9ybWF0 X3RhaWxzcGFjZSgKKwkJaGFuZGxlLCBfU1RSVE9VSTMyKGFyZ3ZbMV0pLCBfU1RSVE9VSTgoYXJn dlsyXSksIGFyZ3ZbM10sCisJCSZlcnJvcl9udW1iZXIpOworCX0gZWxzZSBpZiAoIXN0cmNtcCgq YXJndiwgImRlbHZuY3RjZmxvdyIpKSB7CisJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlsxXSk7 CisJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlsyXSk7CisJCV9STU5FVENMSV9DSEVDS05VTEwo YXJndlszXSk7CisJCXJldHVybl9jb2RlID0gcm1uZXRfYWRkX2RlbF92bmRfdGNfZmxvdyhoYW5k bGUsCisJCV9TVFJUT1VJMzIoYXJndlsxXSksIF9TVFJUT1VJMzIoYXJndlsyXSksIF9TVFJUT1VJ MzIoYXJndlszXSksCisJCVJNTkVUQ1RMX0RFTF9GTE9XLCAmZXJyb3JfbnVtYmVyKTsKKwl9IGVs c2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJnZXRsZXBjIikpIHsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVM TChhcmd2WzFdKTsKKwkJZWdyZXNzX2Rldl9uYW1lID0gTlVMTDsKKwkJZWdyZXNzX2Rldl9uYW1l ID0gKGNoYXIgKiltYWxsb2MoUk1ORVRfTUFYX1NUUl9MRU4KKwkJKiBzaXplb2YoY2hhcikpOwor CQlpZiAoIWVncmVzc19kZXZfbmFtZSkgeworCQkJcHJpbnRfcm1uZXRfYXBpX3N0YXR1cyhSTU5F VENUTF9MSUJfRVJSLAorCQkJUk1ORVRDVExfQ0ZHX0ZBSUxVUkVfRUdSRVNTX0RFVl9OQU1FX05V TEwpOworCQkJcm1uZXRjdGxfY2xlYW51cChoYW5kbGUpOworCQkJcmV0dXJuIFJNTkVUQ1RMX0xJ Ql9FUlI7CisJCX0KKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9nZXRfbG9naWNhbF9lcF9jb25maWco aGFuZGxlLAorCQlfU1RSVE9JMzIoYXJndlsxXSksIGFyZ3ZbMl0sICZybW5ldF9tb2RlLAorCQkm ZWdyZXNzX2Rldl9uYW1lLCBSTU5FVF9NQVhfU1RSX0xFTiwgJmVycm9yX251bWJlcik7CisJCWlm IChyZXR1cm5fY29kZSA9PSBSTU5FVENUTF9TVUNDRVNTKSB7CisJCQlwcmludGYoInJtbmV0X21v ZGUgaXMgJXVcbiIsIHJtbmV0X21vZGUpOworCQkJcHJpbnRmKCJlZ3Jlc3NfZGV2X25hbWUgaXMg JXNcbiIsIGVncmVzc19kZXZfbmFtZSk7CisJCX0KKwkJZnJlZShlZ3Jlc3NfZGV2X25hbWUpOwor CX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImFkZHZuY3RjZmxvdyIpKSB7CisJCV9STU5FVENM SV9DSEVDS05VTEwoYXJndlsxXSk7CisJCV9STU5FVENMSV9DSEVDS05VTEwoYXJndlsyXSk7CisJ CV9STU5FVENMSV9DSEVDS05VTEwoYXJndlszXSk7CisJCXJldHVybl9jb2RlID0gcm1uZXRfYWRk X2RlbF92bmRfdGNfZmxvdyhoYW5kbGUsCisJCV9TVFJUT1VJMzIoYXJndlsxXSksIF9TVFJUT1VJ MzIoYXJndlsyXSksIF9TVFJUT1VJMzIoYXJndlszXSksCisJCVJNTkVUQ1RMX0FERF9GTE9XLCAm ZXJyb3JfbnVtYmVyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJzZXRsZWRmIikpIHsK KwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChh cmd2WzJdKTsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzNdKTsKKwkJcmV0dXJuX2NvZGUg PSBybW5ldF9zZXRfbGlua19lZ3Jlc3NfZGF0YV9mb3JtYXQoaGFuZGxlLAorCQlfU1RSVE9VSTMy KGFyZ3ZbMV0pLCBfU1RSVE9VSTE2KGFyZ3ZbMl0pLCBfU1RSVE9VSTE2KGFyZ3ZbM10pLAorCQlh cmd2WzRdLCAmZXJyb3JfbnVtYmVyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJzZXRs ZXBjIikpIHsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsKKwkJX1JNTkVUQ0xJX0NI RUNLTlVMTChhcmd2WzJdKTsKKwkJcmV0dXJuX2NvZGUgPSBybW5ldF9zZXRfbG9naWNhbF9lcF9j b25maWcoaGFuZGxlLAorCQlfU1RSVE9JMzIoYXJndlsxXSksIF9TVFJUT1VJOChhcmd2WzJdKSwg YXJndlszXSwgYXJndls0XSwKKwkJJmVycm9yX251bWJlcik7CisJfSBlbHNlIGlmICghc3RyY21w KCphcmd2LCAidW5zZXRsZXBjIikpIHsKKwkJX1JNTkVUQ0xJX0NIRUNLTlVMTChhcmd2WzFdKTsK KwkJcmV0dXJuX2NvZGUgPSBybW5ldF91bnNldF9sb2dpY2FsX2VwX2NvbmZpZyhoYW5kbGUsCisJ CV9TVFJUT0kzMihhcmd2WzFdKSwgYXJndlsyXSwgJmVycm9yX251bWJlcik7CisJfQorZW5kOgor CXByaW50X3JtbmV0X2FwaV9zdGF0dXMocmV0dXJuX2NvZGUsIGVycm9yX251bWJlcik7CisJKHZv aWQpcnRybW5ldF9jdGxfZGVpbml0KGhhbmRsZSk7CisJcmV0dXJuIHJldHVybl9jb2RlOworfQor CisvKiEKKyogQGJyaWVmIE1ldGhvZCB3aGljaCBzZXJ2ZXMgYXMgZW4gZW50cnkgcG9pbnQgdG8g dGhlIHJtbmV0Y2xpIGZ1bmN0aW9uCisqIEBkZXRhaWxzIEVudHJ5IHBvaW50IGZvciB0aGUgUm1O ZXQgTmV0bGluayBBUEkuIFRoaXMgaXMgdGhlIGNvbW1hbmQgbGluZQorKiBpbnRlcmZhY2UgZm9y IHRoZSBSbU5ldCBBUEkKKyogQHBhcmFtIGFyZ2MgTnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCB2 YXJ5IGJhc2VkIG9uIHRoZSBjb21tYW5kcworKiBAcGFyYW0gYXJndiBWYWx1ZSBvZiB0aGUgYXJn dW1lbnRzIHdoaWNoIHZhcnkgYmFzZWQgb24gdGhlIGNvbW1hbmRzCisqIEByZXR1cm4gUk1ORVRD VExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLiBSZWxldmFudCBkYXRhIG1pZ2h0IGJlIHByaW50ZWQK KyogYmFzZWQgb24gdGhlIG1lc3NhZ2UgdHlwZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlIg aWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4gRXJyb3IgY29kZSB3aWxsIGJlCisqIHByaW50 ZWQKKyogQHJldHVybiBSTU5FVENUTF9LRVJORUxfRVJSIGlmIHRoZXJlIHdhcyBhIGVycm9yIGlu IHRoZSBrZXJuZWwuIEVycm9yIGNvZGUgd2lsbCBiZQorKiBwcmludGVkCisqIEByZXR1cm4gUk1O RVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhl IEFQSQorKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJYXJnYy0tOwor CWFyZ3YrKzsKKwlyZXR1cm4gcm1uZXRfYXBpX2NhbGwoYXJnYywgYXJndik7Cit9CmRpZmYgLS1n aXQgYS9ybW5ldGxpYi9jbGkvcm1uZXRjbGkuaCBiL3JtbmV0bGliL2NsaS9ybW5ldGNsaS5oCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzUwODIKLS0tIC9kZXYvbnVsbAor KysgYi9ybW5ldGxpYi9jbGkvcm1uZXRjbGkuaApAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCisKKwkJCSAgUiBNIE4gRSBUIEMgTCBJIC4gSAorCitDb3B5cmlnaHQgKGMp IDIwMTMsIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisK K1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg b3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCSogUmVkaXN0cmlidXRpb25zIG9mIHNv dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwkgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKwkqIFJl ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKwkg IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nCisJICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl cmlhbHMgcHJvdmlkZWQKKwkgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwkqIE5laXRoZXIgdGhl IG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKwkgIGNv bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy aXZlZAorCSAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl biBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFO WSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCitBUkUgRElT Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJ QlVUT1JTCitCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT UEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBT RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCitCVVNJTkVTUyBJTlRF UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwK K1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO RyBORUdMSUdFTkNFCitPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCitJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU WSBPRiBTVUNIIERBTUFHRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCisKKyAgQGZpbGUJICAgcm1uZXRjbGkuaAorICBAYnJpZWYgICBoZWFkZXJz IGZvciB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSB0byBleHBvc2Ugcm1uZXQgY29udHJvbCBB UEkncworCisgIERFU0NSSVBUSU9OCisgIEhlYWRlciBmaWxlIGNvbnRhaW5pbmcgZGVmaW5pdGlv biBmb3IgdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gZXhwb3NlCisgIHJtbmV0IGNvbnRy b2wgQVBJJ3MKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFJNTkVUQ0xJX0gK KyNkZWZpbmUgUk1ORVRDTElfSAorCisvKiBQcmludCB0aGUgaGVscCBmb3IgdGhlIGNvbW1hbmRz IHNpbmNlIHRoZSBoZWxwIGZsYWcgd2FzIHVzZWQuICovCisjZGVmaW5lIFJNTkVUQ1RMX0NGR19T VUNDRVNTX0hFTFBfQ09NTUFORCAxMDAKKy8qIE5vL2ludmFsaWQgQVBJIGNhbGwgd2FzIHNwZWNp ZmllZC4gU28gcmV0dXJuIGFuIGVycm9yLiAqLworI2RlZmluZSBSTU5FVENUTF9DRkdfRkFJTFVS RV9OT19DT01NQU5EIDEwMQorLyogVGhlIGJ1ZmZlciBmb3IgZWdyZXNzIGRldmljZSBuYW1lIHdh cyBOVUxMICovCisjZGVmaW5lIFJNTkVUQ1RMX0NGR19GQUlMVVJFX0VHUkVTU19ERVZfTkFNRV9O VUxMIDEwMgorCisvKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIHZhbHVlIG9mIHRoZSBzdGFy dGluZyBlbGVtZW50ICovCisjZGVmaW5lIFJNTkVUQ0ZHX0VSUl9OVU1fU1RBUlQgMTAwCisKKy8q IFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgdG90YWwgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2Ug ZnJvbSBDTEkgKi8KKyNkZWZpbmUgUk1ORVRDRkdfVE9UQUxfRVJSX01TR1MgMworCisjZW5kaWYg Lyogbm90IGRlZmluZWQgUk1ORVRDTElfSCAqLwpkaWZmIC0tZ2l0IGEvcm1uZXRsaWIvaW5jL2xp YnJtbmV0Y3RsLmggYi9ybW5ldGxpYi9pbmMvbGlicm1uZXRjdGwuaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4zZDYyMmJmCi0tLSAvZGV2L251bGwKKysrIGIvcm1uZXRsaWIv aW5jL2xpYnJtbmV0Y3RsLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKKworCQkJICBMIEkgQiBSIE0gTiBFIFQgQyBUIEwgLiBICisKK0NvcHlyaWdodCAoYykgMjAx My0yMDE1LCAyMDE3LTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs IHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCSogUmVkaXN0cmlidXRpb25z IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwkgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K KwkqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv dmUKKwkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nCisJICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl ciBtYXRlcmlhbHMgcHJvdmlkZWQKKwkgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwkqIE5laXRo ZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMK KwkgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj dHMgZGVyaXZlZAorCSAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig d3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIg QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFks IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCitB UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1Ig Q09OVFJJQlVUT1JTCitCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCitCVVNJTkVT UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ TElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO Q0xVRElORyBORUdMSUdFTkNFCitPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCitJRiBBRFZJU0VEIE9GIFRIRSBQT1NT SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEK KyogIEBmaWxlICAgIGxpYnJtbmV0Y3RsLmgKKyogIEBicmllZiAgIHJtbmV0IGNvbnRyb2wgQVBJ J3MgaGVhZGVyIGZpbGUKKyovCisKKyNpZm5kZWYgTElCUk1ORVRDVExfSAorI2RlZmluZSBMSUJS TU5FVENUTF9ICisKKy8qIFJNTkVUIEFQSSBzdWNjZWVkZWQgKi8KKyNkZWZpbmUgUk1ORVRDVExf U1VDQ0VTUyAwCisvKiBSTU5FVCBBUEkgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbGUgZXhlY3V0 aW5nIHdpdGhpbiB0aGUgbGlicmFyeS4gQ2hlY2sgdGhlCisqIGVycm9yIGNvZGUgaW4gdGhpcyBj YXNlICovCisjZGVmaW5lIFJNTkVUQ1RMX0xJQl9FUlIgMQorLyogUk1ORVQgQVBJIGVuY291bnRl cmVkIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyBpbiB0aGUga2VybmVsLiBDaGVjayB0aGUKKyog ZXJyb3IgY29kZSBpbiB0aGlzIGNhc2UgKi8KKyNkZWZpbmUgUk1ORVRDVExfS0VSTkVMX0VSUiAy CisvKiBSTU5FVCBBUEkgZW5jb3VudGVyZWQgYW4gZXJyb3IgYmVjYXVzZSBvZiBpbnZhbGlkIGFy Z3VtZW50cyovCisjZGVmaW5lIFJNTkVUQ1RMX0lOVkFMSURfQVJHIDMKKworLyogRmxhZyB0byBh c3NvY2lhdGUgYSBuZXR3b3JrIGRldmljZSovCisjZGVmaW5lIFJNTkVUQ1RMX0RFVklDRV9BU1NP Q0lBVEUgMQorLyogRmxhZyB0byB1bmFzc29jaWF0ZSBhIG5ldHdvcmsgZGV2aWNlKi8KKyNkZWZp bmUgUk1ORVRDVExfREVWSUNFX1VOQVNTT0NJQVRFIDAKKy8qIEZsYWcgdG8gY3JlYXRlIGEgbmV3 IHZpcnR1YWwgbmV0d29yayBkZXZpY2UqLworI2RlZmluZSBSTU5FVENUTF9ORVdfVk5EIDEKKy8q IEZsYWcgdG8gZnJlZSBhIG5ldyB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlKi8KKyNkZWZpbmUgUk1O RVRDVExfRlJFRV9WTkQgMAorLyogRmxhZyB0byBhZGQgYSBuZXcgZmxvdyovCisjZGVmaW5lIFJN TkVUQ1RMX0FERF9GTE9XIDEKKy8qIEZsYWcgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGZsb3cqLwor I2RlZmluZSBSTU5FVENUTF9ERUxfRkxPVyAwCisKK2VudW0gcm1uZXRjdGxfZXJyb3JfY29kZXNf ZSB7CisJLyogQVBJIHN1Y2NlZWRlZC4gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBmaXJzdCBl bGVtZW50LiAqLworCVJNTkVUQ1RMX0FQSV9TVUNDRVNTID0gMCwKKworCVJNTkVUQ1RMX0FQSV9G SVJTVF9FUlIgPSAxLAorCS8qIEFQSSBmYWlsZWQgYmVjYXVzZSBub3QgZW5vdWdoIG1lbW9yeSB0 byBjcmVhdGUgYnVmZmVyIHRvIHNlbmQKKwkgKiBtZXNzYWdlICovCisJUk1ORVRDVExfQVBJX0VS Ul9SRVFVRVNUX0lOVkFMSUQgPSBSTU5FVENUTF9BUElfRklSU1RfRVJSLAorCS8qIEFQSSBmYWls ZWQgYmVjYXVzZSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYnVmZmVyIGZvciB0aGUKKwkg KiAgcmVzcG9uc2UgbWVzc2FnZSAqLworCVJNTkVUQ1RMX0FQSV9FUlJfUkVTUE9OU0VfSU5WQUxJ RCA9IDIsCisJLyogQVBJIGZhaWxlZCBiZWNhdXNlIGNvdWxkIG5vdCBzZW5kIHRoZSBtZXNzYWdl IHRvIGtlcm5lbCAqLworCVJNTkVUQ1RMX0FQSV9FUlJfTUVTU0FHRV9TRU5EID0gMywKKwkvKiBB UEkgZmFpbGVkIGJlY2F1c2UgY291bGQgbm90IHJlY2VpdmUgbWVzc2FnZSBmcm9tIHRoZSBrZXJu ZWwgKi8KKwlSTU5FVENUTF9BUElfRVJSX01FU1NBR0VfUkVDRUlWRSA9IDQsCisKKwlSTU5FVENU TF9JTklUX0ZJUlNUX0VSUiA9IDUsCisJLyogSW52YWxpZCBwcm9jZXNzIGlkLiBTbyByZXR1cm4g YW4gZXJyb3IuICovCisJUk1ORVRDVExfSU5JVF9FUlJfUFJPQ0VTU19JRCA9IFJNTkVUQ1RMX0lO SVRfRklSU1RfRVJSLAorCS8qIEludmFsaWQgc29ja2V0IGRlc2NyaXB0b3IgaWQuIFNvIHJldHVy biBhbiBlcnJvci4gKi8KKwlSTU5FVENUTF9JTklUX0VSUl9ORVRMSU5LX0ZEID0gNiwKKwkvKiBD b3VsZCBub3QgYmluZCB0aGUgc29ja2V0IHRvIHRoZSBOZXRsaW5rIGZpbGUgZGVzY3JpcHRvciAq LworCVJNTkVUQ1RMX0lOSVRfRVJSX0JJTkQgPSA3LAorCS8qIEludmFsaWQgdXNlciBpZC4gT25s eSByb290IGhhcyBhY2Nlc3MgdG8gdGhpcyBmdW5jdGlvbi4gKE5BKSAqLworCVJNTkVUQ1RMX0lO SVRfRVJSX0lOVkFMSURfVVNFUiA9IDgsCisKKwlSTU5FVENUTF9BUElfU0VDT05EX0VSUiA9IDks CisJLyogQVBJIGZhaWxlZCBiZWNhdXNlIHRoZSBSbU5ldCBoYW5kbGUgZm9yIHRoZSB0cmFuc2Fj dGlvbiB3YXMgTlVMTCAqLworCVJNTkVUQ1RMX0FQSV9FUlJfSE5ETF9JTlZBTElEID0gUk1ORVRD VExfQVBJX1NFQ09ORF9FUlIsCisJLyogQVBJIGZhaWxlZCBiZWNhdXNlIHRoZSByZXF1ZXN0IGJ1 ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uIHdhcyBOVUxMICovCisJUk1ORVRDVExfQVBJX0VSUl9S RVFVRVNUX05VTEwgPSAxMCwKKwkvKiBBUEkgZmFpbGVkIGJlY2F1c2UgdGhlIHJlc3BvbnNlIGJ1 ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uIHdhcyBOVUxMKi8KKwlSTU5FVENUTF9BUElfRVJSX1JF U1BPTlNFX05VTEwgPSAxMSwKKwkvKiBBUEkgZmFpbGVkIGJlY2F1c2UgdGhlIHJlcXVlc3QgYW5k IHJlc3BvbnNlIHR5cGUgZG8gbm90IG1hdGNoKi8KKwlSTU5FVENUTF9BUElfRVJSX01FU1NBR0Vf VFlQRSA9IDEyLAorCS8qIEFQSSBmYWlsZWQgYmVjYXVzZSB0aGUgcmV0dXJuIHR5cGUgaXMgaW52 YWxpZCAqLworCVJNTkVUQ1RMX0FQSV9FUlJfUkVUVVJOX1RZUEUgPSAxMywKKwkvKiBBUEkgZmFp bGVkIGJlY2F1c2UgdGhlIHN0cmluZyB3YXMgdHJ1bmNhdGVkICovCisJUk1ORVRDVExfQVBJX0VS Ul9TVFJJTkdfVFJVTkNBVElPTiA9IDE0LAorCisJLyogVGhlc2UgZXJyb3IgYXJlIDEtdG8tMSB3 aXRoIHJtbmV0X2RhdGEgY29uZmlnIGVycm9ycyBpbiBybW5ldF9kYXRhLmgKKwkgICBmb3IgZWFj aCBjb252ZXJzaW9uLgorCSAgIHBsZWFzZSBrZWVwIHRoZSBlbnVtcyBzeW5jZWQuCisJKi8KKwlS TU5FVENUTF9LRVJORUxfRklSU1RfRVJSID0gMTUsCisJLyogTm8gZXJyb3IgKi8KKwlSTU5FVENU TF9LRVJORUxfRVJST1JfTk9fRVJSID0gUk1ORVRDVExfS0VSTkVMX0ZJUlNUX0VSUiwKKwkvKiBJ bnZhbGlkIC8gdW5zdXBwb3J0ZWQgbWVzc2FnZSAqLworCVJNTkVUQ1RMX0tFUk5FTF9FUlJfVU5L Tk9XTl9NRVNTQUdFID0gMTYsCisJLyogSW50ZXJuYWwgcHJvYmxlbSBpbiB0aGUga2VybmVsIG1v ZHVsZSAqLworCVJNTkVUQ1RMX0tFUk5FTF9FUlJfSU5URVJOQUwgPSAxNywKKwkvKiBLZXJuZWwg aXMgdGVtcG9yYXJpbHkgb3V0IG9mIG1lbW9yeSAqLworCVJNTkVUQ1RMX0tFUk5FTF9FUlJfT1VU X09GX01FTSA9IDE4LAorCS8qIERldmljZSBhbHJlYWR5IGV4aXN0cyAvIFN0aWxsIGluIHVzZSAq LworCVJNRVROQ1RMX0tFUk5FTF9FUlJfREVWSUNFX0lOX1VTRSA9IDE5LAorCS8qIEludmFsaWQg cmVxdWVzdCAvIFVuc3VwcG9ydGVkIHNjZW5hcmlvICovCisJUk1ORVRDVExfS0VSTkVMX0VSUl9J TlZBTElEX1JFUVVFU1QgPSAyMCwKKwkvKiBEZXZpY2UgZG9lc24ndCBleGlzdCAqLworCVJNTkVU Q1RMX0tFUk5FTF9FUlJfTk9fU1VDSF9ERVZJQ0UgPSAyMSwKKwkvKiBPbmUgb3IgbW9yZSBvZiB0 aGUgYXJndW1lbnRzIGlzIGludmFsaWQgKi8KKwlSTU5FVENUTF9LRVJORUxfRVJSX0JBRF9BUkdT ID0gMjIsCisJLyogRWdyZXNzIGRldmljZSBpcyBpbnZhbGlkICovCisJUk1ORVRDVExfS0VSTkVM X0VSUl9CQURfRUdSRVNTX0RFVklDRSA9IDIzLAorCS8qIFRDIGhhbmRsZSBpcyBmdWxsICovCisJ Uk1ORVRDVExfS0VSTkVMX0VSUl9UQ19IQU5ETEVfRlVMTCA9IDI0LAorCisJLyogVGhpcyBzaG91 bGQgYWx3YXlzIGJlIHRoZSBsYXN0IGVsZW1lbnQgKi8KKwlSTU5FVENUTF9BUElfRVJSX0VOVU1f TEVOR1RICit9OworCisjZGVmaW5lIFJNTkVUQ1RMX0VSUl9NU0dfU0laRSAxMDAKKworLyohCisq IEBicmllZiBDb250YWlucyBhIGxpc3Qgb2YgZXJyb3IgbWVzc2FnZSBmcm9tIEFQSQorKi8KK2No YXIgcm1uZXRjdGxfZXJyb3JfY29kZV90ZXh0CitbUk1ORVRDVExfQVBJX0VSUl9FTlVNX0xFTkdU SF1bUk1ORVRDVExfRVJSX01TR19TSVpFXSA9IHsKKwkiRVJST1I6IEFQSSBzdWNjZWVkZWRcbiIs CisJIkVSUk9SOiBVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBzZW5kIG1lc3NhZ2Vc biIsCisJIkVSUk9SOiBVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byByZWNlaXZlIG1l c3NhZ2VcbiIsCisJIkVSUk9SOiBDb3VsZCBub3Qgc2VuZCB0aGUgbWVzc2FnZSB0byBrZXJuZWxc biIsCisJIkVSUk9SOiBVbmFibGUgdG8gcmVjZWl2ZSBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbFxu IiwKKwkiRVJST1I6IEludmFsaWQgcHJvY2VzcyBpZFxuIiwKKwkiRVJST1I6IEludmFsaWQgc29j a2V0IGRlc2NyaXB0b3IgaWRcbiIsCisJIkVSUk9SOiBDb3VsZCBub3QgYmluZCB0byBuZXRsaW5r IHNvY2tldFxuIiwKKwkiRVJST1I6IE9ubHkgcm9vdCBjYW4gYWNjZXNzIHRoaXMgQVBJXG4iLAor CSJFUlJPUjogUm1OZXQgaGFuZGxlIGZvciB0aGUgdHJhbnNhY3Rpb24gd2FzIE5VTExcbiIsCisJ IkVSUk9SOiBSZXF1ZXN0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uIHdhcyBOVUxMXG4iLAor CSJFUlJPUjogUmVzcG9uc2UgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24gd2FzIE5VTExcbiIs CisJIkVSUk9SOiBSZXF1ZXN0IGFuZCByZXNwb25zZSB0eXBlIGRvIG5vdCBtYXRjaFxuIiwKKwki RVJST1I6IFJldHVybiB0eXBlIGlzIGludmFsaWRcbiIsCisJIkVSUk9SOiBTdHJpbmcgd2FzIHRy dW5jYXRlZFxuIiwKKwkvKiBLZXJuZWwgZXJyb3JzICovCisJIkVSUk9SOiBLZXJuZWwgY2FsbCBz dWNjZWVkZWRcbiIsCisJIkVSUk9SOiBJbnZhbGlkIC8gVW5zdXBwb3J0ZWQgZGlyZWN0aXZlXG4i LAorCSJFUlJPUjogSW50ZXJuYWwgcHJvYmxlbSBpbiB0aGUga2VybmVsIG1vZHVsZVxuIiwKKwki RVJST1I6IFRoZSBrZXJuZWwgaXMgdGVtcG9yYXJpbHkgb3V0IG9mIG1lbW9yeVxuIiwKKwkiRVJS T1I6IERldmljZSBhbHJlYWR5IGV4aXN0cyAvIFN0aWxsIGluIHVzZVxuIiwKKwkiRVJST1I6IElu dmFsaWQgcmVxdWVzdCAvIFVuc3VwcG9ydGVkIHNjZW5hcmlvXG4iLAorCSJFUlJPUjogRGV2aWNl IGRvZXNuJ3QgZXhpc3RcbiIsCisJIkVSUk9SOiBPbmUgb3IgbW9yZSBvZiB0aGUgYXJndW1lbnRz IGlzIGludmFsaWRcbiIsCisJIkVSUk9SOiBFZ3Jlc3MgZGV2aWNlIGlzIGludmFsaWRcbiIsCisJ IkVSUk9SOiBUQyBoYW5kbGUgaXMgZnVsbFxuIgorfTsKKworLyo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KwkJCSBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TCis9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwor dHlwZWRlZiBzdHJ1Y3Qgcm1uZXRjdGxfaG5kbF9zIHJtbmV0Y3RsX2huZGxfdDsKKworLyohCisq IEBicmllZiBQdWJsaWMgQVBJIHRvIGluaXRpYWxpemUgdGhlIFJNTkVUIGNvbnRyb2wgZHJpdmVy CisqIEBkZXRhaWxzIEFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBSbU5ldCBoYW5kbGUuIENyZWF0 ZXMgYW5kIGJpbmRzIHRvIGEgICBhbmQKKyogbmV0bGluayBzb2NrZXQgaWYgc3VjY2Vzc2Z1bAor KiBAcGFyYW0gKipybW5ldGN0bF9obmRsX3RfdmFsIFJtTmV0IGhhbmRsZSB0byBiZSBpbml0aWFs aXplZAorKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorKiBAcmV0dXJu IFJNTkVUQ1RMX0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4gQ2hlY2sgZXJy b3JfY29kZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlIgaWYgdGhlcmUgd2FzIGFuIGVy cm9yIGluIHRoZSBrZXJuZWwuCisqIENoZWNrIGVycm9yX2NvZGUKKyogQHJldHVybiBSTU5FVENU TF9JTlZBTElEX0FSRyBpZiBpbnZhbGlkIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCB0byB0aGUgQVBJ CisqLworaW50IHJtbmV0Y3RsX2luaXQocm1uZXRjdGxfaG5kbF90ICoqaG5kbCwgdWludDE2X3Qg KmVycm9yX2NvZGUpOworCisvKiEKKyogQGJyaWVmIFB1YmxpYyBBUEkgdG8gY2xlYW4gdXAgdGhl IFJtTmVUIGNvbnRyb2wgaGFuZGxlCisqIEBkZXRhaWxzIENsb3NlIHRoZSBzb2NrZXQgYW5kIGZy ZWUgdGhlIFJtTmV0IGhhbmRsZQorKiBAcGFyYW0gKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQg aGFuZGxlIHRvIGJlIGluaXRpYWxpemVkCisqIEByZXR1cm4gdm9pZAorKi8KK3ZvaWQgcm1uZXRj dGxfY2xlYW51cChybW5ldGN0bF9obmRsX3QgKmhuZGwpOworCisvKiEKKyogQGJyaWVmIFB1Ymxp YyBBUEkgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBhIFJNTkVUIGRyaXZlciBvbiBhIHBhcnRpY3Vs YXIgZGV2aWNlCisqIEBkZXRhaWxzIE1lc3NhZ2UgdHlwZSBpcyBSTU5FVF9ORVRMSU5LX0FTU09D SUFURV9ORVRXT1JLX0RFVklDRSBvcgorKiBSTU5FVF9ORVRMSU5LX1VOQVNTT0NJQVRFX05FVFdP UktfREVWSUNFIGJhc2VkIG9uIHRoZSBmbGFnIGZvciBhc3NvY19kZXYKKyogQHBhcmFtICpybW5l dGN0bF9obmRsX3RfdmFsIFJtTmV0IGhhbmRsZSBmb3IgdGhlIE5ldGxpbmsgbWVzc2FnZQorKiBA cGFyYW0gZGV2X25hbWUgRGV2aWNlIG9uIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBSbU5ldCBkcml2 ZXIKKyogQHBhcmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24KKyog QHBhcmFtIGFzc29jX2RldiByZWdpc3RlcnMgdGhlIGRldmljZSBpZiBSTU5FVENUTF9ERVZJQ0Vf QVNTT0NJQVRFIG9yCisqIHVucmVnaXN0ZXJzIHRoZSBkZXZpY2UgaWYgUk1ORVRDVExfREVWSUNF X1VOQVNTT0NJQVRFCisqIEByZXR1cm4gUk1ORVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCisq IEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBpZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBD aGVjayBlcnJvcl9jb2RlCisqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3 YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyogQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJu IFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGludmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRv IHRoZSBBUEkKKyovCitpbnQgcm1uZXRfYXNzb2NpYXRlX25ldHdvcmtfZGV2aWNlKHJtbmV0Y3Rs X2huZGxfdCAqaG5kbCwKKwkJCQkgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICB1aW50 MTZfdCAqZXJyb3JfY29kZSwKKwkJCQkgICB1aW50OF90IGFzc29jX2Rldik7CisKKy8qIQorKiBA YnJpZWYgUHVibGljIEFQSSB0byBnZXQgaWYgYSBSTU5FVCBkcml2ZXIgaXMgcmVnaXN0ZXJlZCBv biBhIHBhcnRpY3VsYXIKKyogZGV2aWNlCisqIEBkZXRhaWxzIE1lc3NhZ2UgdHlwZSBpcyBSTU5F VF9ORVRMSU5LX0dFVF9ORVRXT1JLX0RFVklDRV9BU1NPQ0lBVEVELgorKiBAcGFyYW0gKnJtbmV0 Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxlIGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisqIEBw YXJhbSBkZXZfbmFtZSBEZXZpY2Ugb24gd2hpY2ggdG8gY2hlY2sgaWYgdGhlIFJtTmV0IGRyaXZl ciBpcyByZWdpc3RlcmVkCisqIEBwYXJhbSByZWdpc3Rlcl9zdGF0dXMgMSBpZiBSbU5ldCBkYXRh IGRyaXZlciBpcyByZWdpc3RlcmVkIG9uIGEgcGFydGljdWxhcgorKiBkZXZpY2UsIDAgaWYgbm90 CisqIEBwYXJhbSBlcnJvcl9jb2RlIFN0YXR1cyBjb2RlIG9mIHRoaXMgb3BlcmF0aW9uCisqIEBy ZXR1cm4gUk1ORVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCisqIEByZXR1cm4gUk1ORVRDVExf TElCX0VSUiBpZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBDaGVjayBlcnJvcl9jb2RlCisq IEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhl IGtlcm5lbC4KKyogQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURf QVJHIGlmIGludmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBBUEkKKyovCitpbnQg cm1uZXRfZ2V0X25ldHdvcmtfZGV2aWNlX2Fzc29jaWF0ZWQocm1uZXRjdGxfaG5kbF90ICpobmRs LAorCQkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJaW50ICpyZWdpc3Rlcl9zdGF0dXMs CisJCQkJCXVpbnQxNl90ICplcnJvcl9jb2RlKTsKKworLyohCisqIEBicmllZiBQdWJsaWMgQVBJ IHRvIHNldCB0aGUgZWdyZXNzIGRhdGEgZm9ybWF0IGZvciBhIHBhcnRpY3VsYXIgbGluay4KKyog QGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJNTkVUX05FVExJTktfU0VUX0xJTktfRUdSRVNTX0RB VEFfRk9STUFULgorKiBAcGFyYW0gKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxlIGZv ciB0aGUgTmV0bGluayBtZXNzYWdlCisqIEBwYXJhbSBlZ3Jlc3NfZmxhZ3MgRWdyZXNzIGZsYWdz IHRvIGJlIHNldCBvbiB0aGUgZGV2aWNlCisqIEBwYXJhbSBhZ2dfc2l6ZSBNYXggc2l6ZSBvZiBh Z2dyZWdhdGVkIHBhY2tldHMKKyogQHBhcmFtIGFnZ19jb3VudCBOdW1iZXIgb2YgcGFja2V0cyB0 byBiZSBhZ2dyZWdhdGVkCisqIEBwYXJhbSBkZXZfbmFtZSBEZXZpY2Ugb24gd2hpY2ggdG8gc2V0 IHRoZSBlZ3Jlc3MgZGF0YSBmb3JtYXQKKyogQHBhcmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUg b2YgdGhpcyBvcGVyYXRpb24gcmV0dXJuZWQgZnJvbSB0aGUga2VybmVsCisqIEByZXR1cm4gUk1O RVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCisqIEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBp ZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBDaGVjayBlcnJvcl9jb2RlCisqIEByZXR1cm4g Uk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4K KyogQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGlu dmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBBUEkKKyovCitpbnQgcm1uZXRfc2V0 X2xpbmtfZWdyZXNzX2RhdGFfZm9ybWF0KHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCQkgICAg ICB1aW50MzJfdCBlZ3Jlc3NfZmxhZ3MsCisJCQkJICAgICAgdWludDE2X3QgYWdnX3NpemUsCisJ CQkJICAgICAgdWludDE2X3QgYWdnX2NvdW50LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9u YW1lLAorCQkJCSAgICAgIHVpbnQxNl90ICplcnJvcl9jb2RlKTsKKworLyohCisqIEBicmllZiBQ dWJsaWMgQVBJIHRvIGdldCB0aGUgZWdyZXNzIGRhdGEgZm9ybWF0IGZvciBhIHBhcnRpY3VsYXIg bGluay4KKyogQGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJNTkVUX05FVExJTktfR0VUX0xJTktf RUdSRVNTX0RBVEFfRk9STUFULgorKiBAcGFyYW0gKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQg aGFuZGxlIGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisqIEBwYXJhbSBkZXZfbmFtZSBEZXZpY2Ug b24gd2hpY2ggdG8gZ2V0IHRoZSBlZ3Jlc3MgZGF0YSBmb3JtYXQKKyogQHBhcmFtIGVncmVzc19m bGFncyBFZ3Jlc3MgZmxhZ3MgZnJvbSB0aGUgZGV2aWNlCisqIEBwYXJhbSBhZ2dfY291bnQgTnVt YmVyIG9mIHBhY2tldHMgdG8gYmUgYWdncmVnYXRlZAorKiBAcGFyYW0gZXJyb3JfY29kZSBTdGF0 dXMgY29kZSBvZiB0aGlzIG9wZXJhdGlvbiByZXR1cm5lZCBmcm9tIHRoZSBrZXJuZWwKKyogQHJl dHVybiBSTU5FVENUTF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKyogQHJldHVybiBSTU5FVENUTF9M SUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJyb3IuIENoZWNrIGVycm9yX2NvZGUKKyog QHJldHVybiBSTU5FVENUTF9LRVJORUxfRVJSIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUg a2VybmVsLgorKiBDaGVjayBlcnJvcl9jb2RlCisqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9B UkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorKi8KK2ludCBy bW5ldF9nZXRfbGlua19lZ3Jlc3NfZGF0YV9mb3JtYXQocm1uZXRjdGxfaG5kbF90ICpobmRsLAor CQkJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSAgICAgIHVpbnQzMl90ICplZ3Jl c3NfZmxhZ3MsCisJCQkJICAgICAgdWludDE2X3QgKmFnZ19zaXplLAorCQkJCSAgICAgIHVpbnQx Nl90ICphZ2dfY291bnQsCisJCQkJICAgICAgdWludDE2X3QgKmVycm9yX2NvZGUpOworCisvKiEK KyogQGJyaWVmIFB1YmxpYyBBUEkgdG8gc2V0IHRoZSBpbmdyZXNzIGRhdGEgZm9ybWF0IGZvciBh IHBhcnRpY3VsYXIgbGluay4KKyogQGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJNTkVUX05FVExJ TktfU0VUX0xJTktfSU5HUkVTU19EQVRBX0ZPUk1BVC4KKyogQHBhcmFtICpybW5ldGN0bF9obmRs X3RfdmFsIFJtTmV0IGhhbmRsZSBmb3IgdGhlIE5ldGxpbmsgbWVzc2FnZQorKiBAcGFyYW0gaW5n cmVzc19mbGFncyBJbmdyZXNzIGZsYWdzIGZyb20gdGhlIGRldmljZQorKiBAcGFyYW0gdGFpbF9z cGFjaW5nIFRhaWwgc3BhY2luZyBuZWVkZWQgZm9yIHRoZSBwYWNrZXQKKyogQHBhcmFtIGRldl9u YW1lIERldmljZSBvbiB3aGljaCB0byBzZXQgdGhlIGluZ3Jlc3MgZGF0YSBmb3JtYXQKKyogQHBh cmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gcmV0dXJuZWQgZnJv bSB0aGUga2VybmVsCisqIEByZXR1cm4gUk1ORVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCisq IEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBpZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBD aGVjayBlcnJvcl9jb2RlCisqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3 YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyogQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJu IFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGludmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRv IHRoZSBBUEkKKyovCitpbnQgcm1uZXRfc2V0X2xpbmtfaW5ncmVzc19kYXRhX2Zvcm1hdF90YWls c3BhY2Uocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCQkJIHVpbnQzMl90IGluZ3Jlc3NfZmxh Z3MsCisJCQkJCQkgdWludDhfdCAgdGFpbF9zcGFjaW5nLAorCQkJCQkJIGNvbnN0IGNoYXIgKmRl dl9uYW1lLAorCQkJCQkJIHVpbnQxNl90ICplcnJvcl9jb2RlKTsKKworLyohCisqIEBicmllZiBQ dWJsaWMgQVBJIHRvIGdldCB0aGUgaW5ncmVzcyBkYXRhIGZvcm1hdCBmb3IgYSBwYXJ0aWN1bGFy IGxpbmsuCisqIEBkZXRhaWxzIE1lc3NhZ2UgdHlwZSBpcyBSTU5FVF9ORVRMSU5LX0dFVF9MSU5L X0lOR1JFU1NfREFUQV9GT1JNQVQuCisqIEBwYXJhbSAqcm1uZXRjdGxfaG5kbF90X3ZhbCBSbU5l dCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1lc3NhZ2UKKyogQHBhcmFtIGRldl9uYW1lIERldmlj ZSBvbiB3aGljaCB0byBnZXQgdGhlIGluZ3Jlc3MgZGF0YSBmb3JtYXQKKyogQHBhcmFtIGluZ3Jl c3NfZmxhZ3MgSW5ncmVzcyBmbGFncyBmcm9tIHRoZSBkZXZpY2UKKyogQHBhcmFtIHRhaWxfc3Bh Y2luZyBUYWlsIHNwYWNpbmcgbmVlZGVkIGZvciB0aGUgcGFja2V0CisqIEBwYXJhbSBlcnJvcl9j b2RlIFN0YXR1cyBjb2RlIG9mIHRoaXMgb3BlcmF0aW9uIHJldHVybmVkIGZyb20gdGhlIGtlcm5l bAorKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorKiBAcmV0dXJuIFJN TkVUQ1RMX0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4gQ2hlY2sgZXJyb3Jf Y29kZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlIgaWYgdGhlcmUgd2FzIGFuIGVycm9y IGluIHRoZSBrZXJuZWwuCisqIENoZWNrIGVycm9yX2NvZGUKKyogQHJldHVybiBSTU5FVENUTF9J TlZBTElEX0FSRyBpZiBpbnZhbGlkIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCB0byB0aGUgQVBJCisq LworaW50IHJtbmV0X2dldF9saW5rX2luZ3Jlc3NfZGF0YV9mb3JtYXRfdGFpbHNwYWNlKHJtbmV0 Y3RsX2huZGxfdCAqaG5kbCwKKwkJCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCQkJdWlu dDMyX3QgKmluZ3Jlc3NfZmxhZ3MsCisJCQkJCQl1aW50OF90ICAqdGFpbF9zcGFjaW5nLAorCQkJ CQkJdWludDE2X3QgKmVycm9yX2NvZGUpOworCitpbmxpbmUgaW50IHJtbmV0X3NldF9saW5rX2lu Z3Jlc3NfZGF0YV9mb3JtYXQocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCQkgICAgICB1aW50 MzJfdCBpbmdyZXNzX2ZsYWdzLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJ CQkJICAgICAgdWludDE2X3QgKmVycm9yX2NvZGUpCit7CisJcmV0dXJuIHJtbmV0X3NldF9saW5r X2luZ3Jlc3NfZGF0YV9mb3JtYXRfdGFpbHNwYWNlKGhuZGwsCisJCQkJCQkJICAgIGluZ3Jlc3Nf ZmxhZ3MsCisJCQkJCQkJICAgIDAsCisJCQkJCQkJICAgIGRldl9uYW1lLAorCQkJCQkJCSAgICBl cnJvcl9jb2RlKTsKK30KKworaW5saW5lIGludCBybW5ldF9nZXRfbGlua19pbmdyZXNzX2RhdGFf Zm9ybWF0KHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZGV2 X25hbWUsCisJCQkJCSAgICAgIHVpbnQzMl90ICppbmdyZXNzX2ZsYWdzLAorCQkJCQkgICAgICB1 aW50MTZfdCAqZXJyb3JfY29kZSkKK3sKKwlyZXR1cm4gcm1uZXRfZ2V0X2xpbmtfaW5ncmVzc19k YXRhX2Zvcm1hdF90YWlsc3BhY2UoaG5kbCwKKwkJCQkJCQkgICAgZGV2X25hbWUsCisJCQkJCQkJ ICAgIGluZ3Jlc3NfZmxhZ3MsCisJCQkJCQkJICAgIDAsCisJCQkJCQkJICAgIGVycm9yX2NvZGUp OworfQorCisvKiEKKyogQGJyaWVmIFB1YmxpYyBBUEkgdG8gc2V0IHRoZSBsb2dpY2FsIGVuZHBv aW50IGNvbmZpZ3VyYXRpb24gZm9yIGEKKyogcGFydGljdWxhciBsaW5rLgorKiBAZGV0YWlscyBN ZXNzYWdlIHR5cGUgaXMgUk1ORVRfTkVUTElOS19TRVRfTE9HSUNBTF9FUF9DT05GSUcuCisqIEBw YXJhbSAqcm1uZXRjdGxfaG5kbF90X3ZhbCBSbU5ldCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1l c3NhZ2UKKyogQHBhcmFtIGxvZ2ljYWxfZXBfaWQgTG9naWNhbCBlbmQgcG9pbnQgaWQgb24gd2hp Y2ggdGhlIGNvbmZpZ3VyYXRpb24gaXMgdG8gYmUKKyogc2V0CisqIEBwYXJhbSBybW5ldF9tb2Rl IFJtTmV0IG1vZGUgdG8gYmUgc2V0IG9uIHRoZSBkZXZpY2UKKyogQHBhcmFtIGRldl9uYW1lIERl dmljZSBvbiB3aGljaCB0byBzZXQgdGhlIGxvZ2ljYWwgZW5kIHBvaW50IGNvbmZpZ3VyYXRpb24K KyogQHBhcmFtIGVncmVzc19kZXZfbmFtZSBFZ3Jlc3MgRGV2aWNlIGlmIG9wZXJhdGluZyBpbiBi cmlkZ2UgbW9kZQorKiBAcGFyYW0gZXJyb3JfY29kZSBTdGF0dXMgY29kZSBvZiB0aGlzIG9wZXJh dGlvbiByZXR1cm5lZCBmcm9tIHRoZSBrZXJuZWwKKyogQHJldHVybiBSTU5FVENUTF9TVUNDRVNT IGlmIHN1Y2Nlc3NmdWwKKyogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBh IGxpYnJhcnkgZXJyb3IuIENoZWNrIGVycm9yX2NvZGUKKyogQHJldHVybiBSTU5FVENUTF9LRVJO RUxfRVJSIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUga2VybmVsLgorKiBDaGVjayBlcnJv cl9jb2RlCisqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVu dHMgd2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorKi8KK2ludCBybW5ldF9zZXRfbG9naWNhbF9lcF9j b25maWcocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCWludDMyX3QgZXBfaWQsCisJCQkJdWlu dDhfdCBvcGVyYXRpbmdfbW9kZSwKKwkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQljb25z dCBjaGFyICpuZXh0X2RldiwKKwkJCQl1aW50MTZfdCAqZXJyb3JfY29kZSk7CisKKy8qIQorKiBA YnJpZWYgUHVibGljIEFQSSB0byB1bi1zZXQgdGhlIGxvZ2ljYWwgZW5kcG9pbnQgY29uZmlndXJh dGlvbiBmb3IgYQorKiBwYXJ0aWN1bGFyIGxpbmsuCisqIEBkZXRhaWxzIE1lc3NhZ2UgdHlwZSBp cyBSTU5FVF9ORVRMSU5LX1VOU0VUX0xPR0lDQUxfRVBfQ09ORklHLgorKiBAcGFyYW0gKnJtbmV0 Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxlIGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisqIEBw YXJhbSBsb2dpY2FsX2VwX2lkIExvZ2ljYWwgZW5kIHBvaW50IGlkIG9uIHdoaWNoIHRoZSBjb25m aWd1cmF0aW9uIGlzIHRvIGJlCisqIHVuLXNldAorKiBAcGFyYW0gZGV2X25hbWUgRGV2aWNlIG9u IHdoaWNoIHRvIHVuLXNldCB0aGUgbG9naWNhbCBlbmQgcG9pbnQgY29uZmlndXJhdGlvbgorKiBA cGFyYW0gZXJyb3JfY29kZSBTdGF0dXMgY29kZSBvZiB0aGlzIG9wZXJhdGlvbiByZXR1cm5lZCBm cm9tIHRoZSBrZXJuZWwKKyogQHJldHVybiBSTU5FVENUTF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwK KyogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJyb3Iu IENoZWNrIGVycm9yX2NvZGUKKyogQHJldHVybiBSTU5FVENUTF9LRVJORUxfRVJSIGlmIHRoZXJl IHdhcyBhbiBlcnJvciBpbiB0aGUga2VybmVsLgorKiBDaGVjayBlcnJvcl9jb2RlCisqIEByZXR1 cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBwYXNzZWQg dG8gdGhlIEFQSQorKi8KK2ludCBybW5ldF91bnNldF9sb2dpY2FsX2VwX2NvbmZpZyhybW5ldGN0 bF9obmRsX3QgKmhuZGwsCisJCQkJICBpbnQzMl90IGVwX2lkLAorCQkJCSAgY29uc3QgY2hhciAq ZGV2X25hbWUsCisJCQkJICB1aW50MTZfdCAqZXJyb3JfY29kZSk7CisvKiEKKyogQGJyaWVmIFB1 YmxpYyBBUEkgdG8gZ2V0IHRoZSBsb2dpY2FsIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZm9yIGEK KyogcGFydGljdWxhciBsaW5rLgorKiBAZGV0YWlscyBNZXNzYWdlIHR5cGUgaXMgUk1ORVRfTkVU TElOS19HRVRfTE9HSUNBTF9FUF9DT05GSUcuCisqIEBwYXJhbSAqcm1uZXRjdGxfaG5kbF90X3Zh bCBSbU5ldCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1lc3NhZ2UKKyogQHBhcmFtIGxvZ2ljYWxf ZXBfaWQgTG9naWNhbCBlbmQgcG9pbnQgaWQgZnJvbSB3aGljaCB0byBnZXQgdGhlIGNvbmZpZ3Vy YXRpb24KKyogQHBhcmFtIGRldl9uYW1lIERldmljZSBvbiB3aGljaCB0byBnZXQgdGhlIGxvZ2lj YWwgZW5kIHBvaW50IGNvbmZpZ3VyYXRpb24KKyogQHBhcmFtIHJtbmV0X21vZGUgUm1OZXQgbW9k ZSBmcm9tIHRoZSBkZXZpY2UKKyogQHBhcmFtIG5leHRfZGV2IEVncmVzcyBEZXZpY2UgbmFtZQor KiBAcGFyYW0gbmV4dF9kZXZfbGVuIEVncmVzcyBEZXZpY2UgSS9PIHN0cmluZyBsZW4KKyogQHBh cmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gcmV0dXJuZWQgZnJv bSB0aGUga2VybmVsCisqIEByZXR1cm4gUk1ORVRDVExfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCisq IEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBpZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBD aGVjayBlcnJvcl9jb2RlCisqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3 YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyogQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJu IFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGludmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRv IHRoZSBBUEkKKyovCitpbnQgcm1uZXRfZ2V0X2xvZ2ljYWxfZXBfY29uZmlnKHJtbmV0Y3RsX2hu ZGxfdCAqaG5kbCwKKwkJCQlpbnQzMl90IGVwX2lkLAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1l LAorCQkJCXVpbnQ4X3QgKm9wZXJhdGluZ19tb2RlLAorCQkJCWNoYXIgKipuZXh0X2RldiwKKwkJ CQl1aW50MzJfdCBuZXh0X2Rldl9sZW4sCisJCQkJdWludDE2X3QgKmVycm9yX2NvZGUpOworCisv KiEKKyogQGJyaWVmIFB1YmxpYyBBUEkgdG8gY3JlYXRlIGEgbmV3IHZpcnR1YWwgZGV2aWNlIG5v ZGUKKyogQGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJNTkVUX05FVExJTktfTkVXX1ZORCBvcgor KiBSTU5FVENUTF9GUkVFX1ZORCBiYXNlZCBvbiB0aGUgZmxhZyBmb3IgbmV3X3ZuZAorKiBAcGFy YW0gaG5kbCBSbU5ldCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1lc3NhZ2UKKyogQHBhcmFtIGlk IE5vZGUgbnVtYmVyIHRvIGNyZWF0ZSB0aGUgdmlydHVhbCBuZXR3b3JrIGRldmljZSBub2RlCisq IEBwYXJhbSBlcnJvcl9jb2RlIFN0YXR1cyBjb2RlIG9mIHRoaXMgb3BlcmF0aW9uIHJldHVybmVk IGZyb20gdGhlIGtlcm5lbAorKiBAcGFyYW0gbmV3X3ZuZCBjcmVhdGVzIGEgbmV3IHZpcnR1YWwg bmV0d29yayBkZXZpY2UgaWYgIFJNTkVUQ1RMX05FV19WTkQgb3IKKyogZnJlZXMgdGhlIGRldmlj ZSBpZiBSTU5FVENUTF9GUkVFX1ZORAorKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3Vj Y2Vzc2Z1bAorKiBAcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFy eSBlcnJvci4gQ2hlY2sgZXJyb3JfY29kZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlIg aWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBrZXJuZWwuCisqIENoZWNrIGVycm9yX2NvZGUK KyogQHJldHVybiBSTU5FVENUTF9JTlZBTElEX0FSRyBpZiBpbnZhbGlkIGFyZ3VtZW50cyB3ZXJl IHBhc3NlZCB0byB0aGUgQVBJCisqLworaW50IHJtbmV0X25ld192bmQocm1uZXRjdGxfaG5kbF90 ICpobmRsLAorCQkgIHVpbnQzMl90IGlkLAorCQkgIHVpbnQxNl90ICplcnJvcl9jb2RlLAorCQkg IHVpbnQ4X3QgbmV3X3ZuZCk7CisKKy8qIQorICogQGJyaWVmIFB1YmxpYyBBUEkgdG8gY3JlYXRl IGEgbmV3IHZpcnR1YWwgZGV2aWNlIG5vZGUgd2l0aCBhIGN1c3RvbSBwcmVmaXgKKyAqIEBkZXRh aWxzIE1lc3NhZ2UgdHlwZSBpcyBSTU5FVF9ORVRMSU5LX05FV19WTkQgb3IKKyAqIFJNTkVUQ1RM X0ZSRUVfVk5EIGJhc2VkIG9uIHRoZSBmbGFnIGZvciBuZXdfdm5kCisgKiBAcGFyYW0gaG5kbCBS bU5ldCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZCBOb2RlIG51 bWJlciB0byBjcmVhdGUgdGhlIHZpcnR1YWwgbmV0d29yayBkZXZpY2Ugbm9kZQorICogQHBhcmFt IGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gcmV0dXJuZWQgZnJvbSB0 aGUga2VybmVsCisgKiBAcGFyYW0gbmV3X3ZuZCBjcmVhdGVzIGEgbmV3IHZpcnR1YWwgbmV0d29y ayBkZXZpY2UgaWYgIFJNTkVUQ1RMX05FV19WTkQgb3IKKyAqIGZyZWVzIHRoZSBkZXZpY2UgaWYg Uk1ORVRDVExfRlJFRV9WTkQKKyAqIEBwYXJhbSBwcmVmaXggUHJlZml4IHRvIGJlIHVzZWQgd2hl biBuYW1pbmcgdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NF U1MgaWYgc3VjY2Vzc2Z1bAorICogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdh cyBhIGxpYnJhcnkgZXJyb3IuIENoZWNrIGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExf S0VSTkVMX0VSUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyAqIENoZWNr IGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBh cmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorICovCitpbnQgcm1uZXRfbmV3X3ZuZF9w cmVmaXgocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJIHVpbnQzMl90IGlkLAorCQkJIHVpbnQx Nl90ICplcnJvcl9jb2RlLAorCQkJIHVpbnQ4X3QgbmV3X3ZuZCwKKwkJCSBjb25zdCBjaGFyICpw cmVmaXgpOworCisvKiEKKyAqIEBicmllZiBQdWJsaWMgQVBJIHRvIGNyZWF0ZSBhIG5ldyB2aXJ0 dWFsIGRldmljZSBub2RlIHdpdGggYSBjdXN0b20gcHJlZml4CisgKiBAZGV0YWlscyBNZXNzYWdl IHR5cGUgaXMgUk1ORVRfTkVUTElOS19ORVdfVk5EIG9yCisgKiBSTU5FVENUTF9GUkVFX1ZORCBi YXNlZCBvbiB0aGUgZmxhZyBmb3IgbmV3X3ZuZAorICogQHBhcmFtIGhuZGwgUm1OZXQgaGFuZGxl IGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisgKiBAcGFyYW0gaWQgTm9kZSBudW1iZXIgdG8gY3Jl YXRlIHRoZSB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlIG5vZGUKKyAqIEBwYXJhbSBlcnJvcl9jb2Rl IFN0YXR1cyBjb2RlIG9mIHRoaXMgb3BlcmF0aW9uIHJldHVybmVkIGZyb20gdGhlIGtlcm5lbAor ICogQHBhcmFtIG5ld192bmQgY3JlYXRlcyBhIG5ldyB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlIGlm ICBSTU5FVENUTF9ORVdfVk5EIG9yCisgKiBmcmVlcyB0aGUgZGV2aWNlIGlmIFJNTkVUQ1RMX0ZS RUVfVk5ECisgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGJlIHVzZWQgd2hlbiBuYW1pbmcgdGhlIG5l dHdvcmsgaW50ZXJmYWNlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1 bAorICogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJy b3IuIENoZWNrIGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0 aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyAqIENoZWNrIGVycm9yX2NvZGUKKyAq IEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBw YXNzZWQgdG8gdGhlIEFQSQorICovCitpbnQgcm1uZXRfbmV3X3ZuZF9uYW1lKHJtbmV0Y3RsX2hu ZGxfdCAqaG5kbCwKKwkJCSB1aW50MzJfdCBpZCwKKwkJCSB1aW50MTZfdCAqZXJyb3JfY29kZSwK KwkJCSBjb25zdCBjaGFyICpuYW1lKTsKKworLyohCisgKiBAYnJpZWYgQVBJIHRvIGdldCB0aGUg QVNDSUkgbmFtZSBvZiBhIHZpcnR1YWwgbmV0d29yayBkZXZpY2UgZnJvbSBpdHMgSUQKKyAqIEBw YXJhbSBobmRsIFJtTmV0IGhhbmRsZSBmb3IgdGhlIE5ldGxpbmsgbWVzc2FnZQorICogQHBhcmFt IGlkIE5vZGUgbnVtYmVyIHRvIGNyZWF0ZSB0aGUgdmlydHVhbCBuZXR3b3JrIGRldmljZSBub2Rl CisgKiBAcGFyYW0gZXJyb3JfY29kZSBTdGF0dXMgY29kZSBvZiB0aGlzIG9wZXJhdGlvbiByZXR1 cm5lZCBmcm9tIHRoZSBrZXJuZWwKKyAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHN0b3JlIEFTQ0lJ IHJlcHJlc2VudGF0aW9uIG9mIGRldmljZSBuYW1lCisgKiBAcGFyYW0gYnVmbGVuIExlbmd0aCBv ZiB0aGUgYnVmZmVyCisgKiBAcGFyYW0gcHJlZml4IFByZWZpeCB0byBiZSB1c2VkIHdoZW4gbmFt aW5nIHRoZSBuZXR3b3JrIGludGVyZmFjZQorICogQHJldHVybiBSTU5FVENUTF9TVUNDRVNTIGlm IHN1Y2Nlc3NmdWwKKyAqIEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBpZiB0aGVyZSB3YXMgYSBs aWJyYXJ5IGVycm9yLiBDaGVjayBlcnJvcl9jb2RlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX0tFUk5F TF9FUlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBrZXJuZWwuCisgKiBDaGVjayBlcnJv cl9jb2RlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGludmFsaWQgYXJndW1l bnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBBUEkKKyAqLworCitpbnQgcm1uZXRfZ2V0X3ZuZF9uYW1l KHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBp ZCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZXJyb3JfY29kZSwKKyAgICAgICAg ICAgICAgICAgICAgICBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qg YnVmbGVuKTsKKworLyohCisqIEBicmllZiBQdWJsaWMgQVBJIHRvIHNldCBvciBjbGVhciBhIGZs b3cKKyogQGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJNTkVUX05FVExJTktfQUREX1ZORF9UQ19G TE9XIG9yCisqIFJNTkVUX05FVExJTktfREVMX1ZORF9UQ19GTE9XIGJhc2VkIG9uIHRoZSBmbGFn IGZvciBzZXRfZmxvdworKiBAcGFyYW0gKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxl IGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisqIEBwYXJhbSBpZCBOb2RlIG51bWJlciB0byBzZXQg b3IgY2xlYXIgdGhlIGZsb3cgb24gdGhlIHZpcnR1YWwgbmV0d29yaworKiBkZXZpY2Ugbm9kZQor KiBAcGFyYW0gbWFwX2Zsb3dfaWQgRmxvdyBoYW5kbGUgb2YgdGhlIG1vZGVtCisqIEBwYXJhbSB0 Y19mbG93X2lkIFNvZnR3YXJlIGZsb3cgaGFuZGxlCisqIEBwYXJhbSBzZXRfZmxvdyBzZXRzIHRo ZSBmbG93IGlmICBSTU5FVF9ORVRMSU5LX1NFVF9GTE9XIG9yCisqIGNsZWFycyB0aGUgZmxvdyBp ZiBSTU5FVF9ORVRMSU5LX0NMRUFSX0ZMT1cKKyogQHJldHVybiBSTU5FVENUTF9TVUNDRVNTIGlm IHN1Y2Nlc3NmdWwKKyogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxp YnJhcnkgZXJyb3IuIENoZWNrIGVycm9yX2NvZGUKKyogQHJldHVybiBSTU5FVENUTF9LRVJORUxf RVJSIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUga2VybmVsLgorKiBDaGVjayBlcnJvcl9j b2RlCisqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMg d2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorKi8KK2ludCBybW5ldF9hZGRfZGVsX3ZuZF90Y19mbG93 KHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCSAgICAgIHVpbnQzMl90IGlkLAorCQkJICAgICAg dWludDMyX3QgbWFwX2Zsb3dfaWQsCisJCQkgICAgICB1aW50MzJfdCB0Y19mbG93X2lkLAorCQkJ ICAgICAgdWludDhfdCBzZXRfZmxvdywKKwkJCSAgICAgIHVpbnQxNl90ICplcnJvcl9jb2RlKTsK KworLyogQGJyaWVmIFB1YmxpYyBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgUlRNX05FVExJTksgUk1O RVQgY29udHJvbCBkcml2ZXIKKyAqIEBkZXRhaWxzIEFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBS bU5ldCBoYW5kbGUuIENyZWF0ZXMgYW5kIGJpbmRzIHRvIGEKKyAqIG5ldGxpbmsgc29ja2V0IGlm IHN1Y2Nlc3NmdWwKKyAqIEBwYXJhbSAqKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxl IHRvIGJlIGluaXRpYWxpemVkCisgKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vz c2Z1bAorICogQHJldHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkg ZXJyb3IuIENoZWNrIGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBp ZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyAqIENoZWNrIGVycm9yX2NvZGUK KyAqIEByZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2Vy ZSBwYXNzZWQgdG8gdGhlIEFQSQorICovCitpbnQgcnRybW5ldF9jdGxfaW5pdChybW5ldGN0bF9o bmRsX3QgKipobmRsLCB1aW50MTZfdCAqZXJyb3JfY29kZSk7CisKKy8qIEBicmllZiBQdWJsaWMg QVBJIHRvIGNsZWFuIHVwIHRoZSBSVE1fTkVUTElOSyBSbU5lVCBjb250cm9sIGhhbmRsZQorICog QGRldGFpbHMgQ2xvc2UgdGhlIHNvY2tldCBhbmQgZnJlZSB0aGUgUm1OZXQgaGFuZGxlCisgKiBA cGFyYW0gKnJtbmV0Y3RsX2huZGxfdF92YWwgUm1OZXQgaGFuZGxlIHRvIGJlIGluaXRpYWxpemVk CisgKiBAcmV0dXJuIHZvaWQKKyAqLworaW50IHJ0cm1uZXRfY3RsX2RlaW5pdChybW5ldGN0bF9o bmRsX3QgKmhuZGwpOworCisvKiBAYnJpZWYgUHVibGljIEFQSSB0byBjcmVhdGUgYSBuZXcgdmly dHVhbCBkZXZpY2Ugbm9kZQorICogQGRldGFpbHMgTWVzc2FnZSB0eXBlIGlzIFJUTV9ORVdMSU5L CisgKiBAcGFyYW0gaG5kbCBSbU5ldCBoYW5kbGUgZm9yIHRoZSBOZXRsaW5rIG1lc3NhZ2UKKyAq IEBwYXJhbSBkZXZfbmFtZSBEZXZpY2UgbmFtZSBuZXcgbm9kZSB3aWxsIGJlIGNvbm5lY3RlZCB0 bworICogQHBhcmFtIHZuZF9uYW1lIE5hbWUgb2YgdmlydHVhbCBkZXZpY2UgdG8gYmUgY3JlYXRl ZAorICogQHBhcmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gcmV0 dXJuZWQgZnJvbSB0aGUga2VybmVsCisgKiBAcGFyYW0gaW5kZXggSW5kZXggbm9kZSB3aWxsIGhh dmUKKyAqIEBwYXJhbSBmbGFnY29uZmlnIEZsYWcgY29uZmlndXJhdGlvbiBkZXZpY2Ugd2lsbCBo YXZlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorICogQHJldHVy biBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJyb3IuIENoZWNrIGVy cm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3YXMgYW4g ZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyAqIENoZWNrIGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1O RVRDVExfSU5WQUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhl IEFQSQorICovCitpbnQgcnRybW5ldF9jdGxfbmV3dm5kKHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwg Y2hhciAqZGV2bmFtZSwgY2hhciAqdm5kbmFtZSwKKwkJICAgICAgIHVpbnQxNl90ICplcnJvcl9j b2RlLCB1aW50OF90ICBpbmRleCwKKwkJICAgICAgIHVpbnQzMl90IGZsYWdjb25maWcpOworCisv KiBAYnJpZWYgUHVibGljIEFQSSB0byBkZWxldGUgYSB2aXJ0dWFsIGRldmljZSBub2RlCisgKiBA ZGV0YWlscyBNZXNzYWdlIHR5cGUgaXMgUlRNX0RFTExJTksKKyAqIEBwYXJhbSBobmRsIFJtTmV0 IGhhbmRsZSBmb3IgdGhlIE5ldGxpbmsgbWVzc2FnZQorICogQHBhcmFtIHZuZF9uYW1lIE5hbWUg b2YgdmlydHVhbCBkZXZpY2UgdG8gYmUgZGVsZXRlZAorICogQHBhcmFtIGVycm9yX2NvZGUgU3Rh dHVzIGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gcmV0dXJuZWQgZnJvbSB0aGUga2VybmVsCisgKiBA cmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorICogQHJldHVybiBSTU5FVENU TF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJyb3IuIENoZWNrIGVycm9yX2NvZGUK KyAqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4g dGhlIGtlcm5lbC4KKyAqIENoZWNrIGVycm9yX2NvZGUKKyAqIEByZXR1cm4gUk1ORVRDVExfSU5W QUxJRF9BUkcgaWYgaW52YWxpZCBhcmd1bWVudHMgd2VyZSBwYXNzZWQgdG8gdGhlIEFQSQorICov CitpbnQgcnRybW5ldF9jdGxfZGVsdm5kKHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwgY2hhciAqdm5k bmFtZSwKKwkJICAgICAgIHVpbnQxNl90ICplcnJvcl9jb2RlKTsKKworLyogQGJyaWVmIFB1Ymxp YyBBUEkgdG8gY2hhbmdlIGZsYWcncyBvZiBhIHZpcnR1YWwgZGV2aWNlIG5vZGUKKyAqIEBkZXRh aWxzIE1lc3NhZ2UgdHlwZSBpcyBSVE1fTkVXTElOSworICogQHBhcmFtIGhuZGwgUm1OZXQgaGFu ZGxlIGZvciB0aGUgTmV0bGluayBtZXNzYWdlCisgKiBAcGFyYW0gZGV2X25hbWUgTmFtZSBvZiBk ZXZpY2Ugbm9kZSBpcyBjb25uZWN0ZWQgdG8KKyAqIEBwYXJhbSB2bmRfbmFtZSBOYW1lIG9mIHZp cnR1YWwgZGV2aWNlIHRvIGJlIGNoYW5nZWQKKyAqIEBwYXJhbSBlcnJvcl9jb2RlIFN0YXR1cyBj b2RlIG9mIHRoaXMgb3BlcmF0aW9uIHJldHVybmVkIGZyb20gdGhlIGtlcm5lbAorICogQHBhcmFt IGZsYWdjb25maWcgTmV3IGZsYWcgY29uZmlnIHZuZCBzaG91bGQgaGF2ZQorICogQHJldHVybiBS TU5FVENUTF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKyAqIEByZXR1cm4gUk1ORVRDVExfTElCX0VS UiBpZiB0aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBDaGVjayBlcnJvcl9jb2RlCisgKiBAcmV0 dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBrZXJu ZWwuCisgKiBDaGVjayBlcnJvcl9jb2RlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURfQVJH IGlmIGludmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBBUEkKKyAqLworaW50IHJ0 cm1uZXRfY3RsX2NoYW5nZXZuZChybW5ldGN0bF9obmRsX3QgKmhuZGwsIGNoYXIgKmRldm5hbWUs IGNoYXIgKnZuZG5hbWUsCisJCQkgIHVpbnQxNl90ICplcnJvcl9jb2RlLCB1aW50OF90ICBpbmRl eCwKKwkJCSAgdWludDMyX3QgZmxhZ2NvbmZpZyk7CisKKy8qIEBicmllZiBQdWJsaWMgQVBJIHRv IGJyaWRnZSBhIHZuZCBhbmQgZGV2aWNlCisgKiBAZGV0YWlscyBNZXNzYWdlIHR5cGUgaXMgUlRN X05FV0xJTksKKyAqIEBwYXJhbSBobmRsIFJtTmV0IGhhbmRsZSBmb3IgdGhlIE5ldGxpbmsgbWVz c2FnZQorICogQHBhcmFtIGRldl9uYW1lIGRldmljZSB0byBicmlkZ2UgbXNnIHdpbGwgYmUgc2Vu dCB0bworICogQHBhcmFtIHZuZF9uYW1lIHZuZCBuYW1lIG9mIGRldmljZSB0aGF0IHdpbGwgYmUg ZGV2X25hbWUncyBtYXN0ZXIKKyAqIEBwYXJhbSBlcnJvcl9jb2RlIFN0YXR1cyBjb2RlIG9mIHRo aXMgb3BlcmF0aW9uIHJldHVybmVkIGZyb20gdGhlIGtlcm5lbAorICogQHJldHVybiBSTU5FVENU TF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKyAqIEByZXR1cm4gUk1ORVRDVExfTElCX0VSUiBpZiB0 aGVyZSB3YXMgYSBsaWJyYXJ5IGVycm9yLiBDaGVjayBlcnJvcl9jb2RlCisgKiBAcmV0dXJuIFJN TkVUQ1RMX0tFUk5FTF9FUlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBrZXJuZWwuCisg KiBDaGVjayBlcnJvcl9jb2RlCisgKiBAcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURfQVJHIGlmIGlu dmFsaWQgYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoZSBBUEkKKyAqLworaW50IHJ0cm1uZXRf Y3RsX2JyaWRnZXZuZChybW5ldGN0bF9obmRsX3QgKmhuZGwsIGNoYXIgKmRldm5hbWUsIGNoYXIg KnZuZG5hbWUsCisJCQkgIHVpbnQxNl90ICplcnJvcl9jb2RlKTsKKworI2VuZGlmIC8qIG5vdCBk ZWZpbmVkIExJQlJNTkVUQ1RMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcm1uZXRsaWIvaW5jL2xpYnJt bmV0Y3RsX2huZGwuaCBiL3JtbmV0bGliL2luYy9saWJybW5ldGN0bF9obmRsLmgKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0MzVlZAotLS0gL2Rldi9udWxsCisrKyBiL3Jt bmV0bGliL2luYy9saWJybW5ldGN0bF9obmRsLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgorCisJCQlMIEkgQiBSIE0gTiBFIFQgQyBUIEwgXyBIIE4gRCBMLiBICisK K0NvcHlyaWdodCAoYykgMjAxMywgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisJKiBSZWRpc3Ry aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor CSAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyLgorCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl IHRoZSBhYm92ZQorCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg YW5kIHRoZSBmb2xsb3dpbmcKKwkgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorCSAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor CSogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVz IG9mIGl0cworCSAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90 ZSBwcm9kdWN0cyBkZXJpdmVkCisJICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQg IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5H LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5U QUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5H RU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBP V05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdF UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElU VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IK K0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg T0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0Yg VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisKKy8qIQorKiAgQGZpbGUgICAgbGlicm1uZXRjdGxfaG5kbC5oCisqICBAYnJpZWYgICBybW5l dCBjb250cm9sIEFQSSdzIGhhbmRsZSBmaWxlCisqLworCisjaWZuZGVmIExJQlJNTkVUQ1RMX0hO RExfSAorI2RlZmluZSBMSUJSTU5FVENUTF9ITkRMX0gKKworLyo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KwkJCSBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TCis9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwor CisvKiEKKyogQGJyaWVmIFN0cnVjdHVyZSBmb3IgUk1ORVQgY29udHJvbCBoYW5kbGVzLiBBIHJt bmV0IGhuZGwgY29udGFpbnMgdGhlIGNhbGxlcgorKiBwcm9jZXNzIGlkLCB0aGUgdHJhbnNhY3Rp b24gaWQgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gMCBmb3IgZWFjaCBuZXcKKyogaW5pdGlhbGl6 ZWQgaGFuZGxlIGFuZCB0aGUgbmV0bGluayBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoaXMgaGFuZGxl LgorKiBAdmFyIHBpZCBwcm9jZXNzIGlkIHRvIGJlIHVzZWQgZm9yIHRoZSBuZXRsaW5rIG1lc3Nh Z2UKKyogQHZhciB0cmFuc2FjdGlvbl9pZCBtZXNzYWdlIG51bWJlciBmb3IgZGVidWdnaW5nCisq IEB2YXIgbmV0bGlua19mZCBuZXRsaW5rIGZpbGUgZGVzY3JpcHRvciB0byBiZSB1c2VkCisqIEB2 YXIgc3JjX2FkZHIgc291cmNlIHNvY2tldCBhZGRyZXNzIHByb3BlcnRpZXMgZm9yIHRoaXMgbWVz c2FnZQorKiBAdmFyIGRlc3RfYWRkciBkZXN0aW5hdGlvbiBzb2NrZXQgYWRkcmVzcyBwcm9wZXJ0 aWVzIGZvciB0aGlzIG1lc3NhZ2UKKyovCisKK3N0cnVjdCBybW5ldGN0bF9obmRsX3MgeworCSB1 aW50MzJfdCBwaWQ7CisJIHVpbnQzMl90IHRyYW5zYWN0aW9uX2lkOworCSBpbnQgbmV0bGlua19m ZDsKKwkgc3RydWN0IHNvY2thZGRyX25sIHNyY19hZGRyLCBkZXN0X2FkZHI7Cit9OworCisjZW5k aWYgLyogbm90IGRlZmluZWQgTElCUk1ORVRDVExfSE5ETF9IICovCisKZGlmZiAtLWdpdCBhL3Jt bmV0bGliL3NyYy9NYWtlZmlsZS5hbSBiL3JtbmV0bGliL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ1M2I3Ci0tLSAvZGV2L251bGwKKysrIGIv cm1uZXRsaWIvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQgQEAKK0FNX0NGTEFHUyA9ICQo Q09ERV9DT1ZFUkFHRV9DRkxBR1MpCitBTV9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvciAtV3VuZGVm IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWcKK0FNX0NGTEFHUyArPSAtSS4v Li4vaW5jCitBTV9MREZMQUdTID0gJChDT0RFX0NPVkVSQUdFX0xERkxBR1MpCisKK2xpYnJtbmV0 Y3RsX2xhX0MgPSBAQ0AKK2xpYnJtbmV0Y3RsX2xhX1NPVVJDRVMgPSBsaWJybW5ldGN0bC5jCisK K2xpYnJtbmV0Y3RsX2xhX0NGTEFHUyA6PSAkKEFNX0NGTEFHUykKK2xpYnJtbmV0Y3RsX2xhX0xE RkxBR1MgOj0gJChBTV9MREZMQUdTKSAtbHB0aHJlYWQKK2xpYnJhcnlfaW5jbHVkZWRpciA9ICQo cGtnaW5jbHVkZWRpcikKK2xpYnJhcnlfaW5jbHVkZV9IRUFERVJTID0gLi8uLi9pbmMvbGlicm1u ZXRjdGwuaAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJybW5ldGN0bC5sYQpkaWZmIC0tZ2l0IGEv cm1uZXRsaWIvc3JjL2xpYnJtbmV0Y3RsLmMgYi9ybW5ldGxpYi9zcmMvbGlicm1uZXRjdGwuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA3Mzc2Ci0tLSAvZGV2L251bGwK KysrIGIvcm1uZXRsaWIvc3JjL2xpYnJtbmV0Y3RsLmMKQEAgLTAsMCArMSwxMzY5IEBACisvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCisKKwkJCUwgSSBCIFIgTSBOIEUgVCBDIFQgTCAuIEMKKworQ29w eXJpZ2h0IChjKSAyMDEzLTIwMTUsIDIwMTctMjAxOCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxs IHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0 ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisJKiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodAorCSAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyLgorCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw cm9kdWNlIHRoZSBhYm92ZQorCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKwkgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRp b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorCSAgd2l0aCB0aGUgZGlzdHJpYnV0 aW9uLgorCSogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhl IG5hbWVzIG9mIGl0cworCSAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisJICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01F UkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1J TkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS SUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwg REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitT VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU UzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU SEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJ TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklT RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCisKKy8qIQorKiBAZmlsZSAgICBsaWJybW5ldGN0bC5jCisqIEBicmllZiAgIHJtbmV0 IGNvbnRyb2wgQVBJJ3MgaW1wbGVtZW50YXRpb24gZmlsZQorKi8KKworLyo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKwkJCUlOQ0xVREUgRklMRVMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRl IDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0 bGluay5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVk ZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNp bmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5fc3RhdHMuaD4K KyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlICJy bW5ldF9kYXRhLmgiCisjaW5jbHVkZSAibGlicm1uZXRjdGxfaG5kbC5oIgorI2luY2x1ZGUgImxp YnJtbmV0Y3RsLmgiCisKKyNpZmRlZiBVU0VfR0xJQgorI2luY2x1ZGUgPGdsaWIuaD4KKyNkZWZp bmUgc3RybGNweSBnX3N0cmxjcHkKKyNlbmRpZgorCisjZGVmaW5lIFJNTkVUQ1RMX1NPQ0tfRkxB RyAwCisjZGVmaW5lIFJPT1RfVVNFUl9JRCAwCisjZGVmaW5lIE1JTl9WQUxJRF9QUk9DRVNTX0lE IDAKKyNkZWZpbmUgTUlOX1ZBTElEX1NPQ0tFVF9GRCAwCisjZGVmaW5lIEtFUk5FTF9QUk9DRVNT X0lEIDAKKyNkZWZpbmUgVU5JQ0FTVCAwCisjZGVmaW5lIE1BWF9CVUZfU0laRSBzaXplb2Yoc3Ry dWN0IG5sbXNnaGRyKSArIHNpemVvZihzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MpCisjZGVmaW5lIElO R1JFU1NfRkxBR1NfTUFTSyAgIChSTU5FVF9JTkdSRVNTX0ZJWF9FVEhFUk5FVCB8IFwKKwkJCSAg ICAgIFJNTkVUX0lOR1JFU1NfRk9STUFUX01BUCB8IFwKKwkJCSAgICAgIFJNTkVUX0lOR1JFU1Nf Rk9STUFUX0RFQUdHUkVHQVRJT04gfCBcCisJCQkgICAgICBSTU5FVF9JTkdSRVNTX0ZPUk1BVF9E RU1VWElORyB8IFwKKwkJCSAgICAgIFJNTkVUX0lOR1JFU1NfRk9STUFUX01BUF9DT01NQU5EUyB8 IFwKKwkJCSAgICAgIFJNTkVUX0lOR1JFU1NfRk9STUFUX01BUF9DS1NVTVYzIHwgXAorCQkJICAg ICAgUk1ORVRfSU5HUkVTU19GT1JNQVRfTUFQX0NLU1VNVjQpCisjZGVmaW5lIEVHUkVTU19GTEFH U19NQVNLICAgIChSTU5FVF9FR1JFU1NfRk9STUFUX19SRVNFUlZFRF9fIHwgXAorCQkJICAgICAg Uk1ORVRfRUdSRVNTX0ZPUk1BVF9NQVAgfCBcCisJCQkgICAgICBSTU5FVF9FR1JFU1NfRk9STUFU X0FHR1JFR0FUSU9OIHwgXAorCQkJICAgICAgUk1ORVRfRUdSRVNTX0ZPUk1BVF9NVVhJTkcgfCBc CisJCQkgICAgICBSTU5FVF9FR1JFU1NfRk9STUFUX01BUF9DS1NVTVYzIHwgXAorCQkJICAgICAg Uk1ORVRfRUdSRVNTX0ZPUk1BVF9NQVBfQ0tTVU1WNCkKKworI2RlZmluZSBtaW4oYSwgYikgKCgo YSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBOTE1TR19UQUlMKG5tc2cpIFwKKyAgICAo KHN0cnVjdCBydGF0dHIgKikgKCgoY2hhciAqKShubXNnKSkgKyBOTE1TR19BTElHTigobm1zZykt Pm5sbXNnX2xlbikpKQorCitzdHJ1Y3Qgbmxtc2cgeworCXN0cnVjdCBubG1zZ2hkciBubF9hZGRy OworCXN0cnVjdCBpZmluZm9tc2cgaWZtc2c7CisJY2hhciBkYXRhWzUwMF07Cit9OworCitleHRl cm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc2l6 ZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQlMT0NBTCBGVU5DVElPTiBERUZJTklUSU9O UworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIQorKiBAYnJpZWYgU3luY2hyb25vdXMgbWV0aG9k IHRvIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMgdG8gYW5kIGZyb20gdGhlIGtlcm5lbAorKiB1 c2luZyAgbmV0bGluayBzb2NrZXRzCisqIEBkZXRhaWxzIEluY3JlbWVudHMgdGhlIHRyYW5zYWN0 aW9uIGlkIGZvciBlYWNoIG1lc3NhZ2Ugc2VudCB0byB0aGUga2VybmVsLgorKiBTZW5kcyB0aGUg bmV0bGluayBtZXNzYWdlIHRvIHRoZSBrZXJuZWwgYW5kIHJlY2VpdmVzIHRoZSByZXNwb25zZSBm cm9tIHRoZQorKiBrZXJuZWwuCisqIEBwYXJhbSAqaG5kbCBSbU5ldCBoYW5kbGUgZm9yIHRoaXMg dHJhbnNhY3Rpb24KKyogQHBhcmFtIHJlcXVlc3QgTWVzc2FnZSB0byBiZSBzZW50IHRvIHRoZSBr ZXJuZWwKKyogQHBhcmFtIHJlc3BvbnNlIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUga2VybmVs CisqIEByZXR1cm4gUk1ORVRDVExfQVBJX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGx5IGFibGUgdG8g c2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlCisqIGZyb20gdGhlIGtlcm5lbAorKiBAcmV0dXJuIFJN TkVUQ1RMX0FQSV9FUlJfSE5ETF9JTlZBTElEIGlmIFJtTmV0IGhhbmRsZSBmb3IgdGhlIHRyYW5z YWN0aW9uIHdhcworKiBOVUxMCisqIEByZXR1cm4gUk1ORVRDVExfQVBJX0VSUl9SRVFVRVNUX05V TEwgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGJ1ZmZlciBmb3IKKyogc2VuZGluZyB0aGUg bWVzc2FnZQorKiBAcmV0dXJuIFJNTkVUQ1RMX0FQSV9FUlJfTUVTU0FHRV9TRU5EIGlmIGNvdWxk IG5vdCBzZW5kIHRoZSBtZXNzYWdlIHRvIGtlcm5lbAorKiBAcmV0dXJuIFJNTkVUQ1RMX0FQSV9F UlJfTUVTU0FHRV9SRUNFSVZFIGlmIGNvdWxkIG5vdCByZWNlaXZlIG1lc3NhZ2UgZnJvbSB0aGUK Kyoga2VybmVsCisqIEByZXR1cm4gUk1ORVRDVExfQVBJX0VSUl9NRVNTQUdFX1RZUEUgaWYgdGhl IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHR5cGUgZG8gbm90CisqIG1hdGNoCisqLworc3RhdGljIHVp bnQxNl90IHJtbmV0Y3RsX3RyYW5zYWN0KHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCXN0cnVj dCBybW5ldF9ubF9tc2dfcyAqcmVxdWVzdCwKKwkJCXN0cnVjdCBybW5ldF9ubF9tc2dfcyAqcmVz cG9uc2UpIHsKKwl1aW50OF90ICpyZXF1ZXN0X2J1ZiwgKnJlc3BvbnNlX2J1ZjsKKwlzdHJ1Y3Qg bmxtc2doZHIgKm5sbXNnaGRyX3ZhbDsKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgKnJtbmV0X25s X21zZ19zX3ZhbDsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQgPSAtMTsKKwl1aW50MTZfdCByZXR1cm5f Y29kZSA9IFJNTkVUQ1RMX0FQSV9FUlJfSE5ETF9JTlZBTElEOworCXN0cnVjdCBzb2NrYWRkcl9u bCogX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpIHNhZGRyX3B0cjsKKwlzb2NrbGVuX3Qg YWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpOworCXJlcXVlc3RfYnVmID0gTlVM TDsKKwlyZXNwb25zZV9idWYgPSBOVUxMOworCW5sbXNnaGRyX3ZhbCA9IE5VTEw7CisJcm1uZXRf bmxfbXNnX3NfdmFsID0gTlVMTDsKKwlkbyB7CisJaWYgKCFobmRsKXsKKwkJYnJlYWs7CisJfQor CWlmICghcmVxdWVzdCl7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfQVBJX0VSUl9SRVFVRVNU X05VTEw7CisJCWJyZWFrOworCX0KKwlpZiAoIXJlc3BvbnNlKXsKKwkJcmV0dXJuX2NvZGUgPSBS TU5FVENUTF9BUElfRVJSX1JFU1BPTlNFX05VTEw7CisJCWJyZWFrOworCX0KKwlyZXF1ZXN0X2J1 ZiA9ICh1aW50OF90ICopbWFsbG9jKE1BWF9CVUZfU0laRSAqIHNpemVvZih1aW50OF90KSk7CisJ aWYgKCFyZXF1ZXN0X2J1Zil7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfQVBJX0VSUl9SRVFV RVNUX05VTEw7CisJCWJyZWFrOworCX0KKworCXJlc3BvbnNlX2J1ZiA9ICh1aW50OF90ICopbWFs bG9jKE1BWF9CVUZfU0laRSAqIHNpemVvZih1aW50OF90KSk7CisJaWYgKCFyZXNwb25zZV9idWYp IHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9BUElfRVJSX1JFU1BPTlNFX05VTEw7CisJCWJy ZWFrOworCX0KKworCW5sbXNnaGRyX3ZhbCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilyZXF1ZXN0X2J1 ZjsKKwlybW5ldF9ubF9tc2dfc192YWwgPSAoc3RydWN0IHJtbmV0X25sX21zZ19zICopTkxNU0df REFUQShyZXF1ZXN0X2J1Zik7CisKKwltZW1zZXQocmVxdWVzdF9idWYsIDAsIE1BWF9CVUZfU0la RSpzaXplb2YodWludDhfdCkpOworCW1lbXNldChyZXNwb25zZV9idWYsIDAsIE1BWF9CVUZfU0la RSpzaXplb2YodWludDhfdCkpOworCisJbmxtc2doZHJfdmFsLT5ubG1zZ19zZXEgPSBobmRsLT50 cmFuc2FjdGlvbl9pZDsKKwlubG1zZ2hkcl92YWwtPm5sbXNnX3BpZCA9IGhuZGwtPnBpZDsKKwlu bG1zZ2hkcl92YWwtPm5sbXNnX2xlbiA9IE1BWF9CVUZfU0laRTsKKworCW1lbWNweSgodm9pZCAq KU5MTVNHX0RBVEEocmVxdWVzdF9idWYpLCByZXF1ZXN0LAorCXNpemVvZihzdHJ1Y3Qgcm1uZXRf bmxfbXNnX3MpKTsKKworCXJtbmV0X25sX21zZ19zX3ZhbC0+Y3JkID0gUk1ORVRfTkVUTElOS19N U0dfQ09NTUFORDsKKwlobmRsLT50cmFuc2FjdGlvbl9pZCsrOworCisJc2FkZHJfcHRyID0gJmhu ZGwtPmRlc3RfYWRkcjsKKwlpZiAoc2VuZHRvKGhuZGwtPm5ldGxpbmtfZmQsCisJCQlyZXF1ZXN0 X2J1ZiwKKwkJCU1BWF9CVUZfU0laRSwKKwkJCVJNTkVUQ1RMX1NPQ0tfRkxBRywKKwkJCShzdHJ1 Y3Qgc29ja2FkZHIqKXNhZGRyX3B0ciwKKwkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpKSA8 IDApIHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9BUElfRVJSX01FU1NBR0VfU0VORDsKKwkJ YnJlYWs7CisJfQorCisJc2FkZHJfcHRyID0gJmhuZGwtPnNyY19hZGRyOworCWJ5dGVzX3JlYWQg PSByZWN2ZnJvbShobmRsLT5uZXRsaW5rX2ZkLAorCQkJcmVzcG9uc2VfYnVmLAorCQkJTUFYX0JV Rl9TSVpFLAorCQkJUk1ORVRDVExfU09DS19GTEFHLAorCQkJKHN0cnVjdCBzb2NrYWRkciopc2Fk ZHJfcHRyLAorCQkJJmFkZHJsZW4pOworCWlmIChieXRlc19yZWFkIDwgMCkgeworCQlyZXR1cm5f Y29kZSA9IFJNTkVUQ1RMX0FQSV9FUlJfTUVTU0FHRV9SRUNFSVZFOworCQlicmVhazsKKwl9CisK KwltZW1jcHkocmVzcG9uc2UsICh2b2lkICopTkxNU0dfREFUQShyZXNwb25zZV9idWYpLAorCXNp emVvZihzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MpKTsKKwlpZiAoc2l6ZW9mKCpyZXNwb25zZSkgPCBz aXplb2Yoc3RydWN0IHJtbmV0X25sX21zZ19zKSkgeworCQlyZXR1cm5fY29kZSA9IFJNTkVUQ1RM X0FQSV9FUlJfUkVTUE9OU0VfTlVMTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlcXVlc3QtPm1l c3NhZ2VfdHlwZSAhPSByZXNwb25zZS0+bWVzc2FnZV90eXBlKSB7CisJCXJldHVybl9jb2RlID0g Uk1ORVRDVExfQVBJX0VSUl9NRVNTQUdFX1RZUEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm5fY29k ZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgwKTsKKwlmcmVlKHJlcXVlc3RfYnVmKTsK KwlmcmVlKHJlc3BvbnNlX2J1Zik7CisJcmV0dXJuIHJldHVybl9jb2RlOworfQorCisvKiEKKyog QGJyaWVmIFN0YXRpYyBmdW5jdGlvbiB0byBjaGVjayB0aGUgZGV2IG5hbWUKKyogQGRldGFpbHMg Q2hlY2tzIGlmIHRoZSBuYW1lIGlzIG5vdCBOVUxMIGFuZCBpZiB0aGUgbmFtZSBpcyBsZXNzIHRo YW4gdGhlCisqIFJNTkVUX01BWF9TVFJfTEVOCisqIEBwYXJhbSBkZXZfbmFtZSBOYW1lIG9mIHRo ZSBkZXZpY2UKKyogQHJldHVybiBSTU5FVENUTF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKyogQHJl dHVybiBSTU5FVENUTF9JTlZBTElEX0FSRyBpZiBpbnZhbGlkIGFyZ3VtZW50cyB3ZXJlIHBhc3Nl ZCB0byB0aGUgQVBJCisqLworc3RhdGljIGlubGluZSBpbnQgX3JtbmV0Y3RsX2NoZWNrX2Rldl9u YW1lKGNvbnN0IGNoYXIgKmRldl9uYW1lKSB7CisJaW50IHJldHVybl9jb2RlID0gUk1ORVRDVExf SU5WQUxJRF9BUkc7CisJZG8geworCWlmICghZGV2X25hbWUpCisJCWJyZWFrOworCWlmIChzdHJs ZW4oZGV2X25hbWUpID49IFJNTkVUX01BWF9TVFJfTEVOKQorCQlicmVhazsKKwlyZXR1cm5fY29k ZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7 Cit9CisKKy8qIQorKiBAYnJpZWYgU3RhdGljIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBzdHJpbmcg bGVuZ3RoIGFmdGVyIGEgY29weQorKiBAZGV0YWlscyBDaGVja3MgaWYgdGhlIHN0cmluZyBsZW5n dGggaXMgbm90IGxlc3NlciB0aGFuIHplcm8gYW5kIGxlc3NlciB0aGFuCisqIFJNTkVUX01BWF9T VFJfTEVOCisqIEBwYXJhbSBzdHJfbGVuIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgY29w eQorKiBAcGFyYW0gZXJyb3JfY29kZSBTdGF0dXMgY29kZSBvZiB0aGlzIG9wZXJhdGlvbgorKiBA cmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorKiBAcmV0dXJuIFJNTkVUQ1RM X0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4gQ2hlY2sgZXJyb3JfY29kZQor Ki8KK3N0YXRpYyBpbmxpbmUgaW50IF9ybW5ldGN0bF9jaGVja19sZW4oc2l6ZV90IHN0cl9sZW4s IHVpbnQxNl90ICplcnJvcl9jb2RlKSB7CisJaW50IHJldHVybl9jb2RlID0gUk1ORVRDVExfTElC X0VSUjsKKwlkbyB7CisJaWYgKHN0cl9sZW4gPiBSTU5FVF9NQVhfU1RSX0xFTikgeworCQkqZXJy b3JfY29kZSA9IFJNTkVUQ1RMX0FQSV9FUlJfU1RSSU5HX1RSVU5DQVRJT047CisJCWJyZWFrOwor CX0KKwlyZXR1cm5fY29kZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgwKTsKKwlyZXR1 cm4gcmV0dXJuX2NvZGU7Cit9CisKKy8qIQorKiBAYnJpZWYgU3RhdGljIGZ1bmN0aW9uIHRvIGNo ZWNrIHRoZSByZXNwb25zZSB0eXBlCisqIEBkZXRhaWxzIENoZWNrcyBpZiB0aGUgcmVzcG9uc2Ug dHlwZSBvZiB0aGlzIG1lc3NhZ2Ugd2FzIHJldHVybiBjb2RlCisqIEBwYXJhbSBjcmQgVGhlIGNy ZCBmaWVsZCBwYXNzZWQKKyogQHBhcmFtIGVycm9yX2NvZGUgU3RhdHVzIGNvZGUgb2YgdGhpcyBv cGVyYXRpb24KKyogQHJldHVybiBSTU5FVENUTF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKyogQHJl dHVybiBSTU5FVENUTF9MSUJfRVJSIGlmIHRoZXJlIHdhcyBhIGxpYnJhcnkgZXJyb3IuIENoZWNr IGVycm9yX2NvZGUKKyovCitzdGF0aWMgaW5saW5lIGludCBfcm1uZXRjdGxfY2hlY2tfY29kZShp bnQgY3JkLCB1aW50MTZfdCAqZXJyb3JfY29kZSkgeworCWludCByZXR1cm5fY29kZSA9IFJNTkVU Q1RMX0xJQl9FUlI7CisJZG8geworCWlmIChjcmQgIT0gUk1ORVRfTkVUTElOS19NU0dfUkVUVVJO Q09ERSkgeworCQkqZXJyb3JfY29kZSA9IFJNTkVUQ1RMX0FQSV9FUlJfUkVUVVJOX1RZUEU7CisJ CWJyZWFrOworCX0KKwlyZXR1cm5fY29kZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgw KTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKKy8qIQorKiBAYnJpZWYgU3RhdGljIGZ1bmN0 aW9uIHRvIGNoZWNrIHRoZSByZXNwb25zZSB0eXBlCisqIEBkZXRhaWxzIENoZWNrcyBpZiB0aGUg cmVzcG9uc2UgdHlwZSBvZiB0aGlzIG1lc3NhZ2Ugd2FzIGRhdGEKKyogQHBhcmFtIGNyZCBUaGUg Y3JkIGZpZWxkIHBhc3NlZAorKiBAcGFyYW0gZXJyb3JfY29kZSBTdGF0dXMgY29kZSBvZiB0aGlz IG9wZXJhdGlvbgorKiBAcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAorKiBA cmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlIgaWYgdGhlcmUgd2FzIGEgbGlicmFyeSBlcnJvci4gQ2hl Y2sgZXJyb3JfY29kZQorKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9ybW5ldGN0bF9jaGVja19kYXRh KGludCBjcmQsIHVpbnQxNl90ICplcnJvcl9jb2RlKSB7CisJaW50IHJldHVybl9jb2RlID0gUk1O RVRDVExfTElCX0VSUjsKKwlkbyB7CisJaWYgKGNyZCAhPSBSTU5FVF9ORVRMSU5LX01TR19SRVRV Uk5EQVRBKSB7CisJCSplcnJvcl9jb2RlID0gUk1ORVRDVExfQVBJX0VSUl9SRVRVUk5fVFlQRTsK KwkJYnJlYWs7CisJfQorCXJldHVybl9jb2RlID0gUk1ORVRDVExfU1VDQ0VTUzsKKwl9IHdoaWxl KDApOworCXJldHVybiByZXR1cm5fY29kZTsKK30KKworLyohCisqIEBicmllZiBTdGF0aWMgZnVu Y3Rpb24gdG8gc2V0IHRoZSByZXR1cm4gdmFsdWUKKyogQGRldGFpbHMgQ2hlY2tzIGlmIHRoZSBl cnJvcl9jb2RlIGZyb20gdGhlIHRyYW5zYWN0aW9uIGlzIHplcm8gZm9yIGEgcmV0dXJuCisqIGNv ZGUgdHlwZSBtZXNzYWdlIGFuZCBzZXRzIHRoZSBtZXNzYWdlIHR5cGUgYXMgUk1ORVRDVExfU1VD Q0VTUworKiBAcGFyYW0gY3JkIFRoZSBjcmQgZmllbGQgcGFzc2VkCisqIEBwYXJhbSBlcnJvcl9j b2RlIFN0YXR1cyBjb2RlIG9mIHRoaXMgb3BlcmF0aW9uCisqIEByZXR1cm4gUk1ORVRDVExfU1VD Q0VTUyBpZiBzdWNjZXNzZnVsCisqIEByZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUiBpZiB0aGVy ZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGtlcm5lbC4KKyogQ2hlY2sgZXJyb3JfY29kZQorKi8KK3N0 YXRpYyBpbmxpbmUgaW50IF9ybW5ldGN0bF9zZXRfY29kZXMoaW50IGVycm9yX3ZhbCwgdWludDE2 X3QgKmVycm9yX2NvZGUpIHsKKwlpbnQgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9LRVJORUxfRVJS OworCWlmIChlcnJvcl92YWwgPT0gUk1ORVRfQ09ORklHX09LKQorCQlyZXR1cm5fY29kZSA9IFJN TkVUQ1RMX1NVQ0NFU1M7CisJZWxzZQorCQkqZXJyb3JfY29kZSA9ICh1aW50MTZfdCllcnJvcl92 YWwgKyBSTU5FVENUTF9LRVJORUxfRklSU1RfRVJSOworCXJldHVybiByZXR1cm5fY29kZTsKK30K KworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQlFWFBPU0VEIEFQSQorPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ki8KKworaW50IHJtbmV0Y3RsX2luaXQocm1uZXRjdGxfaG5kbF90ICoqaG5kbCwgdWludDE2 X3QgKmVycm9yX2NvZGUpCit7CisJcGlkX3QgcGlkID0gMDsKKwlpbnQgbmV0bGlua19mZCA9IC0x LCByZXR1cm5fY29kZSA9IFJNTkVUQ1RMX0xJQl9FUlI7CisJc3RydWN0IHNvY2thZGRyX25sKiBf X2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkgc2FkZHJfcHRyOworCWRvIHsKKwlpZiAoKCFo bmRsKSB8fCAoIWVycm9yX2NvZGUpKXsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9JTlZBTElE X0FSRzsKKwkJYnJlYWs7CisJfQorCisJKmhuZGwgPSAocm1uZXRjdGxfaG5kbF90ICopbWFsbG9j KHNpemVvZihybW5ldGN0bF9obmRsX3QpKTsKKwlpZiAoISpobmRsKSB7CisJCSplcnJvcl9jb2Rl ID0gUk1ORVRDVExfQVBJX0VSUl9ITkRMX0lOVkFMSUQ7CisJCWJyZWFrOworCX0KKworCW1lbXNl dCgqaG5kbCwgMCwgc2l6ZW9mKHJtbmV0Y3RsX2huZGxfdCkpOworCisJcGlkID0gZ2V0cGlkKCk7 CisJaWYgKHBpZCAgPCBNSU5fVkFMSURfUFJPQ0VTU19JRCkgeworCQlmcmVlKCpobmRsKTsKKwkJ KmVycm9yX2NvZGUgPSBSTU5FVENUTF9JTklUX0VSUl9QUk9DRVNTX0lEOworCQlicmVhazsKKwl9 CisJKCpobmRsKS0+cGlkID0gKHVpbnQzMl90KXBpZDsKKwluZXRsaW5rX2ZkID0gc29ja2V0KFBG X05FVExJTkssIFNPQ0tfUkFXLCBSTU5FVF9ORVRMSU5LX1BST1RPKTsKKwlpZiAobmV0bGlua19m ZCA8IE1JTl9WQUxJRF9TT0NLRVRfRkQpIHsKKwkJZnJlZSgqaG5kbCk7CisJCSplcnJvcl9jb2Rl ID0gUk1ORVRDVExfSU5JVF9FUlJfTkVUTElOS19GRDsKKwkJYnJlYWs7CisJfQorCisJKCpobmRs KS0+bmV0bGlua19mZCA9IG5ldGxpbmtfZmQ7CisKKwltZW1zZXQoJigqaG5kbCktPnNyY19hZGRy LCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSk7CisKKwkoKmhuZGwpLT5zcmNfYWRkci5u bF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCSgqaG5kbCktPnNyY19hZGRyLm5sX3BpZCA9ICgqaG5k bCktPnBpZDsKKworCXNhZGRyX3B0ciA9ICYoKmhuZGwpLT5zcmNfYWRkcjsKKwlpZiAoYmluZCgo KmhuZGwpLT5uZXRsaW5rX2ZkLAorCQkoc3RydWN0IHNvY2thZGRyKilzYWRkcl9wdHIsCisJCXNp emVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpKSA8IDApIHsKKwkJY2xvc2UoKCpobmRsKS0+bmV0bGlu a19mZCk7CisJCWZyZWUoKmhuZGwpOworCQkqZXJyb3JfY29kZSA9IFJNTkVUQ1RMX0lOSVRfRVJS X0JJTkQ7CisJCWJyZWFrOworCX0KKworCW1lbXNldCgmKCpobmRsKS0+ZGVzdF9hZGRyLCAwLCBz aXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSk7CisKKwkoKmhuZGwpLT5kZXN0X2FkZHIubmxfZmFt aWx5ID0gQUZfTkVUTElOSzsKKwkoKmhuZGwpLT5kZXN0X2FkZHIubmxfcGlkID0gS0VSTkVMX1BS T0NFU1NfSUQ7CisJKCpobmRsKS0+ZGVzdF9hZGRyLm5sX2dyb3VwcyA9IFVOSUNBU1Q7CisKKwly ZXR1cm5fY29kZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0 dXJuX2NvZGU7Cit9CisKK3ZvaWQgcm1uZXRjdGxfY2xlYW51cChybW5ldGN0bF9obmRsX3QgKmhu ZGwpCit7CisJaWYgKCFobmRsKQorCQlyZXR1cm47CisJY2xvc2UoaG5kbC0+bmV0bGlua19mZCk7 CisJZnJlZShobmRsKTsKK30KKworaW50IHJtbmV0X2Fzc29jaWF0ZV9uZXR3b3JrX2RldmljZShy bW5ldGN0bF9obmRsX3QgKmhuZGwsCisJCQkJICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJ ICAgdWludDE2X3QgKmVycm9yX2NvZGUsCisJCQkJICAgdWludDhfdCBhc3NvY19kZXYpCit7CisJ c3RydWN0IHJtbmV0X25sX21zZ19zIHJlcXVlc3QsIHJlc3BvbnNlOworCXNpemVfdCBzdHJfbGVu ID0gMDsKKwlpbnQgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOworCWRvIHsKKwlpZiAo KCFobmRsKSB8fCAoIWVycm9yX2NvZGUpIHx8IF9ybW5ldGN0bF9jaGVja19kZXZfbmFtZShkZXZf bmFtZSkgfHwKKwkJKChhc3NvY19kZXYgIT0gUk1ORVRDVExfREVWSUNFX0FTU09DSUFURSkgJiYK KwkJKGFzc29jX2RldiAhPSBSTU5FVENUTF9ERVZJQ0VfVU5BU1NPQ0lBVEUpKSkgeworCQlyZXR1 cm5fY29kZSA9IFJNTkVUQ1RMX0lOVkFMSURfQVJHOworCQlicmVhazsKKwl9CisKKwlpZiAoYXNz b2NfZGV2ID09IFJNTkVUQ1RMX0RFVklDRV9BU1NPQ0lBVEUpCisJCXJlcXVlc3QubWVzc2FnZV90 eXBlID0gUk1ORVRfTkVUTElOS19BU1NPQ0lBVEVfTkVUV09SS19ERVZJQ0U7CisJZWxzZQorCQly ZXF1ZXN0Lm1lc3NhZ2VfdHlwZSA9IFJNTkVUX05FVExJTktfVU5BU1NPQ0lBVEVfTkVUV09SS19E RVZJQ0U7CisKKwlyZXF1ZXN0LmFyZ19sZW5ndGggPSBSTU5FVF9NQVhfU1RSX0xFTjsKKwlzdHJf bGVuID0gc3RybGNweSgoY2hhciAqKShyZXF1ZXN0LmRhdGEpLCBkZXZfbmFtZSwgKHNpemVfdClS TU5FVF9NQVhfU1RSX0xFTik7CisJaWYgKF9ybW5ldGN0bF9jaGVja19sZW4oc3RyX2xlbiwgZXJy b3JfY29kZSkgIT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisKKwlpZiAoKCplcnJvcl9j b2RlID0gcm1uZXRjdGxfdHJhbnNhY3QoaG5kbCwgJnJlcXVlc3QsICZyZXNwb25zZSkpCisJCSE9 IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCWlmIChfcm1uZXRjdGxfY2hlY2tfY29kZShy ZXNwb25zZS5jcmQsIGVycm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOwor CXJldHVybl9jb2RlID0gX3JtbmV0Y3RsX3NldF9jb2RlcyhyZXNwb25zZS5yZXR1cm5fY29kZSwg ZXJyb3JfY29kZSk7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKK2lu dCBybW5ldF9nZXRfbmV0d29ya19kZXZpY2VfYXNzb2NpYXRlZChybW5ldGN0bF9obmRsX3QgKmhu ZGwsCisJCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCQlpbnQgKnJlZ2lzdGVyX3N0YXR1 cywKKwkJCQkJdWludDE2X3QgKmVycm9yX2NvZGUpIHsKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3Mg cmVxdWVzdCwgcmVzcG9uc2U7CisJc2l6ZV90IHN0cl9sZW4gPSAwOworCWludCAgcmV0dXJuX2Nv ZGUgPSBSTU5FVENUTF9MSUJfRVJSOworCWRvIHsKKwlpZiAoKCFobmRsKSB8fCAoIXJlZ2lzdGVy X3N0YXR1cykgfHwgKCFlcnJvcl9jb2RlKSB8fAorCV9ybW5ldGN0bF9jaGVja19kZXZfbmFtZShk ZXZfbmFtZSkpIHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9JTlZBTElEX0FSRzsKKwkJYnJl YWs7CisJfQorCisJcmVxdWVzdC5tZXNzYWdlX3R5cGUgPSBSTU5FVF9ORVRMSU5LX0dFVF9ORVRX T1JLX0RFVklDRV9BU1NPQ0lBVEVEOworCisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gUk1ORVRfTUFY X1NUUl9MRU47CisJc3RyX2xlbiA9IHN0cmxjcHkoKGNoYXIgKikocmVxdWVzdC5kYXRhKSwgZGV2 X25hbWUsIFJNTkVUX01BWF9TVFJfTEVOKTsKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2xlbihzdHJf bGVuLCBlcnJvcl9jb2RlKSAhPSBSTU5FVENUTF9TVUNDRVNTKQorCQlicmVhazsKKworCWlmICgo KmVycm9yX2NvZGUgPSBybW5ldGN0bF90cmFuc2FjdChobmRsLCAmcmVxdWVzdCwgJnJlc3BvbnNl KSkKKwkJIT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisKKwlpZiAoX3JtbmV0Y3RsX2No ZWNrX2RhdGEocmVzcG9uc2UuY3JkLCBlcnJvcl9jb2RlKQorCQkhPSBSTU5FVENUTF9TVUNDRVNT KSB7CisJCWlmIChfcm1uZXRjdGxfY2hlY2tfY29kZShyZXNwb25zZS5jcmQsIGVycm9yX2NvZGUp CisJCQk9PSBSTU5FVENUTF9TVUNDRVNTKQorCQkJcmV0dXJuX2NvZGUgPSBfcm1uZXRjdGxfc2V0 X2NvZGVzKHJlc3BvbnNlLnJldHVybl9jb2RlLAorCQkJCQkJCSAgZXJyb3JfY29kZSk7CisJCWJy ZWFrOworCX0KKworCSpyZWdpc3Rlcl9zdGF0dXMgPSByZXNwb25zZS5yZXR1cm5fY29kZTsKKwly ZXR1cm5fY29kZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0 dXJuX2NvZGU7Cit9CisKK2ludCBybW5ldF9zZXRfbGlua19lZ3Jlc3NfZGF0YV9mb3JtYXQocm1u ZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCSAgICAgIHVpbnQzMl90IGVncmVzc19mbGFncywKKwkJ CQkgICAgICB1aW50MTZfdCBhZ2dfc2l6ZSwKKwkJCQkgICAgICB1aW50MTZfdCBhZ2dfY291bnQs CisJCQkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJICAgICAgdWludDE2X3QgKmVy cm9yX2NvZGUpIHsKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJ c2l6ZV90IHN0cl9sZW4gPSAwOworCWludCAgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJS OworCWRvIHsKKwlpZiAoKCFobmRsKSB8fCAoIWVycm9yX2NvZGUpIHx8IF9ybW5ldGN0bF9jaGVj a19kZXZfbmFtZShkZXZfbmFtZSkgfHwKKwkgICAgKCh+RUdSRVNTX0ZMQUdTX01BU0spICYgZWdy ZXNzX2ZsYWdzKSkgeworCQlyZXR1cm5fY29kZSA9IFJNTkVUQ1RMX0lOVkFMSURfQVJHOworCQli cmVhazsKKwl9CisKKwlyZXF1ZXN0Lm1lc3NhZ2VfdHlwZSA9IFJNTkVUX05FVExJTktfU0VUX0xJ TktfRUdSRVNTX0RBVEFfRk9STUFUOworCisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gUk1ORVRfTUFY X1NUUl9MRU4gKworCQkJIHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDE2X3QpICsgc2l6 ZW9mKHVpbnQxNl90KTsKKwlzdHJfbGVuID0gc3RybGNweSgoY2hhciAqKShyZXF1ZXN0LmRhdGFf Zm9ybWF0LmRldiksCisJCQkgIGRldl9uYW1lLAorCQkJICBSTU5FVF9NQVhfU1RSX0xFTik7CisJ aWYgKF9ybW5ldGN0bF9jaGVja19sZW4oc3RyX2xlbiwgZXJyb3JfY29kZSkgIT0gUk1ORVRDVExf U1VDQ0VTUykKKwkJYnJlYWs7CisKKwlyZXF1ZXN0LmRhdGFfZm9ybWF0LmZsYWdzID0gZWdyZXNz X2ZsYWdzOworCXJlcXVlc3QuZGF0YV9mb3JtYXQuYWdnX3NpemUgPSBhZ2dfc2l6ZTsKKwlyZXF1 ZXN0LmRhdGFfZm9ybWF0LmFnZ19jb3VudCA9IGFnZ19jb3VudDsKKworCWlmICgoKmVycm9yX2Nv ZGUgPSBybW5ldGN0bF90cmFuc2FjdChobmRsLCAmcmVxdWVzdCwgJnJlc3BvbnNlKSkKKwkJIT0g Uk1ORVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2NvZGUo cmVzcG9uc2UuY3JkLCBlcnJvcl9jb2RlKSAhPSBSTU5FVENUTF9TVUNDRVNTKQorCQlicmVhazsK KworCXJldHVybl9jb2RlID0gX3JtbmV0Y3RsX3NldF9jb2RlcyhyZXNwb25zZS5yZXR1cm5fY29k ZSwgZXJyb3JfY29kZSk7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisK K2ludCBybW5ldF9nZXRfbGlua19lZ3Jlc3NfZGF0YV9mb3JtYXQocm1uZXRjdGxfaG5kbF90ICpo bmRsLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSAgICAgIHVpbnQzMl90 ICplZ3Jlc3NfZmxhZ3MsCisJCQkJICAgICAgdWludDE2X3QgKmFnZ19zaXplLAorCQkJCSAgICAg IHVpbnQxNl90ICphZ2dfY291bnQsCisJCQkJICAgICAgdWludDE2X3QgKmVycm9yX2NvZGUpIHsK KwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJc2l6ZV90IHN0cl9s ZW4gPSAwOworCWludCAgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOworCWRvIHsKKwlp ZiAoKCFobmRsKSB8fCAoIWVncmVzc19mbGFncykgfHwgKCFhZ2dfc2l6ZSkgfHwgKCFhZ2dfY291 bnQpIHx8CisJKCFlcnJvcl9jb2RlKSB8fCBfcm1uZXRjdGxfY2hlY2tfZGV2X25hbWUoZGV2X25h bWUpKSB7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisJCWJyZWFrOwor CX0KKwlyZXF1ZXN0Lm1lc3NhZ2VfdHlwZSA9IFJNTkVUX05FVExJTktfR0VUX0xJTktfRUdSRVNT X0RBVEFfRk9STUFUOworCisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gUk1ORVRfTUFYX1NUUl9MRU47 CisJc3RyX2xlbiA9IHN0cmxjcHkoKGNoYXIgKikocmVxdWVzdC5kYXRhX2Zvcm1hdC5kZXYpLAor CQkJICBkZXZfbmFtZSwKKwkJCSAgUk1ORVRfTUFYX1NUUl9MRU4pOworCWlmIChfcm1uZXRjdGxf Y2hlY2tfbGVuKHN0cl9sZW4sIGVycm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJy ZWFrOworCisJaWYgKCgqZXJyb3JfY29kZSA9IHJtbmV0Y3RsX3RyYW5zYWN0KGhuZGwsICZyZXF1 ZXN0LCAmcmVzcG9uc2UpKQorCQkhPSBSTU5FVENUTF9TVUNDRVNTKQorCQlicmVhazsKKworCWlm IChfcm1uZXRjdGxfY2hlY2tfZGF0YShyZXNwb25zZS5jcmQsIGVycm9yX2NvZGUpCisJCSE9IFJN TkVUQ1RMX1NVQ0NFU1MpIHsKKwkJaWYgKF9ybW5ldGN0bF9jaGVja19jb2RlKHJlc3BvbnNlLmNy ZCwgZXJyb3JfY29kZSkKKwkJCT09IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCQlyZXR1cm5fY29kZSA9 IF9ybW5ldGN0bF9zZXRfY29kZXMocmVzcG9uc2UucmV0dXJuX2NvZGUsCisJCQkJCQkJICBlcnJv cl9jb2RlKTsKKwkJYnJlYWs7CisJfQorCisJKmVncmVzc19mbGFncyA9IHJlc3BvbnNlLmRhdGFf Zm9ybWF0LmZsYWdzOworCSphZ2dfc2l6ZSA9IHJlc3BvbnNlLmRhdGFfZm9ybWF0LmFnZ19zaXpl OworCSphZ2dfY291bnQgPSByZXNwb25zZS5kYXRhX2Zvcm1hdC5hZ2dfY291bnQ7CisJcmV0dXJu X2NvZGUgPSBSTU5FVENUTF9TVUNDRVNTOworCX0gd2hpbGUoMCk7CisJcmV0dXJuIHJldHVybl9j b2RlOworfQorCitpbnQgcm1uZXRfc2V0X2xpbmtfaW5ncmVzc19kYXRhX2Zvcm1hdF90YWlsc3Bh Y2Uocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCQkJIHVpbnQzMl90IGluZ3Jlc3NfZmxhZ3Ms CisJCQkJCQkgdWludDhfdCAgdGFpbF9zcGFjaW5nLAorCQkJCQkJIGNvbnN0IGNoYXIgKmRldl9u YW1lLAorCQkJCQkJIHVpbnQxNl90ICplcnJvcl9jb2RlKSB7CisJc3RydWN0IHJtbmV0X25sX21z Z19zIHJlcXVlc3QsIHJlc3BvbnNlOworCXNpemVfdCBzdHJfbGVuID0gMDsKKwlpbnQgIHJldHVy bl9jb2RlID0gUk1ORVRDVExfTElCX0VSUjsKKwlkbyB7CisJaWYgKCghaG5kbCkgfHwgKCFlcnJv cl9jb2RlKSB8fCBfcm1uZXRjdGxfY2hlY2tfZGV2X25hbWUoZGV2X25hbWUpIHx8CisJICAgICgo fklOR1JFU1NfRkxBR1NfTUFTSykgJiBpbmdyZXNzX2ZsYWdzKSkgeworCQlyZXR1cm5fY29kZSA9 IFJNTkVUQ1RMX0lOVkFMSURfQVJHOworCQlicmVhazsKKwl9CisKKwlyZXF1ZXN0Lm1lc3NhZ2Vf dHlwZSA9IFJNTkVUX05FVExJTktfU0VUX0xJTktfSU5HUkVTU19EQVRBX0ZPUk1BVDsKKworCXJl cXVlc3QuYXJnX2xlbmd0aCA9IFJNTkVUX01BWF9TVFJfTEVOICsKKwlzaXplb2YodWludDMyX3Qp ICsgc2l6ZW9mKHVpbnQxNl90KSArIHNpemVvZih1aW50MTZfdCk7CisJc3RyX2xlbiA9IHN0cmxj cHkoKGNoYXIgKikocmVxdWVzdC5kYXRhX2Zvcm1hdC5kZXYpLAorCQkJICBkZXZfbmFtZSwKKwkJ CSAgUk1ORVRfTUFYX1NUUl9MRU4pOworCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9sZW4s IGVycm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCXJlcXVlc3QuZGF0 YV9mb3JtYXQuZmxhZ3MgPSBpbmdyZXNzX2ZsYWdzOworCXJlcXVlc3QuZGF0YV9mb3JtYXQudGFp bF9zcGFjaW5nID0gdGFpbF9zcGFjaW5nOworCisJaWYgKCgqZXJyb3JfY29kZSA9IHJtbmV0Y3Rs X3RyYW5zYWN0KGhuZGwsICZyZXF1ZXN0LCAmcmVzcG9uc2UpKQorCQkhPSBSTU5FVENUTF9TVUND RVNTKQorCQlicmVhazsKKworCWlmIChfcm1uZXRjdGxfY2hlY2tfY29kZShyZXNwb25zZS5jcmQs IGVycm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCisJcmV0dXJuX2Nv ZGUgPSBfcm1uZXRjdGxfc2V0X2NvZGVzKHJlc3BvbnNlLnJldHVybl9jb2RlLCBlcnJvcl9jb2Rl KTsKKwl9IHdoaWxlKDApOworCXJldHVybiByZXR1cm5fY29kZTsKK30KKworaW50IHJtbmV0X2dl dF9saW5rX2luZ3Jlc3NfZGF0YV9mb3JtYXRfdGFpbHNwYWNlKHJtbmV0Y3RsX2huZGxfdCAqaG5k bCwKKwkJCQkJCSBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJCSB1aW50MzJfdCAqaW5ncmVz c19mbGFncywKKwkJCQkJCSB1aW50OF90ICAqdGFpbF9zcGFjaW5nLAorCQkJCQkJIHVpbnQxNl90 ICplcnJvcl9jb2RlKSB7CisJc3RydWN0IHJtbmV0X25sX21zZ19zIHJlcXVlc3QsIHJlc3BvbnNl OworCXNpemVfdCBzdHJfbGVuID0gMDsKKwlpbnQgIHJldHVybl9jb2RlID0gUk1ORVRDVExfTElC X0VSUjsKKwlkbyB7CisJaWYgKCghaG5kbCkgfHwgKCFlcnJvcl9jb2RlKSB8fAorCQlfcm1uZXRj dGxfY2hlY2tfZGV2X25hbWUoZGV2X25hbWUpKSB7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExf SU5WQUxJRF9BUkc7CisJCWJyZWFrOworCX0KKworCXJlcXVlc3QubWVzc2FnZV90eXBlID0gUk1O RVRfTkVUTElOS19HRVRfTElOS19JTkdSRVNTX0RBVEFfRk9STUFUOworCisJcmVxdWVzdC5hcmdf bGVuZ3RoID0gUk1ORVRfTUFYX1NUUl9MRU47CisJc3RyX2xlbiA9IHN0cmxjcHkoKGNoYXIgKiko cmVxdWVzdC5kYXRhX2Zvcm1hdC5kZXYpLAorCQkJICBkZXZfbmFtZSwKKwkJCSAgUk1ORVRfTUFY X1NUUl9MRU4pOworCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9sZW4sIGVycm9yX2NvZGUp ICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCisJaWYgKCgqZXJyb3JfY29kZSA9IHJt bmV0Y3RsX3RyYW5zYWN0KGhuZGwsICZyZXF1ZXN0LCAmcmVzcG9uc2UpKQorCQkhPSBSTU5FVENU TF9TVUNDRVNTKQorCQlicmVhazsKKworCWlmIChfcm1uZXRjdGxfY2hlY2tfZGF0YShyZXNwb25z ZS5jcmQsIGVycm9yX2NvZGUpCisJCSE9IFJNTkVUQ1RMX1NVQ0NFU1MpIHsKKwkJaWYgKF9ybW5l dGN0bF9jaGVja19jb2RlKHJlc3BvbnNlLmNyZCwgZXJyb3JfY29kZSkKKwkJCT09IFJNTkVUQ1RM X1NVQ0NFU1MpCisJCQlyZXR1cm5fY29kZSA9IF9ybW5ldGN0bF9zZXRfY29kZXMocmVzcG9uc2Uu cmV0dXJuX2NvZGUsCisJCQkJCQkJICBlcnJvcl9jb2RlKTsKKwkJYnJlYWs7CisJfQorCisJaWYg KGluZ3Jlc3NfZmxhZ3MpCisJCSppbmdyZXNzX2ZsYWdzID0gcmVzcG9uc2UuZGF0YV9mb3JtYXQu ZmxhZ3M7CisKKwlpZiAodGFpbF9zcGFjaW5nKQorCQkqdGFpbF9zcGFjaW5nID0gcmVzcG9uc2Uu ZGF0YV9mb3JtYXQudGFpbF9zcGFjaW5nOworCisJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9TVUND RVNTOworCX0gd2hpbGUoMCk7CisJcmV0dXJuIHJldHVybl9jb2RlOworfQorCitpbnQgcm1uZXRf c2V0X2xvZ2ljYWxfZXBfY29uZmlnKHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCQlpbnQzMl90 IGVwX2lkLAorCQkJCXVpbnQ4X3Qgb3BlcmF0aW5nX21vZGUsCisJCQkJY29uc3QgY2hhciAqZGV2 X25hbWUsCisJCQkJY29uc3QgY2hhciAqbmV4dF9kZXYsCisJCQkJdWludDE2X3QgKmVycm9yX2Nv ZGUpIHsKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJc2l6ZV90 IHN0cl9sZW4gPSAwOworCWludCByZXR1cm5fY29kZSA9IFJNTkVUQ1RMX0xJQl9FUlI7CisJZG8g eworCWlmICgoIWhuZGwpIHx8ICgoZXBfaWQgPCAtMSkgfHwgKGVwX2lkID4gMzEpKSB8fCAoIWVy cm9yX2NvZGUpIHx8CisJCV9ybW5ldGN0bF9jaGVja19kZXZfbmFtZShkZXZfbmFtZSkgfHwKKwkJ X3JtbmV0Y3RsX2NoZWNrX2Rldl9uYW1lKG5leHRfZGV2KSB8fAorCQlvcGVyYXRpbmdfbW9kZSA+ PSBSTU5FVF9FUE1PREVfTEVOR1RIKSB7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfSU5WQUxJ RF9BUkc7CisJCWJyZWFrOworCX0KKworCXJlcXVlc3QubWVzc2FnZV90eXBlID0gUk1ORVRfTkVU TElOS19TRVRfTE9HSUNBTF9FUF9DT05GSUc7CisKKwlyZXF1ZXN0LmFyZ19sZW5ndGggPSBSTU5F VF9NQVhfU1RSX0xFTiArCisJUk1ORVRfTUFYX1NUUl9MRU4gKyBzaXplb2YoaW50MzJfdCkgKyBz aXplb2YodWludDhfdCk7CisJc3RyX2xlbiA9IHN0cmxjcHkoKGNoYXIgKikocmVxdWVzdC5sb2Nh bF9lcF9jb25maWcuZGV2KSwKKwkJCSAgZGV2X25hbWUsCisJCQkgIFJNTkVUX01BWF9TVFJfTEVO KTsKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2xlbihzdHJfbGVuLCBlcnJvcl9jb2RlKSAhPSBSTU5F VENUTF9TVUNDRVNTKQorCQlicmVhazsKKworCXN0cl9sZW4gPSBzdHJsY3B5KChjaGFyICopKHJl cXVlc3QubG9jYWxfZXBfY29uZmlnLm5leHRfZGV2KSwKKwkJCSAgbmV4dF9kZXYsCisJCQkgIFJN TkVUX01BWF9TVFJfTEVOKTsKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2xlbihzdHJfbGVuLCBlcnJv cl9jb2RlKSAhPSBSTU5FVENUTF9TVUNDRVNTKQorCQlicmVhazsKKwlyZXF1ZXN0LmxvY2FsX2Vw X2NvbmZpZy5lcF9pZCA9IGVwX2lkOworCXJlcXVlc3QubG9jYWxfZXBfY29uZmlnLm9wZXJhdGlu Z19tb2RlID0gb3BlcmF0aW5nX21vZGU7CisKKwlpZiAoKCplcnJvcl9jb2RlID0gcm1uZXRjdGxf dHJhbnNhY3QoaG5kbCwgJnJlcXVlc3QsICZyZXNwb25zZSkpCisJCSE9IFJNTkVUQ1RMX1NVQ0NF U1MpCisJCWJyZWFrOworCWlmIChfcm1uZXRjdGxfY2hlY2tfY29kZShyZXNwb25zZS5jcmQsIGVy cm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCisJcmV0dXJuX2NvZGUg PSBfcm1uZXRjdGxfc2V0X2NvZGVzKHJlc3BvbnNlLnJldHVybl9jb2RlLCBlcnJvcl9jb2RlKTsK Kwl9IHdoaWxlKDApOworCXJldHVybiByZXR1cm5fY29kZTsKK30KKworaW50IHJtbmV0X3Vuc2V0 X2xvZ2ljYWxfZXBfY29uZmlnKHJtbmV0Y3RsX2huZGxfdCAqaG5kbCwKKwkJCQkgIGludDMyX3Qg ZXBfaWQsCisJCQkJICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgIHVpbnQxNl90ICplcnJv cl9jb2RlKSB7CisJc3RydWN0IHJtbmV0X25sX21zZ19zIHJlcXVlc3QsIHJlc3BvbnNlOworCXNp emVfdCBzdHJfbGVuID0gMDsKKwlpbnQgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOwor CWRvIHsKKworCWlmICgoIWhuZGwpIHx8ICgoZXBfaWQgPCAtMSkgfHwgKGVwX2lkID4gMzEpKSB8 fCAoIWVycm9yX2NvZGUpIHx8CisJCV9ybW5ldGN0bF9jaGVja19kZXZfbmFtZShkZXZfbmFtZSkp IHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9JTlZBTElEX0FSRzsKKwkJYnJlYWs7CisJfQor CisJcmVxdWVzdC5tZXNzYWdlX3R5cGUgPSBSTU5FVF9ORVRMSU5LX1VOU0VUX0xPR0lDQUxfRVBf Q09ORklHOworCisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gUk1ORVRfTUFYX1NUUl9MRU4gKyBzaXpl b2YoaW50MzJfdCk7CisJc3RyX2xlbiA9IHN0cmxjcHkoKGNoYXIgKikocmVxdWVzdC5sb2NhbF9l cF9jb25maWcuZGV2KSwKKwkJCSAgZGV2X25hbWUsCisJCQkgIFJNTkVUX01BWF9TVFJfTEVOKTsK KworCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9sZW4sIGVycm9yX2NvZGUpICE9IFJNTkVU Q1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCisJcmVxdWVzdC5sb2NhbF9lcF9jb25maWcuZXBfaWQg PSBlcF9pZDsKKworCWlmICgoKmVycm9yX2NvZGUgPSBybW5ldGN0bF90cmFuc2FjdChobmRsLCAm cmVxdWVzdCwgJnJlc3BvbnNlKSkKKwkJIT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisJ aWYgKF9ybW5ldGN0bF9jaGVja19jb2RlKHJlc3BvbnNlLmNyZCwgZXJyb3JfY29kZSkgIT0gUk1O RVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisKKwlyZXR1cm5fY29kZSA9IF9ybW5ldGN0bF9zZXRf Y29kZXMocmVzcG9uc2UucmV0dXJuX2NvZGUsIGVycm9yX2NvZGUpOworCX0gd2hpbGUoMCk7CisK KwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKK2ludCBybW5ldF9nZXRfbG9naWNhbF9lcF9jb25m aWcocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJCWludDMyX3QgZXBfaWQsCisJCQkJY29uc3Qg Y2hhciAqZGV2X25hbWUsCisJCQkJdWludDhfdCAqb3BlcmF0aW5nX21vZGUsCisJCQkJY2hhciAq Km5leHRfZGV2LAorCQkJCXVpbnQzMl90IG5leHRfZGV2X2xlbiwKKwkJCQl1aW50MTZfdCAqZXJy b3JfY29kZSkgeworCXN0cnVjdCBybW5ldF9ubF9tc2dfcyByZXF1ZXN0LCByZXNwb25zZTsKKwlz aXplX3Qgc3RyX2xlbiA9IDA7CisJaW50IHJldHVybl9jb2RlID0gUk1ORVRDVExfTElCX0VSUjsK KwlkbyB7CisJaWYgKCghaG5kbCkgfHwgKCFvcGVyYXRpbmdfbW9kZSkgfHwgKCFlcnJvcl9jb2Rl KSB8fCAoKGVwX2lkIDwgLTEpIHx8CisJICAgIChlcF9pZCA+IDMxKSkgfHwgX3JtbmV0Y3RsX2No ZWNrX2Rldl9uYW1lKGRldl9uYW1lKSB8fCAoIW5leHRfZGV2KQorCSAgICB8fCAoMCA9PSBuZXh0 X2Rldl9sZW4pKSB7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisJCWJy ZWFrOworCX0KKworCXJlcXVlc3QubWVzc2FnZV90eXBlID0gUk1ORVRfTkVUTElOS19HRVRfTE9H SUNBTF9FUF9DT05GSUc7CisKKwlyZXF1ZXN0LmFyZ19sZW5ndGggPSBSTU5FVF9NQVhfU1RSX0xF TiArIHNpemVvZihpbnQzMl90KTsKKwlzdHJfbGVuID0gc3RybGNweSgoY2hhciAqKShyZXF1ZXN0 LmxvY2FsX2VwX2NvbmZpZy5kZXYpLAorCQkJICBkZXZfbmFtZSwKKwkJCSAgUk1ORVRfTUFYX1NU Ul9MRU4pOworCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9sZW4sIGVycm9yX2NvZGUpICE9 IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCisJcmVxdWVzdC5sb2NhbF9lcF9jb25maWcu ZXBfaWQgPSBlcF9pZDsKKworCWlmICgoKmVycm9yX2NvZGUgPSBybW5ldGN0bF90cmFuc2FjdCho bmRsLCAmcmVxdWVzdCwgJnJlc3BvbnNlKSkKKwkJIT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJYnJl YWs7CisKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2RhdGEocmVzcG9uc2UuY3JkLCBlcnJvcl9jb2Rl KQorCQkhPSBSTU5FVENUTF9TVUNDRVNTKSB7CisJCWlmIChfcm1uZXRjdGxfY2hlY2tfY29kZShy ZXNwb25zZS5jcmQsIGVycm9yX2NvZGUpCisJCQk9PSBSTU5FVENUTF9TVUNDRVNTKQorCQkJcmV0 dXJuX2NvZGUgPSBfcm1uZXRjdGxfc2V0X2NvZGVzKHJlc3BvbnNlLnJldHVybl9jb2RlLAorCQkJ CQkJCSAgZXJyb3JfY29kZSk7CisJCWJyZWFrOworCX0KKworCXN0cl9sZW4gPSBzdHJsY3B5KCpu ZXh0X2RldiwKKwkJCSAgKGNoYXIgKikocmVzcG9uc2UubG9jYWxfZXBfY29uZmlnLm5leHRfZGV2 KSwKKwkJCSAgbWluKFJNTkVUX01BWF9TVFJfTEVOLCBuZXh0X2Rldl9sZW4pKTsKKwlpZiAoX3Jt bmV0Y3RsX2NoZWNrX2xlbihzdHJfbGVuLCBlcnJvcl9jb2RlKSAhPSBSTU5FVENUTF9TVUNDRVNT KQorCQlicmVhazsKKworCSpvcGVyYXRpbmdfbW9kZSA9IHJlc3BvbnNlLmxvY2FsX2VwX2NvbmZp Zy5vcGVyYXRpbmdfbW9kZTsKKwlyZXR1cm5fY29kZSA9IFJNTkVUQ1RMX1NVQ0NFU1M7CisJfSB3 aGlsZSgwKTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKK2ludCBybW5ldF9uZXdfdm5kX3By ZWZpeChybW5ldGN0bF9obmRsX3QgKmhuZGwsCisJCQkgdWludDMyX3QgaWQsCisJCQkgdWludDE2 X3QgKmVycm9yX2NvZGUsCisJCQkgdWludDhfdCBuZXdfdm5kLAorCQkJIGNvbnN0IGNoYXIgKnBy ZWZpeCkKK3sKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJaW50 IHJldHVybl9jb2RlID0gUk1ORVRDVExfTElCX0VSUjsKKwlzaXplX3Qgc3RyX2xlbiA9IDA7CisJ ZG8geworCWlmICgoIWhuZGwpIHx8ICghZXJyb3JfY29kZSkgfHwKKwkoKG5ld192bmQgIT0gUk1O RVRDVExfTkVXX1ZORCkgJiYgKG5ld192bmQgIT0gUk1ORVRDVExfRlJFRV9WTkQpKSkgeworCQly ZXR1cm5fY29kZSA9IFJNTkVUQ1RMX0lOVkFMSURfQVJHOworCQlicmVhazsKKwl9CisKKwltZW1z ZXQocmVxdWVzdC52bmQudm5kX25hbWUsIDAsIFJNTkVUX01BWF9TVFJfTEVOKTsKKwlpZiAobmV3 X3ZuZCA9PSAgUk1ORVRDVExfTkVXX1ZORCkgeworCQlpZiAocHJlZml4KSB7CisJCQlyZXF1ZXN0 Lm1lc3NhZ2VfdHlwZSA9Uk1ORVRfTkVUTElOS19ORVdfVk5EX1dJVEhfUFJFRklYOworCQkJc3Ry X2xlbiA9IHN0cmxjcHkoKGNoYXIgKilyZXF1ZXN0LnZuZC52bmRfbmFtZSwKKwkJCQkJICBwcmVm aXgsIFJNTkVUX01BWF9TVFJfTEVOKTsKKwkJCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9s ZW4sIGVycm9yX2NvZGUpCisJCQkJCQkhPSBSTU5FVENUTF9TVUNDRVNTKQorCQkJCWJyZWFrOwor CQl9IGVsc2UgeworCQkJcmVxdWVzdC5tZXNzYWdlX3R5cGUgPSBSTU5FVF9ORVRMSU5LX05FV19W TkQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXF1ZXN0Lm1lc3NhZ2VfdHlwZSA9IFJNTkVUX05FVExJ TktfRlJFRV9WTkQ7CisJfQorCisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gc2l6ZW9mKHVpbnQzMl90 KTsKKwlyZXF1ZXN0LnZuZC5pZCA9IGlkOworCisJaWYgKCgqZXJyb3JfY29kZSA9IHJtbmV0Y3Rs X3RyYW5zYWN0KGhuZGwsICZyZXF1ZXN0LCAmcmVzcG9uc2UpKQorCQkhPSBSTU5FVENUTF9TVUND RVNTKQorCQlicmVhazsKKwlpZiAoX3JtbmV0Y3RsX2NoZWNrX2NvZGUocmVzcG9uc2UuY3JkLCBl cnJvcl9jb2RlKSAhPSBSTU5FVENUTF9TVUNDRVNTKQorCQlicmVhazsKKworCXJldHVybl9jb2Rl ID0gX3JtbmV0Y3RsX3NldF9jb2RlcyhyZXNwb25zZS5yZXR1cm5fY29kZSwgZXJyb3JfY29kZSk7 CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKK2ludCBybW5ldF9uZXdf dm5kX25hbWUocm1uZXRjdGxfaG5kbF90ICpobmRsLAorCQkJIHVpbnQzMl90IGlkLAorCQkJIHVp bnQxNl90ICplcnJvcl9jb2RlLAorCQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3Qg cm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJaW50IHJldHVybl9jb2RlID0gUk1O RVRDVExfTElCX0VSUjsKKwlzaXplX3Qgc3RyX2xlbiA9IDA7CisJZG8geworCWlmICgoIWhuZGwp IHx8ICghZXJyb3JfY29kZSkpIHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9JTlZBTElEX0FS RzsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KHJlcXVlc3Qudm5kLnZuZF9uYW1lLCAwLCBSTU5F VF9NQVhfU1RSX0xFTik7CisJCWlmIChwcmVmaXgpIHsKKwkJCXJlcXVlc3QubWVzc2FnZV90eXBl ID1STU5FVF9ORVRMSU5LX05FV19WTkRfV0lUSF9OQU1FOworCQkJc3RyX2xlbiA9IHN0cmxjcHko KGNoYXIgKilyZXF1ZXN0LnZuZC52bmRfbmFtZSwKKwkJCQkJICBwcmVmaXgsIFJNTkVUX01BWF9T VFJfTEVOKTsKKwkJCWlmIChfcm1uZXRjdGxfY2hlY2tfbGVuKHN0cl9sZW4sIGVycm9yX2NvZGUp CisJCQkJCQkhPSBSTU5FVENUTF9TVUNDRVNTKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJ cmVxdWVzdC5tZXNzYWdlX3R5cGUgPSBSTU5FVF9ORVRMSU5LX05FV19WTkQ7CisJCX0KKworCXJl cXVlc3QuYXJnX2xlbmd0aCA9IHNpemVvZih1aW50MzJfdCk7CisJcmVxdWVzdC52bmQuaWQgPSBp ZDsKKworCWlmICgoKmVycm9yX2NvZGUgPSBybW5ldGN0bF90cmFuc2FjdChobmRsLCAmcmVxdWVz dCwgJnJlc3BvbnNlKSkKKwkJIT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJYnJlYWs7CisJaWYgKF9y bW5ldGN0bF9jaGVja19jb2RlKHJlc3BvbnNlLmNyZCwgZXJyb3JfY29kZSkgIT0gUk1ORVRDVExf U1VDQ0VTUykKKwkJYnJlYWs7CisKKwlyZXR1cm5fY29kZSA9IF9ybW5ldGN0bF9zZXRfY29kZXMo cmVzcG9uc2UucmV0dXJuX2NvZGUsIGVycm9yX2NvZGUpOworCX0gd2hpbGUoMCk7CisJcmV0dXJu IHJldHVybl9jb2RlOworfQorCitpbnQgcm1uZXRfbmV3X3ZuZChybW5ldGN0bF9obmRsX3QgKmhu ZGwsCisJCSAgdWludDMyX3QgaWQsCisJCSAgdWludDE2X3QgKmVycm9yX2NvZGUsCisJCSAgdWlu dDhfdCBuZXdfdm5kKQoreworCXJldHVybiBybW5ldF9uZXdfdm5kX3ByZWZpeChobmRsLCBpZCwg ZXJyb3JfY29kZSwgbmV3X3ZuZCwgMCk7Cit9CisKK2ludCBybW5ldF9nZXRfdm5kX25hbWUocm1u ZXRjdGxfaG5kbF90ICpobmRsLAorCQkgICAgICAgdWludDMyX3QgaWQsCisJCSAgICAgICB1aW50 MTZfdCAqZXJyb3JfY29kZSwKKwkJICAgICAgIGNoYXIgKmJ1ZiwKKwkJICAgICAgIHVpbnQzMl90 IGJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgcm1uZXRfbmxfbXNnX3MgcmVxdWVzdCwgcmVzcG9uc2U7CisJ dWludDMyX3Qgc3RyX2xlbjsKKwlpbnQgcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9MSUJfRVJSOwor CWRvIHsKKwlpZiAoKCFobmRsKSB8fCAoIWVycm9yX2NvZGUpIHx8ICghYnVmKSB8fCAoMCA9PSBi dWZsZW4pKSB7CisJCXJldHVybl9jb2RlID0gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisJCWJyZWFr OworCX0KKworCXJlcXVlc3QubWVzc2FnZV90eXBlID0gUk1ORVRfTkVUTElOS19HRVRfVk5EX05B TUU7CisJcmVxdWVzdC5hcmdfbGVuZ3RoID0gc2l6ZW9mKHVpbnQzMl90KTsKKwlyZXF1ZXN0LnZu ZC5pZCA9IGlkOworCisKKwlpZiAoKCplcnJvcl9jb2RlID0gcm1uZXRjdGxfdHJhbnNhY3QoaG5k bCwgJnJlcXVlc3QsICZyZXNwb25zZSkpCisJCSE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFr OworCisJaWYgKF9ybW5ldGN0bF9jaGVja19kYXRhKHJlc3BvbnNlLmNyZCwgZXJyb3JfY29kZSkK KwkJIT0gUk1ORVRDVExfU1VDQ0VTUykgeworCQlpZiAoX3JtbmV0Y3RsX2NoZWNrX2NvZGUocmVz cG9uc2UuY3JkLCBlcnJvcl9jb2RlKQorCQkJPT0gUk1ORVRDVExfU1VDQ0VTUykKKwkJCXJldHVy bl9jb2RlID0gX3JtbmV0Y3RsX3NldF9jb2RlcyhyZXNwb25zZS5yZXR1cm5fY29kZSwKKwkJCQkJ CQkgIGVycm9yX2NvZGUpOworCQlicmVhazsKKwl9CisKKwlzdHJfbGVuID0gKHVpbnQzMl90KXN0 cmxjcHkoYnVmLAorCQkJICAoY2hhciAqKShyZXNwb25zZS52bmQudm5kX25hbWUpLAorCQkJICBi dWZsZW4pOworCWlmIChzdHJfbGVuID49IGJ1ZmxlbikgeworCQkqZXJyb3JfY29kZSA9IFJNTkVU Q1RMX0FQSV9FUlJfU1RSSU5HX1RSVU5DQVRJT047CisJCWJyZWFrOworCX0KKworCXJldHVybl9j b2RlID0gUk1ORVRDVExfU1VDQ0VTUzsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gcmV0dXJuX2Nv ZGU7Cit9CisKK2ludCBybW5ldF9hZGRfZGVsX3ZuZF90Y19mbG93KHJtbmV0Y3RsX2huZGxfdCAq aG5kbCwKKwkJCSAgICAgIHVpbnQzMl90IGlkLAorCQkJICAgICAgdWludDMyX3QgbWFwX2Zsb3df aWQsCisJCQkgICAgICB1aW50MzJfdCB0Y19mbG93X2lkLAorCQkJICAgICAgdWludDhfdCBzZXRf ZmxvdywKKwkJCSAgICAgIHVpbnQxNl90ICplcnJvcl9jb2RlKSB7CisJc3RydWN0IHJtbmV0X25s X21zZ19zIHJlcXVlc3QsIHJlc3BvbnNlOworCWludCByZXR1cm5fY29kZSA9IFJNTkVUQ1RMX0xJ Ql9FUlI7CisJZG8geworCWlmICgoIWhuZGwpIHx8ICghZXJyb3JfY29kZSkgfHwgKChzZXRfZmxv dyAhPSBSTU5FVENUTF9BRERfRkxPVykgJiYKKwkgICAgKHNldF9mbG93ICE9IFJNTkVUQ1RMX0RF TF9GTE9XKSkpIHsKKwkJcmV0dXJuX2NvZGUgPSBSTU5FVENUTF9JTlZBTElEX0FSRzsKKwkJYnJl YWs7CisJfQorCWlmIChzZXRfZmxvdyA9PSAgUk1ORVRDVExfQUREX0ZMT1cpCisJCXJlcXVlc3Qu bWVzc2FnZV90eXBlID0gUk1ORVRfTkVUTElOS19BRERfVk5EX1RDX0ZMT1c7CisJZWxzZQorCQly ZXF1ZXN0Lm1lc3NhZ2VfdHlwZSA9IFJNTkVUX05FVExJTktfREVMX1ZORF9UQ19GTE9XOworCisJ cmVxdWVzdC5hcmdfbGVuZ3RoID0gKHNpemVvZih1aW50MzJfdCkpKjM7CisJcmVxdWVzdC5mbG93 X2NvbnRyb2wuaWQgPSBpZDsKKwlyZXF1ZXN0LmZsb3dfY29udHJvbC5tYXBfZmxvd19pZCA9IG1h cF9mbG93X2lkOworCXJlcXVlc3QuZmxvd19jb250cm9sLnRjX2Zsb3dfaWQgPSB0Y19mbG93X2lk OworCisJaWYgKCgqZXJyb3JfY29kZSA9IHJtbmV0Y3RsX3RyYW5zYWN0KGhuZGwsICZyZXF1ZXN0 LCAmcmVzcG9uc2UpKQorCSE9IFJNTkVUQ1RMX1NVQ0NFU1MpCisJCWJyZWFrOworCWlmIChfcm1u ZXRjdGxfY2hlY2tfY29kZShyZXNwb25zZS5jcmQsIGVycm9yX2NvZGUpICE9IFJNTkVUQ1RMX1NV Q0NFU1MpCisJCWJyZWFrOworCXJldHVybl9jb2RlID0gX3JtbmV0Y3RsX3NldF9jb2RlcyhyZXNw b25zZS5yZXR1cm5fY29kZSwgZXJyb3JfY29kZSk7CisJfSB3aGlsZSgwKTsKKwlyZXR1cm4gcmV0 dXJuX2NvZGU7Cit9CisKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgTkVXIERSSVZFUiBB UEkKKyAqLworLyogQGJyaWVmIFN5bmNocm9ub3VzIG1ldGhvZCB0byByZWNlaXZlIG1lc3NhZ2Vz IHRvIGFuZCBmcm9tIHRoZSBrZXJuZWwKKyAqIHVzaW5nIG5ldGxpbmsgc29ja2V0cworICogQGRl dGFpbHMgUmVjZWl2ZXMgdGhlIGFjayByZXNwb25zZSBmcm9tIHRoZSBrZXJuZWwuCisgKiBAcGFy YW0gKmhuZGwgUm1OZXQgaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAcGFyYW0gKmVy cm9yX2NvZGUgRXJyb3IgY29kZSBpZiB0cmFuc2FjdGlvbiBmYWlscworICogQHJldHVybiBSTU5F VENUTF9BUElfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbHkgYWJsZSB0byBzZW5kIGFuZCByZWNlaXZl IG1lc3NhZ2UKKyAqIGZyb20gdGhlIGtlcm5lbAorICogQHJldHVybiBSTU5FVENUTF9BUElfRVJS X0hORExfSU5WQUxJRCBpZiBSbU5ldCBoYW5kbGUgZm9yIHRoZSB0cmFuc2FjdGlvbiB3YXMKKyAq IE5VTEwKKyAqIEByZXR1cm4gUk1ORVRDVExfQVBJX0VSUl9NRVNTQUdFX1JFQ0VJVkUgaWYgY291 bGQgbm90IHJlY2VpdmUgbWVzc2FnZSBmcm9tCisgKiB0aGUga2VybmVsCisgKiBAcmV0dXJuIFJN TkVUQ1RMX0FQSV9FUlJfTUVTU0FHRV9UWVBFIGlmIHRoZSByZXNwb25zZSB0eXBlIGRvZXMgbm90 CisgKiBtYXRjaAorICovCitzdGF0aWMgaW50IHJtbmV0X2dldF9hY2socm1uZXRjdGxfaG5kbF90 ICpobmRsLCB1aW50MTZfdCAqZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgbmxhY2sgeworCQlzdHJ1 Y3Qgbmxtc2doZHIgYWNraGVhZGVyOworCQlzdHJ1Y3Qgbmxtc2dlcnIgYWNrZGF0YTsKKwkJY2hh ciAgIGRhdGFbMjU2XTsKKworCX0gYWNrOworCWludCBpOworCisJaWYgKCFobmRsIHx8ICFlcnJv cl9jb2RlKQorCQlyZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisKKwlpZiAoKGkgPSByZWN2 KGhuZGwtPm5ldGxpbmtfZmQsICZhY2ssIHNpemVvZihhY2spLCAwKSkgPCAwKSB7CisJCSplcnJv cl9jb2RlID0gZXJybm87CisJCXJldHVybiBSTU5FVENUTF9BUElfRVJSX01FU1NBR0VfUkVDRUlW RTsKKwl9CisKKwkvKkFjayBzaG91bGQgYWx3YXlzIGJlIE5MTVNHX0VSUk9SIHR5cGUqLworCWlm IChhY2suYWNraGVhZGVyLm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpIHsKKwkJaWYgKGFjay5h Y2tkYXRhLmVycm9yID09IDApIHsKKwkJCSplcnJvcl9jb2RlID0gUk1ORVRDVExfQVBJX1NVQ0NF U1M7CisJCQlyZXR1cm4gUk1ORVRDVExfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCSplcnJvcl9j b2RlID0gLWFjay5hY2tkYXRhLmVycm9yOworCQkJcmV0dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlI7 CisJCX0KKwl9CisKKwkqZXJyb3JfY29kZSA9IFJNTkVUQ1RMX0FQSV9FUlJfUkVUVVJOX1RZUEU7 CisJcmV0dXJuIFJNTkVUQ1RMX0FQSV9GSVJTVF9FUlI7Cit9CisKKy8qCisgKiAgICAgICAgICAg ICAgICAgICAgICAgRVhQT1NFRCBORVcgRFJJVkVSIEFQSQorICovCitpbnQgcnRybW5ldF9jdGxf aW5pdChybW5ldGN0bF9obmRsX3QgKipobmRsLCB1aW50MTZfdCAqZXJyb3JfY29kZSkKK3sKKwlz dHJ1Y3Qgc29ja2FkZHJfbmwgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpICpzYWRkcl9w dHI7CisJaW50IG5ldGxpbmtfZmQgPSAtMTsKKwlwaWRfdCBwaWQgPSAwOworCisJaWYgKCFobmRs IHx8ICFlcnJvcl9jb2RlKQorCQlyZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisKKwkqaG5k bCA9IChybW5ldGN0bF9obmRsX3QgKiltYWxsb2Moc2l6ZW9mKHJtbmV0Y3RsX2huZGxfdCkpOwor CWlmICghKmhuZGwpIHsKKwkJKmVycm9yX2NvZGUgPSBSTU5FVENUTF9BUElfRVJSX0hORExfSU5W QUxJRDsKKwkJcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlI7CisJfQorCisJbWVtc2V0KCpobmRsLCAw LCBzaXplb2Yocm1uZXRjdGxfaG5kbF90KSk7CisKKwlwaWQgPSBnZXRwaWQoKTsKKwlpZiAocGlk ICA8IE1JTl9WQUxJRF9QUk9DRVNTX0lEKSB7CisJCWZyZWUoKmhuZGwpOworCQkqZXJyb3JfY29k ZSA9IFJNTkVUQ1RMX0lOSVRfRVJSX1BST0NFU1NfSUQ7CisJCXJldHVybiBSTU5FVENUTF9MSUJf RVJSOworCX0KKwkoKmhuZGwpLT5waWQgPSBLRVJORUxfUFJPQ0VTU19JRDsKKwluZXRsaW5rX2Zk ID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX1JPVVRFKTsKKwlpZiAobmV0 bGlua19mZCA8IE1JTl9WQUxJRF9TT0NLRVRfRkQpIHsKKwkJZnJlZSgqaG5kbCk7CisJCSplcnJv cl9jb2RlID0gUk1ORVRDVExfSU5JVF9FUlJfTkVUTElOS19GRDsKKwkJcmV0dXJuIFJNTkVUQ1RM X0xJQl9FUlI7CisJfQorCisJKCpobmRsKS0+bmV0bGlua19mZCA9IG5ldGxpbmtfZmQ7CisKKwlt ZW1zZXQoJigqaG5kbCktPnNyY19hZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSk7 CisKKwkoKmhuZGwpLT5zcmNfYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCSgqaG5kbCkt PnNyY19hZGRyLm5sX3BpZCA9ICgqaG5kbCktPnBpZDsKKworCXNhZGRyX3B0ciA9ICYoKmhuZGwp LT5zcmNfYWRkcjsKKwlpZiAoYmluZCgoKmhuZGwpLT5uZXRsaW5rX2ZkLAorCQkoc3RydWN0IHNv Y2thZGRyICopc2FkZHJfcHRyLAorCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSkgPCAwKSB7 CisJCWNsb3NlKCgqaG5kbCktPm5ldGxpbmtfZmQpOworCQlmcmVlKCpobmRsKTsKKwkJKmVycm9y X2NvZGUgPSBSTU5FVENUTF9JTklUX0VSUl9CSU5EOworCQlyZXR1cm4gUk1ORVRDVExfTElCX0VS UjsKKwl9CisKKwltZW1zZXQoJigqaG5kbCktPmRlc3RfYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBz b2NrYWRkcl9ubCkpOworCisJKCpobmRsKS0+ZGVzdF9hZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJ Tks7CisJKCpobmRsKS0+ZGVzdF9hZGRyLm5sX3BpZCA9IEtFUk5FTF9QUk9DRVNTX0lEOworCSgq aG5kbCktPmRlc3RfYWRkci5ubF9ncm91cHMgPSBVTklDQVNUOworCisJcmV0dXJuIFJNTkVUQ1RM X1NVQ0NFU1M7Cit9CisKK2ludCBydHJtbmV0X2N0bF9kZWluaXQocm1uZXRjdGxfaG5kbF90ICpo bmRsKQoreworCWlmICghaG5kbCkKKwkJcmV0dXJuIFJNTkVUQ1RMX1NVQ0NFU1M7CisKKwljbG9z ZShobmRsLT5uZXRsaW5rX2ZkKTsKKwlmcmVlKGhuZGwpOworCisJcmV0dXJuIFJNTkVUQ1RMX1NV Q0NFU1M7Cit9CisKK2ludCBydHJtbmV0X2N0bF9uZXd2bmQocm1uZXRjdGxfaG5kbF90ICpobmRs LCBjaGFyICpkZXZuYW1lLCBjaGFyICp2bmRuYW1lLAorCQkgICAgICAgdWludDE2X3QgKmVycm9y X2NvZGUsIHVpbnQ4X3QgIGluZGV4LAorCQkgICAgICAgdWludDMyX3QgZmxhZ2NvbmZpZykKK3sK KwlzdHJ1Y3QgcnRhdHRyICphdHRyaW5mbywgKmRhdGFpbmZvLCAqbGlua2luZm87CisJc3RydWN0 IGlmbGFfdmxhbl9mbGFncyBmbGFnczsKKwlpbnQgZGV2aW5kZXggPSAwLCB2YWwgPSAwOworCWNo YXIgKmtpbmQgPSAicm1uZXQiOworCXN0cnVjdCBubG1zZyByZXE7CisJc2hvcnQgaWQ7CisKKwlp ZiAoIWhuZGwgfHwgIWRldm5hbWUgfHwgIXZuZG5hbWUgfHwgIWVycm9yX2NvZGUpCisJCXJldHVy biBSTU5FVENUTF9JTlZBTElEX0FSRzsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7 CisJcmVxLm5sX2FkZHIubmxtc2dfdHlwZSA9IFJUTV9ORVdMSU5LOworCXJlcS5ubF9hZGRyLm5s bXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCXJlcS5u bF9hZGRyLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0NSRUFURSB8IE5MTV9G X0VYQ0wgfAorCQkJCSAgTkxNX0ZfQUNLOworCXJlcS5ubF9hZGRyLm5sbXNnX3NlcSA9IGhuZGwt PnRyYW5zYWN0aW9uX2lkOworCWhuZGwtPnRyYW5zYWN0aW9uX2lkKys7CisKKwkvKiBHZXQgaW5k ZXggb2YgZGV2bmFtZSovCisJZGV2aW5kZXggPSBpZl9uYW1ldG9pbmRleChkZXZuYW1lKTsKKwlp ZiAoZGV2aW5kZXggPCAwKSB7CisJCSplcnJvcl9jb2RlID0gZXJybm87CisJCXJldHVybiBSTU5F VENUTF9LRVJORUxfRVJSOworCX0KKworCS8qIFNldHVwIGxpbmsgYXR0ciB3aXRoIGRldmluZGV4 IGFzIGRhdGEgKi8KKwl2YWwgPSBkZXZpbmRleDsKKwlhdHRyaW5mbyA9IChzdHJ1Y3QgcnRhdHRy ICopKCgoY2hhciAqKSZyZXEpICsKKwkJCQkgICAgIE5MTVNHX0FMSUdOKHJlcS5ubF9hZGRyLm5s bXNnX2xlbikpOworCWF0dHJpbmZvLT5ydGFfdHlwZSA9IElGTEFfTElOSzsKKwlhdHRyaW5mby0+ cnRhX2xlbiA9IFJUQV9BTElHTihSVEFfTEVOR1RIKHNpemVvZih2YWwpKSk7CisJbWVtY3B5KFJU QV9EQVRBKGF0dHJpbmZvKSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCXJlcS5ubF9hZGRyLm5sbXNn X2xlbiA9IE5MTVNHX0FMSUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElH TihSVEFfTEVOR1RIKHNpemVvZih2YWwpKSk7CisKKwkvKiBTZXQgdXAgSUZMQSBpbmZvIGtpbmQg IFJNTkVUIHRoYXQgaGFzIGxpbmtpbmZvIGFuZCB0eXBlICovCisJYXR0cmluZm8gPSAoc3RydWN0 IHJ0YXR0ciAqKSgoKGNoYXIgKikmcmVxKSArCisJCQkJICAgICBOTE1TR19BTElHTihyZXEubmxf YWRkci5ubG1zZ19sZW4pKTsKKwlhdHRyaW5mby0+cnRhX3R5cGUgPSAgSUZMQV9JRk5BTUU7CisJ YXR0cmluZm8tPnJ0YV9sZW4gPSBSVEFfQUxJR04oUlRBX0xFTkdUSChzdHJsZW4odm5kbmFtZSkg KyAxKSk7CisJbWVtY3B5KFJUQV9EQVRBKGF0dHJpbmZvKSwgdm5kbmFtZSwgc3RybGVuKHZuZG5h bWUpICsgMSk7CisJcmVxLm5sX2FkZHIubmxtc2dfbGVuID0gTkxNU0dfQUxJR04ocmVxLm5sX2Fk ZHIubmxtc2dfbGVuKSArCisJCQkJUlRBX0FMSUdOKFJUQV9MRU5HVEgoc3RybGVuKHZuZG5hbWUp ICsgMSkpOworCisJbGlua2luZm8gPSAoc3RydWN0IHJ0YXR0ciAqKSgoKGNoYXIgKikmcmVxKSAr CisJCQkJICAgICBOTE1TR19BTElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pKTsKKwlsaW5raW5m by0+cnRhX3R5cGUgPSBJRkxBX0xJTktJTkZPOworCWxpbmtpbmZvLT5ydGFfbGVuID0gUlRBX0FM SUdOKFJUQV9MRU5HVEgoMCkpOworCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdO KHJlcS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElHTihSVEFfTEVOR1RIKDApKTsK KworCWF0dHJpbmZvID0gKHN0cnVjdCBydGF0dHIgKikoKChjaGFyICopJnJlcSkgKworCQkJCSAg ICAgTkxNU0dfQUxJR04ocmVxLm5sX2FkZHIubmxtc2dfbGVuKSk7CisJYXR0cmluZm8tPnJ0YV90 eXBlID0gIElGTEFfSU5GT19LSU5EOworCWF0dHJpbmZvLT5ydGFfbGVuID0gUlRBX0FMSUdOKFJU QV9MRU5HVEgoc3RybGVuKGtpbmQpKSk7CisJbWVtY3B5KFJUQV9EQVRBKGF0dHJpbmZvKSwga2lu ZCwgc3RybGVuKGtpbmQpKTsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihy ZXEubmxfYWRkci5ubG1zZ19sZW4pICsKKwkJCQlSVEFfQUxJR04oUlRBX0xFTkdUSChzdHJsZW4o a2luZCkpKTsKKworCWRhdGFpbmZvID0gKHN0cnVjdCBydGF0dHIgKikoKChjaGFyICopJnJlcSkg KworCQkJCSAgICAgTkxNU0dfQUxJR04ocmVxLm5sX2FkZHIubmxtc2dfbGVuKSk7CisJZGF0YWlu Zm8tPnJ0YV90eXBlID0gIElGTEFfSU5GT19EQVRBOworCWRhdGFpbmZvLT5ydGFfbGVuID0gUlRB X0FMSUdOKFJUQV9MRU5HVEgoMCkpOworCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNHX0FM SUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElHTihSVEFfTEVOR1RIKDAp KTsKKworCWlkID0gaW5kZXg7CisJYXR0cmluZm8gPSAoc3RydWN0IHJ0YXR0ciAqKSgoKGNoYXIg KikmcmVxKSArCisJCQkJICAgICBOTE1TR19BTElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pKTsK KwlhdHRyaW5mby0+cnRhX3R5cGUgPSAgSUZMQV9WTEFOX0lEOworCWF0dHJpbmZvLT5ydGFfbGVu ID0gUlRBX0xFTkdUSChzaXplb2YoaWQpKTsKKwltZW1jcHkoUlRBX0RBVEEoYXR0cmluZm8pLCAm aWQsIHNpemVvZihpZCkpOworCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKHJl cS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElHTihSVEFfTEVOR1RIKHNpemVvZihp ZCkpKTsKKworCWlmIChmbGFnY29uZmlnICE9IDApIHsKKwkJZmxhZ3MubWFzayAgPSBmbGFnY29u ZmlnOworCQlmbGFncy5mbGFncyA9IGZsYWdjb25maWc7CisKKwkJYXR0cmluZm8gPSAoc3RydWN0 IHJ0YXR0ciAqKSgoKGNoYXIgKikmcmVxKSArCisJCQkJCSAgICAgTkxNU0dfQUxJR04ocmVxLm5s X2FkZHIubmxtc2dfbGVuKSk7CisJCWF0dHJpbmZvLT5ydGFfdHlwZSA9ICBJRkxBX1ZMQU5fRkxB R1M7CisJCWF0dHJpbmZvLT5ydGFfbGVuID0gUlRBX0xFTkdUSChzaXplb2YoZmxhZ3MpKTsKKwkJ bWVtY3B5KFJUQV9EQVRBKGF0dHJpbmZvKSwgJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKKwkJcmVx Lm5sX2FkZHIubmxtc2dfbGVuID0gTkxNU0dfQUxJR04ocmVxLm5sX2FkZHIubmxtc2dfbGVuKSAr CisJCQkJCVJUQV9BTElHTihSVEFfTEVOR1RIKHNpemVvZihmbGFncykpKTsKKwl9CisKKwlkYXRh aW5mby0+cnRhX2xlbiA9IChjaGFyICopTkxNU0dfVEFJTCgmcmVxLm5sX2FkZHIpIC0gKGNoYXIg KilkYXRhaW5mbzsKKworCWxpbmtpbmZvLT5ydGFfbGVuID0gKGNoYXIgKilOTE1TR19UQUlMKCZy ZXEubmxfYWRkcikgLSAoY2hhciAqKWxpbmtpbmZvOworCisJaWYgKHNlbmQoaG5kbC0+bmV0bGlu a19mZCwgJnJlcSwgcmVxLm5sX2FkZHIubmxtc2dfbGVuLCAwKSA8IDApIHsKKwkJKmVycm9yX2Nv ZGUgPSBSTU5FVENUTF9BUElfRVJSX01FU1NBR0VfU0VORDsKKwkJcmV0dXJuIFJNTkVUQ1RMX0xJ Ql9FUlI7CisJfQorCisJcmV0dXJuIHJtbmV0X2dldF9hY2soaG5kbCwgZXJyb3JfY29kZSk7Cit9 CisKK2ludCBydHJtbmV0X2N0bF9kZWx2bmQocm1uZXRjdGxfaG5kbF90ICpobmRsLCBjaGFyICp2 bmRuYW1lLAorCQkgICAgICAgdWludDE2X3QgKmVycm9yX2NvZGUpCit7CisJaW50IGRldmluZGV4 ID0gMDsKKwlzdHJ1Y3Qgbmxtc2cgcmVxOworCisJaWYgKCFobmRsIHx8ICF2bmRuYW1lIHx8ICFl cnJvcl9jb2RlKQorCQlyZXR1cm4gUk1ORVRDVExfSU5WQUxJRF9BUkc7CisKKwltZW1zZXQoJnJl cSwgMCwgc2l6ZW9mKHJlcSkpOworCXJlcS5ubF9hZGRyLm5sbXNnX3R5cGUgPSBSVE1fREVMTElO SzsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBp ZmluZm9tc2cpKTsKKwlyZXEubmxfYWRkci5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBO TE1fRl9BQ0s7CisJcmVxLm5sX2FkZHIubmxtc2dfc2VxID0gaG5kbC0+dHJhbnNhY3Rpb25faWQ7 CisJaG5kbC0+dHJhbnNhY3Rpb25faWQrKzsKKworCS8qIEdldCBpbmRleCBvZiB2bmRuYW1lKi8K KwlkZXZpbmRleCA9IGlmX25hbWV0b2luZGV4KHZuZG5hbWUpOworCWlmIChkZXZpbmRleCA8IDAp IHsKKwkJKmVycm9yX2NvZGUgPSBlcnJubzsKKwkJcmV0dXJuIFJNTkVUQ1RMX0tFUk5FTF9FUlI7 CisJfQorCisJLyogU2V0dXAgaW5kZXggYXR0cmlidXRlICovCisJcmVxLmlmbXNnLmlmaV9pbmRl eCA9IGRldmluZGV4OworCWlmIChzZW5kKGhuZGwtPm5ldGxpbmtfZmQsICZyZXEsIHJlcS5ubF9h ZGRyLm5sbXNnX2xlbiwgMCkgPCAwKSB7CisJCSplcnJvcl9jb2RlID0gUk1ORVRDVExfQVBJX0VS Ul9NRVNTQUdFX1NFTkQ7CisJCXJldHVybiBSTU5FVENUTF9MSUJfRVJSOworCX0KKworCXJldHVy biBybW5ldF9nZXRfYWNrKGhuZGwsIGVycm9yX2NvZGUpOworfQorCisKK2ludCBydHJtbmV0X2N0 bF9jaGFuZ2V2bmQocm1uZXRjdGxfaG5kbF90ICpobmRsLCBjaGFyICpkZXZuYW1lLCBjaGFyICp2 bmRuYW1lLAorCQkJICB1aW50MTZfdCAqZXJyb3JfY29kZSwgdWludDhfdCAgaW5kZXgsCisJCQkg IHVpbnQzMl90IGZsYWdjb25maWcpCit7CisJc3RydWN0IHJ0YXR0ciAqYXR0cmluZm8sICpkYXRh aW5mbywgKmxpbmtpbmZvOworCXN0cnVjdCBpZmxhX3ZsYW5fZmxhZ3MgZmxhZ3M7CisJY2hhciAq a2luZCA9ICJybW5ldCI7CisJc3RydWN0IG5sbXNnIHJlcTsKKwlpbnQgZGV2aW5kZXggPSAwOwor CWludCB2YWwgPSAwOworCXNob3J0IGlkOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEp KTsKKworCWlmICghaG5kbCB8fCAhZGV2bmFtZSB8fCAhdm5kbmFtZSB8fCAhZXJyb3JfY29kZSkK KwkJcmV0dXJuIFJNTkVUQ1RMX0lOVkFMSURfQVJHOworCisJcmVxLm5sX2FkZHIubmxtc2dfdHlw ZSA9IFJUTV9ORVdMSU5LOworCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChz aXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCXJlcS5ubF9hZGRyLm5sbXNnX2ZsYWdzID0gTkxN X0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKwlyZXEubmxfYWRkci5ubG1zZ19zZXEgPSBobmRsLT50 cmFuc2FjdGlvbl9pZDsKKwlobmRsLT50cmFuc2FjdGlvbl9pZCsrOworCisJLyogR2V0IGluZGV4 IG9mIGRldm5hbWUqLworCWRldmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoZGV2bmFtZSk7CisJaWYg KGRldmluZGV4IDwgMCkgeworCQkqZXJyb3JfY29kZSA9IGVycm5vOworCQlyZXR1cm4gUk1ORVRD VExfS0VSTkVMX0VSUjsKKwl9CisKKwkvKiBTZXR1cCBsaW5rIGF0dHIgd2l0aCBkZXZpbmRleCBh cyBkYXRhICovCisJdmFsID0gZGV2aW5kZXg7CisJYXR0cmluZm8gPSAoc3RydWN0IHJ0YXR0ciAq KSgoKGNoYXIgKikmcmVxKSArCisJCQkJICAgICBOTE1TR19BTElHTihyZXEubmxfYWRkci5ubG1z Z19sZW4pKTsKKworCWF0dHJpbmZvLT5ydGFfdHlwZSA9IElGTEFfTElOSzsKKwlhdHRyaW5mby0+ cnRhX2xlbiA9IFJUQV9BTElHTihSVEFfTEVOR1RIKHNpemVvZih2YWwpKSk7CisJbWVtY3B5KFJU QV9EQVRBKGF0dHJpbmZvKSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCXJlcS5ubF9hZGRyLm5sbXNn X2xlbiA9IE5MTVNHX0FMSUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElH TihSVEFfTEVOR1RIKHNpemVvZih2YWwpKSk7CisKKwkgIC8qIFNldCB1cCBJRkxBIGluZm8ga2lu ZCAgUk1ORVQgdGhhdCBoYXMgbGlua2luZm8gYW5kIHR5cGUgKi8KKwlhdHRyaW5mbyA9IChzdHJ1 Y3QgcnRhdHRyICopKCgoY2hhciAqKSZyZXEpICsKKwkJCQkgICAgIE5MTVNHX0FMSUdOKHJlcS5u bF9hZGRyLm5sbXNnX2xlbikpOworCWF0dHJpbmZvLT5ydGFfdHlwZSA9ICBJRkxBX0lGTkFNRTsK KwlhdHRyaW5mby0+cnRhX2xlbiA9IFJUQV9BTElHTihSVEFfTEVOR1RIKHN0cmxlbih2bmRuYW1l KSArIDEpKTsKKwltZW1jcHkoUlRBX0RBVEEoYXR0cmluZm8pLCB2bmRuYW1lLCBzdHJsZW4odm5k bmFtZSkgKyAxKTsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihyZXEubmxf YWRkci5ubG1zZ19sZW4pICsKKwkJCQlSVEFfQUxJR04oUlRBX0xFTkdUSChzdHJsZW4odm5kbmFt ZSkgKyAxKSk7CisKKwlsaW5raW5mbyA9IChzdHJ1Y3QgcnRhdHRyICopKCgoY2hhciAqKSZyZXEp ICsKKwkJCQkgICAgIE5MTVNHX0FMSUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikpOworCisJbGlu a2luZm8tPnJ0YV90eXBlID0gSUZMQV9MSU5LSU5GTzsKKwlsaW5raW5mby0+cnRhX2xlbiA9IFJU QV9BTElHTihSVEFfTEVOR1RIKDApKTsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4gPSBOTE1TR19B TElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pICsKKwkJCQlSVEFfQUxJR04oUlRBX0xFTkdUSCgw KSk7CisKKworCWF0dHJpbmZvID0gKHN0cnVjdCBydGF0dHIgKikoKChjaGFyICopJnJlcSkgKwor CQkJCSAgICAgTkxNU0dfQUxJR04ocmVxLm5sX2FkZHIubmxtc2dfbGVuKSk7CisKKwlhdHRyaW5m by0+cnRhX3R5cGUgPSAgSUZMQV9JTkZPX0tJTkQ7CisJYXR0cmluZm8tPnJ0YV9sZW4gPSBSVEFf QUxJR04oUlRBX0xFTkdUSChzdHJsZW4oa2luZCkpKTsKKwltZW1jcHkoUlRBX0RBVEEoYXR0cmlu Zm8pLCBraW5kLCBzdHJsZW4oa2luZCkpOworCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNH X0FMSUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikgKworCQkJCVJUQV9BTElHTihSVEFfTEVOR1RI KHN0cmxlbihraW5kKSkpOworCisJZGF0YWluZm8gPSAoc3RydWN0IHJ0YXR0ciAqKSgoKGNoYXIg KikmcmVxKSArCisJCQkJICAgICBOTE1TR19BTElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pKTsK KworCWRhdGFpbmZvLT5ydGFfdHlwZSA9ICBJRkxBX0lORk9fREFUQTsKKwlkYXRhaW5mby0+cnRh X2xlbiA9IFJUQV9BTElHTihSVEFfTEVOR1RIKDApKTsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4g PSBOTE1TR19BTElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pICsKKwkJCQlSVEFfQUxJR04oUlRB X0xFTkdUSCgwKSk7CisKKwlpZCA9IGluZGV4OworCWF0dHJpbmZvID0gKHN0cnVjdCBydGF0dHIg KikoKChjaGFyICopJnJlcSkgKworCQkJCSAgICAgTkxNU0dfQUxJR04ocmVxLm5sX2FkZHIubmxt c2dfbGVuKSk7CisJYXR0cmluZm8tPnJ0YV90eXBlID0gIElGTEFfVkxBTl9JRDsKKwlhdHRyaW5m by0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoc2l6ZW9mKGlkKSk7CisJbWVtY3B5KFJUQV9EQVRBKGF0 dHJpbmZvKSwgJmlkLCBzaXplb2YoaWQpKTsKKwlyZXEubmxfYWRkci5ubG1zZ19sZW4gPSBOTE1T R19BTElHTihyZXEubmxfYWRkci5ubG1zZ19sZW4pICsKKwkJCQlSVEFfQUxJR04oUlRBX0xFTkdU SChzaXplb2YoaWQpKSk7CisKKwlpZiAoZmxhZ2NvbmZpZyAhPSAwKSB7CisJCWZsYWdzLm1hc2sg ID0gZmxhZ2NvbmZpZzsKKwkJZmxhZ3MuZmxhZ3MgPSBmbGFnY29uZmlnOworCisJCWF0dHJpbmZv ID0gKHN0cnVjdCBydGF0dHIgKikoKChjaGFyICopJnJlcSkgKworCQkJCQkgICAgIE5MTVNHX0FM SUdOKHJlcS5ubF9hZGRyLm5sbXNnX2xlbikpOworCQlhdHRyaW5mby0+cnRhX3R5cGUgPSAgSUZM QV9WTEFOX0ZMQUdTOworCQlhdHRyaW5mby0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoc2l6ZW9mKGZs YWdzKSk7CisJCW1lbWNweShSVEFfREFUQShhdHRyaW5mbyksICZmbGFncywgc2l6ZW9mKGZsYWdz KSk7CisJCXJlcS5ubF9hZGRyLm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKHJlcS5ubF9hZGRyLm5s bXNnX2xlbikgKworCQkJCQlSVEFfQUxJR04oUlRBX0xFTkdUSChzaXplb2YoZmxhZ3MpKSk7CisJ fQorCisJZGF0YWluZm8tPnJ0YV9sZW4gPSAoY2hhciAqKU5MTVNHX1RBSUwoJnJlcS5ubF9hZGRy KSAtIChjaGFyICopZGF0YWluZm87CisKKwlsaW5raW5mby0+cnRhX2xlbiA9IChjaGFyICopTkxN U0dfVEFJTCgmcmVxLm5sX2FkZHIpIC0gKGNoYXIgKilsaW5raW5mbzsKKworCWlmIChzZW5kKGhu ZGwtPm5ldGxpbmtfZmQsICZyZXEsIHJlcS5ubF9hZGRyLm5sbXNnX2xlbiwgMCkgPCAwKSB7CisJ CSplcnJvcl9jb2RlID0gUk1ORVRDVExfQVBJX0VSUl9NRVNTQUdFX1NFTkQ7CisJCXJldHVybiBS TU5FVENUTF9MSUJfRVJSOworCX0KKworCXJldHVybiBybW5ldF9nZXRfYWNrKGhuZGwsIGVycm9y X2NvZGUpOworfQorCitpbnQgcnRybW5ldF9jdGxfYnJpZGdldm5kKHJtbmV0Y3RsX2huZGxfdCAq aG5kbCwgY2hhciAqZGV2bmFtZSwgY2hhciAqdm5kbmFtZSwKKwkJCSAgdWludDE2X3QgKmVycm9y X2NvZGUpCit7CisJaW50IGRldmluZGV4ID0gMCwgdm5kaW5kZXggPSAwOworCXN0cnVjdCBydGF0 dHIgKm1hc3RlcmluZm87CisJc3RydWN0IG5sbXNnIHJlcTsKKworCWlmICghaG5kbCB8fCAhdm5k bmFtZSB8fCAhZGV2bmFtZSB8fCAhZXJyb3JfY29kZSkKKwkJcmV0dXJuIFJNTkVUQ1RMX0lOVkFM SURfQVJHOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlyZXEubmxfYWRkci5u bG1zZ190eXBlID0gUlRNX05FV0xJTks7CisJcmVxLm5sX2FkZHIubmxtc2dfbGVuID0gTkxNU0df TEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxLm5sX2FkZHIubmxtc2dfZmxh Z3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLOworCXJlcS5ubF9hZGRyLm5sbXNnX3NlcSA9 IGhuZGwtPnRyYW5zYWN0aW9uX2lkOworCWhuZGwtPnRyYW5zYWN0aW9uX2lkKys7CisKKwkvKiBH ZXQgaW5kZXggb2Ygdm5kbmFtZSovCisJZGV2aW5kZXggPSBpZl9uYW1ldG9pbmRleChkZXZuYW1l KTsKKwlpZiAoZGV2aW5kZXggPCAwKSB7CisJCSplcnJvcl9jb2RlID0gZXJybm87CisJCXJldHVy biBSTU5FVENUTF9LRVJORUxfRVJSOworCX0KKworCXZuZGluZGV4ID0gaWZfbmFtZXRvaW5kZXgo dm5kbmFtZSk7CisJaWYgKHZuZGluZGV4IDwgMCkgeworCQkqZXJyb3JfY29kZSA9IGVycm5vOwor CQlyZXR1cm4gUk1ORVRDVExfS0VSTkVMX0VSUjsKKwl9CisKKwkvKiBTZXR1cCBpbmRleCBhdHRy aWJ1dGUgKi8KKwlyZXEuaWZtc2cuaWZpX2luZGV4ID0gZGV2aW5kZXg7CisJbWFzdGVyaW5mbyA9 IChzdHJ1Y3QgcnRhdHRyICopKCgoY2hhciAqKSZyZXEpICsKKwkJCQkgICAgICAgTkxNU0dfQUxJ R04ocmVxLm5sX2FkZHIubmxtc2dfbGVuKSk7CisKKwltYXN0ZXJpbmZvLT5ydGFfdHlwZSA9ICBJ RkxBX01BU1RFUjsKKwltYXN0ZXJpbmZvLT5ydGFfbGVuID0gUlRBX0xFTkdUSChzaXplb2Yodm5k aW5kZXgpKTsKKwltZW1jcHkoUlRBX0RBVEEobWFzdGVyaW5mbyksICZ2bmRpbmRleCwgc2l6ZW9m KHZuZGluZGV4KSk7CisJcmVxLm5sX2FkZHIubmxtc2dfbGVuID0gTkxNU0dfQUxJR04ocmVxLm5s X2FkZHIubmxtc2dfbGVuKSArCisJCQkJUlRBX0FMSUdOKFJUQV9MRU5HVEgoc2l6ZW9mKHZuZGlu ZGV4KSkpOworCisJaWYgKHNlbmQoaG5kbC0+bmV0bGlua19mZCwgJnJlcSwgcmVxLm5sX2FkZHIu bmxtc2dfbGVuLCAwKSA8IDApIHsKKwkJKmVycm9yX2NvZGUgPSBSTU5FVENUTF9BUElfRVJSX01F U1NBR0VfU0VORDsKKwkJcmV0dXJuIFJNTkVUQ1RMX0xJQl9FUlI7CisJfQorCisJcmV0dXJuIHJt bmV0X2dldF9hY2soaG5kbCwgZXJyb3JfY29kZSk7Cit9Ci0tIAoxLjkuMQoK --=_3f93595a1e805a560a1fe6bdbe813855--