From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Ferre Subject: Re: [PATCH RESEND 3/5] mtd: nand: Cleanup/rework the atmel_nand driver Date: Tue, 14 Feb 2017 13:58:30 +0100 Message-ID: <1be79cf2-0318-8d07-0df4-911db18f5285@atmel.com> References: <1485535324-28393-1-git-send-email-boris.brezillon@free-electrons.com> <1485535324-28393-4-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1485535324-28393-4-git-send-email-boris.brezillon@free-electrons.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+gldm-linux-mtd-36=gmane.org@lists.infradead.org To: Boris Brezillon , Richard Weinberger , linux-mtd@lists.infradead.org, Linus Walleij , Alexandre Courbot , linux-gpio@vger.kernel.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Alexandre Belloni , Wenyou Yang , Josh Wu , Haavard Skinnemoen , Hans-Christian Egtvedt , linux-kernel@vger.kernel.org Cc: Mark Rutland , devicetree@vger.kernel.org, Pawel Moll , Ian Campbell , Marek Vasut , Rob Herring , Kumar Gala , Cyrille Pitchen , Brian Norris , David Woodhouse , linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org SGkgQm9yaXMsCgpMZSAyNy8wMS8yMDE3IMOgIDE3OjQyLCBCb3JpcyBCcmV6aWxsb24gYSDDqWNy aXQgOgo+IFRoaXMgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBkcml2ZXIgd2hvc2UgbWFp biBwdXJwb3NlIGlzIHRvCj4gc3VwcG9ydCB0aGUgbmV3IERUIHJlcHJlc2VudGF0aW9uIHdoZXJl IHRoZSBOQU5EIGNvbnRyb2xsZXIgbm9kZSBpcyBub3cKPiByZWFsbHkgdmlzaWJsZSBpbiB0aGUg RFQgYW5kIGFwcGVhcnMgdW5kZXIgdGhlIEVCSSBidXMuIFdpdGggdGhpcyBuZXcKPiByZXByZXNl bnRhdGlvbiwgd2UgY2FuIGFkZCBvdGhlciBkZXZpY2VzIHVuZGVyIHRoZSBFQkkgYnVzIHdpdGhv dXQKPiByaXNraW5nIHBpbm11eGluZyBjb25mbGljdHMgKHRoZSBOQU5EIGNvbnRyb2xsZXIgaXMg dW5kZXIgdGhlIEVCSQo+IGJ1cyBsb2dpYyBhbmQgYXMgc3VjaCwgc2hhcmUgc29tZSBvZiBpdHMg cGlucyB3aXRoIG90aGVyIGRldmljZXMKPiBjb25uZWN0ZWQgb24gdGhpcyBidXMpLgo+IAo+IEV2 ZW4gdGhvdWdoIHRoZSBnb2FsIG9mIHRoaXMgcmV3b3JrIHdhcyBub3QgbmVjZXNzYXJpbHkgdG8g YWRkIG5ldwo+IGZlYXR1cmVzLCB0aGUgbmV3IGRyaXZlciBoYXMgYmVlbiBkZXNpZ25lZCB3aXRo IHRoaXMgaW4gbWluZC4gV2l0aCBhCj4gY2xlYXJlciBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIGRp ZmZlcmVudCBibG9ja3MgYW5kIGRpZmZlcmVudCBJUAo+IHJldmlzaW9ucywgYWRkaW5nIG5ldyBm dW5jdGlvbmFsaXRpZXMgc2hvdWxkIGJlIGVhc2llciAod2UgYWxyZWFkeQo+IGhhdmUgcGxhbnMg dG8gc3VwcG9ydCBTTUMgdGltaW5nIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB3ZSBubyBsb25nZXIK PiBoYXZlIHRvIHJlbHkgb24gdGhlIGNvbmZpZ3VyYXRpb24gZG9uZSBieSB0aGUgYm9vdGxvYWRl ci9ib290c3RyYXApLgo+IAo+IEFsc28gbm90ZSB0aGF0IHdlIG5vIGxvbmdlciBoYXZlIGEgY3Vz dG9tIC0+Y21kZnVuYygpIGltcGxlbWVudGF0aW9uLAo+IHdoaWNoIG1lYW5zIHdlIGNhbiBub3cg YmVuZWZpdCBmcm9tIG5ldyBmZWF0dXJlcyBhZGRlZCBpbiB0aGUgY29yZQo+IGltcGxlbWVudGF0 aW9uIGZvciBmcmVlIChzdXBwb3J0IGZvciBuZXcgTkFORCBvcGVyYXRpb25zIGZvciBleGFtcGxl KS4KPiAKPiBUaGUgbGFzdCB0aGluZyB0aGF0IHdlIGdhaW4gd2l0aCB0aGlzIHJld29yayBpcyBz dXBwb3J0IGZvciBtdWx0aS1jaGlwcwo+IGFuZCBtdWx0aS1kaWVzIGNoaXBzLCB0aGFua3MgdG8g dGhlIGNsZWFuIE5BTkQgY29udHJvbGxlciA8LT4gTkFORAo+IGRldmljZXMgcmVwcmVzZW50YXRp b24uCgpUaGFua3MgZm9yIHRoZSBjb21wcmVoZW5zaXZlIGNvbW1pdCBtZXNzYWdlIQoKPiBUaGlz IG5ldyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIHNldmVyYWwgcGxhdGZvcm1zIChhdDkxc2Ft OTI2MSwKPiBhdDkxc2FtOWc0NSwgYXQ5MXNhbTl4NSwgc2FtYTVkMyBhbmQgc2FtYTVkNCkgdG8g bWFrZSBzdXJlIGl0IGRpZCBub3QKPiBpbnRyb2R1Y2UgcmVncmVzc2lvbnMsIGFuZCBpdCdzIHdv cnRoIG1lbnRpb25pbmcgdGhhdCBvbGQgYmluZGluZ3MgYXJlCj4gc3RpbGwgc3VwcG9ydGVkICh3 aGljaCBwYXJ0bHkgZXhwbGFpbiB0aGUgcG9zaXRpdmUgZGlmZnN0YXQpLgoKR3JlYXQhCgo+IFNp Z25lZC1vZmYtYnk6IEJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGZyZWUtZWxlY3Ry b25zLmNvbT4KPiAtLS0KPiAgTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgIHwgICAg MiArLQo+ICBkcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlICAgICAgICAgfCAgICAyICstCj4gIGRy aXZlcnMvbXRkL25hbmQvYXRtZWwvTWFrZWZpbGUgICB8ICAgIDQgKwo+ICBkcml2ZXJzL210ZC9u YW5kL2F0bWVsL25mYy5jICAgICAgfCAyMTY4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIGRyaXZlcnMvbXRkL25hbmQvYXRtZWwvcG1lY2MuYyAgICB8IDEwMTEgKysrKysrKysr KysrKysrCj4gIGRyaXZlcnMvbXRkL25hbmQvYXRtZWwvcG1lY2MuaCAgICB8ICAgNzMgKysKPiAg ZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kLmMgICAgIHwgMjQ3OSAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIGRyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZF9lY2Mu aCB8ICAxNjMgLS0tCj4gIGRyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZF9uZmMuaCB8ICAxMDMg LS0KPiAgOSBmaWxlcyBjaGFuZ2VkLCAzMjU4IGluc2VydGlvbnMoKyksIDI3NDcgZGVsZXRpb25z KC0pCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL2F0bWVsL01ha2VmaWxl Cj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL2F0bWVsL25mYy5jCj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL2F0bWVsL3BtZWNjLmMKPiAgY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvbXRkL25hbmQvYXRtZWwvcG1lY2MuaAo+ICBkZWxldGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kLmMKPiAgZGVsZXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZF9lY2MuaAo+ICBkZWxldGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kX25mYy5oCj4gCj4gZGlmZiAtLWdpdCBhL01B SU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKPiBpbmRleCAyNmVkZDgzMmM2NGUuLjQyNDhmNDZlMjI0 ZCAxMDA2NDQKPiAtLS0gYS9NQUlOVEFJTkVSUwo+ICsrKyBiL01BSU5UQUlORVJTCj4gQEAgLTIy MzMsNyArMjIzMyw3IEBAIE06CVdlbnlvdSBZYW5nIDx3ZW55b3UueWFuZ0BhdG1lbC5jb20+Cj4g IE06CUpvc2ggV3UgPHJhaW55ZmVlbGluZ0BvdXRsb29rLmNvbT4KPiAgTDoJbGludXgtbXRkQGxp c3RzLmluZnJhZGVhZC5vcmcKPiAgUzoJU3VwcG9ydGVkCj4gLUY6CWRyaXZlcnMvbXRkL25hbmQv YXRtZWxfbmFuZCoKPiArRjoJZHJpdmVycy9tdGQvbmFuZC9hdG1lbC8qCj4gIAo+ICBBVE1FTCBT RE1NQyBEUklWRVIKPiAgTToJTHVkb3ZpYyBEZXNyb2NoZXMgPGx1ZG92aWMuZGVzcm9jaGVzQGF0 bWVsLmNvbT4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZl cnMvbXRkL25hbmQvTWFrZWZpbGUKPiBpbmRleCAxOWE2NmU0MDRkNWIuLmFlYzYyOWJiZTI2ZiAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9t dGQvbmFuZC9NYWtlZmlsZQo+IEBAIC0yNSw3ICsyNSw3IEBAIG9iai0kKENPTkZJR19NVERfTkFO RF9TSEFSUFNMKQkJKz0gc2hhcnBzbC5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9OQU5EU0lN KQkJKz0gbmFuZHNpbS5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9DUzU1M1gpCQkrPSBjczU1 M3hfbmFuZC5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9OREZDKQkJKz0gbmRmYy5vCj4gLW9i ai0kKENPTkZJR19NVERfTkFORF9BVE1FTCkJCSs9IGF0bWVsX25hbmQubwo+ICtvYmotJChDT05G SUdfTVREX05BTkRfQVRNRUwpCQkrPSBhdG1lbC8KPiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0dQ SU8pCQkrPSBncGlvLm8KPiAgb21hcDJfbmFuZC1vYmpzIDo9IG9tYXAyLm8KPiAgb2JqLSQoQ09O RklHX01URF9OQU5EX09NQVAyKSAJCSs9IG9tYXAyX25hbmQubwo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL210ZC9uYW5kL2F0bWVsL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbmFuZC9hdG1lbC9NYWtl ZmlsZQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4xNWJjNGEw MTRmMzMKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdG1lbC9NYWtl ZmlsZQo+IEBAIC0wLDAgKzEsNCBAQAo+ICtvYmotJChDT05GSUdfTVREX05BTkRfQVRNRUwpCSs9 IGF0bWVsLW5hbmQtY29udHJvbGxlci5vIGF0bWVsLXBtZWNjLm8KPiArCj4gK2F0bWVsLW5hbmQt Y29udHJvbGxlci1vYmpzCTo9IG5mYy5vCgpJIGhhdmUgZG91YnRzIGFib3V0IHRoZSBuYW1lICJu ZmMiIGFzIHdlIGhhdmUgKmEgcGFydCogb2YgdGhlIG5ld2VzdApuYW5kIGZsYXNoIGNvbnRyb2xs ZXIgYW5kIGl0cyBhc3NvY2lhdGVkIHJlZ2lzdGVyIHNldCB0aGF0IGlzIG5hbWVkCiJORkMiIGlu IHRoZSBkYXRhc2hlZXQ6IGl0IG1heSBsZWFkIHRvIHNvbWUga2luZCBvZiBjb25mdXNpb24uLi4K Cgo+ICthdG1lbC1wbWVjYy1vYmpzCQk6PSBwbWVjYy5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bXRkL25hbmQvYXRtZWwvbmZjLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsL25mYy5jCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjMxNzNlNWY2YzQ1MAo+IC0t LSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsL25mYy5jCj4gQEAgLTAs MCArMSwyMTY4IEBACj4gKy8qCj4gKyAqIMKpIENvcHlyaWdodCAyMDE2IEFUTUVMCgpZZXMsIEkg a25vdyBpdCBjb21lcyBmcm9tIHRoZSBwcmV2aW91cyBkcml2ZXIgYnV0IGNvdWxkIHlvdSBwbGVh c2UKcmVtb3ZlIHRoZSBVVEYtOCAob3Igb3RoZXIgY2hhcmFjdGVyIGVuY29kaW5nKS4KCj4gKyAq IMKpIENvcHlyaWdodCAyMDE2IEZyZWUgRWxlY3Ryb25zCgoyMDE3PwoKPiArICogQXV0aG9yOiBC b3JpcyBCcmV6aWxsb24gPGJvcmlzLmJyZXppbGxvbkBmcmVlLWVsZWN0cm9ucy5jb20+Cj4gKyAq Cj4gKyAqIERlcml2ZWQgZnJvbSB0aGUgYXRtZWxfbmFuZC5jIGRyaXZlciB3aGljaCBjb250YWlu ZWQgdGhlIGZvbGxvd2luZwo+ICsgKiBjb3B5cmlnaHRzOgo+ICsgKgo+ICsgKiAgICBDb3B5cmln aHQgwqkgMjAwMyBSaWNrIEJyb25zb24KPiArICoKPiArICogICAgRGVyaXZlZCBmcm9tIGRyaXZl cnMvbXRkL25hbmQvYXV0Y3B1MTIuYwo+ICsgKiAgICAgICAgQ29weXJpZ2h0IMKpIDIwMDEgVGhv bWFzIEdsZWl4bmVyIChnbGVpeG5lckBhdXRyb25peC5kZSkKPiArICoKPiArICogICAgRGVyaXZl ZCBmcm9tIGRyaXZlcnMvbXRkL3NwaWEuYwo+ICsgKiAgICAgICAgQ29weXJpZ2h0IMKpIDIwMDAg U3RldmVuIEouIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKPiArICoKPiArICoKPiArICogICAgQWRk IEhhcmR3YXJlIEVDQyBzdXBwb3J0IGZvciBBVDkxU0FNOTI2MCAvIEFUOTFTQU05MjYzCj4gKyAq ICAgICAgICBSaWNoYXJkIEdlbm91ZCAocmljaGFyZC5nZW5vdWRAZ21haWwuY29tKSwgQWRlbmVv IENvcHlyaWdodCDCqSAyMDA3Cj4gKyAqCj4gKyAqICAgICAgICBEZXJpdmVkIGZyb20gRGFzIFUt Qm9vdCBzb3VyY2UgY29kZQo+ICsgKiAgICAgICAgICAgICAgKHUtYm9vdC0xLjEuNS9ib2FyZC9h dG1lbC9hdDkxc2FtOTI2M2VrL25hbmQuYykKPiArICogICAgICAgIMKpIENvcHlyaWdodCAyMDA2 IEFUTUVMIFJvdXNzZXQsIExhY3Jlc3Nvbm5pZXJlIE5pY29sYXMKPiArICoKPiArICogICAgQWRk IFByb2dyYW1tYWJsZSBNdWx0aWJpdCBFQ0Mgc3VwcG9ydCBmb3IgdmFyaW91cyBBVDkxIFNvQwo+ ICsgKiAgICAgICAgwqkgQ29weXJpZ2h0IDIwMTIgQVRNRUwsIEhvbmcgWHUKPiArICoKPiArICog ICAgQWRkIE5hbmQgRmxhc2ggQ29udHJvbGxlciBzdXBwb3J0IGZvciBTQU1BNSBTb0MKPiArICog ICAgICAgIMKpIENvcHlyaWdodCAyMDEzIEFUTUVMLCBKb3NoIFd1IChqb3NoLnd1QGF0bWVsLmNv bSkKPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPiArICogcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqLwo+ICsKPiArI2lu Y2x1ZGUgPGxpbnV4L2Nsay5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2Mu aD4KPiArI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KPiArI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29u c3VtZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvbWZkL3N5c2Nvbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi9hdG1lbC1tYXRy aXguaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXRk L25hbmQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KPiArI2luY2x1ZGUgPGxp bnV4L29mX2lycS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPiArI2luY2x1 ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2F0bWVsLmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9yZWdtYXAuaD4KPiArCj4gKyNpbmNsdWRlICJwbWVjYy5oIgo+ICsKPiArI2RlZmluZSBB VE1FTF9IU01DX05GQ19DRkcJCQkweDAKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19DRkdfU1BB UkVTSVpFKHgpCQkoKHgpIDw8IDI0KQo+ICsjZGVmaW5lIEFUTUVMX0hTTUNfTkZDX0NGR19EVE8o Y3ljLCBtdWwpCSgoKGN5YykgPDwgMTYpIHwgKChtdWwpIDw8IDIwKSkKPiArI2RlZmluZSBBVE1F TF9IU01DX05GQ19DRkdfRFRPX01BWAkJR0VOTUFTSygyMiwgMTYpCj4gKyNkZWZpbmUgQVRNRUxf SFNNQ19ORkNfQ0ZHX1JCRURHRQkJQklUKDEzKQo+ICsjZGVmaW5lIEFUTUVMX0hTTUNfTkZDX0NG R19GQUxMSU5HX0VER0UJCUJJVCgxMikKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19DRkdfUlNQ QVJFCQlCSVQoOSkKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19DRkdfV1NQQVJFCQlCSVQoOCkK PiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19DRkdfUEFHRVNJWkVfTUFTSwlHRU5NQVNLKDIsIDAp Cj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfQ0ZHX1BBR0VTSVpFKHgpCQkoZmxzKCh4KSAvIDUx MikgLSAxKQo+ICsKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19DVFJMCQkJMHg0Cj4gKyNkZWZp bmUgQVRNRUxfSFNNQ19ORkNfQ1RSTF9FTgkJCUJJVCgwKQo+ICsjZGVmaW5lIEFUTUVMX0hTTUNf TkZDX0NUUkxfRElTCQkJQklUKDEpCj4gKwo+ICsjZGVmaW5lIEFUTUVMX0hTTUNfTkZDX1NSCQkJ MHg4Cj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfSUVSCQkJMHhjCj4gKyNkZWZpbmUgQVRNRUxf SFNNQ19ORkNfSURSCQkJMHgxMAo+ICsjZGVmaW5lIEFUTUVMX0hTTUNfTkZDX0lNUgkJCTB4MTQK PiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19TUl9FTkFCTEVECQlCSVQoMSkKPiArI2RlZmluZSBB VE1FTF9IU01DX05GQ19TUl9SQl9SSVNFCQlCSVQoNCkKPiArI2RlZmluZSBBVE1FTF9IU01DX05G Q19TUl9SQl9GQUxMCQlCSVQoNSkKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19TUl9CVVNZCQkJ QklUKDgpCj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfU1JfV1IJCQlCSVQoMTEpCj4gKyNkZWZp bmUgQVRNRUxfSFNNQ19ORkNfU1JfQ1NJRAkJCUdFTk1BU0soMTQsIDEyKQo+ICsjZGVmaW5lIEFU TUVMX0hTTUNfTkZDX1NSX1hGUkRPTkUJCUJJVCgxNikKPiArI2RlZmluZSBBVE1FTF9IU01DX05G Q19TUl9DTURET05FCQlCSVQoMTcpCj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfU1JfRFRPRQkJ CUJJVCgyMCkKPiArI2RlZmluZSBBVE1FTF9IU01DX05GQ19TUl9VTkRFRgkJCUJJVCgyMSkKPiAr I2RlZmluZSBBVE1FTF9IU01DX05GQ19TUl9BV0IJCQlCSVQoMjIpCj4gKyNkZWZpbmUgQVRNRUxf SFNNQ19ORkNfU1JfTkZDQVNFCQlCSVQoMjMpCj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfU1Jf UkJFREdFKHgpCQlCSVQoKHgpICsgMjQpCj4gKwo+ICsjZGVmaW5lIEFUTUVMX0hTTUNfTkZDX0FE RFIJCQkweDE4Cj4gKyNkZWZpbmUgQVRNRUxfSFNNQ19ORkNfQkFOSwkJCTB4MWMKPiArCj4gKyNk ZWZpbmUgQVRNRUxfTkZDX01BWF9SQl9JRAkJCTcKPiArCj4gKyNkZWZpbmUgQVRNRUxfTkZDX1NS QU1fU0laRQkJCTB4MjQwMAo+ICsKPiArI2RlZmluZSBBVE1FTF9ORkNfQ01EKHBvcywgY21kKQkJ CSgoY21kKSA8PCAoKChwb3MpICogOCkgKyAyKSkKPiArI2RlZmluZSBBVE1FTF9ORkNfVkNNRDIJ CQkJQklUKDE4KQo+ICsjZGVmaW5lIEFUTUVMX05GQ19BQ1lDTEUobmFkZHJzKQkJKChuYWRkcnMp IDw8IDE5KQo+ICsjZGVmaW5lIEFUTUVMX05GQ19DU0lEKGNzKQkJCSgoY3MpIDw8IDIyKQo+ICsj ZGVmaW5lIEFUTUVMX05GQ19EQVRBRU4JCQlCSVQoMjUpCj4gKyNkZWZpbmUgQVRNRUxfTkZDX05G Q1dSCQkJCUJJVCgyNikKPiArCj4gKyNkZWZpbmUgQVRNRUxfTkFORF9BTEVfT0ZGU0VUCQkJQklU KDIxKQo+ICsjZGVmaW5lIEFUTUVMX05BTkRfQ0xFX09GRlNFVAkJCUJJVCgyMikKPiArCj4gKyNk ZWZpbmUgREVGQVVMVF9USU1FT1VUX01TCQkJMTAwMAo+ICsKPiArI2RlZmluZSBBVE1FTF9ORkNf TUlOX0RNQV9MRU4JCQk2NAo+ICsKPiArZW51bSBhdG1lbF9uYW5kX3JiX3R5cGUgewo+ICsJQVRN RUxfTkFORF9OT19SQiwKPiArCUFUTUVMX05BTkRfTkFUSVZFX1JCLAo+ICsJQVRNRUxfTkFORF9H UElPX1JCLAo+ICt9Owo+ICsKPiArc3RydWN0IGF0bWVsX25hbmRfcmIgewo+ICsJZW51bSBhdG1l bF9uYW5kX3JiX3R5cGUgdHlwZTsKPiArCXVuaW9uIHsKPiArCQlzdHJ1Y3QgZ3Bpb19kZXNjICpn cGlvOwo+ICsJCWludCBpZDsKPiArCX07Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfbmFuZF9j cyB7Cj4gKwlpbnQgaWQ7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZF9yYiByYjsKPiArCXN0cnVjdCBn cGlvX2Rlc2MgKmNzZ3BpbzsKPiArCXN0cnVjdCB7Cj4gKwkJdm9pZCBfX2lvbWVtICp2aXJ0Owo+ ICsJCWRtYV9hZGRyX3QgZG1hOwo+ICsJfSBpbzsKPiArfTsKPiArCj4gK3N0cnVjdCBhdG1lbF9u YW5kIHsKPiArCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldjsK PiArCXN0cnVjdCBuYW5kX2NoaXAgYmFzZTsKPiArCXN0cnVjdCBhdG1lbF9uYW5kX2NzICphY3Rp dmVjczsKPiArCXN0cnVjdCBhdG1lbF9wbWVjY191c2VyICpwbWVjYzsKPiArCXN0cnVjdCBncGlv X2Rlc2MgKmNkZ3BpbzsKPiArCWludCBudW1jczsKPiArCXN0cnVjdCBhdG1lbF9uYW5kX2NzIGNz W107Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBhdG1lbF9uYW5kICp0b19hdG1l bF9uYW5kKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXJldHVybiBjb250YWluZXJf b2YoY2hpcCwgc3RydWN0IGF0bWVsX25hbmQsIGJhc2UpOwo+ICt9Cj4gKwo+ICtlbnVtIGF0bWVs X3NhbWE1X2RhdGFfeGZlciB7CgpXZWxsLCBzYW1hNSB3b3VsZCB0aGVuIG1lYW4gImFsbCBjb250 cm9sbGVycyBjb21wYXRpYmxlIHdpdGggdGhlIG9uZQpmb3VuZCBvbiBzYW1hNWQzIi4uLiBBbmQg ZXZlbiBpZiBzb21lIFNvQyBkb2Vzbid0IGNvbnRhaW4gdGhlIHN1YnN0cmlnCiJzYW1hNSIuLi4g U28gbWF5YmUgdGhpbmsgYWJvdXQgYW5vdGhlciB3YXkgdG8gZ2VuZXJpY2FsbHkgY2FsbCB0aGlz CnZhcmlhbnQgb2YgdGhlIG5hbmQgZmxhc2ggY29udHJvbGxlci4uLgoKPiArCUFUTUVMX05GQ19O T19EQVRBLAo+ICsJQVRNRUxfTkZDX1JFQURfREFUQSwKPiArCUFUTUVMX05GQ19XUklURV9EQVRB LAo+ICt9Owo+ICsKPiArc3RydWN0IGF0bWVsX3NhbWE1X29wIHsKPiArCXU4IGNzOwo+ICsJdTgg bmNtZHM7Cj4gKwl1OCBjbWRzWzJdOwo+ICsJdTggbmFkZHJzOwo+ICsJdTggYWRkcnNbNV07Cj4g KwllbnVtIGF0bWVsX3NhbWE1X2RhdGFfeGZlciBkYXRhOwo+ICt9Owo+ICsKPiArc3RydWN0IGF0 bWVsX25mYzsKCkhlcmUgYWdhaW46IG5pdHBpY2tpbmcgYWJvdXQgbmFtZXMsIGJ1dCBuZmMgY2Fu IGJlIGNvbmZ1c2luZyB3aXRoIHRoZQpORkMgcmVnaXN0ZXIgZGVmaW5lZCBpbiB0aGUgZGF0YXNo ZWV0LgoKQW4gaWRlYTogd2hlbiB5b3UgZmluZCBnb29kIG5hbWluZyBzY2hlbWUsIHlvdSBjYW4g YWRkIGEgbGl0dGxlIGdsb3NzYXJ5CmluIHRoZSBoZWFkZXIgdG8gZXhwbGFpbiBhY3JvbnltcyBh bmQgbmFtaW5nIGNvbnZlbnRpb24gb2YgdGhlIGRyaXZlciBsaWtlOgpodHRwOi8vbHhyLmZyZWUt ZWxlY3Ryb25zLmNvbS9zb3VyY2UvZHJpdmVycy9kbWEvYXRfaGRtYWMuYyNMMzMKCgo+ICtzdHJ1 Y3QgYXRtZWxfbmZjX2NhcHM7Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfbmZjX29wcyB7Cj4gKwlpbnQg KCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkgICAgIGNvbnN0IHN0 cnVjdCBhdG1lbF9uZmNfY2FwcyAqY2Fwcyk7Cj4gKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBhdG1l bF9uZmMgKm5mYyk7Cj4gKwl2b2lkICgqbmFuZF9pbml0KShzdHJ1Y3QgYXRtZWxfbmZjICpuZmMs IHN0cnVjdCBhdG1lbF9uYW5kICpuYW5kKTsKPiArCWludCAoKmVjY19pbml0KShzdHJ1Y3QgYXRt ZWxfbmFuZCAqbmFuZCk7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfbmZjX2NhcHMgewo+ICsJ Ym9vbCBoYXNfZG1hOwo+ICsJYm9vbCBsZWdhY3lfb2ZfYmluZGluZ3M7Cj4gKwl1MzIgYWxlX29m ZnM7Cj4gKwl1MzIgY2xlX29mZnM7Cj4gKwljb25zdCBzdHJ1Y3QgYXRtZWxfbmZjX29wcyAqb3Bz Owo+ICt9Owo+ICsKPiArc3RydWN0IGF0bWVsX25mYyB7Cj4gKwlzdHJ1Y3QgbmFuZF9od19jb250 cm9sIGJhc2U7Cj4gKwljb25zdCBzdHJ1Y3QgYXRtZWxfbmZjX2NhcHMgKmNhcHM7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgcmVnbWFwICpzbWM7Cj4gKwlzdHJ1Y3QgcmVnbWFw ICptYXRyaXg7Cj4gKwl1bnNpZ25lZCBpbnQgZWJpX2NzYV9vZmZzOwo+ICsJc3RydWN0IGRtYV9j aGFuICpkbWFjOwo+ICsJc3RydWN0IGF0bWVsX3BtZWNjICpwbWVjYzsKPiArCXN0cnVjdCBsaXN0 X2hlYWQgY2hpcHM7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBhdG1lbF9uZmMg KnRvX25mYyhzdHJ1Y3QgbmFuZF9od19jb250cm9sICpjdGwpCj4gK3sKPiArCXJldHVybiBjb250 YWluZXJfb2YoY3RsLCBzdHJ1Y3QgYXRtZWxfbmZjLCBiYXNlKTsKPiArfQo+ICsKPiArc3RydWN0 IGF0bWVsX3NhbWE1X25mYyB7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmZjIGJhc2U7Cj4gKwlzdHJ1Y3Qg ewo+ICsJCXN0cnVjdCBnZW5fcG9vbCAqcG9vbDsKPiArCQl2b2lkIF9faW9tZW0gKnZpcnQ7Cj4g KwkJZG1hX2FkZHJfdCBkbWE7Cj4gKwl9IHNyYW07Cj4gKwlzdHJ1Y3QgcmVnbWFwICppbzsKPiAr CXN0cnVjdCBhdG1lbF9zYW1hNV9vcCBvcDsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRl Owo+ICsJaW50IGlycTsKPiArCj4gKwkvKiBPbmx5IHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGZy b20gbGVnYWN5IERUIGJpbmRpbmdzLiAqLwo+ICsJc3RydWN0IGNsayAqY2xrOwo+ICt9Owo+ICsK PiArc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjICp0b19zYW1hNV9uZmMoc3Ry dWN0IG5hbmRfaHdfY29udHJvbCAqY3RsKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKHRv X25mYyhjdGwpLCBzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjLCBiYXNlKTsKPiArfQo+ICsKPiArc3Rh dGljIGlycXJldHVybl90IGF0bWVsX3NhbWE1X25mY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAq ZGF0YSkKPiArewo+ICsJc3RydWN0IGF0bWVsX3NhbWE1X25mYyAqbmZjID0gZGF0YTsKPiArCXUz MiBpbXIsIHNyOwo+ICsKPiArCXJlZ21hcF9yZWFkKG5mYy0+YmFzZS5zbWMsIEFUTUVMX0hTTUNf TkZDX0lNUiwgJmltcik7Cj4gKwlyZWdtYXBfcmVhZChuZmMtPmJhc2Uuc21jLCBBVE1FTF9IU01D X05GQ19TUiwgJnNyKTsKPiArCj4gKwlzciAmPSBpbXI7Cj4gKwo+ICsJaWYgKHNyKQo+ICsJCXJl Z21hcF93cml0ZShuZmMtPmJhc2Uuc21jLCBBVE1FTF9IU01DX05GQ19JRFIsIHNyKTsKPiArCj4g KwlpZiAoc3IgPT0gaW1yKQo+ICsJCWNvbXBsZXRlKCZuZmMtPmNvbXBsZXRlKTsKPiArCj4gKwly ZXR1cm4gc3IgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9v bCBhdG1lbF9zYW1hNV9uZmNfb3BfZG9uZSh1MzIgKmV2ZW50cywgdTMyIHN0YXR1cykKPiArewo+ ICsJKmV2ZW50cyBePSAoc3RhdHVzICYgKmV2ZW50cyk7Cj4gKwo+ICsJcmV0dXJuICEqZXZlbnRz Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY193YWl0KHN0cnVjdCBhdG1l bF9zYW1hNV9uZmMgKm5mYywgdTMyIGV2ZW50cywKPiArCQkJCWJvb2wgcG9sbCwgdW5zaWduZWQg aW50IHRpbWVvdXRfbXMpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKCF0aW1lb3V0X21z KQo+ICsJCXRpbWVvdXRfbXMgPSBERUZBVUxUX1RJTUVPVVRfTVM7Cj4gKwo+ICsJaWYgKHBvbGwp IHsKPiArCQl1MzIgc3RhdHVzOwo+ICsKPiArCQlyZXQgPSByZWdtYXBfcmVhZF9wb2xsX3RpbWVv dXQobmZjLT5iYXNlLnNtYywKPiArCQkJCQkgICAgICAgQVRNRUxfSFNNQ19ORkNfU1IsIHN0YXR1 cywKPiArCQkJCQkgICAgICAgYXRtZWxfc2FtYTVfbmZjX29wX2RvbmUoJmV2ZW50cywKPiArCQkJ CQkJCQkgICAgICAgc3RhdHVzKSwKPiArCQkJCQkgICAgICAgMCwgdGltZW91dF9tcyAqIDEwMDAp Owo+ICsJfSBlbHNlIHsKPiArCQlpbml0X2NvbXBsZXRpb24oJm5mYy0+Y29tcGxldGUpOwo+ICsJ CXJlZ21hcF93cml0ZShuZmMtPmJhc2Uuc21jLCBBVE1FTF9IU01DX05GQ19JRVIsIGV2ZW50cyk7 Cj4gKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZuZmMtPmNvbXBsZXRlLAo+ ICsJCQkJCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpKTsKPiArCQlyZWdtYXBfd3JpdGUo bmZjLT5iYXNlLnNtYywgQVRNRUxfSFNNQ19ORkNfSURSLCAweGZmZmZmZmZmKTsKPiArCX0KPiAr Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhdG1lbF9uZmNfZG1hX3Ry YW5zZmVyX2ZpbmlzaGVkKHZvaWQgKmRhdGEpCj4gK3sKPiArCXN0cnVjdCBjb21wbGV0aW9uICpm aW5pc2hlZCA9IGRhdGE7Cj4gKwo+ICsJY29tcGxldGUoZmluaXNoZWQpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGF0bWVsX25mY19kbWFfdHJhbnNmZXIoc3RydWN0IGF0bWVsX25mYyAqbmZjLCB2 b2lkICpidWYsCj4gKwkJCQkgIGRtYV9hZGRyX3QgZGV2X2RtYSwgc2l6ZV90IGxlbiwKPiArCQkJ CSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQo+ICt7Cj4gKwlERUNMQVJFX0NPTVBMRVRJ T05fT05TVEFDSyhmaW5pc2hlZCk7Cj4gKwlkbWFfYWRkcl90IHNyY19kbWEsIGRzdF9kbWEsIGJ1 Zl9kbWE7Cj4gKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4Owo+ICsJZG1hX2Nv b2tpZV90IGNvb2tpZTsKPiArCj4gKwlidWZfZG1hID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYs IGJ1ZiwgbGVuLCBkaXIpOwo+ICsJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKG5mYy0+ZGV2LCBkZXZf ZG1hKSkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCSJGYWlsZWQgdG8gcHJlcGFyZSBh IGJ1ZmZlciBmb3IgRE1BIGFjY2Vzc1xuIik7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJ aWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKPiArCQlzcmNfZG1hID0gZGV2X2RtYTsKPiAr CQlkc3RfZG1hID0gYnVmX2RtYTsKPiArCX0gZWxzZSB7Cj4gKwkJc3JjX2RtYSA9IGJ1Zl9kbWE7 Cj4gKwkJZHN0X2RtYSA9IGRldl9kbWE7Cj4gKwl9Cj4gKwo+ICsJdHggPSBkbWFlbmdpbmVfcHJl cF9kbWFfbWVtY3B5KG5mYy0+ZG1hYywgZHN0X2RtYSwgc3JjX2RtYSwgbGVuLAo+ICsJCQkJICAg ICAgIERNQV9DVFJMX0FDSyB8IERNQV9QUkVQX0lOVEVSUlVQVCk7Cj4gKwlpZiAoIXR4KSB7Cj4g KwkJZGV2X2VycihuZmMtPmRldiwgIkZhaWxlZCB0byBwcmVwYXJlIERNQSBtZW1jcHlcbiIpOwo+ ICsJCWdvdG8gZXJyX3VubWFwOwo+ICsJfQo+ICsKPiArCXR4LT5jYWxsYmFjayA9IGF0bWVsX25m Y19kbWFfdHJhbnNmZXJfZmluaXNoZWQ7Cj4gKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAmZmluaXNo ZWQ7Cj4gKwo+ICsJY29va2llID0gZG1hZW5naW5lX3N1Ym1pdCh0eCk7Cj4gKwlpZiAoZG1hX3N1 Ym1pdF9lcnJvcihjb29raWUpKSB7Cj4gKwkJZGV2X2VycihuZmMtPmRldiwgIkZhaWxlZCB0byBk byBETUEgdHhfc3VibWl0XG4iKTsKPiArCQlnb3RvIGVycl91bm1hcDsKPiArCX0KPiArCj4gKwlk bWFfYXN5bmNfaXNzdWVfcGVuZGluZyhuZmMtPmRtYWMpOwo+ICsJd2FpdF9mb3JfY29tcGxldGlv bigmZmluaXNoZWQpOwo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX3VubWFwOgo+ICsJZG1h X3VubWFwX3NpbmdsZShuZmMtPmRldiwgYnVmX2RtYSwgbGVuLCBkaXIpOwo+ICsKPiArZXJyOgo+ ICsJZGV2X2RiZyhuZmMtPmRldiwgIkZhbGwgYmFjayB0byBDUFUgSS9PXG4iKTsKPiArCj4gKwly ZXR1cm4gLUVJTzsKPiArfQo+ICsKPiArc3RhdGljIHU4IGF0bWVsX25hbmRfcmVhZF9ieXRlKHN0 cnVjdCBtdGRfaW5mbyAqbXRkKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRk X3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBhdG1lbF9uYW5kICpuYW5kID0gdG9fYXRtZWxfbmFu ZChjaGlwKTsKPiArCj4gKwlyZXR1cm4gaW9yZWFkOChuYW5kLT5hY3RpdmVjcy0+aW8udmlydCk7 Cj4gK30KPiArCj4gK3N0YXRpYyB1MTYgYXRtZWxfbmFuZF9yZWFkX3dvcmQoc3RydWN0IG10ZF9p bmZvICptdGQpCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZCht dGQpOwo+ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ ICsKPiArCXJldHVybiBpb3JlYWQxNihuYW5kLT5hY3RpdmVjcy0+aW8udmlydCk7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGF0bWVsX25hbmRfd3JpdGVfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10 ZCwgdTggYnl0ZSkKPiArewo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5k KG10ZCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCA9IHRvX2F0bWVsX25hbmQoY2hpcCk7 Cj4gKwo+ICsJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQo+ICsJCWlvd3Jp dGUxNihieXRlIHwgKGJ5dGUgPDwgOCksIG5hbmQtPmFjdGl2ZWNzLT5pby52aXJ0KTsKPiArCWVs c2UKPiArCQlpb3dyaXRlOChieXRlLCBuYW5kLT5hY3RpdmVjcy0+aW8udmlydCk7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGF0bWVsX25hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQs IHU4ICpidWYsIGludCBsZW4pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRf dG9fbmFuZChtdGQpOwo+ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5k KGNoaXApOwo+ICsJc3RydWN0IGF0bWVsX25mYyAqbmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xs ZXIpOwo+ICsKPiArCS8qCj4gKwkgKiBJZiB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBETUEsIHRo ZSBidWZmZXIgYWRkcmVzcyBpcyBETUEtYWJsZSBhbmQKPiArCSAqIGxlbiBpcyBsb25nIGVub3Vn aCB0byBtYWtlIERNQSB0cmFuc2ZlcnMgcHJvZml0YWJsZSwgbGV0J3MgdHJpZ2dlcgo+ICsJICog YSBETUEgdHJhbnNmZXIuIElmIGl0IGZhaWxzLCBmYWxsYmFjayB0byBQSU8gbW9kZS4KPiArCSAq Lwo+ICsJaWYgKG5mYy0+ZG1hYyAmJiB2aXJ0X2FkZHJfdmFsaWQoYnVmKSAmJgo+ICsJICAgIGxl biA+PSBBVE1FTF9ORkNfTUlOX0RNQV9MRU4gJiYKPiArCSAgICAhYXRtZWxfbmZjX2RtYV90cmFu c2ZlcihuZmMsIGJ1ZiwgbmFuZC0+YWN0aXZlY3MtPmlvLmRtYSwgbGVuLAo+ICsJCQkJICAgIERN QV9GUk9NX0RFVklDRSkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWlmIChjaGlwLT5vcHRpb25zICYg TkFORF9CVVNXSURUSF8xNikKPiArCQlpb3JlYWQxNl9yZXAobmFuZC0+YWN0aXZlY3MtPmlvLnZp cnQsIGJ1ZiwgbGVuIC8gMik7Cj4gKwllbHNlCj4gKwkJaW9yZWFkOF9yZXAobmFuZC0+YWN0aXZl Y3MtPmlvLnZpcnQsIGJ1ZiwgbGVuKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXRtZWxfbmFu ZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHU4ICpidWYsIGludCBsZW4p Cj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJ c3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ICsJc3RydWN0 IGF0bWVsX25mYyAqbmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsKPiArCS8qCj4g KwkgKiBJZiB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBETUEsIHRoZSBidWZmZXIgYWRkcmVzcyBp cyBETUEtYWJsZSBhbmQKPiArCSAqIGxlbiBpcyBsb25nIGVub3VnaCB0byBtYWtlIERNQSB0cmFu c2ZlcnMgcHJvZml0YWJsZSwgbGV0J3MgdHJpZ2dlcgo+ICsJICogYSBETUEgdHJhbnNmZXIuIElm IGl0IGZhaWxzLCBmYWxsYmFjayB0byBQSU8gbW9kZS4KPiArCSAqLwo+ICsJaWYgKG5mYy0+ZG1h YyAmJiB2aXJ0X2FkZHJfdmFsaWQoYnVmKSAmJgo+ICsJICAgIGxlbiA+PSBBVE1FTF9ORkNfTUlO X0RNQV9MRU4gJiYKPiArCSAgICAhYXRtZWxfbmZjX2RtYV90cmFuc2ZlcihuZmMsICh2b2lkICop YnVmLCBuYW5kLT5hY3RpdmVjcy0+aW8uZG1hLAo+ICsJCQkJICAgIGxlbiwgRE1BX1RPX0RFVklD RSkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURU SF8xNikKPiArCQlpb3dyaXRlMTZfcmVwKG5hbmQtPmFjdGl2ZWNzLT5pby52aXJ0LCBidWYsIGxl biAvIDIpOwo+ICsJZWxzZQo+ICsJCWlvd3JpdGU4X3JlcChuYW5kLT5hY3RpdmVjcy0+aW8udmly dCwgYnVmLCBsZW4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25hbmRfZGV2X3JlYWR5 KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0g bXRkX3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBhdG1lbF9uYW5kICpuYW5kID0gdG9fYXRtZWxf bmFuZChjaGlwKTsKPiArCj4gKwlyZXR1cm4gZ3Bpb2RfZ2V0X3ZhbHVlKG5hbmQtPmFjdGl2ZWNz LT5yYi5ncGlvKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXRtZWxfbmFuZF9zZWxlY3RfY2hp cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBhdG1lbF9uYW5kICpuYW5kID0g dG9fYXRtZWxfbmFuZChjaGlwKTsKPiArCj4gKwlpZiAoY3MgPCAwIHx8IGNzID49IG5hbmQtPm51 bWNzKSB7Cj4gKwkJbmFuZC0+YWN0aXZlY3MgPSBOVUxMOwo+ICsJCWNoaXAtPmRldl9yZWFkeSA9 IE5VTEw7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCW5hbmQtPmFjdGl2ZWNzID0gJm5hbmQt PmNzW2NzXTsKPiArCj4gKwlpZiAobmFuZC0+YWN0aXZlY3MtPnJiLnR5cGUgPT0gQVRNRUxfTkFO RF9HUElPX1JCKQo+ICsJCWNoaXAtPmRldl9yZWFkeSA9IGF0bWVsX25hbmRfZGV2X3JlYWR5Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY19kZXZfcmVhZHkoc3RydWN0IG10 ZF9pbmZvICptdGQpCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFu ZChtdGQpOwo+ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXAp Owo+ICsJc3RydWN0IGF0bWVsX3NhbWE1X25mYyAqbmZjID0gdG9fc2FtYTVfbmZjKGNoaXAtPmNv bnRyb2xsZXIpOwo+ICsJdTMyIHN0YXR1czsKPiArCj4gKwlyZWdtYXBfcmVhZChuZmMtPmJhc2Uu c21jLCBBVE1FTF9IU01DX05GQ19TUiwgJnN0YXR1cyk7Cj4gKwo+ICsJcmV0dXJuIHN0YXR1cyAm IEFUTUVMX0hTTUNfTkZDX1NSX1JCRURHRShuYW5kLT5hY3RpdmVjcy0+cmIuaWQpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBhdG1lbF9zYW1hNV9uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9p bmZvICptdGQsIGludCBjcykKPiArewo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90 b19uYW5kKG10ZCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCA9IHRvX2F0bWVsX25hbmQo Y2hpcCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjICpuZmMgPSB0b19zYW1hNV9uZmMoY2hp cC0+Y29udHJvbGxlcik7Cj4gKwo+ICsJYXRtZWxfbmFuZF9zZWxlY3RfY2hpcChtdGQsIGNzKTsK PiArCj4gKwlpZiAoIW5hbmQtPmFjdGl2ZWNzKSB7Cj4gKwkJcmVnbWFwX3dyaXRlKG5mYy0+YmFz ZS5zbWMsIEFUTUVMX0hTTUNfTkZDX0NUUkwsCj4gKwkJCSAgICAgQVRNRUxfSFNNQ19ORkNfQ1RS TF9ESVMpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlpZiAobmFuZC0+YWN0aXZlY3MtPnJi LnR5cGUgPT0gQVRNRUxfTkFORF9OQVRJVkVfUkIpCj4gKwkJY2hpcC0+ZGV2X3JlYWR5ID0gYXRt ZWxfc2FtYTVfbmZjX2Rldl9yZWFkeTsKPiArCj4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobmZjLT5i YXNlLnNtYywgQVRNRUxfSFNNQ19ORkNfQ0ZHLAo+ICsJCQkgICBBVE1FTF9IU01DX05GQ19DRkdf UEFHRVNJWkVfTUFTSywKPiArCQkJICAgQVRNRUxfSFNNQ19ORkNfQ0ZHX1BBR0VTSVpFKG10ZC0+ d3JpdGVzaXplKSk7Cj4gKwlyZWdtYXBfd3JpdGUobmZjLT5iYXNlLnNtYywgQVRNRUxfSFNNQ19O RkNfQ1RSTCwKPiArCQkgICAgIEFUTUVMX0hTTUNfTkZDX0NUUkxfRU4pOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY19leGVjX29wKHN0cnVjdCBhdG1lbF9zYW1hNV9uZmMg Km5mYykKPiArewo+ICsJdTMyIGFkZHIsIHZhbCwgd2FpdCA9IEFUTUVMX0hTTUNfTkZDX1NSX0NN RERPTkU7Cj4gKwl1OCAqYWRkcnMgPSBuZmMtPm9wLmFkZHJzOwo+ICsJdW5zaWduZWQgaW50IG9w ID0gMDsKPiArCWludCBpLCByZXQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IG5mYy0+b3AubmNt ZHM7IGkrKykKPiArCQlvcCB8PSBBVE1FTF9ORkNfQ01EKGksIG5mYy0+b3AuY21kc1tpXSk7Cj4g Kwo+ICsJaWYgKG5mYy0+b3AubmFkZHJzID09IDUpCgpVc2UgYSAjZGVmaW5lIGZvciB0aGlzIHZh bHVlLgoKPiArCQlyZWdtYXBfd3JpdGUobmZjLT5iYXNlLnNtYywgQVRNRUxfSFNNQ19ORkNfQURE UiwgKmFkZHJzKyspOwo+ICsKPiArCW9wIHw9IEFUTUVMX05GQ19DU0lEKG5mYy0+b3AuY3MpIHwK PiArCSAgICAgIEFUTUVMX05GQ19BQ1lDTEUobmZjLT5vcC5uYWRkcnMpOwo+ICsKPiArCWlmIChu ZmMtPm9wLm5jbWRzID4gMSkKPiArCQlvcCB8PSBBVE1FTF9ORkNfVkNNRDI7Cj4gKwo+ICsJYWRk ciA9IGFkZHJzWzBdIHwgKGFkZHJzWzFdIDw8IDgpIHwgKGFkZHJzWzJdIDw8IDE2KSB8Cj4gKwkg ICAgICAgKGFkZHJzWzNdIDw8IDI0KTsKPiArCj4gKwlpZiAobmZjLT5vcC5kYXRhICE9IEFUTUVM X05GQ19OT19EQVRBKSB7Cj4gKwkJb3AgfD0gQVRNRUxfTkZDX0RBVEFFTjsKPiArCQl3YWl0IHw9 IEFUTUVMX0hTTUNfTkZDX1NSX1hGUkRPTkU7Cj4gKwo+ICsJCWlmIChuZmMtPm9wLmRhdGEgPT0g QVRNRUxfTkZDX1dSSVRFX0RBVEEpCj4gKwkJCW9wIHw9IEFUTUVMX05GQ19ORkNXUjsKPiArCX0K PiArCj4gKwkvKiBDbGVhciBhbGwgZmxhZ3MuICovCj4gKwlyZWdtYXBfcmVhZChuZmMtPmJhc2Uu c21jLCBBVE1FTF9IU01DX05GQ19TUiwgJnZhbCk7Cj4gKwo+ICsJLyogU2VuZCB0aGUgY29tbWFu ZC4gKi8KPiArCXJlZ21hcF93cml0ZShuZmMtPmlvLCBvcCwgYWRkcik7Cj4gKwo+ICsJcmV0ID0g YXRtZWxfc2FtYTVfbmZjX3dhaXQobmZjLCB3YWl0LCB0cnVlLCAwKTsKPiArCWlmIChyZXQpCj4g KwkJZGV2X2VycihuZmMtPmJhc2UuZGV2LAo+ICsJCQkiRmFpbGVkIHRvIHNlbmQgTkFORCBjb21t YW5kIChlcnIgPSAlZCkhIiwKPiArCQkJcmV0KTsKPiArCj4gKwkvKiBSZXNldCB0aGUgb3Agc3Rh dGUuICovCj4gKwltZW1zZXQoJm5mYy0+b3AsIDAsIHNpemVvZihuZmMtPm9wKSk7Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXRtZWxfc2FtYTVfbmZjX2NtZF9j dHJsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgZGF0LAo+ICsJCQkJICAgICB1bnNpZ25lZCBp bnQgY3RybCkKPiArewo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10 ZCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCA9IHRvX2F0bWVsX25hbmQoY2hpcCk7Cj4g KwlzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjICpuZmMgPSB0b19zYW1hNV9uZmMoY2hpcC0+Y29udHJv bGxlcik7Cj4gKwo+ICsJaWYgKGN0cmwgJiBOQU5EX0FMRSkgewo+ICsJCWlmIChuZmMtPm9wLm5h ZGRycyA+IDQpCgpIZXJlIGFsc28sIEkgZ3Vlc3MgaXQncyB0aGUgc2FtZSB0ZXN0IGFzICJpZiAo bmZjLT5vcC5uYWRkcnMgPT0gNSkiCmFib3ZlOiBzbyB0cnkgdG8gdXNlIHNhbWUgdGVzdCB0byBt YWtlIHVzIHVuZGVyc3RhbmQgdGhhdCBpdCdzIHRoZSBzYW1lCmNvbmRpdGlvbi4gV2l0aCB0aGUg I2RlZmluZWQgdmFsdWUgaXQgYWxzbyBzaG91bGQgaGVscC4uLgoKPiArCQkJcmV0dXJuOwo+ICsK PiArCQluZmMtPm9wLmFkZHJzW25mYy0+b3AubmFkZHJzKytdID0gZGF0Owo+ICsJfSBlbHNlIGlm IChjdHJsICYgTkFORF9DTEUpIHsKPiArCQlpZiAobmZjLT5vcC5uY21kcyA+IDEpCj4gKwkJCXJl dHVybjsKPiArCj4gKwkJbmZjLT5vcC5jbWRzW25mYy0+b3AubmNtZHMrK10gPSBkYXQ7Cj4gKwl9 Cj4gKwo+ICsJaWYgKGRhdCA9PSBOQU5EX0NNRF9OT05FKSB7Cj4gKwkJbmZjLT5vcC5jcyA9IG5h bmQtPmFjdGl2ZWNzLT5pZDsKPiArCQlhdG1lbF9zYW1hNV9uZmNfZXhlY19vcChuZmMpOwo+ICsJ fQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhdG1lbF9uYW5kX2NtZF9jdHJsKHN0cnVjdCBtdGRf aW5mbyAqbXRkLCBpbnQgY21kLAo+ICsJCQkJdW5zaWduZWQgaW50IGN0cmwpCj4gK3sKPiArCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0IGF0bWVs X25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ICsJc3RydWN0IGF0bWVsX25mYyAq bmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsKPiArCWlmIChjdHJsICYgTkFORF9D VFJMX0NIQU5HRSAmJiBuYW5kLT5hY3RpdmVjcy0+Y3NncGlvKSB7Cj4gKwkJaWYgKGN0cmwgJiBO QU5EX05DRSkKPiArCQkJZ3Bpb2Rfc2V0X3ZhbHVlKG5hbmQtPmFjdGl2ZWNzLT5jc2dwaW8sIDAp Owo+ICsJCWVsc2UKPiArCQkJZ3Bpb2Rfc2V0X3ZhbHVlKG5hbmQtPmFjdGl2ZWNzLT5jc2dwaW8s IDEpOwo+ICsJfQo+ICsKPiArCWlmIChjdHJsICYgTkFORF9BTEUpCj4gKwkJd3JpdGViKGNtZCwg bmFuZC0+YWN0aXZlY3MtPmlvLnZpcnQgKyBuZmMtPmNhcHMtPmFsZV9vZmZzKTsKPiArCWVsc2Ug aWYgKGN0cmwgJiBOQU5EX0NMRSkKPiArCQl3cml0ZWIoY21kLCBuYW5kLT5hY3RpdmVjcy0+aW8u dmlydCArIG5mYy0+Y2Fwcy0+Y2xlX29mZnMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhdG1l bF9zYW1hNV9uZmNfY29weV90b19zcmFtKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4 ICpidWYsCj4gKwkJCQkJIGJvb2wgb29iX3JlcXVpcmVkKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IGF0bWVsX3NhbWE1X25mYyAq bmZjID0gdG9fc2FtYTVfbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJaW50IHJldCA9IC1FSU87 Cj4gKwo+ICsJaWYgKG5mYy0+YmFzZS5kbWFjKQo+ICsJCXJldCA9IGF0bWVsX25mY19kbWFfdHJh bnNmZXIoJm5mYy0+YmFzZSwgKHZvaWQgKilidWYsCj4gKwkJCQkJICAgICBuZmMtPnNyYW0uZG1h LCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJCQkgICAgIERNQV9UT19ERVZJQ0UpOwo+ICsKPiArCS8q IEZhbGxpbmcgYmFjayB0byBDUFUgY29weS4gKi8KPiArCWlmIChyZXQpCj4gKwkJbWVtY3B5X3Rv aW8obmZjLT5zcmFtLnZpcnQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOwo+ICsKPiArCWlmIChvb2Jf cmVxdWlyZWQpCj4gKwkJbWVtY3B5X3RvaW8obmZjLT5zcmFtLnZpcnQgKyBtdGQtPndyaXRlc2l6 ZSwgY2hpcC0+b29iX3BvaSwKPiArCQkJICAgIG10ZC0+b29ic2l6ZSk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGF0bWVsX3NhbWE1X25mY19jb3B5X2Zyb21fc3JhbShzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwLCB1OCAqYnVmLAo+ICsJCQkJCSAgIGJvb2wgb29iX3JlcXVpcmVkKQo+ICt7Cj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IGF0bWVs X3NhbWE1X25mYyAqbmZjID0gdG9fc2FtYTVfbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJaW50 IHJldCA9IC1FSU87Cj4gKwo+ICsJaWYgKG5mYy0+YmFzZS5kbWFjKQo+ICsJCXJldCA9IGF0bWVs X25mY19kbWFfdHJhbnNmZXIoJm5mYy0+YmFzZSwgYnVmLCBuZmMtPnNyYW0uZG1hLAo+ICsJCQkJ CSAgICAgbXRkLT53cml0ZXNpemUsIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ICsJLyogRmFsbGlu ZyBiYWNrIHRvIENQVSBjb3B5LiAqLwo+ICsJaWYgKHJldCkKPiArCQltZW1jcHlfZnJvbWlvKGJ1 ZiwgbmZjLT5zcmFtLnZpcnQsIG10ZC0+d3JpdGVzaXplKTsKPiArCj4gKwlpZiAob29iX3JlcXVp cmVkKQo+ICsJCW1lbWNweV9mcm9taW8oY2hpcC0+b29iX3BvaSwgbmZjLT5zcmFtLnZpcnQgKyBt dGQtPndyaXRlc2l6ZSwKPiArCQkJICAgICAgbXRkLT5vb2JzaXplKTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgYXRtZWxfc2FtYTVfbmZjX3NldF9vcF9hZGRyKHN0cnVjdCBuYW5kX2NoaXAgKmNo aXAsIGludCBwYWdlLAo+ICsJCQkJCWludCBjb2x1bW4pCj4gK3sKPiArCXN0cnVjdCBtdGRfaW5m byAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjICpu ZmMgPSB0b19zYW1hNV9uZmMoY2hpcC0+Y29udHJvbGxlcik7Cj4gKwo+ICsJaWYgKGNvbHVtbiA+ PSAwKSB7Cj4gKwkJbmZjLT5vcC5hZGRyc1tuZmMtPm9wLm5hZGRycysrXSA9IGNvbHVtbjsKPiAr Cj4gKwkJLyoKPiArCQkgKiAyIGFkZHJlc3MgY3ljbGVzIGZvciB0aGUgY29sdW1uIG9mZnNldCBv biBsYXJnZSBwYWdlIE5BTkRzLgo+ICsJCSAqLwo+ICsJCWlmIChtdGQtPndyaXRlc2l6ZSA+IDUx MikKPiArCQkJbmZjLT5vcC5hZGRyc1tuZmMtPm9wLm5hZGRycysrXSA9IGNvbHVtbiA+PiA4Owo+ ICsJfQo+ICsKPiArCWlmIChwYWdlID49IDApIHsKPiArCQluZmMtPm9wLmFkZHJzW25mYy0+b3Au bmFkZHJzKytdID0gcGFnZTsKPiArCQluZmMtPm9wLmFkZHJzW25mYy0+b3AubmFkZHJzKytdID0g cGFnZSA+PiA4Owo+ICsKPiArCQlpZiAoKG10ZC0+d3JpdGVzaXplID4gNTEyICYmIGNoaXAtPmNo aXBzaXplID4gU1pfMTI4TSkgfHwKPiArCQkgICAgKG10ZC0+d3JpdGVzaXplIDw9IDUxMiAmJiBj aGlwLT5jaGlwc2l6ZSA+IFNaXzMyTSkpCj4gKwkJCW5mYy0+b3AuYWRkcnNbbmZjLT5vcC5uYWRk cnMrK10gPSBwYWdlID4+IDE2Owo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25m Y19wbWVjY19lbmFibGUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IG9wLCBib29sIHJhdykK PiArewo+ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ ICsJc3RydWN0IGF0bWVsX25mYyAqbmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJ aW50IHJldDsKPiArCj4gKwlpZiAocmF3KQo+ICsJCXJldHVybiAwOwo+ICsKPiArCXJldCA9IGF0 bWVsX3BtZWNjX2VuYWJsZShuYW5kLT5wbWVjYywgb3ApOwo+ICsJaWYgKHJldCkKPiArCQlkZXZf ZXJyKG5mYy0+ZGV2LAo+ICsJCQkiRmFpbGVkIHRvIGVuYWJsZSBFQ0MgZW5naW5lIChlcnIgPSAl ZClcbiIsIHJldCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg YXRtZWxfbmZjX3BtZWNjX2Rpc2FibGUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgYm9vbCByYXcp Cj4gK3sKPiArCXN0cnVjdCBhdG1lbF9uYW5kICpuYW5kID0gdG9fYXRtZWxfbmFuZChjaGlwKTsK PiArCj4gKwlpZiAoIXJhdykKPiArCQlhdG1lbF9wbWVjY19kaXNhYmxlKG5hbmQtPnBtZWNjKTsK PiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9uZmNfcG1lY2NfZ2VuZXJhdGVfZWNjYnl0ZXMo c3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgYm9vbCByYXcpCj4gK3sKPiArCXN0cnVjdCBhdG1lbF9u YW5kICpuYW5kID0gdG9fYXRtZWxfbmFuZChjaGlwKTsKPiArCXN0cnVjdCBtdGRfaW5mbyAqbXRk ID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmZjICpuZmMgPSB0b19uZmMo Y2hpcC0+Y29udHJvbGxlcik7Cj4gKwlzdHJ1Y3QgbXRkX29vYl9yZWdpb24gb29icmVnaW9uOwo+ ICsJdm9pZCAqZWNjYnVmOwo+ICsJaW50IHJldCwgaTsKPiArCj4gKwlpZiAocmF3KQo+ICsJCXJl dHVybiAwOwo+ICsKPiArCXJldCA9IGF0bWVsX3BtZWNjX3dhaXRfcmR5KG5hbmQtPnBtZWNjKTsK PiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkiRmFpbGVkIHRvIHRy YW5zZmVyIE5BTkQgcGFnZSBkYXRhIChlcnIgPSAlZClcbiIsCj4gKwkJCXJldCk7Cj4gKwkJcmV0 dXJuIHJldDsKPiArCX0KPiArCj4gKwltdGRfb29ibGF5b3V0X2VjYyhtdGQsIDAsICZvb2JyZWdp b24pOwo+ICsJZWNjYnVmID0gY2hpcC0+b29iX3BvaSArIG9vYnJlZ2lvbi5vZmZzZXQ7Cj4gKwo+ ICsJZm9yIChpID0gMDsgaSA8IGNoaXAtPmVjYy5zdGVwczsgaSsrKSB7Cj4gKwkJYXRtZWxfcG1l Y2NfZ2V0X2dlbmVyYXRlZF9lY2NieXRlcyhuYW5kLT5wbWVjYywgaSwKPiArCQkJCQkJICAgZWNj YnVmKTsKPiArCQllY2NidWYgKz0gY2hpcC0+ZWNjLmJ5dGVzOwo+ICsJfQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19wbWVjY19jb3JyZWN0X2RhdGEo c3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdm9pZCAqYnVmLAo+ICsJCQkJCWJvb2wgcmF3KQo+ICt7 Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCA9IHRvX2F0bWVsX25hbmQoY2hpcCk7Cj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IGF0bWVs X25mYyAqbmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJc3RydWN0IG10ZF9vb2Jf cmVnaW9uIG9vYnJlZ2lvbjsKPiArCWludCByZXQsIGksIG1heF9iaXRmbGlwcyA9IDA7Cj4gKwl2 b2lkICpkYXRhYnVmLCAqZWNjYnVmOwo+ICsKPiArCWlmIChyYXcpCj4gKwkJcmV0dXJuIDA7Cj4g Kwo+ICsJcmV0ID0gYXRtZWxfcG1lY2Nfd2FpdF9yZHkobmFuZC0+cG1lY2MpOwo+ICsJaWYgKHJl dCkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCSJGYWlsZWQgdG8gcmVhZCBOQU5EIHBh Z2UgZGF0YSAoZXJyID0gJWQpXG4iLAo+ICsJCQlyZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9 Cj4gKwo+ICsJbXRkX29vYmxheW91dF9lY2MobXRkLCAwLCAmb29icmVnaW9uKTsKPiArCWVjY2J1 ZiA9IGNoaXAtPm9vYl9wb2kgKyBvb2JyZWdpb24ub2Zmc2V0Owo+ICsJZGF0YWJ1ZiA9IGJ1ZjsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+ZWNjLnN0ZXBzOyBpKyspIHsKPiArCQlyZXQg PSBhdG1lbF9wbWVjY19jb3JyZWN0X3NlY3RvcihuYW5kLT5wbWVjYywgaSwgZGF0YWJ1ZiwKPiAr CQkJCQkJIGVjY2J1Zik7Cj4gKwkJaWYgKHJldCA8IDAgJiYgIWF0bWVsX3BtZWNjX2NvcnJlY3Rf ZXJhc2VkX2NodW5rcyhuYW5kLT5wbWVjYykpCj4gKwkJCXJldCA9IG5hbmRfY2hlY2tfZXJhc2Vk X2VjY19jaHVuayhkYXRhYnVmLAo+ICsJCQkJCQkJICBjaGlwLT5lY2Muc2l6ZSwKPiArCQkJCQkJ CSAgZWNjYnVmLAo+ICsJCQkJCQkJICBjaGlwLT5lY2MuYnl0ZXMsCj4gKwkJCQkJCQkgIE5VTEws IDAsCj4gKwkJCQkJCQkgIGNoaXAtPmVjYy5zdHJlbmd0aCk7Cj4gKwo+ICsJCWlmIChyZXQgPj0g MCkKPiArCQkJbWF4X2JpdGZsaXBzID0gbWF4KHJldCwgbWF4X2JpdGZsaXBzKTsKPiArCQllbHNl Cj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOwo+ICsKPiArCQlkYXRhYnVmICs9IGNoaXAt PmVjYy5zaXplOwo+ICsJCWVjY2J1ZiArPSBjaGlwLT5lY2MuYnl0ZXM7Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIG1heF9iaXRmbGlwczsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9uZmNfcG1l Y2Nfd3JpdGVfcGcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiArCQkJ CSAgICBib29sIG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UsIGJvb2wgcmF3KQo+ICt7Cj4gKwlzdHJ1 Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IGF0bWVsX25h bmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQg PSBhdG1lbF9uZmNfcG1lY2NfZW5hYmxlKGNoaXAsIE5BTkRfRUNDX1dSSVRFLCByYXcpOwo+ICsJ aWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWF0bWVsX25hbmRfd3JpdGVfYnVmKG10 ZCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gKwo+ICsJcmV0ID0gYXRtZWxfbmZjX3BtZWNjX2dl bmVyYXRlX2VjY2J5dGVzKGNoaXAsIHJhdyk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJYXRtZWxfcG1l Y2NfZGlzYWJsZShuYW5kLT5wbWVjYyk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlh dG1lbF9uZmNfcG1lY2NfZGlzYWJsZShjaGlwLCByYXcpOwo+ICsKPiArCWF0bWVsX25hbmRfd3Jp dGVfYnVmKG10ZCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9uZmNfcG1lY2Nfd3JpdGVfcGFnZShzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwKPiArCQkJCSAgICAgIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNv bnN0IHU4ICpidWYsCj4gKwkJCQkgICAgICBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKPiAr ewo+ICsJcmV0dXJuIGF0bWVsX25mY19wbWVjY193cml0ZV9wZyhjaGlwLCBidWYsIG9vYl9yZXF1 aXJlZCwgcGFnZSwgZmFsc2UpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19wbWVj Y193cml0ZV9wYWdlX3JhdyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKPiArCQkJCQkgIHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4gKwkJCQkJICBjb25zdCB1OCAqYnVmLCBpbnQgb29iX3JlcXVpcmVk LAo+ICsJCQkJCSAgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVybiBhdG1lbF9uZmNfcG1lY2Nfd3Jp dGVfcGcoY2hpcCwgYnVmLCBvb2JfcmVxdWlyZWQsIHBhZ2UsIHRydWUpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGF0bWVsX25mY19wbWVjY19yZWFkX3BnKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAs IHU4ICpidWYsCj4gKwkJCQkgICBib29sIG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UsIGJvb2wgcmF3 KQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJ aW50IHJldDsKPiArCj4gKwlyZXQgPSBhdG1lbF9uZmNfcG1lY2NfZW5hYmxlKGNoaXAsIE5BTkRf RUNDX1JFQUQsIHJhdyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJYXRt ZWxfbmFuZF9yZWFkX2J1ZihtdGQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOwo+ICsJYXRtZWxfbmFu ZF9yZWFkX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7Cj4gKwo+ICsJcmV0 ID0gYXRtZWxfbmZjX3BtZWNjX2NvcnJlY3RfZGF0YShjaGlwLCBidWYsIHJhdyk7Cj4gKwo+ICsJ YXRtZWxfbmZjX3BtZWNjX2Rpc2FibGUoY2hpcCwgcmF3KTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19wbWVjY19yZWFkX3BhZ2Uoc3RydWN0IG10 ZF9pbmZvICptdGQsCj4gKwkJCQkgICAgIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHU4ICpidWYs Cj4gKwkJCQkgICAgIGludCBvb2JfcmVxdWlyZWQsIGludCBwYWdlKQo+ICt7Cj4gKwlyZXR1cm4g YXRtZWxfbmZjX3BtZWNjX3JlYWRfcGcoY2hpcCwgYnVmLCBvb2JfcmVxdWlyZWQsIHBhZ2UsIGZh bHNlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9uZmNfcG1lY2NfcmVhZF9wYWdlX3Jh dyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKPiArCQkJCQkgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwg dTggKmJ1ZiwKPiArCQkJCQkgaW50IG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UpCj4gK3sKPiArCXJl dHVybiBhdG1lbF9uZmNfcG1lY2NfcmVhZF9wZyhjaGlwLCBidWYsIG9vYl9yZXF1aXJlZCwgcGFn ZSwgdHJ1ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfc2FtYTVfbmZjX3BtZWNjX3dy aXRlX3BnKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCQkJICBjb25zdCB1OCAqYnVmLCBi b29sIG9vYl9yZXF1aXJlZCwKPiArCQkJCQkgIGludCBwYWdlLCBib29sIHJhdykKPiArewo+ICsJ c3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiArCXN0cnVjdCBhdG1l bF9uYW5kICpuYW5kID0gdG9fYXRtZWxfbmFuZChjaGlwKTsKPiArCXN0cnVjdCBhdG1lbF9zYW1h NV9uZmMgKm5mYyA9IHRvX3NhbWE1X25mYyhjaGlwLT5jb250cm9sbGVyKTsKPiArCWludCByZXQ7 Cj4gKwo+ICsJYXRtZWxfc2FtYTVfbmZjX2NvcHlfdG9fc3JhbShjaGlwLCBidWYsIGZhbHNlKTsK PiArCj4gKwluZmMtPm9wLmNtZHNbMF0gPSBOQU5EX0NNRF9TRVFJTjsKPiArCW5mYy0+b3AubmNt ZHMgPSAxOwo+ICsJYXRtZWxfc2FtYTVfbmZjX3NldF9vcF9hZGRyKGNoaXAsIHBhZ2UsIDB4MCk7 Cj4gKwluZmMtPm9wLmNzID0gbmFuZC0+YWN0aXZlY3MtPmlkOwo+ICsJbmZjLT5vcC5kYXRhID0g QVRNRUxfTkZDX1dSSVRFX0RBVEE7Cj4gKwo+ICsJcmV0ID0gYXRtZWxfbmZjX3BtZWNjX2VuYWJs ZShjaGlwLCBOQU5EX0VDQ19XUklURSwgcmF3KTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJl dDsKPiArCj4gKwlyZXQgPSBhdG1lbF9zYW1hNV9uZmNfZXhlY19vcChuZmMpOwo+ICsJaWYgKHJl dCkgewo+ICsJCWF0bWVsX25mY19wbWVjY19kaXNhYmxlKGNoaXAsIHJhdyk7Cj4gKwkJZGV2X2Vy cihuZmMtPmJhc2UuZGV2LAo+ICsJCQkiRmFpbGVkIHRvIHRyYW5zZmVyIE5BTkQgcGFnZSBkYXRh IChlcnIgPSAlZClcbiIsCj4gKwkJCXJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwlyZXQgPSBhdG1lbF9uZmNfcG1lY2NfZ2VuZXJhdGVfZWNjYnl0ZXMoY2hpcCwgcmF3KTsKPiAr Cj4gKwlhdG1lbF9uZmNfcG1lY2NfZGlzYWJsZShjaGlwLCByYXcpOwo+ICsKPiArCWlmIChyZXQp Cj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlhdG1lbF9uYW5kX3dyaXRlX2J1ZihtdGQsIGNoaXAt Pm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7Cj4gKwo+ICsJbmZjLT5vcC5jbWRzWzBdID0gTkFORF9D TURfUEFHRVBST0c7Cj4gKwluZmMtPm9wLm5jbWRzID0gMTsKPiArCW5mYy0+b3AuY3MgPSBuYW5k LT5hY3RpdmVjcy0+aWQ7Cj4gKwlyZXQgPSBhdG1lbF9zYW1hNV9uZmNfZXhlY19vcChuZmMpOwo+ ICsJaWYgKHJldCkKPiArCQlkZXZfZXJyKG5mYy0+YmFzZS5kZXYsICJGYWlsZWQgdG8gcHJvZ3Jh bSBOQU5EIHBhZ2UgKGVyciA9ICVkKVxuIiwKPiArCQkJcmV0KTsKPiArCj4gKwlyZXR1cm4gcmV0 Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY19wbWVjY193cml0ZV9wYWdl KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+ICsJCQkJCSAgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LAo+ICsJCQkJCSAgICBjb25zdCB1OCAqYnVmLCBpbnQgb29iX3JlcXVpcmVkLAo+ICsJCQkJCSAg ICBpbnQgcGFnZSkKPiArewo+ICsJcmV0dXJuIGF0bWVsX3NhbWE1X25mY19wbWVjY193cml0ZV9w ZyhjaGlwLCBidWYsIG9vYl9yZXF1aXJlZCwgcGFnZSwKPiArCQkJCQkgICAgICBmYWxzZSk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfc2FtYTVfbmZjX3BtZWNjX3dyaXRlX3BhZ2VfcmF3 KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+ICsJCQkJCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ ICsJCQkJCQljb25zdCB1OCAqYnVmLAo+ICsJCQkJCQlpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFn ZSkKPiArewo+ICsJcmV0dXJuIGF0bWVsX3NhbWE1X25mY19wbWVjY193cml0ZV9wZyhjaGlwLCBi dWYsIG9vYl9yZXF1aXJlZCwgcGFnZSwKPiArCQkJCQkgICAgICB0cnVlKTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBhdG1lbF9zYW1hNV9uZmNfcG1lY2NfcmVhZF9wZyhzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwLCB1OCAqYnVmLAo+ICsJCQkJCSBib29sIG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UsIGJv b2wgcmF3KQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXAp Owo+ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ICsJ c3RydWN0IGF0bWVsX3NhbWE1X25mYyAqbmZjID0gdG9fc2FtYTVfbmZjKGNoaXAtPmNvbnRyb2xs ZXIpOwo+ICsJaW50IHJldDsKPiArCj4gKwkvKgo+ICsJICogT3B0aW1pemVkIHJlYWQgcGFnZSBh Y2Nlc3NvcnMgb25seSB3b3JrIHdoZW4gdGhlIE5BTkQgUi9CIHBpbiBpcwo+ICsJICogY29ubmVj dGVkIHRvIGEgbmF0aXZlIFNvQyBSL0IgcGluLiBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBmYWxs YmFjawo+ICsJICogdG8gdGhlIG5vbi1vcHRpbWl6ZWQgb25lLgo+ICsJICovCj4gKwlpZiAobmFu ZC0+YWN0aXZlY3MtPnJiLnR5cGUgIT0gQVRNRUxfTkFORF9OQVRJVkVfUkIpIHsKCkNhbid0IHdl IG9wdGltaXplIHRoaXMgcGF0aCBieSBub3QgaGF2aW5nIHRvIHRlc3QgdGhpcyBmb3IgZWFjaCBw YWdlIHJlYWQ/Cgo+ICsJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgMHgwMCwg cGFnZSk7Cj4gKwo+ICsJCXJldHVybiBhdG1lbF9uZmNfcG1lY2NfcmVhZF9wZyhjaGlwLCBidWYs IG9vYl9yZXF1aXJlZCwgcGFnZSwKPiArCQkJCQkgICAgICAgcmF3KTsKPiArCX0KPiArCj4gKwlu ZmMtPm9wLmNtZHNbbmZjLT5vcC5uY21kcysrXSA9IE5BTkRfQ01EX1JFQUQwOwo+ICsKPiArCWlm IChtdGQtPndyaXRlc2l6ZSA+IDUxMikKPiArCQluZmMtPm9wLmNtZHNbbmZjLT5vcC5uY21kcysr XSA9IE5BTkRfQ01EX1JFQURTVEFSVDsKPiArCj4gKwlhdG1lbF9zYW1hNV9uZmNfc2V0X29wX2Fk ZHIoY2hpcCwgcGFnZSwgMHgwKTsKPiArCW5mYy0+b3AuY3MgPSBuYW5kLT5hY3RpdmVjcy0+aWQ7 Cj4gKwluZmMtPm9wLmRhdGEgPSBBVE1FTF9ORkNfUkVBRF9EQVRBOwo+ICsKPiArCXJldCA9IGF0 bWVsX25mY19wbWVjY19lbmFibGUoY2hpcCwgTkFORF9FQ0NfUkVBRCwgcmF3KTsKPiArCWlmIChy ZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSBhdG1lbF9zYW1hNV9uZmNfZXhlY19v cChuZmMpOwo+ICsJaWYgKHJldCkgewo+ICsJCWF0bWVsX25mY19wbWVjY19kaXNhYmxlKGNoaXAs IHJhdyk7Cj4gKwkJZGV2X2VycihuZmMtPmJhc2UuZGV2LAo+ICsJCQkiRmFpbGVkIHRvIGxvYWQg TkFORCBwYWdlIGRhdGEgKGVyciA9ICVkKVxuIiwKPiArCQkJcmV0KTsKPiArCQlyZXR1cm4gcmV0 Owo+ICsJfQo+ICsKPiArCWF0bWVsX3NhbWE1X25mY19jb3B5X2Zyb21fc3JhbShjaGlwLCBidWYs IGZhbHNlKTsKPiArCWF0bWVsX25hbmRfcmVhZF9idWYobXRkLCBjaGlwLT5vb2JfcG9pLCBtdGQt Pm9vYnNpemUpOwo+ICsKPiArCXJldCA9IGF0bWVsX25mY19wbWVjY19jb3JyZWN0X2RhdGEoY2hp cCwgYnVmLCByYXcpOwo+ICsKPiArCWF0bWVsX25mY19wbWVjY19kaXNhYmxlKGNoaXAsIHJhdyk7 Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9zYW1hNV9u ZmNfcG1lY2NfcmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+ICsJCQkJCSAgIHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIHU4ICpidWYsCj4gKwkJCQkJICAgaW50IG9vYl9yZXF1aXJlZCwg aW50IHBhZ2UpCj4gK3sKPiArCXJldHVybiBhdG1lbF9zYW1hNV9uZmNfcG1lY2NfcmVhZF9wZyhj aGlwLCBidWYsIG9vYl9yZXF1aXJlZCwgcGFnZSwKPiArCQkJCQkgICAgIGZhbHNlKTsKPiArfQo+ ICsKPiArc3RhdGljIGludCBhdG1lbF9zYW1hNV9uZmNfcG1lY2NfcmVhZF9wYWdlX3JhdyhzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwKPiArCQkJCQkgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwg dTggKmJ1ZiwKPiArCQkJCQkgICAgICAgaW50IG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UpCj4gK3sK PiArCXJldHVybiBhdG1lbF9zYW1hNV9uZmNfcG1lY2NfcmVhZF9wZyhjaGlwLCBidWYsIG9vYl9y ZXF1aXJlZCwgcGFnZSwKPiArCQkJCQkgICAgIHRydWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGF0bWVsX25hbmRfcG1lY2NfaW5pdChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IGF0bWVs X25hbmQgKm5hbmQgPSB0b19hdG1lbF9uYW5kKGNoaXApOwo+ICsJc3RydWN0IGF0bWVsX25mYyAq bmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJc3RydWN0IGF0bWVsX3BtZWNjX3Vz ZXJfcmVxIHJlcTsKPiArCj4gKwlpZiAoIW5mYy0+cG1lY2MpIHsKPiArCQlkZXZfZXJyKG5mYy0+ ZGV2LCAiSFcgRUNDIG5vdCBzdXBwb3J0ZWRcbiIpOwo+ICsJCXJldHVybiAtRU5PVFNVUFA7Cj4g Kwl9Cj4gKwo+ICsJaWYgKG5mYy0+Y2Fwcy0+bGVnYWN5X29mX2JpbmRpbmdzKSB7Cj4gKwkJdTMy IHZhbDsKPiArCj4gKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihuZmMtPmRldi0+b2Zfbm9k ZSwgImF0bWVsLHBtZWNjLWNhcCIsCj4gKwkJCQkJICAmdmFsKSkKPiArCQkJY2hpcC0+ZWNjLnN0 cmVuZ3RoID0gdmFsOwo+ICsKPiArCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5mYy0+ZGV2 LT5vZl9ub2RlLAo+ICsJCQkJCSAgImF0bWVsLHBtZWNjLXNlY3Rvci1zaXplIiwKPiArCQkJCQkg ICZ2YWwpKQo+ICsJCQljaGlwLT5lY2Muc2l6ZSA9IHZhbDsKPiArCX0KPiArCj4gKwlpZiAoY2hp cC0+ZWNjLm9wdGlvbnMgJiBOQU5EX0VDQ19NQVhJTUlaRSkKPiArCQlyZXEuZWNjLnN0cmVuZ3Ro ID0gQVRNRUxfUE1FQ0NfTUFYSU1JWkVfRUNDX1NUUkVOR1RIOwo+ICsJZWxzZSBpZiAoY2hpcC0+ ZWNjLnN0cmVuZ3RoKQo+ICsJCXJlcS5lY2Muc3RyZW5ndGggPSBjaGlwLT5lY2Muc3RyZW5ndGg7 Cj4gKwllbHNlIGlmIChjaGlwLT5lY2Nfc3RyZW5ndGhfZHMpCj4gKwkJcmVxLmVjYy5zdHJlbmd0 aCA9IGNoaXAtPmVjY19zdHJlbmd0aF9kczsKPiArCWVsc2UKPiArCQlyZXEuZWNjLnN0cmVuZ3Ro ID0gQVRNRUxfUE1FQ0NfTUFYSU1JWkVfRUNDX1NUUkVOR1RIOwo+ICsKPiArCWlmIChjaGlwLT5l Y2Muc2l6ZSkKPiArCQlyZXEuZWNjLnNlY3RvcnNpemUgPSBjaGlwLT5lY2Muc2l6ZTsKPiArCWVs c2UgaWYgKGNoaXAtPmVjY19zdGVwX2RzKQo+ICsJCXJlcS5lY2Muc2VjdG9yc2l6ZSA9IGNoaXAt PmVjY19zdGVwX2RzOwo+ICsJZWxzZQo+ICsJCXJlcS5lY2Muc2VjdG9yc2l6ZSA9IEFUTUVMX1BN RUNDX1NFQ1RPUl9TSVpFX0FVVE87Cj4gKwo+ICsJcmVxLnBhZ2VzaXplID0gbXRkLT53cml0ZXNp emU7Cj4gKwlyZXEub29ic2l6ZSA9IG10ZC0+b29ic2l6ZTsKPiArCj4gKwlpZiAobXRkLT53cml0 ZXNpemUgPD0gNTEyKSB7Cj4gKwkJcmVxLmVjYy5ieXRlcyA9IDQ7Cj4gKwkJcmVxLmVjYy5vb2Jv ZmZzZXQgPSAwOwo+ICsJfSBlbHNlIHsKPiArCQlyZXEuZWNjLmJ5dGVzID0gbXRkLT5vb2JzaXpl IC0gMjsKPiArCQlyZXEuZWNjLm9vYm9mZnNldCA9IEFUTUVMX1BNRUNDX09PQk9GRlNFVF9BVVRP Owo+ICsJfQo+ICsKPiArCW5hbmQtPnBtZWNjID0gYXRtZWxfcG1lY2NfY3JlYXRlX3VzZXIobmZj LT5wbWVjYywgJnJlcSk7Cj4gKwlpZiAoSVNfRVJSKG5hbmQtPnBtZWNjKSkKPiArCQlyZXR1cm4g UFRSX0VSUihuYW5kLT5wbWVjYyk7Cj4gKwo+ICsJY2hpcC0+ZWNjLmFsZ28gPSBOQU5EX0VDQ19C Q0g7Cj4gKwljaGlwLT5lY2Muc2l6ZSA9IHJlcS5lY2Muc2VjdG9yc2l6ZTsKPiArCWNoaXAtPmVj Yy5ieXRlcyA9IHJlcS5lY2MuYnl0ZXMgLyByZXEuZWNjLm5zZWN0b3JzOwo+ICsJY2hpcC0+ZWNj LnN0cmVuZ3RoID0gcmVxLmVjYy5zdHJlbmd0aDsKPiArCj4gKwljaGlwLT5vcHRpb25zIHw9IE5B TkRfTk9fU1VCUEFHRV9XUklURTsKPiArCj4gKwltdGRfc2V0X29vYmxheW91dChtdGQsICZuYW5k X29vYmxheW91dF9scF9vcHMpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGF0bWVsX25mY19lY2NfaW5pdChzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCkKPiArewo+ICsJ c3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZuYW5kLT5iYXNlOwo+ICsJc3RydWN0IGF0bWVsX25m YyAqbmZjID0gdG9fbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ICsJaW50IHJldDsKPiArCj4gKwlz d2l0Y2ggKGNoaXAtPmVjYy5tb2RlKSB7Cj4gKwljYXNlIE5BTkRfRUNDX05PTkU6Cj4gKwljYXNl IE5BTkRfRUNDX1NPRlQ6Cj4gKwkJLyoKPiArCQkgKiBOb3RoaW5nIHRvIGRvLCB0aGUgY29yZSB3 aWxsIGluaXRpYWxpemUgZXZlcnl0aGluZyBmb3IgdXMuCj4gKwkJICovCj4gKwkJYnJlYWs7Cj4g Kwo+ICsJY2FzZSBOQU5EX0VDQ19IVzoKPiArCQlyZXQgPSBhdG1lbF9uYW5kX3BtZWNjX2luaXQo Y2hpcCk7Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiArCj4gKwkJY2hpcC0+ZWNj LnJlYWRfcGFnZSA9IGF0bWVsX25mY19wbWVjY19yZWFkX3BhZ2U7Cj4gKwkJY2hpcC0+ZWNjLndy aXRlX3BhZ2UgPSBhdG1lbF9uZmNfcG1lY2Nfd3JpdGVfcGFnZTsKPiArCQljaGlwLT5lY2MucmVh ZF9wYWdlX3JhdyA9IGF0bWVsX25mY19wbWVjY19yZWFkX3BhZ2VfcmF3Owo+ICsJCWNoaXAtPmVj Yy53cml0ZV9wYWdlX3JhdyA9IGF0bWVsX25mY19wbWVjY193cml0ZV9wYWdlX3JhdzsKPiArCQli cmVhazsKPiArCj4gKwlkZWZhdWx0Ogo+ICsJCS8qIE90aGVyIG1vZGVzIGFyZSBub3Qgc3VwcG9y dGVkLiAqLwo+ICsJCWRldl9lcnIobmZjLT5kZXYsICJVbnN1cHBvcnRlZCBFQ0MgbW9kZTogJWRc biIsCj4gKwkJCWNoaXAtPmVjYy5tb2RlKTsKPiArCQlyZXR1cm4gLUVOT1RTVVBQOwo+ICsJfQo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY19l Y2NfaW5pdChzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCkKPiArewo+ICsJc3RydWN0IG5hbmRfY2hp cCAqY2hpcCA9ICZuYW5kLT5iYXNlOwo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBhdG1lbF9u ZmNfZWNjX2luaXQobmFuZCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJ aWYgKGNoaXAtPmVjYy5tb2RlICE9IE5BTkRfRUNDX0hXKQo+ICsJCXJldHVybiAwOwo+ICsKPiAr CS8qIEFkanVzdCB0aGUgRUNDIG9wZXJhdGlvbnMgZm9yIHRoZSBTQU1BNSBJUC4gKi8KPiArCWNo aXAtPmVjYy5yZWFkX3BhZ2UgPSBhdG1lbF9zYW1hNV9uZmNfcG1lY2NfcmVhZF9wYWdlOwo+ICsJ Y2hpcC0+ZWNjLndyaXRlX3BhZ2UgPSBhdG1lbF9zYW1hNV9uZmNfcG1lY2Nfd3JpdGVfcGFnZTsK PiArCWNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3ID0gYXRtZWxfc2FtYTVfbmZjX3BtZWNjX3JlYWRf cGFnZV9yYXc7Cj4gKwljaGlwLT5lY2Mud3JpdGVfcGFnZV9yYXcgPSBhdG1lbF9zYW1hNV9uZmNf cG1lY2Nfd3JpdGVfcGFnZV9yYXc7Cj4gKwljaGlwLT5lY2Mub3B0aW9ucyB8PSBOQU5EX0VDQ19D VVNUT01fUEFHRV9BQ0NFU1M7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGF0bWVsX25mY19uYW5kX2luaXQoc3RydWN0IGF0bWVsX25mYyAqbmZjLCBzdHJ1Y3QgYXRt ZWxfbmFuZCAqbmFuZCkKPiArewo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZuYW5kLT5i YXNlOwo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiArCj4g KwltdGQtPmRldi5wYXJlbnQgPSBuZmMtPmRldjsKPiArCW5hbmQtPmJhc2UuY29udHJvbGxlciA9 ICZuZmMtPmJhc2U7Cj4gKwo+ICsJY2hpcC0+Y21kX2N0cmwgPSBhdG1lbF9uYW5kX2NtZF9jdHJs Owo+ICsJY2hpcC0+cmVhZF9ieXRlID0gYXRtZWxfbmFuZF9yZWFkX2J5dGU7Cj4gKwljaGlwLT5y ZWFkX3dvcmQgPSBhdG1lbF9uYW5kX3JlYWRfd29yZDsKPiArCWNoaXAtPndyaXRlX2J5dGUgPSBh dG1lbF9uYW5kX3dyaXRlX2J5dGU7Cj4gKwljaGlwLT5yZWFkX2J1ZiA9IGF0bWVsX25hbmRfcmVh ZF9idWY7Cj4gKwljaGlwLT53cml0ZV9idWYgPSBhdG1lbF9uYW5kX3dyaXRlX2J1ZjsKPiArCWNo aXAtPnNlbGVjdF9jaGlwID0gYXRtZWxfbmFuZF9zZWxlY3RfY2hpcDsKPiArCj4gKwkvKgo+ICsJ ICogVXNlIGEgYm91bmNlIGJ1ZmZlciB3aGVuIHRoZSBidWZmZXIgcGFzc2VkIGJ5IHRoZSBNVEQg dXNlciBpcyBub3QKPiArCSAqIHN1aXRhYmxlIGZvciBETUEuCj4gKwkgKi8KPiArCWlmIChuZmMt PmRtYWMpCj4gKwkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX1VTRV9CT1VOQ0VfQlVGRkVSOwo+ICsK PiArCS8qIERlZmF1bHQgdG8gSFcgRUNDIGlmIHBtZWNjIGlzIGF2YWlsYWJsZS4gKi8KPiArCWlm IChuZmMtPnBtZWNjKQo+ICsJCWNoaXAtPmVjYy5tb2RlID0gTkFORF9FQ0NfSFc7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGF0bWVsX3NhbWE1X25mY19uYW5kX2luaXQoc3RydWN0IGF0bWVsX25m YyAqbmZjLAo+ICsJCQkJICAgICAgc3RydWN0IGF0bWVsX25hbmQgKm5hbmQpCj4gK3sKPiArCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmbmFuZC0+YmFzZTsKPiArCj4gKwlhdG1lbF9uZmNfbmFu ZF9pbml0KG5mYywgbmFuZCk7Cj4gKwo+ICsJLyogT3ZlcmxvYWQgc29tZSBtZXRob2RzIGZvciB0 aGUgU0FNQTUgY29udHJvbGxlci4gKi8KCiJmb3IgdGhlIFNBTUE1RDMtY29tcGF0aWJsZSBjb250 cm9sbGVyIgoKPiArCWNoaXAtPmNtZF9jdHJsID0gYXRtZWxfc2FtYTVfbmZjX2NtZF9jdHJsOwo+ ICsJY2hpcC0+c2VsZWN0X2NoaXAgPSBhdG1lbF9zYW1hNV9uZmNfc2VsZWN0X2NoaXA7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfbmZjX25hbmRfZGV0ZWN0KHN0cnVjdCBhdG1lbF9uYW5k ICpuYW5kKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJm5hbmQtPmJhc2U7Cj4g KwlzdHJ1Y3QgYXRtZWxfbmZjICpuZmMgPSB0b19uZmMoY2hpcC0+Y29udHJvbGxlcik7Cj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJaW50IHJldDsKPiAr Cj4gKwlyZXQgPSBuYW5kX3NjYW5faWRlbnQobXRkLCBuYW5kLT5udW1jcywgTlVMTCk7Cj4gKwlp ZiAocmV0KQo+ICsJCWRldl9lcnIobmZjLT5kZXYsICJuYW5kX3NjYW5faWRlbnQoKSBmYWlsZWQ6 ICVkXG4iLCByZXQpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg YXRtZWxfbmZjX25hbmRfdW5yZWdpc3RlcihzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZCkKPiArewo+ ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZuYW5kLT5iYXNlOwo+ICsJc3RydWN0IG10ZF9p bmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0g bXRkX2RldmljZV91bnJlZ2lzdGVyKG10ZCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7 Cj4gKwo+ICsJbmFuZF9jbGVhbnVwKGNoaXApOwo+ICsJbGlzdF9kZWwoJm5hbmQtPm5vZGUpOwo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19uYW5kX3Jl Z2lzdGVyKHN0cnVjdCBhdG1lbF9uYW5kICpuYW5kKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwID0gJm5hbmQtPmJhc2U7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmZjICpuZmMgPSB0b19uZmMo Y2hpcC0+Y29udHJvbGxlcik7Cj4gKwlzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhICpwZGF0YSA9IGRl dl9nZXRfcGxhdGRhdGEobmZjLT5kZXYpOwo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5k X3RvX210ZChjaGlwKTsKPiArCWNvbnN0IHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cyA9IE5V TEw7Cj4gKwlpbnQgbnBhcnRzID0gMCwgcmV0Owo+ICsKPiArCWlmIChuZmMtPmNhcHMtPmxlZ2Fj eV9vZl9iaW5kaW5ncyB8fCAhbmZjLT5kZXYtPm9mX25vZGUpIHsKPiArCQkvKgo+ICsJCSAqIFdl IGtlZXAgdGhlIE1URCBuYW1lIHVuY2hhbmdlZCB0byBhdm9pZCBicmVha2luZyBwbGF0Zm9ybXMK PiArCQkgKiB3aGVyZSB0aGUgTVREIGNtZGxpbmUgcGFyc2VyIGlzIHVzZWQgYW5kIHRoZSBib290 bG9hZGVyCj4gKwkJICogaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSBuZXcgbmFtaW5n IHNjaGVtZS4KPiArCQkgKi8KPiArCQltdGQtPm5hbWUgPSAiYXRtZWxfbmFuZCI7Cj4gKwl9IGVs c2UgaWYgKCFtdGQtPm5hbWUpIHsKPiArCQkvKgo+ICsJCSAqIElmIHRoZSBuZXcgYmluZGluZ3Mg YXJlIHVzZWQgYW5kIHRoZSBib290bG9hZGVyIGhhcyBub3QgYmVlbgo+ICsJCSAqIHVwZGF0ZWQg dG8gcGFzcyBhIG5ldyBtdGRwYXJ0cyBwYXJhbWV0ZXIgb24gdGhlIGNtZGxpbmUsIHlvdQo+ICsJ CSAqIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpbiB5b3VyIG5hbmQgbm9k ZToKPiArCQkgKgo+ICsJCSAqCWxhYmVsID0gImF0bWVsX25hbmQiOwoKSSBkb24ndCBzZWUgdGhp cyBpbiB0aGUgbmV3IGJpbmRpbmcgZG9jdW1lbnRhdGlvbi4gSXQgaXMgdXNlZnVsIHRvCmRvY3Vt ZW50IGl0LgoKCj4gKwkJICoKPiArCQkgKiBUaGlzIHdheSwgbXRkLT5uYW1lIHdpbGwgYmUgc2V0 IGJ5IHRoZSBjb3JlIHdoZW4KPiArCQkgKiBuYW5kX3NldF9mbGFzaF9ub2RlKCkgaXMgY2FsbGVk Lgo+ICsJCSAqLwo+ICsJCW10ZC0+bmFtZSA9IGRldm1fa2FzcHJpbnRmKG5mYy0+ZGV2LCBHRlBf S0VSTkVMLAo+ICsJCQkJCSAgICIlczpuYW5kLiVkIiwgZGV2X25hbWUobmZjLT5kZXYpLAo+ICsJ CQkJCSAgIG5hbmQtPmNzWzBdLmlkKTsKPiArCQlpZiAoIW10ZC0+bmFtZSkgewo+ICsJCQlkZXZf ZXJyKG5mYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG10ZC0+bmFtZVxuIik7Cj4gKwkJCXJl dHVybiAtRU5PTUVNOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXQgPSBuYW5kX3NjYW5fdGFpbCht dGQpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYsICJuYW5kX3NjYW5fdGFp bCgpIGZhaWxlZDogJWRcbiIsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlp ZiAocGRhdGEpIHsKPiArCQlwYXJ0cyA9IHBkYXRhLT5wYXJ0czsKPiArCQlucGFydHMgPSBwZGF0 YS0+bnVtX3BhcnRzOwo+ICsJfQo+ICsKPiArCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRk LCBwYXJ0cywgbnBhcnRzKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LCAi RmFpbGVkIHRvIHJlZ2lzdGVyIG10ZCBkZXZpY2U6ICVkXG4iLCByZXQpOwo+ICsJCW5hbmRfY2xl YW51cChjaGlwKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCWxpc3RfYWRkX3RhaWwo Jm5hbmQtPm5vZGUsICZuZmMtPmNoaXBzKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RydWN0IGdwaW9fZGVzYyAqYXRtZWxfbmFuZF9vZl9nZXRfZ3BpbyhzdHJ1Y3QgYXRtZWxfbmZj ICpuZmMsCj4gKwkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gKwkJCQkJIGNvbnN0IGNo YXIgKm5hbWUsIGludCBpbmRleCwKPiArCQkJCQkgZW51bSBncGlvZF9mbGFncyBmbGFncykKPiAr ewo+ICsJc3RydWN0IGdwaW9fZGVzYyAqZ3BpbzsKPiArCWludCByZXQ7Cj4gKwo+ICsJZ3BpbyA9 IGRldm1fZ2V0X2luZGV4X2dwaW9kX2Zyb21fY2hpbGQobmZjLT5kZXYsIG5hbWUsIGluZGV4LAo+ ICsJCQkJCSAgICAgICAmbnAtPmZ3bm9kZSk7Cj4gKwlpZiAoSVNfRVJSKGdwaW8pKSB7Cj4gKwkJ aWYgKFBUUl9FUlIoZ3BpbykgPT0gLUVOT0VOVCkKPiArCQkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJ CXJldHVybiBncGlvOwo+ICsJfQo+ICsKPiArCWlmICghKGZsYWdzICYgR1BJT0RfRkxBR1NfQklU X0RJUl9TRVQpKQo+ICsJCXJldHVybiBncGlvOwo+ICsKPiArCS8qIFByb2Nlc3MgZmxhZ3MgKi8K Ck5pdDogIi4iIGF0IHRoZSBlbmQgbGlrZSBvdGhlciBjb21tZW50cyBpbiB0aGUgZmlsZQoKPiAr CWlmIChmbGFncyAmIEdQSU9EX0ZMQUdTX0JJVF9ESVJfT1VUKQo+ICsJCXJldCA9IGdwaW9kX2Rp cmVjdGlvbl9vdXRwdXQoZ3BpbywKPiArCQkJCQkhIShmbGFncyAmIEdQSU9EX0ZMQUdTX0JJVF9E SVJfVkFMKSk7Cj4gKwllbHNlCj4gKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KGdwaW8p Owo+ICsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKPiArCj4gKwlyZXR1 cm4gZ3BpbzsKPiArfQo+ICsKPiArc3RydWN0IGdwaW9fZGVzYyAqYXRtZWxfbmFuZF9wZGF0YV9n ZXRfZ3BpbyhzdHJ1Y3QgYXRtZWxfbmZjICpuZmMsCj4gKwkJCQkJICAgIGludCBncGlvaWQsIGNv bnN0IGNoYXIgKm5hbWUsCj4gKwkJCQkJICAgIGJvb2wgYWN0aXZlX2xvdywKPiArCQkJCQkgICAg ZW51bSBncGlvZF9mbGFncyBmbGFncykKPiArewo+ICsJdW5zaWduZWQgbG9uZyBvZmxhZ3M7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCWlmICghZ3Bpb19pc192YWxpZChncGlvaWQpKQo+ICsJCXJldHVy biBOVUxMOwo+ICsKPiArCXN3aXRjaCAoZmxhZ3MpIHsKPiArCWNhc2UgR1BJT0RfSU46Cj4gKwkJ b2ZsYWdzID0gR1BJT0ZfSU47Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIEdQSU9EX09VVF9MT1c6Cj4g KwkJb2ZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfTE9XOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBHUElP RF9PVVRfSElHSDoKPiArCQlvZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOwo+ICsJCWJyZWFr Owo+ICsJZGVmYXVsdDoKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgR1BJTyBj b25maWdcbiIpOwo+ICsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICsJfQo+ICsKPiArCWlm IChhY3RpdmVfbG93KQo+ICsJCW9mbGFncyB8PSBHUElPRl9BQ1RJVkVfTE9XOwo+ICsKPiArCXJl dCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShuZmMtPmRldiwgZ3Bpb2lkLCBvZmxhZ3MsIG5hbWUp Owo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LCAiQ291bGQgbm90IHJl cXVlc3QgJXMgR1BJTyAoZXJyID0gJWQpXG4iLAo+ICsJCQluYW1lLCByZXQpOwo+ICsJCXJldHVy biBFUlJfUFRSKHJldCk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGdwaW9fdG9fZGVzYyhncGlvaWQp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGF0bWVsX25hbmQgKmF0bWVsX25mY19vZl9uYW5k X2NyZWF0ZShzdHJ1Y3QgYXRtZWxfbmZjICpuZmMsCj4gKwkJCQkJCSAgIHN0cnVjdCBkZXZpY2Vf bm9kZSAqbnAsCj4gKwkJCQkJCSAgIGludCByZWdfY2VsbHMpCj4gK3sKPiArCXN0cnVjdCBhdG1l bF9uYW5kICpuYW5kOwo+ICsJc3RydWN0IGdwaW9fZGVzYyAqZ3BpbzsKPiArCWludCBudW1jcywg cmV0LCBpOwo+ICsKPiArCW51bWNzID0gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShu cCwgInJlZyIsCj4gKwkJCQkJCXJlZ19jZWxscyAqIHNpemVvZih1MzIpKTsKPiArCWlmIChudW1j cyA8IDEpIHsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LCAiTWlzc2luZyBvciBpbnZhbGlkIHJlZyBw cm9wZXJ0eVxuIik7Cj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gKwl9Cj4gKwo+ICsJ bmFuZCA9IGRldm1fa3phbGxvYyhuZmMtPmRldiwKPiArCQkJICAgIHNpemVvZigqbmFuZCkgKyAo bnVtY3MgKiBzaXplb2YoKm5hbmQtPmNzKSksCj4gKwkJCSAgICBHRlBfS0VSTkVMKTsKPiArCWlm ICghbmFuZCkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTkFO RCBvYmplY3RcbiIpOwo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ICsJfQo+ICsKPiAr CW5hbmQtPm51bWNzID0gbnVtY3M7Cj4gKwo+ICsJZ3BpbyA9IGF0bWVsX25hbmRfb2ZfZ2V0X2dw aW8obmZjLCBucCwgImRldCIsIDAsIEdQSU9EX0lOKTsKPiArCWlmIChJU19FUlIoZ3BpbykpIHsK PiArCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkiRmFpbGVkIHRvIGdldCBkZXRlY3QgZ3BpbyAo ZXJyID0gJWxkKVxuIiwKPiArCQkJUFRSX0VSUihncGlvKSk7Cj4gKwkJcmV0dXJuIEVSUl9DQVNU KGdwaW8pOwo+ICsJfQo+ICsKPiArCW5hbmQtPmNkZ3BpbyA9IGdwaW87Cj4gKwo+ICsJZm9yIChp ID0gMDsgaSA8IG51bWNzOyBpKyspIHsKPiArCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwo+ICsJCXUz MiB2YWw7Cj4gKwo+ICsJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMp Owo+ICsJCWlmIChyZXQpIHsKPiArCQkJZGV2X2VycihuZmMtPmRldiwgIkludmFsaWQgcmVnIHBy b3BlcnR5IChlcnIgPSAlZClcbiIsCj4gKwkJCQlyZXQpOwo+ICsJCQlyZXR1cm4gRVJSX1BUUihy ZXQpOwo+ICsJCX0KPiArCj4gKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAs ICJyZWciLCBpICogcmVnX2NlbGxzLAo+ICsJCQkJCQkgJnZhbCk7Cj4gKwkJaWYgKHJldCkgewo+ ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LCAiSW52YWxpZCByZWcgcHJvcGVydHkgKGVyciA9ICVkKVxu IiwKPiArCQkJCXJldCk7Cj4gKwkJCXJldHVybiBFUlJfUFRSKHJldCk7Cj4gKwkJfQo+ICsKPiAr CQluYW5kLT5jc1tpXS5pZCA9IHZhbDsKPiArCj4gKwkJbmFuZC0+Y3NbaV0uaW8uZG1hID0gcmVz LnN0YXJ0Owo+ICsJCW5hbmQtPmNzW2ldLmlvLnZpcnQgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2Uo bmZjLT5kZXYsICZyZXMpOwo+ICsJCWlmIChJU19FUlIobmFuZC0+Y3NbaV0uaW8udmlydCkpCj4g KwkJCXJldHVybiBFUlJfQ0FTVChuYW5kLT5jc1tpXS5pby52aXJ0KTsKPiArCj4gKwkJaWYgKCFv Zl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHJiIiwgJnZhbCkpIHsKPiArCQkJaWYgKHZh bCA+IEFUTUVMX05GQ19NQVhfUkJfSUQpCj4gKwkJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsK PiArCj4gKwkJCW5hbmQtPmNzW2ldLnJiLnR5cGUgPSBBVE1FTF9OQU5EX05BVElWRV9SQjsKPiAr CQkJbmFuZC0+Y3NbaV0ucmIuaWQgPSB2YWw7Cj4gKwkJfSBlbHNlIHsKPiArCQkJZ3BpbyA9IGF0 bWVsX25hbmRfb2ZfZ2V0X2dwaW8obmZjLCBucCwgInJiIiwgaSwKPiArCQkJCQkJICAgICAgR1BJ T0RfSU4pOwo+ICsJCQlpZiAoSVNfRVJSKGdwaW8pKSB7Cj4gKwkJCQlkZXZfZXJyKG5mYy0+ZGV2 LAo+ICsJCQkJCSJGYWlsZWQgdG8gZ2V0IFIvQiBncGlvIChlcnIgPSAlbGQpXG4iLAo+ICsJCQkJ CVBUUl9FUlIoZ3BpbykpOwo+ICsJCQkJcmV0dXJuIEVSUl9DQVNUKGdwaW8pOwo+ICsJCQl9Cj4g Kwo+ICsJCQlpZiAoZ3Bpbykgewo+ICsJCQkJbmFuZC0+Y3NbaV0ucmIudHlwZSA9IEFUTUVMX05B TkRfR1BJT19SQjsKPiArCQkJCW5hbmQtPmNzW2ldLnJiLmdwaW8gPSBncGlvOwo+ICsJCQl9Cj4g KwkJfQo+ICsKPiArCQlncGlvID0gYXRtZWxfbmFuZF9vZl9nZXRfZ3BpbyhuZmMsIG5wLCAiY3Mi LCBpLAo+ICsJCQkJCSAgICAgIEdQSU9EX09VVF9ISUdIKTsKPiArCQlpZiAoSVNfRVJSKGdwaW8p KSB7Cj4gKwkJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCQkiRmFpbGVkIHRvIGdldCBDUyBncGlv IChlcnIgPSAlbGQpXG4iLAo+ICsJCQkJUFRSX0VSUihncGlvKSk7Cj4gKwkJCXJldHVybiBFUlJf Q0FTVChncGlvKTsKPiArCQl9Cj4gKwo+ICsJCW5hbmQtPmNzW2ldLmNzZ3BpbyA9IGdwaW87Cj4g Kwl9Cj4gKwo+ICsJbmFuZF9zZXRfZmxhc2hfbm9kZSgmbmFuZC0+YmFzZSwgbnApOwo+ICsKPiAr CXJldHVybiBuYW5kOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19hZGRfbmFuZChz dHJ1Y3QgYXRtZWxfbmZjICpuZmMsIHN0cnVjdCBhdG1lbF9uYW5kICpuYW5kKQo+ICt7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCS8qIE5vIGNhcmQgaW5zZXJ0ZWQsIHNraXAgdGhpcyBOQU5ELiAqLwo+ ICsJaWYgKG5hbmQtPmNkZ3BpbyAmJiBncGlvZF9nZXRfdmFsdWUobmFuZC0+Y2RncGlvKSkgewo+ ICsJCWRldl9pbmZvKG5mYy0+ZGV2LCAiTm8gU21hcnRNZWRpYSBjYXJkIGluc2VydGVkLlxuIik7 Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5jYXBzLT5vcHMtPm5hbmRfaW5pdChu ZmMsIG5hbmQpOwo+ICsKPiArCS8qCj4gKwkgKiBBdHRhY2ggdGhlIENTIHRvIHRoZSBOQU5EIEZs YXNoIGxvZ2ljLiBPbmx5IHJlcXVpcmVkIG9uIHByZS1zYW1hNQo+ICsJICogU29Dcy4KPiArCSAq Lwo+ICsJaWYgKG5mYy0+bWF0cml4KSB7Cj4gKwkJaW50IGk7Cj4gKwo+ICsJCWZvciAoaSA9IDA7 IGkgPCBuYW5kLT5udW1jczsgaSsrKQo+ICsJCQlyZWdtYXBfdXBkYXRlX2JpdHMobmZjLT5tYXRy aXgsIG5mYy0+ZWJpX2NzYV9vZmZzLAo+ICsJCQkJCSAgIEJJVChuYW5kLT5jc1tpXS5pZCksCj4g KwkJCQkJICAgQklUKG5hbmQtPmNzW2ldLmlkKSk7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gYXRtZWxf bmZjX25hbmRfZGV0ZWN0KG5hbmQpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsK PiArCXJldCA9IG5mYy0+Y2Fwcy0+b3BzLT5lY2NfaW5pdChuYW5kKTsKPiArCWlmIChyZXQpCj4g KwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXR1cm4gYXRtZWxfbmZjX25hbmRfcmVnaXN0ZXIobmFu ZCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfbmZjX3JlbW92ZV9uYW5kcyhzdHJ1Y3Qg YXRtZWxfbmZjICpuZmMpCj4gK3sKPiArCXN0cnVjdCBhdG1lbF9uYW5kICpuYW5kLCAqdG1wOwo+ ICsJaW50IHJldDsKPiArCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmFuZCwgdG1wLCAm bmZjLT5jaGlwcywgbm9kZSkgewo+ICsJCXJldCA9IGF0bWVsX25mY19uYW5kX3VucmVnaXN0ZXIo bmFuZCk7Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9uZmNfb2ZfYWRkX25hbmRzKHN0cnVj dCBhdG1lbF9uZmMgKm5mYykKPiArewo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCwgKm5hbmRf bnA7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZmMtPmRldjsKPiArCWludCByZXQsIHJlZ19j ZWxsczsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJbnAgPSBkZXYtPm9mX25vZGU7Cj4gKwo+ICsJcmV0 ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICIjYWRkcmVzcy1jZWxscyIsICZ2YWwpOwo+ICsJ aWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAibWlzc2luZyAjYWRkcmVzcy1jZWxscyBwcm9w ZXJ0eVxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZWdfY2VsbHMgPSB2YWw7 Cj4gKwo+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICIjc2l6ZS1jZWxscyIsICZ2 YWwpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAibWlzc2luZyAjYWRkcmVzcy1j ZWxscyBwcm9wZXJ0eVxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZWdfY2Vs bHMgKz0gdmFsOwo+ICsKPiArCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIG5hbmRfbnApIHsK PiArCQlzdHJ1Y3QgYXRtZWxfbmFuZCAqbmFuZDsKPiArCj4gKwkJbmFuZCA9IGF0bWVsX25mY19v Zl9uYW5kX2NyZWF0ZShuZmMsIG5hbmRfbnAsIHJlZ19jZWxscyk7Cj4gKwkJaWYgKElTX0VSUihu YW5kKSkgewo+ICsJCQlyZXQgPSBQVFJfRVJSKG5hbmQpOwo+ICsJCQlnb3RvIGVycjsKPiArCQl9 Cj4gKwo+ICsJCXJldCA9IGF0bWVsX25mY19hZGRfbmFuZChuZmMsIG5hbmQpOwo+ICsJCWlmIChy ZXQpCj4gKwkJCWdvdG8gZXJyOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyOgo+ ICsJYXRtZWxfbmZjX3JlbW92ZV9uYW5kcyhuZmMpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfbmZjX2xlZ2FjeV9hZGRfbmFuZHMoc3RydWN0IGF0bWVs X25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZmMtPmRldjsKPiArCXN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKPiAr CXN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwo+ ICsJc3RydWN0IGF0bWVsX25hbmQgKm5hbmQ7Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvOwo+ ICsJc3RydWN0IHJlc291cmNlICpyZXM7Cj4gKwo+ICsJLyoKPiArCSAqIExlZ2FjeSBiaW5kaW5n cyBvbmx5IGFsbG93IGNvbm5lY3RpbmcgYSBzaW5nbGUgTkFORCB3aXRoIGEgdW5pcXVlIENTCj4g KwkgKiBsaW5lIHRvIHRoZSBjb250cm9sbGVyLgo+ICsJICovCj4gKwluYW5kID0gZGV2bV9remFs bG9jKG5mYy0+ZGV2LCBzaXplb2YoKm5hbmQpICsgc2l6ZW9mKCpuYW5kLT5jcyksCj4gKwkJCSAg ICBHRlBfS0VSTkVMKTsKPiArCWlmICghbmFuZCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4g KwluYW5kLT5udW1jcyA9IDE7Cj4gKwo+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBk ZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiArCW5hbmQtPmNzWzBdLmlvLnZpcnQgPSBkZXZtX2lv cmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwo+ICsJaWYgKElTX0VSUihuYW5kLT5jc1swXS5pby52 aXJ0KSkKPiArCQlyZXR1cm4gUFRSX0VSUihuYW5kLT5jc1swXS5pby52aXJ0KTsKPiArCj4gKwlu YW5kLT5jc1swXS5pby5kbWEgPSByZXMtPnN0YXJ0Owo+ICsKPiArCS8qCj4gKwkgKiBUaGUgb2xk IGRyaXZlciB3YXMgaGFyZGNvZGluZyB0aGUgQ1MgaWQgdG8gMyBmb3IgYWxsIHNhbWE1Cj4gKwkg KiBjb250cm9sbGVycy4gU2luY2UgdGhpcyBpZCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHRoZSBz YW1hNQo+ICsJICogY29udHJvbGxlciB3ZSBjYW4gc2FmZWx5IGFzc2lnbiB0aGlzIGlkIHRvIDMg bm8gbWF0dGVyIHRoZQo+ICsJICogY29udHJvbGxlci4KPiArCSAqIElmIG9uZSB3YW50cyB0byBj b25uZWN0IGEgTkFORCB0byBhIGRpZmZlcmVudCBDUyBsaW5lLCBoZSB3aWxsCj4gKwkgKiBoYXZl IHRvIHVzZSB0aGUgbmV3IGJpbmRpbmdzLgoKWWVzIQoKPiArCSAqLwo+ICsJbmFuZC0+Y3NbMF0u aWQgPSAzOwo+ICsKPiArCS8qIFIvQiBHUElPLiAqLwo+ICsJaWYgKHBkYXRhKQo+ICsJCWdwaW8g PSBhdG1lbF9uYW5kX3BkYXRhX2dldF9ncGlvKG5mYywgcGRhdGEtPnJkeV9waW4sCj4gKwkJCQkJ CSAibmFuZC1yYiIsCj4gKwkJCQkJCSBwZGF0YS0+cmR5X3Bpbl9hY3RpdmVfbG93LAo+ICsJCQkJ CQkgR1BJT0RfSU4pOwo+ICsJZWxzZQo+ICsJCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleF9v cHRpb25hbChkZXYsIE5VTEwsIDAsCj4gKwkJCQkJCSAgICAgR1BJT0RfSU4pOwo+ICsJaWYgKElT X0VSUihncGlvKSkgewo+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBSL0IgZ3BpbyAo ZXJyID0gJWxkKVxuIiwKPiArCQkJUFRSX0VSUihncGlvKSk7Cj4gKwkJcmV0dXJuIFBUUl9FUlIo Z3Bpbyk7Cj4gKwl9Cj4gKwo+ICsJaWYgKGdwaW8pIHsKPiArCQluYW5kLT5jc1swXS5yYi50eXBl ID0gQVRNRUxfTkFORF9HUElPX1JCOwo+ICsJCW5hbmQtPmNzWzBdLnJiLmdwaW8gPSBncGlvOwo+ ICsJfQo+ICsKPiArCS8qIENTIEdQSU8uICovCj4gKwlpZiAocGRhdGEpCj4gKwkJZ3BpbyA9IGF0 bWVsX25hbmRfcGRhdGFfZ2V0X2dwaW8obmZjLCBwZGF0YS0+ZW5hYmxlX3BpbiwKPiArCQkJCQkJ ICJuYW5kLWNzIiwgMCwgR1BJT0RfT1VUX0hJR0gpOwo+ICsJZWxzZQo+ICsJCWdwaW8gPSBkZXZt X2dwaW9kX2dldF9pbmRleF9vcHRpb25hbChkZXYsIE5VTEwsIDEsCj4gKwkJCQkJCSAgICAgR1BJ T0RfT1VUX0hJR0gpOwo+ICsJaWYgKElTX0VSUihncGlvKSkgewo+ICsJCWRldl9lcnIoZGV2LCAi RmFpbGVkIHRvIGdldCBDUyBncGlvIChlcnIgPSAlbGQpXG4iLAo+ICsJCQlQVFJfRVJSKGdwaW8p KTsKPiArCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKPiArCX0KPiArCj4gKwluYW5kLT5jc1swXS5j c2dwaW8gPSBncGlvOwo+ICsKPiArCS8qIENhcmQgZGV0ZWN0IEdQSU8uICovCj4gKwlpZiAocGRh dGEpCj4gKwkJZ3BpbyA9IGF0bWVsX25hbmRfcGRhdGFfZ2V0X2dwaW8obmZjLCBwZGF0YS0+ZGV0 X3BpbiwKPiArCQkJCQkJICJuYW5kLWNkIiwgMCwgR1BJT0RfSU4pOwo+ICsJZWxzZQo+ICsJCWdw aW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleF9vcHRpb25hbChuZmMtPmRldiwgTlVMTCwgMiwKPiAr CQkJCQkJICAgICBHUElPRF9JTik7Cj4gKwlpZiAoSVNfRVJSKGdwaW8pKSB7Cj4gKwkJZGV2X2Vy cihkZXYsCj4gKwkJCSJGYWlsZWQgdG8gZ2V0IGRldGVjdCBncGlvIChlcnIgPSAlbGQpXG4iLAo+ ICsJCQlQVFJfRVJSKGdwaW8pKTsKPiArCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKPiArCX0KPiAr Cj4gKwluYW5kLT5jZGdwaW8gPSBncGlvOwo+ICsKPiArCWlmIChwZGF0YSkgewo+ICsJCWlmIChw ZGF0YS0+YnVzX3dpZHRoXzE2KQo+ICsJCQluYW5kLT5iYXNlLm9wdGlvbnMgfD0gTkFORF9CVVNX SURUSF8xNjsKPiArCj4gKwkJLyoKPiArCQkgKiBUaGUgb25seSBzdXBwb3J0ZWQgbW9kZSB3aGVu IHBkYXRhIGlzIGludm9sdmVkIGlzIHNvZnR3YXJlCj4gKwkJICogaGFtbWluZyBFQ0MuIEZhbGxi YWNrIHRvIG5vIEVDQyBhdCBhbGwgaW4gb3RoZXIgY2FzZS4KPiArCQkgKi8KPiArCQlpZiAocGRh dGEtPmVjY19tb2RlID09IE5BTkRfRUNDX1NPRlQpIHsKPiArCQkJbmFuZC0+YmFzZS5lY2MubW9k ZSA9IE5BTkRfRUNDX1NPRlQ7Cj4gKwkJCW5hbmQtPmJhc2UuZWNjLmFsZ28gPSBOQU5EX0VDQ19I QU1NSU5HOwo+ICsJCX0KPiArCj4gKwkJaWYgKHBkYXRhLT5vbl9mbGFzaF9iYnQpCj4gKwkJCW5h bmQtPmJhc2UuYmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOwo+ICsJfQo+ICsKPiAr CW5hbmRfc2V0X2ZsYXNoX25vZGUoJm5hbmQtPmJhc2UsIG5mYy0+ZGV2LT5vZl9ub2RlKTsKPiAr Cj4gKwlyZXR1cm4gYXRtZWxfbmZjX2FkZF9uYW5kKG5mYywgbmFuZCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgYXRtZWxfbmZjX2FkZF9uYW5kcyhzdHJ1Y3QgYXRtZWxfbmZjICpuZmMpCj4gK3sK PiArCS8qIFdlIGRvIG5vdCByZXRyaWV2ZSB0aGUgU01DIHN5c2NvbiB3aGVuIHBhcnNpbmcgb2xk IERUcyBvciBwZGF0YS4gKi8KPiArCWlmIChuZmMtPmNhcHMtPmxlZ2FjeV9vZl9iaW5kaW5ncyB8 fCAhbmZjLT5kZXYtPm9mX25vZGUpCj4gKwkJcmV0dXJuIGF0bWVsX25mY19sZWdhY3lfYWRkX25h bmRzKG5mYyk7Cj4gKwo+ICsJcmV0dXJuIGF0bWVsX25mY19vZl9hZGRfbmFuZHMobmZjKTsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgYXRtZWxfbmZjX2NsZWFudXAoc3RydWN0IGF0bWVsX25mYyAq bmZjKQo+ICt7Cj4gKwlpZiAobmZjLT5kbWFjKQo+ICsJCWRtYV9yZWxlYXNlX2NoYW5uZWwobmZj LT5kbWFjKTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXRt ZWxfbWF0cml4X29mX2lkc1tdID0gewo+ICsJewo+ICsJCS5jb21wYXRpYmxlID0gImF0bWVsLGF0 OTFzYW05MjYwLW1hdHJpeCIsCj4gKwkJLmRhdGEgPSAodm9pZCAqKUFUOTFTQU05MjYwX01BVFJJ WF9FQklDU0EsCj4gKwl9LAo+ICsJewo+ICsJCS5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05 MjYxLW1hdHJpeCIsCj4gKwkJLmRhdGEgPSAodm9pZCAqKUFUOTFTQU05MjYxX01BVFJJWF9FQklD U0EsCj4gKwl9LAo+ICsJewo+ICsJCS5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYzLW1h dHJpeCIsCj4gKwkJLmRhdGEgPSAodm9pZCAqKUFUOTFTQU05MjYzX01BVFJJWF9FQkkwQ1NBLAo+ ICsJfSwKPiArCXsKPiArCQkuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOXJsLW1hdHJpeCIs Cj4gKwkJLmRhdGEgPSAodm9pZCAqKUFUOTFTQU05UkxfTUFUUklYX0VCSUNTQSwKPiArCX0sCj4g Kwl7Cj4gKwkJLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTlnNDUtbWF0cml4IiwKPiArCQku ZGF0YSA9ICh2b2lkICopQVQ5MVNBTTlHNDVfTUFUUklYX0VCSUNTQSwKPiArCX0sCj4gKwl7Cj4g KwkJLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTluMTItbWF0cml4IiwKPiArCQkuZGF0YSA9 ICh2b2lkICopQVQ5MVNBTTlOMTJfTUFUUklYX0VCSUNTQSwKPiArCX0sCj4gKwl7Cj4gKwkJLmNv bXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTl4NS1tYXRyaXgiLAo+ICsJCS5kYXRhID0gKHZvaWQg KilBVDkxU0FNOVg1X01BVFJJWF9FQklDU0EsCj4gKwl9LAo+ICt9Owo+ICsKPiArc3RhdGljIGlu dCBhdG1lbF9uZmNfaW5pdChzdHJ1Y3QgYXRtZWxfbmZjICpuZmMsIHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYsCj4gKwkJCSAgY29uc3Qgc3RydWN0IGF0bWVsX25mY19jYXBzICpjYXBzKQo+ ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IGRldmlj ZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKPiArCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg Km1hdGNoOwo+ICsJaW50IHJldDsKPiArCj4gKwluYW5kX2h3X2NvbnRyb2xfaW5pdCgmbmZjLT5i YXNlKTsKPiArCUlOSVRfTElTVF9IRUFEKCZuZmMtPmNoaXBzKTsKPiArCW5mYy0+ZGV2ID0gZGV2 Owo+ICsJbmZjLT5jYXBzID0gY2FwczsKPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBuZmMpOwo+ICsKPiArCW5mYy0+cG1lY2MgPSBkZXZtX2F0bWVsX3BtZWNjX2dldChkZXYpOwo+ ICsJaWYgKElTX0VSUihuZmMtPnBtZWNjKSkgewo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5wbWVj Yyk7Cj4gKwkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQo+ICsJCQlkZXZfZXJyKGRldiwgIkNv dWxkIG5vdCBnZXQgUE1FQ0Mgb2JqZWN0IChlcnIgPSAlZClcbiIsCj4gKwkJCQlyZXQpOwo+ICsJ CXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJaWYgKG5mYy0+Y2Fwcy0+aGFzX2RtYSkgewo+ICsJ CWRtYV9jYXBfbWFza190IG1hc2s7Cj4gKwo+ICsJCWRtYV9jYXBfemVybyhtYXNrKTsKPiArCQlk bWFfY2FwX3NldChETUFfTUVNQ1BZLCBtYXNrKTsKPiArCj4gKwkJbmZjLT5kbWFjID0gZG1hX3Jl cXVlc3RfY2hhbm5lbChtYXNrLCBOVUxMLCBOVUxMKTsKPiArCQlpZiAoIW5mYy0+ZG1hYykKPiAr CQkJZGV2X2VycihuZmMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IERNQSBjaGFubmVsXG4iKTsK PiArCX0KPiArCj4gKwkvKiBXZSBkbyBub3QgcmV0cmlldmUgdGhlIFNNQyBzeXNjb24gd2hlbiBw YXJzaW5nIG9sZCBEVHMgb3IgcGRhdGEuICovCj4gKwlpZiAobmZjLT5jYXBzLT5sZWdhY3lfb2Zf YmluZGluZ3MgfHwgIW5mYy0+ZGV2LT5vZl9ub2RlKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCW5w ID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPnBhcmVudC0+b2Zfbm9kZSwgImF0bWVsLHNtYyIsIDAp Owo+ICsJaWYgKCFucCkgewo+ICsJCWRldl9lcnIoZGV2LCAiTWlzc2luZyBvciBpbnZhbGlkIGF0 bWVsLHNtYyBwcm9wZXJ0eVxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJ bmZjLT5zbWMgPSBzeXNjb25fbm9kZV90b19yZWdtYXAobnApOwo+ICsJb2Zfbm9kZV9wdXQobnAp Owo+ICsJaWYgKElTX0VSUihuZmMtPnNtYykpIHsKPiArCQlyZXQgPSBJU19FUlIobmZjLT5zbWMp Owo+ICsJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGdldCBTTUMgcmVnbWFwIChlcnIgPSAlZClc biIsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlucCA9IG9mX3BhcnNlX3Bo YW5kbGUoZGV2LT5wYXJlbnQtPm9mX25vZGUsICJhdG1lbCxtYXRyaXgiLCAwKTsKPiArCWlmICgh bnApCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICsJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKGF0bWVsX21h dHJpeF9vZl9pZHMsIG5wKTsKPiArCWlmICghbWF0Y2gpIHsKPiArCQlvZl9ub2RlX3B1dChucCk7 Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5tYXRyaXggPSBzeXNjb25fbm9kZV90 b19yZWdtYXAobnApOwo+ICsJb2Zfbm9kZV9wdXQobnApOwo+ICsJaWYgKElTX0VSUihuZmMtPm1h dHJpeCkpIHsKPiArCQlyZXQgPSBJU19FUlIobmZjLT5tYXRyaXgpOwo+ICsJCWRldl9lcnIoZGV2 LCAiQ291bGQgbm90IGdldCBTTUMgcmVnbWFwIChlcnIgPSAlZClcbiIsIHJldCk7Cj4gKwkJcmV0 dXJuIHJldDsKPiArCX0KPiArCj4gKwluZmMtPmViaV9jc2Ffb2ZmcyA9ICh1bnNpZ25lZCBpbnQp bWF0Y2gtPmRhdGE7Cj4gKwo+ICsJLyoKPiArCSAqIFRoZSBhdDkxc2FtOTI2MyBoYXMgMiBFQklz LCBpZiB0aGUgTkFORCBjb250cm9sbGVyIGlzIHVuZGVyIEVCSTEKPiArCSAqIGFkZCA0IHRvIC0+ ZWJpX2NzYV9vZmZzLgo+ICsJICovCj4gKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2 LT5wYXJlbnQtPm9mX25vZGUsCj4gKwkJCQkgICAgImF0bWVsLGF0OTFzYW05MjYzLWViaTEiKSkK PiArCQluZmMtPmViaV9jc2Ffb2ZmcyArPSA0Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGF0bWVsX3NhbWE1X25mY19sZWdhY3lfaW5pdChzdHJ1Y3QgYXRtZWxfc2Ft YTVfbmZjICpuZmMpCj4gK3sKPiArCXN0cnVjdCByZWdtYXBfY29uZmlnIHJlZ21hcF9jb25mID0g ewo+ICsJCS5yZWdfYml0cyA9IDMyLAo+ICsJCS52YWxfYml0cyA9IDMyLAo+ICsJCS5yZWdfc3Ry aWRlID0gNCwKPiArCQkudmFsX2JpdHMgPSAzMiwKPiArCX07Cj4gKwo+ICsJc3RydWN0IGRldmlj ZSAqZGV2ID0gbmZjLT5iYXNlLmRldjsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbmFuZF9ucCwg Km5mY19ucDsKPiArCXZvaWQgX19pb21lbSAqaW9tZW07Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgcmVz Owo+ICsJaW50IHJldDsKPiArCj4gKwluYW5kX25wID0gZGV2LT5vZl9ub2RlOwo+ICsJbmZjX25w ID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoZGV2LT5vZl9ub2RlLCBOVUxMLAo+ICsJCQkJCSAi YXRtZWwsc2FtYTVkMy1uZmMiKTsKPiArCj4gKwluZmMtPmNsayA9IG9mX2Nsa19nZXQobmZjX25w LCAwKTsKPiArCWlmIChJU19FUlIobmZjLT5jbGspKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihuZmMt PmNsayk7Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgSFNNQyBjbG9jayAo ZXJyID0gJWQpXG4iLAo+ICsJCQlyZXQpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXJl dCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMtPmNsayk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2 X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHRoZSBIU01DIGNsb2NrIChlcnIgPSAlZClcbiIs Cj4gKwkJCXJldCk7Cj4gKwkJZ290byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5pcnEgPSBvZl9p cnFfZ2V0KG5hbmRfbnAsIDApOwo+ICsJaWYgKG5mYy0+aXJxIDwgMCkgewo+ICsJCXJldCA9IG5m Yy0+aXJxOwo+ICsJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKPiArCQkJZGV2X2VycihkZXYs ICJGYWlsZWQgdG8gZ2V0IElSUSBudW1iZXIgKGVyciA9ICVkKVxuIiwKPiArCQkJCXJldCk7Cj4g KwkJZ290byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShu ZmNfbnAsIDAsICZyZXMpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiSW52YWxp ZCBvciBtaXNzaW5nIE5GQyBJTyByZXNvdXJjZSAoZXJyID0gJWQpXG4iLAo+ICsJCQlyZXQpOwo+ ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCWlvbWVtID0gZGV2bV9pb3JlbWFwX3Jlc291cmNl KGRldiwgJnJlcyk7Cj4gKwlpZiAoSVNfRVJSKGlvbWVtKSkgewo+ICsJCXJldCA9IFBUUl9FUlIo aW9tZW0pOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXJlZ21hcF9jb25mLm5hbWUgPSAi bmZjLWlvIjsKPiArCXJlZ21hcF9jb25mLm1heF9yZWdpc3RlciA9IHJlc291cmNlX3NpemUoJnJl cykgLSA0Owo+ICsJbmZjLT5pbyA9IGRldm1fcmVnbWFwX2luaXRfbW1pbyhkZXYsIGlvbWVtLCAm cmVnbWFwX2NvbmYpOwo+ICsJaWYgKElTX0VSUihuZmMtPmlvKSkgewo+ICsJCXJldCA9IFBUUl9F UlIobmZjLT5pbyk7Cj4gKwkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgY3JlYXRlIE5GQyBJTyBy ZWdtYXAgKGVyciA9ICVkKVxuIiwKPiArCQkJcmV0KTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiAr Cj4gKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5mY19ucCwgMSwgJnJlcyk7Cj4gKwlp ZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG9yIG1pc3NpbmcgSFNNQyByZXNv dXJjZSAoZXJyID0gJWQpXG4iLAo+ICsJCQlyZXQpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsK PiArCWlvbWVtID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgJnJlcyk7Cj4gKwlpZiAoSVNf RVJSKGlvbWVtKSkgewo+ICsJCXJldCA9IFBUUl9FUlIoaW9tZW0pOwo+ICsJCWdvdG8gb3V0Owo+ ICsJfQo+ICsKPiArCXJlZ21hcF9jb25mLm5hbWUgPSAic21jIjsKPiArCXJlZ21hcF9jb25mLm1h eF9yZWdpc3RlciA9IHJlc291cmNlX3NpemUoJnJlcykgLSA0Owo+ICsJbmZjLT5iYXNlLnNtYyA9 IGRldm1fcmVnbWFwX2luaXRfbW1pbyhkZXYsIGlvbWVtLCAmcmVnbWFwX2NvbmYpOwo+ICsJaWYg KElTX0VSUihuZmMtPmJhc2Uuc21jKSkgewo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5iYXNlLnNt Yyk7Cj4gKwkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgY3JlYXRlIE5GQyBJTyByZWdtYXAgKGVy ciA9ICVkKVxuIiwKPiArCQkJcmV0KTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXQg PSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5mY19ucCwgMiwgJnJlcyk7Cj4gKwlpZiAocmV0KSB7 Cj4gKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG9yIG1pc3NpbmcgU1JBTSByZXNvdXJjZSAoZXJy ID0gJWQpXG4iLAo+ICsJCQlyZXQpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCW5mYy0+ c3JhbS52aXJ0ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgJnJlcyk7Cj4gKwlpZiAoSVNf RVJSKG5mYy0+c3JhbS52aXJ0KSkgewo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5zcmFtLnZpcnQp Owo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCW5mYy0+c3JhbS5kbWEgPSByZXMuc3RhcnQ7 Cj4gKwo+ICtvdXQ6Cj4gKwlvZl9ub2RlX3B1dChuZmNfbnApOwo+ICsKPiArCXJldHVybiByZXQ7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfc2FtYTVfbmZjX2luaXQoc3RydWN0IGF0bWVs X3NhbWE1X25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZmMtPmJhc2Uu ZGV2Owo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucDsKPiArCWludCByZXQ7Cj4gKwo+ICsJbnAg PSBvZl9wYXJzZV9waGFuZGxlKGRldi0+cGFyZW50LT5vZl9ub2RlLCAiYXRtZWwsc21jIiwgMCk7 Cj4gKwlpZiAoIW5wKSB7Cj4gKwkJZGV2X2VycihkZXYsICJNaXNzaW5nIG9yIGludmFsaWQgYXRt ZWwsc21jIHByb3BlcnR5XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlu ZmMtPmlycSA9IG9mX2lycV9nZXQobnAsIDApOwo+ICsJb2Zfbm9kZV9wdXQobnApOwo+ICsJaWYg KG5mYy0+aXJxIDwgMCkgewo+ICsJCWlmIChuZmMtPmlycSAhPSAtRVBST0JFX0RFRkVSKQo+ICsJ CQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgSVJRIG51bWJlciAoZXJyID0gJWQpXG4iLAo+ ICsJCQkJbmZjLT5pcnEpOwo+ICsJCXJldHVybiBuZmMtPmlycTsKPiArCX0KPiArCj4gKwlucCA9 IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiYXRtZWwsbmZjLWlvIiwgMCk7Cj4gKwlp ZiAoIW5wKSB7Cj4gKwkJZGV2X2VycihkZXYsICJNaXNzaW5nIG9yIGludmFsaWQgYXRtZWwsbmZj LWlvIHByb3BlcnR5XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwluZmMt PmlvID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG5wKTsKPiArCW9mX25vZGVfcHV0KG5wKTsKPiAr CWlmIChJU19FUlIobmZjLT5pbykpIHsKPiArCQlyZXQgPSBQVFJfRVJSKG5mYy0+aW8pOwo+ICsJ CWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGdldCBORkMgSU8gcmVnbWFwIChlcnIgPSAlZClcbiIs IHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwluZmMtPnNyYW0ucG9vbCA9IG9m X2dlbl9wb29sX2dldChuZmMtPmJhc2UuZGV2LT5vZl9ub2RlLAo+ICsJCQkJCSAiYXRtZWwsbmZj LXNyYW0iLCAwKTsKPiArCWlmICghbmZjLT5zcmFtLnBvb2wpIHsKPiArCQlkZXZfZXJyKG5mYy0+ YmFzZS5kZXYsICJNaXNzaW5nIFNSQU1cbiIpOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ ICsKPiArCW5mYy0+c3JhbS52aXJ0ID0gZ2VuX3Bvb2xfZG1hX2FsbG9jKG5mYy0+c3JhbS5wb29s LAo+ICsJCQkJCSAgICBBVE1FTF9ORkNfU1JBTV9TSVpFLAo+ICsJCQkJCSAgICAmbmZjLT5zcmFt LmRtYSk7Cj4gKwlpZiAoIW5mYy0+c3JhbS52aXJ0KSB7Cj4gKwkJZGV2X2VycihuZmMtPmJhc2Uu ZGV2LAo+ICsJCQkiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBORkMgU1JBTSBw b29sXG4iKTsKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9zYW1hNV9uZmNfcmVtb3ZlKHN0cnVjdCBhdG1lbF9u ZmMgKm5mYykKPiArewo+ICsJc3RydWN0IGF0bWVsX3NhbWE1X25mYyAqc2FtYTVfbmZjOwo+ICsJ aW50IHJldDsKPiArCj4gKwlyZXQgPSBhdG1lbF9uZmNfcmVtb3ZlX25hbmRzKG5mYyk7Cj4gKwlp ZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJc2FtYTVfbmZjID0gY29udGFpbmVyX29m KG5mYywgc3RydWN0IGF0bWVsX3NhbWE1X25mYywgYmFzZSk7Cj4gKwlpZiAoc2FtYTVfbmZjLT5z cmFtLnBvb2wpCj4gKwkJZ2VuX3Bvb2xfZnJlZShzYW1hNV9uZmMtPnNyYW0ucG9vbCwKPiArCQkJ ICAgICAgKHVuc2lnbmVkIGxvbmcpc2FtYTVfbmZjLT5zcmFtLnZpcnQsCj4gKwkJCSAgICAgIEFU TUVMX05GQ19TUkFNX1NJWkUpOwo+ICsKPiArCWlmIChzYW1hNV9uZmMtPmNsaykgewo+ICsJCWNs a19kaXNhYmxlX3VucHJlcGFyZShzYW1hNV9uZmMtPmNsayk7Cj4gKwkJY2xrX3B1dChzYW1hNV9u ZmMtPmNsayk7Cj4gKwl9Cj4gKwo+ICsJYXRtZWxfbmZjX2NsZWFudXAobmZjKTsKPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9zYW1hNV9uZmNfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkJCSBjb25zdCBzdHJ1Y3QgYXRtZWxfbmZj X2NhcHMgKmNhcHMpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4g KwlzdHJ1Y3QgYXRtZWxfc2FtYTVfbmZjICpuZmM7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCW5mYyA9 IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbmZjKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW5m YykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlyZXQgPSBhdG1lbF9uZmNfaW5pdCgmbmZj LT5iYXNlLCBwZGV2LCBjYXBzKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4g KwlpZiAoY2Fwcy0+bGVnYWN5X29mX2JpbmRpbmdzKQo+ICsJCXJldCA9IGF0bWVsX3NhbWE1X25m Y19sZWdhY3lfaW5pdChuZmMpOwo+ICsJZWxzZQo+ICsJCXJldCA9IGF0bWVsX3NhbWE1X25mY19p bml0KG5mYyk7Cj4gKwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCS8qIE1h a2Ugc3VyZSBhbGwgaXJxcyBhcmUgbWFza2VkIGJlZm9yZSByZWdpc3RlcmluZyBvdXIgSVJRIGhh bmRsZXIuICovCj4gKwlyZWdtYXBfd3JpdGUobmZjLT5iYXNlLnNtYywgQVRNRUxfSFNNQ19ORkNf SURSLCAweGZmZmZmZmZmKTsKPiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBuZmMtPmly cSwgYXRtZWxfc2FtYTVfbmZjX2ludGVycnVwdCwKPiArCQkJICAgICAgIElSUUZfU0hBUkVELCAi bmZjIiwgbmZjKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGRldiwKPiArCQkJIkNvdWxk IG5vdCBnZXQgcmVnaXN0ZXIgTkZDIGludGVycnVwdCBoYW5kbGVyIChlcnIgPSAlZClcbiIsCj4g KwkJCXJldCk7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJLyogSW5pdGlhbCBORkMgY29u ZmlndXJhdGlvbi4gKi8KPiArCXJlZ21hcF93cml0ZShuZmMtPmJhc2Uuc21jLCBBVE1FTF9IU01D X05GQ19DRkcsCj4gKwkJICAgICBBVE1FTF9IU01DX05GQ19DRkdfRFRPX01BWCk7Cj4gKwo+ICsJ cmV0ID0gYXRtZWxfbmZjX2FkZF9uYW5kcygmbmZjLT5iYXNlKTsKPiArCWlmIChyZXQpCj4gKwkJ Z290byBlcnI7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtlcnI6Cj4gKwlhdG1lbF9zYW1hNV9u ZmNfcmVtb3ZlKCZuZmMtPmJhc2UpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK2Nv bnN0IHN0cnVjdCBhdG1lbF9uZmNfb3BzIGF0bWVsX3NhbWE1X25mY19vcHMgPSB7Cj4gKwkucHJv YmUgPSBhdG1lbF9zYW1hNV9uZmNfcHJvYmUsCj4gKwkucmVtb3ZlID0gYXRtZWxfc2FtYTVfbmZj X3JlbW92ZSwKPiArCS5lY2NfaW5pdCA9IGF0bWVsX3NhbWE1X25mY19lY2NfaW5pdCwKPiArCS5u YW5kX2luaXQgPSBhdG1lbF9zYW1hNV9uZmNfbmFuZF9pbml0LAo+ICt9Owo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBhdG1lbF9uZmNfY2FwcyBhdG1lbF9zYW1hNV9uZmNfY2FwcyA9IHsKPiAr CS5oYXNfZG1hID0gdHJ1ZSwKPiArCS5hbGVfb2ZmcyA9IDEgPDwgMjEsCj4gKwkuY2xlX29mZnMg PSAxIDw8IDIyLAo+ICsJLm9wcyA9ICZhdG1lbF9zYW1hNV9uZmNfb3BzLAo+ICt9Owo+ICsKPiAr LyogT25seSB1c2VkIHRvIHBhcnNlIG9sZCBiaW5kaW5ncy4gKi8KPiArc3RhdGljIGNvbnN0IHN0 cnVjdCBhdG1lbF9uZmNfY2FwcyBhdG1lbF9zYW1hNV9uYW5kX2NhcHMgPSB7Cj4gKwkuaGFzX2Rt YSA9IHRydWUsCj4gKwkuYWxlX29mZnMgPSAxIDw8IDIxLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAy MiwKPiArCS5vcHMgPSAmYXRtZWxfc2FtYTVfbmZjX29wcywKPiArCS5sZWdhY3lfb2ZfYmluZGlu Z3MgPSB0cnVlLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBhdG1lbF9ybTkyMDBfbmZjX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gKwkJCQkgIGNvbnN0IHN0cnVjdCBhdG1l bF9uZmNfY2FwcyAqY2FwcykKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRl djsKPiArCXN0cnVjdCBhdG1lbF9uZmMgKm5mYzsKPiArCWludCByZXQ7Cj4gKwo+ICsJbmZjID0g ZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpuZmMpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghbmZj KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXJldCA9IGF0bWVsX25mY19pbml0KG5mYywg cGRldiwgY2Fwcyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0dXJu IGF0bWVsX25mY19hZGRfbmFuZHMobmZjKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBhdG1lbF9y bTkyMDBfbmZjX3JlbW92ZShzdHJ1Y3QgYXRtZWxfbmZjICpuZmMpCj4gK3sKPiArCWludCByZXQ7 Cj4gKwo+ICsJcmV0ID0gYXRtZWxfbmZjX3JlbW92ZV9uYW5kcyhuZmMpOwo+ICsJaWYgKHJldCkK PiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWF0bWVsX25mY19jbGVhbnVwKG5mYyk7Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gK2NvbnN0IHN0cnVjdCBhdG1lbF9uZmNfb3BzIGF0bWVsX3Jt OTIwMF9uZmNfb3BzID0gewo+ICsJLnByb2JlID0gYXRtZWxfcm05MjAwX25mY19wcm9iZSwKPiAr CS5yZW1vdmUgPSBhdG1lbF9ybTkyMDBfbmZjX3JlbW92ZSwKPiArCS5lY2NfaW5pdCA9IGF0bWVs X25mY19lY2NfaW5pdCwKPiArCS5uYW5kX2luaXQgPSBhdG1lbF9uZmNfbmFuZF9pbml0LAo+ICt9 Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBhdG1lbF9uZmNfY2FwcyBhdG1lbF9ybTkyMDBf bmZjX2NhcHMgPSB7Cj4gKwkuYWxlX29mZnMgPSAxIDw8IDIxLAo+ICsJLmNsZV9vZmZzID0gMSA8 PCAyMiwKPiArCS5vcHMgPSAmYXRtZWxfcm05MjAwX25mY19vcHMsCj4gK307Cj4gKwo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IGF0bWVsX25mY19jYXBzIGF0bWVsX3NhbTkyNjFfbmZjX2NhcHMgPSB7 Cj4gKwkuYWxlX29mZnMgPSAxIDw8IDIyLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAyMSwKPiArCS5v cHMgPSAmYXRtZWxfcm05MjAwX25mY19vcHMsCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IGF0bWVsX25mY19jYXBzIGF0bWVsX3NhbTlnNDVfbmZjX2NhcHMgPSB7Cj4gKwkuaGFzX2Rt YSA9IHRydWUsCj4gKwkuYWxlX29mZnMgPSAxIDw8IDIxLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAy MiwKPiArCS5vcHMgPSAmYXRtZWxfcm05MjAwX25mY19vcHMsCj4gK307Cj4gKwo+ICsvKiBPbmx5 IHVzZWQgdG8gcGFyc2Ugb2xkIGJpbmRpbmdzLiAqLwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGF0 bWVsX25mY19jYXBzIGF0bWVsX3JtOTIwMF9uYW5kX2NhcHMgPSB7Cj4gKwkuYWxlX29mZnMgPSAx IDw8IDIxLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAyMiwKPiArCS5vcHMgPSAmYXRtZWxfcm05MjAw X25mY19vcHMsCj4gKwkubGVnYWN5X29mX2JpbmRpbmdzID0gdHJ1ZSwKPiArfTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgYXRtZWxfbmZjX2NhcHMgYXRtZWxfc2FtOTI2MV9uYW5kX2NhcHMg PSB7Cj4gKwkuYWxlX29mZnMgPSAxIDw8IDIyLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAyMSwKPiAr CS5vcHMgPSAmYXRtZWxfcm05MjAwX25mY19vcHMsCj4gKwkubGVnYWN5X29mX2JpbmRpbmdzID0g dHJ1ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRtZWxfbmZjX2NhcHMgYXRt ZWxfc2FtOWc0NV9uYW5kX2NhcHMgPSB7Cj4gKwkuaGFzX2RtYSA9IHRydWUsCj4gKwkuYWxlX29m ZnMgPSAxIDw8IDIxLAo+ICsJLmNsZV9vZmZzID0gMSA8PCAyMiwKPiArCS5vcHMgPSAmYXRtZWxf cm05MjAwX25mY19vcHMsCj4gKwkubGVnYWN5X29mX2JpbmRpbmdzID0gdHJ1ZSwKPiArfTsKPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0bWVsX25mY19vZl9pZHNbXSA9 IHsKPiArCXsKPiArCQkuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLW5hbmQtY29udHJv bGxlciIsCj4gKwkJLmRhdGEgPSAmYXRtZWxfcm05MjAwX25mY19jYXBzLAo+ICsJfSwKPiArCXsK PiArCQkuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MS1uYW5kLWNvbnRyb2xsZXIiLAo+ ICsJCS5kYXRhID0gJmF0bWVsX3NhbTkyNjFfbmZjX2NhcHMsCj4gKwl9LAo+ICsJewo+ICsJCS5j b21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05ZzQ1LW5hbmQtY29udHJvbGxlciIsCj4gKwkJLmRh dGEgPSAmYXRtZWxfc2FtOWc0NV9uZmNfY2FwcywKPiArCX0sCj4gKwl7Cj4gKwkJLmNvbXBhdGli bGUgPSAiYXRtZWwsc2FtYTVkMy1uYW5kLWNvbnRyb2xsZXIiLAo+ICsJCS5kYXRhID0gJmF0bWVs X3NhbWE1X25mY19jYXBzLAo+ICsJfSwKPiArCS8qIFN1cHBvcnQgZm9yIG9sZC9kZXByZWNhdGVk IGJpbmRpbmdzOiAqLwo+ICsJewo+ICsJCS5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFybTkyMDAt bmFuZCIsCj4gKwkJLmRhdGEgPSAmYXRtZWxfcm05MjAwX25hbmRfY2FwcywKPiArCX0sCj4gKwl7 Cj4gKwkJLmNvbXBhdGlibGUgPSAiYXRtZWwsc2FtYTVkNC1uYW5kIiwKPiArCQkuZGF0YSA9ICZh dG1lbF9ybTkyMDBfbmFuZF9jYXBzLAo+ICsJfSwKPiArCXsKPiArCQkuY29tcGF0aWJsZSA9ICJh dG1lbCxzYW1hNWQyLW5hbmQiLAo+ICsJCS5kYXRhID0gJmF0bWVsX3JtOTIwMF9uYW5kX2NhcHMs Cj4gKwl9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9LAo+ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RB QkxFKG9mLCBhdG1lbF9uZmNfaWRfdGFibGUpOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2VfaWQgYXRtZWxfbmZjX3BsYXRmb3JtX2lkc1tdID0gewo+ICsJewo+ICsJ CS5uYW1lID0gImF0bWVsX25hbmQiLAo+ICsJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdf dCkmYXRtZWxfcm05MjAwX25mY19jYXBzLAo+ICsJfSwKPiArCXsgLyogc2VudGluZWwgKi8gfQo+ ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBhdG1lbF9uZmNfcGxhdGZvcm1f aWRzKTsKPiArCj4gK3N0YXRpYyBpbnQgYXRtZWxfbmZjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBhdG1lbF9uZmNfY2FwcyAqY2FwczsK PiArCj4gKwlpZiAocGRldi0+aWRfZW50cnkpCj4gKwkJY2FwcyA9ICh2b2lkICopcGRldi0+aWRf ZW50cnktPmRyaXZlcl9kYXRhOwo+ICsJZWxzZQo+ICsJCWNhcHMgPSBvZl9kZXZpY2VfZ2V0X21h dGNoX2RhdGEoJnBkZXYtPmRldik7Cj4gKwo+ICsJaWYgKCFjYXBzKSB7Cj4gKwkJZGV2X2Vycigm cGRldi0+ZGV2LCAiQ291bGQgbm90IHJldHJpZXZlIE5GQyBjYXBzXG4iKTsKPiArCQlyZXR1cm4g LUVJTlZBTDsKPiArCX0KPiArCj4gKwlpZiAoY2Fwcy0+bGVnYWN5X29mX2JpbmRpbmdzICYmIHBk ZXYtPmRldi5vZl9ub2RlKSB7Cj4gKwkJdTMyIGFsZV9vZmZzID0gMjE7Cj4gKwo+ICsJCS8qCj4g KwkJICogSWYgd2UgYXJlIHBhcnNpbmcgbGVnYWN5IERUIHByb3BzIGFuZCB0aGUgRFQgY29udGFp bnMgYQo+ICsJCSAqIHZhbGlkIE5GQyBub2RlLCBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBz YW1hNSBsb2dpYy4KPiArCQkgKi8KPiArCQlpZiAob2ZfZmluZF9jb21wYXRpYmxlX25vZGUocGRl di0+ZGV2Lm9mX25vZGUsIE5VTEwsCj4gKwkJCQkJICAgICJhdG1lbCxzYW1hNWQzLW5mYyIpKQo+ ICsJCQljYXBzID0gJmF0bWVsX3NhbWE1X25hbmRfY2FwczsKPiArCj4gKwkJLyoKPiArCQkgKiBF dmVuIGlmIHRoZSBjb21wYXRpYmxlIHNheXMgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbgo+ICsJCSAq IGF0OTFybTkyMDAgY29udHJvbGxlciwgdGhlIGF0bWVsLG5hbmQtaGFzLWRtYSBzcGVjaWZ5IHRo YXQKPiArCQkgKiB0aGlzIGNvbnRyb2xsZXIgc3VwcG9ydHMgRE1BLCB3aGljaCBtZWFucyB3ZSBh cmUgaW4gZmFjdAo+ICsJCSAqIGRlYWxpbmcgd2l0aCBhbiBhdDkxc2FtOWc0NSsgY29udHJvbGxl ci4KPiArCQkgKi8KPiArCQlpZiAoIWNhcHMtPmhhc19kbWEgJiYKPiArCQkgICAgb2ZfcHJvcGVy dHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAo+ICsJCQkJCSAgImF0bWVsLG5hbmQtaGFz LWRtYSIpKQo+ICsJCQljYXBzID0gJmF0bWVsX3NhbTlnNDVfbmFuZF9jYXBzOwo+ICsKPiArCQkv Kgo+ICsJCSAqIEFsbCBTb0NzIGV4Y2VwdCB0aGUgYXQ5MXNhbTkyNjEgYXJlIGFzc2lnbmluZyBB TEUgdG8gQTIxIGFuZAo+ICsJCSAqIENMRSB0byBBMjIuIElmIGF0bWVsLG5hbmQtYWRkci1vZmZz ZXQgIT0gMjEgdGhpcyBtZWFucyB3ZSdyZQo+ICsJCSAqIGFjdHVhbGx5IGRlYWxpbmcgd2l0aCBh biBhdDkxc2FtOTI2MSBjb250cm9sbGVyLgo+ICsJCSAqLwo+ICsJCW9mX3Byb3BlcnR5X3JlYWRf dTMyKHBkZXYtPmRldi5vZl9ub2RlLAo+ICsJCQkJICAgICAiYXRtZWwsbmFuZC1hZGRyLW9mZnNl dCIsICZhbGVfb2Zmcyk7Cj4gKwkJaWYgKGFsZV9vZmZzICE9IDIxKQo+ICsJCQljYXBzID0gJmF0 bWVsX3NhbTkyNjFfbmFuZF9jYXBzOwo+ICsJfQo+ICsKPiArCXJldHVybiBjYXBzLT5vcHMtPnBy b2JlKHBkZXYsIGNhcHMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVsX25mY19yZW1vdmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGF0bWVsX25mYyAq bmZjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJcmV0dXJuIG5mYy0+Y2Fw cy0+b3BzLT5yZW1vdmUobmZjKTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgYXRtZWxfbmZjX2RyaXZlciA9IHsKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUgPSAi YXRtZWwtbmFuZC1jb250cm9sbGVyIiwKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9w dHIoYXRtZWxfbmZjX29mX2lkcyksCj4gKwl9LAo+ICsJLnByb2JlID0gYXRtZWxfbmZjX3Byb2Jl LAo+ICsJLnJlbW92ZSA9IGF0bWVsX25mY19yZW1vdmUsCj4gKwkuaWRfdGFibGUgPSBhdG1lbF9u ZmNfcGxhdGZvcm1faWRzCj4gK307Cj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXRtZWxfbmZj X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gK01PRFVMRV9BVVRIT1Io IkJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsK PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EIEZsYXNoIENvbnRyb2xsZXIgZHJpdmVyIGZvciBB dG1lbCBTb0NzIik7Cj4gK01PRFVMRV9BTElBUygicGxhdGZvcm06YXRtZWwtbmFuZC1jb250cm9s bGVyIik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXRtZWwvcG1lY2MuYyBiL2Ry aXZlcnMvbXRkL25hbmQvYXRtZWwvcG1lY2MuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMDAwMDAwLi45YmFjY2FlNWQ1YTUKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJp dmVycy9tdGQvbmFuZC9hdG1lbC9wbWVjYy5jCj4gQEAgLTAsMCArMSwxMDExIEBACj4gKy8qCj4g KyAqIMKpIENvcHlyaWdodCAyMDE2IEFUTUVMCj4gKyAqIMKpIENvcHlyaWdodCAyMDE2IEZyZWUg RWxlY3Ryb25zCgpEaXR0byBhYm91dCAoYykKCj4gKyAqCj4gKyAqIEF1dGhvcjogQm9yaXMgQnJl emlsbG9uIDxib3Jpcy5icmV6aWxsb25AZnJlZS1lbGVjdHJvbnMuY29tPgo+ICsgKgo+ICsgKiBE ZXJpdmVkIGZyb20gdGhlIGF0bWVsX25hbmQuYyBkcml2ZXIgd2hpY2ggY29udGFpbmVkIHRoZSBm b2xsb3dpbmcKPiArICogY29weXJpZ2h0czoKPiArICoKPiArICogICAgQ29weXJpZ2h0IMKpIDIw MDMgUmljayBCcm9uc29uCj4gKyAqCj4gKyAqICAgIERlcml2ZWQgZnJvbSBkcml2ZXJzL210ZC9u YW5kL2F1dGNwdTEyLmMKPiArICogICAgICAgIENvcHlyaWdodCDCqSAyMDAxIFRob21hcyBHbGVp eG5lciAoZ2xlaXhuZXJAYXV0cm9uaXguZGUpCj4gKyAqCj4gKyAqICAgIERlcml2ZWQgZnJvbSBk cml2ZXJzL210ZC9zcGlhLmMKPiArICogICAgICAgIENvcHlyaWdodCDCqSAyMDAwIFN0ZXZlbiBK LiBIaWxsIChzamhpbGxAY290dy5jb20pCj4gKyAqCj4gKyAqCj4gKyAqICAgIEFkZCBIYXJkd2Fy ZSBFQ0Mgc3VwcG9ydCBmb3IgQVQ5MVNBTTkyNjAgLyBBVDkxU0FNOTI2Mwo+ICsgKiAgICAgICAg UmljaGFyZCBHZW5vdWQgKHJpY2hhcmQuZ2Vub3VkQGdtYWlsLmNvbSksIEFkZW5lbyBDb3B5cmln aHQgwqkgMjAwNwo+ICsgKgo+ICsgKiAgICAgICAgRGVyaXZlZCBmcm9tIERhcyBVLUJvb3Qgc291 cmNlIGNvZGUKPiArICogICAgICAgICAgICAgICh1LWJvb3QtMS4xLjUvYm9hcmQvYXRtZWwvYXQ5 MXNhbTkyNjNlay9uYW5kLmMpCj4gKyAqICAgICAgICDCqSBDb3B5cmlnaHQgMjAwNiBBVE1FTCBS b3Vzc2V0LCBMYWNyZXNzb25uaWVyZSBOaWNvbGFzCj4gKyAqCj4gKyAqICAgIEFkZCBQcm9ncmFt bWFibGUgTXVsdGliaXQgRUNDIHN1cHBvcnQgZm9yIHZhcmlvdXMgQVQ5MSBTb0MKPiArICogICAg ICAgIMKpIENvcHlyaWdodCAyMDEyIEFUTUVMLCBIb25nIFh1Cj4gKyAqCj4gKyAqICAgIEFkZCBO YW5kIEZsYXNoIENvbnRyb2xsZXIgc3VwcG9ydCBmb3IgU0FNQTUgU29DCj4gKyAqICAgICAgICDC qSBDb3B5cmlnaHQgMjAxMyBBVE1FTCwgSm9zaCBXdSAoam9zaC53dUBhdG1lbC5jb20pCj4gKyAq Cj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCj4gKyAqIHB1Ymxpc2hlZCBieSB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxs aW51eC9nZW5hbGxvYy5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9vZl9pcnEuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3Ns YWIuaD4KPiArCj4gKyNpbmNsdWRlICJwbWVjYy5oIgo+ICsKPiArLyogR2Fsb2lzIGZpZWxkIGRp bWVuc2lvbiAqLwo+ICsjZGVmaW5lIFBNRUNDX0dGX0RJTUVOU0lPTl8xMwkJCTEzCj4gKyNkZWZp bmUgUE1FQ0NfR0ZfRElNRU5TSU9OXzE0CQkJMTQKPiArCj4gKy8qIFByaW1pdGl2ZSBQb2x5bm9t aWFsIHVzZWQgYnkgUE1FQ0MgKi8KPiArI2RlZmluZSBQTUVDQ19HRl8xM19QUklNSVRJVkVfUE9M WQkJMHgyMDFiCj4gKyNkZWZpbmUgUE1FQ0NfR0ZfMTRfUFJJTUlUSVZFX1BPTFkJCTB4NDQ0Mwo+ ICsKPiArI2RlZmluZSBQTUVDQ19MT09LVVBfVEFCTEVfU0laRV81MTIJCTB4MjAwMAo+ICsjZGVm aW5lIFBNRUNDX0xPT0tVUF9UQUJMRV9TSVpFXzEwMjQJCTB4NDAwMAo+ICsKPiArLyogVGltZSBv dXQgdmFsdWUgZm9yIHJlYWRpbmcgUE1FQ0Mgc3RhdHVzIHJlZ2lzdGVyICovCj4gKyNkZWZpbmUg UE1FQ0NfTUFYX1RJTUVPVVRfTVMJCQkxMDAKPiArCj4gKy8qIFBNRUNDIFJlZ2lzdGVyIERlZmlu aXRpb25zICovCj4gKyNkZWZpbmUgQVRNRUxfUE1FQ0NfQ0ZHCQkJCTB4MAo+ICsjZGVmaW5lIFBN RUNDX0NGR19CQ0hfU1RSRU5HVEgoeCkJCSh4KQo+ICsjZGVmaW5lIFBNRUNDX0NGR19CQ0hfU1RS RU5HVEhfTUFTSwkJR0VOTUFTSygyLCAwKQo+ICsjZGVmaW5lIFBNRUNDX0NGR19TRUNUT1I1MTIJ CQkoMCA8PCA0KQo+ICsjZGVmaW5lIFBNRUNDX0NGR19TRUNUT1IxMDI0CQkJKDEgPDwgNCkKPiAr I2RlZmluZSBQTUVDQ19DRkdfTlNFQ1RPUlMoeCkJCQkoKGZscyh4KSAtIDEpIDw8IDgpCj4gKyNk ZWZpbmUgUE1FQ0NfQ0ZHX1JFQURfT1AJCQkoMCA8PCAxMikKPiArI2RlZmluZSBQTUVDQ19DRkdf V1JJVEVfT1AJCQkoMSA8PCAxMikKPiArI2RlZmluZSBQTUVDQ19DRkdfU1BBUkVfRU5BQkxFCQkJ QklUKDE2KQo+ICsjZGVmaW5lIFBNRUNDX0NGR19BVVRPX0VOQUJMRQkJCUJJVCgyMCkKPiArCj4g KyNkZWZpbmUgQVRNRUxfUE1FQ0NfU0FSRUEJCQkweDQKPiArI2RlZmluZSBBVE1FTF9QTUVDQ19T QUREUgkJCTB4OAo+ICsjZGVmaW5lIEFUTUVMX1BNRUNDX0VBRERSCQkJMHhjCj4gKwo+ICsjZGVm aW5lIEFUTUVMX1BNRUNDX0NMSwkJCQkweDEwCj4gKyNkZWZpbmUgUE1FQ0NfQ0xLXzEzM01IWgkJ CSgyIDw8IDApCj4gKwo+ICsjZGVmaW5lIEFUTUVMX1BNRUNDX0NUUkwJCQkweDE0Cj4gKyNkZWZp bmUgUE1FQ0NfQ1RSTF9SU1QJCQkJQklUKDApCj4gKyNkZWZpbmUgUE1FQ0NfQ1RSTF9EQVRBCQkJ CUJJVCgxKQo+ICsjZGVmaW5lIFBNRUNDX0NUUkxfVVNFUgkJCQlCSVQoMikKPiArI2RlZmluZSBQ TUVDQ19DVFJMX0VOQUJMRQkJCUJJVCg0KQo+ICsjZGVmaW5lIFBNRUNDX0NUUkxfRElTQUJMRQkJ CUJJVCg1KQo+ICsKPiArI2RlZmluZSBBVE1FTF9QTUVDQ19TUgkJCQkweDE4Cj4gKyNkZWZpbmUg UE1FQ0NfU1JfQlVTWQkJCQlCSVQoMCkKPiArI2RlZmluZSBQTUVDQ19TUl9FTkFCTEUJCQkJQklU KDQpCj4gKwo+ICsjZGVmaW5lIEFUTUVMX1BNRUNDX0lFUgkJCQkweDFjCj4gKyNkZWZpbmUgQVRN RUxfUE1FQ0NfSURSCQkJCTB4MjAKPiArI2RlZmluZSBBVE1FTF9QTUVDQ19JTVIJCQkJMHgyNAo+ ICsjZGVmaW5lIEFUTUVMX1BNRUNDX0lTUgkJCQkweDI4Cj4gKyNkZWZpbmUgUE1FQ0NfRVJST1Jf SU5UCQkJCUJJVCgwKQo+ICsKPiArI2RlZmluZSBBVE1FTF9QTUVDQ19FQ0Moc2VjdG9yLCBuKQkJ XAo+ICsJKCgoKHNlY3RvcikgKyAxKSAqIDB4NDApICsgKG4pKQo+ICsKPiArI2RlZmluZSBBVE1F TF9QTUVDQ19SRU0oc2VjdG9yLCBuKQkJXAo+ICsJKCgoKHNlY3RvcikgKyAxKSAqIDB4NDApICsg KChuKSAqIDQpICsgMHgyMDApCj4gKwo+ICsvKiBQTUVSUkxPQyBSZWdpc3RlciBEZWZpbml0aW9u cyAqLwo+ICsjZGVmaW5lIEFUTUVMX1BNRVJSTE9DX0VMQ0ZHCQkJMHgwCj4gKyNkZWZpbmUgUE1F UlJMT0NfRUxDRkdfU0VDVE9SXzUxMgkJKDAgPDwgMCkKPiArI2RlZmluZSBQTUVSUkxPQ19FTENG R19TRUNUT1JfMTAyNAkJKDEgPDwgMCkKPiArI2RlZmluZSBQTUVSUkxPQ19FTENGR19OVU1fRVJS T1JTKG4pCQkoKG4pIDw8IDE2KQo+ICsKPiArI2RlZmluZSBBVE1FTF9QTUVSUkxPQ19FTFBSSU0J CQkweDQKPiArI2RlZmluZSBBVE1FTF9QTUVSUkxPQ19FTEVOCQkJMHg4Cj4gKyNkZWZpbmUgQVRN RUxfUE1FUlJMT0NfRUxESVMJCQkweGMKPiArI2RlZmluZSBQTUVSUkxPQ19ESVNBQkxFCQkJQklU KDApCj4gKwo+ICsjZGVmaW5lIEFUTUVMX1BNRVJSTE9DX0VMU1IJCQkweDEwCj4gKyNkZWZpbmUg UE1FUlJMT0NfRUxTUl9CVVNZCQkJQklUKDApCj4gKwo+ICsjZGVmaW5lIEFUTUVMX1BNRVJSTE9D X0VMSUVSCQkJMHgxNAo+ICsjZGVmaW5lIEFUTUVMX1BNRVJSTE9DX0VMSURSCQkJMHgxOAo+ICsj ZGVmaW5lIEFUTUVMX1BNRVJSTE9DX0VMSU1SCQkJMHgxYwo+ICsjZGVmaW5lIEFUTUVMX1BNRVJS TE9DX0VMSVNSCQkJMHgyMAo+ICsjZGVmaW5lIFBNRVJSTE9DX0VSUl9OVU1fTUFTSwkJCUdFTk1B U0soMTIsIDgpCj4gKyNkZWZpbmUgUE1FUlJMT0NfQ0FMQ19ET05FCQkJQklUKDApCj4gKwo+ICsj ZGVmaW5lIEFUTUVMX1BNRVJSTE9DX1NJR01BKHgpCQkJKCgoeCkgKiAweDQpICsgMHgyOCkKPiAr Cj4gKyNkZWZpbmUgQVRNRUxfUE1FUlJMT0NfRUwob2ZmcywgeCkJCSgoKHgpICogMHg0KSArIChv ZmZzKSkKPiArCj4gK3N0cnVjdCBhdG1lbF9wbWVjY19nZl90YWJsZXMgewo+ICsJdTE2ICphbHBo YV90bzsKPiArCXUxNiAqaW5kZXhfb2Y7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfcG1lY2Nf Y2FwcyB7Cj4gKwljb25zdCBpbnQgKnN0cmVuZ3RoczsKPiArCWludCBuc3RyZW5ndGhzOwo+ICsJ aW50IGVsX29mZnNldDsKPiArCWJvb2wgY29ycmVjdF9lcmFzZWRfY2h1bmtzOwo+ICt9Owo+ICsK PiArc3RydWN0IGF0bWVsX3BtZWNjIHsKPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCWNvbnN0 IHN0cnVjdCBhdG1lbF9wbWVjY19jYXBzICpjYXBzOwo+ICsKPiArCXN0cnVjdCB7Cj4gKwkJdm9p ZCBfX2lvbWVtICpiYXNlOwo+ICsJCXZvaWQgX19pb21lbSAqZXJybG9jOwo+ICsJfSByZWdzOwo+ ICsKPiArCXN0cnVjdCBtdXRleCBsb2NrOwo+ICt9Owo+ICsKPiArc3RydWN0IGF0bWVsX3BtZWNj X3VzZXJfY29uZl9jYWNoZSB7Cj4gKwl1MzIgY2ZnOwo+ICsJdTMyIHNhcmVhOwo+ICsJdTMyIHNh ZGRyOwo+ICsJdTMyIGVhZGRyOwo+ICt9Owo+ICsKPiArc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIg ewo+ICsJc3RydWN0IGF0bWVsX3BtZWNjX3VzZXJfY29uZl9jYWNoZSBjYWNoZTsKPiArCXN0cnVj dCBhdG1lbF9wbWVjYyAqcG1lY2M7Cj4gKwljb25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfZ2ZfdGFi bGVzICpnZl90YWJsZXM7Cj4gKwlpbnQgZWNjYnl0ZXM7Cj4gKwlzMTYgKnBhcnRpYWxfc3luOwo+ ICsJczE2ICpzaTsKPiArCXMxNiAqbG11Owo+ICsJczE2ICpzbXU7Cj4gKwlzMzIgKm11Owo+ICsJ czMyICpkbXU7Cj4gKwlzMzIgKmRlbHRhOwo+ICsJdTMyIGlzcjsKPiArfTsKPiArCj4gK3N0YXRp YyBERUZJTkVfTVVURVgocG1lY2NfZ2ZfdGFibGVzX2xvY2spOwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IGF0bWVsX3BtZWNjX2dmX3RhYmxlcyAqcG1lY2NfZ2ZfdGFibGVzXzUxMjsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBhdG1lbF9wbWVjY19nZl90YWJsZXMgKnBtZWNjX2dmX3RhYmxlc18xMDI0 Owo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgZGVnKHVuc2lnbmVkIGludCBwb2x5KQo+ICt7Cj4g KwkvKiBwb2x5bm9taWFsIGRlZ3JlZSBpcyB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgaW5kZXgg Ki8KPiArCXJldHVybiBmbHMocG9seSkgLSAxOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGF0bWVs X3BtZWNjX2J1aWxkX2dmX3RhYmxlcyhpbnQgbW0sIHVuc2lnbmVkIGludCBwb2x5LAo+ICsJCQkJ ICAgICAgIHN0cnVjdCBhdG1lbF9wbWVjY19nZl90YWJsZXMgKmdmX3RhYmxlcykKPiArewo+ICsJ dW5zaWduZWQgaW50IGksIHggPSAxOwo+ICsJY29uc3QgdW5zaWduZWQgaW50IGsgPSAxIDw8IGRl Zyhwb2x5KTsKPiArCXVuc2lnbmVkIGludCBubiA9ICgxIDw8IG1tKSAtIDE7Cj4gKwo+ICsJLyog cHJpbWl0aXZlIHBvbHlub21pYWwgbXVzdCBiZSBvZiBkZWdyZWUgbSAqLwo+ICsJaWYgKGsgIT0g KDF1IDw8IG1tKSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwg bm47IGkrKykgewo+ICsJCWdmX3RhYmxlcy0+YWxwaGFfdG9baV0gPSB4Owo+ICsJCWdmX3RhYmxl cy0+aW5kZXhfb2ZbeF0gPSBpOwo+ICsJCWlmIChpICYmICh4ID09IDEpKQo+ICsJCQkvKiBwb2x5 bm9taWFsIGlzIG5vdCBwcmltaXRpdmUgKGFeaT0xIHdpdGggMDxpPDJebS0xKSAqLwo+ICsJCQly ZXR1cm4gLUVJTlZBTDsKPiArCQl4IDw8PSAxOwo+ICsJCWlmICh4ICYgaykKPiArCQkJeCBePSBw b2x5Owo+ICsJfQo+ICsJZ2ZfdGFibGVzLT5hbHBoYV90b1tubl0gPSAxOwo+ICsJZ2ZfdGFibGVz LT5pbmRleF9vZlswXSA9IDA7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfZ2ZfdGFibGVzICoKPiArYXRtZWxfcG1lY2NfY3JlYXRl X2dmX3RhYmxlcyhjb25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlcl9yZXEgKnJlcSkKPiArewo+ ICsJc3RydWN0IGF0bWVsX3BtZWNjX2dmX3RhYmxlcyAqZ2ZfdGFibGVzOwo+ICsJdW5zaWduZWQg aW50IHBvbHksIGRlZ3JlZSwgdGFibGVfc2l6ZTsKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKHJl cS0+ZWNjLnNlY3RvcnNpemUgPT0gNTEyKSB7Cj4gKwkJZGVncmVlID0gUE1FQ0NfR0ZfRElNRU5T SU9OXzEzOwo+ICsJCXBvbHkgPSBQTUVDQ19HRl8xM19QUklNSVRJVkVfUE9MWTsKPiArCQl0YWJs ZV9zaXplID0gUE1FQ0NfTE9PS1VQX1RBQkxFX1NJWkVfNTEyOwo+ICsJfSBlbHNlIHsKPiArCQlk ZWdyZWUgPSBQTUVDQ19HRl9ESU1FTlNJT05fMTQ7Cj4gKwkJcG9seSA9IFBNRUNDX0dGXzE0X1BS SU1JVElWRV9QT0xZOwo+ICsJCXRhYmxlX3NpemUgPSBQTUVDQ19MT09LVVBfVEFCTEVfU0laRV8x MDI0Owo+ICsJfQo+ICsKPiArCWdmX3RhYmxlcyA9IGt6YWxsb2Moc2l6ZW9mKCpnZl90YWJsZXMp ICsKPiArCQkJICAgICgyICogdGFibGVfc2l6ZSAqIHNpemVvZih1MTYpKSwKPiArCQkJICAgIEdG UF9LRVJORUwpOwo+ICsJaWYgKCFnZl90YWJsZXMpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01F TSk7Cj4gKwo+ICsJZ2ZfdGFibGVzLT5hbHBoYV90byA9ICh2b2lkICopKGdmX3RhYmxlcyArIDEp Owo+ICsJZ2ZfdGFibGVzLT5pbmRleF9vZiA9IGdmX3RhYmxlcy0+YWxwaGFfdG8gKyB0YWJsZV9z aXplOwo+ICsKPiArCXJldCA9IGF0bWVsX3BtZWNjX2J1aWxkX2dmX3RhYmxlcyhkZWdyZWUsIHBv bHksIGdmX3RhYmxlcyk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJa2ZyZWUoZ2ZfdGFibGVzKTsKPiAr CQlyZXR1cm4gRVJSX1BUUihyZXQpOwo+ICsJfQo+ICsKPiArCXJldHVybiBnZl90YWJsZXM7Cj4g K30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfZ2ZfdGFibGVzICoKPiAr YXRtZWxfcG1lY2NfZ2V0X2dmX3RhYmxlcyhjb25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlcl9y ZXEgKnJlcSkKPiArewo+ICsJY29uc3Qgc3RydWN0IGF0bWVsX3BtZWNjX2dmX3RhYmxlcyAqKmdm X3RhYmxlcywgKnJldDsKPiArCj4gKwltdXRleF9sb2NrKCZwbWVjY19nZl90YWJsZXNfbG9jayk7 Cj4gKwlpZiAocmVxLT5lY2Muc2VjdG9yc2l6ZSA9PSA1MTIpCj4gKwkJZ2ZfdGFibGVzID0gJnBt ZWNjX2dmX3RhYmxlc181MTI7Cj4gKwllbHNlCj4gKwkJZ2ZfdGFibGVzID0gJnBtZWNjX2dmX3Rh Ymxlc18xMDI0Owo+ICsKPiArCXJldCA9ICpnZl90YWJsZXM7Cj4gKwo+ICsJaWYgKCFyZXQpIHsK PiArCQlyZXQgPSBhdG1lbF9wbWVjY19jcmVhdGVfZ2ZfdGFibGVzKHJlcSk7Cj4gKwkJaWYgKCFJ U19FUlIocmV0KSkKPiArCQkJKmdmX3RhYmxlcyA9IHJldDsKPiArCX0KPiArCW11dGV4X3VubG9j aygmcG1lY2NfZ2ZfdGFibGVzX2xvY2spOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgYXRtZWxfcG1lY2NfcHJlcGFyZV91c2VyX3JlcShzdHJ1Y3QgYXRtZWxfcG1l Y2MgKnBtZWNjLAo+ICsJCQkJCXN0cnVjdCBhdG1lbF9wbWVjY191c2VyX3JlcSAqcmVxKQo+ICt7 Cj4gKwlpbnQgaSwgbWF4X2VjY2J5dGVzLCBlY2NieXRlcyA9IDAsIGVjY3N0cmVuZ3RoID0gMDsK PiArCj4gKwlpZiAocmVxLT5wYWdlc2l6ZSA8PSAwIHx8IHJlcS0+b29ic2l6ZSA8PSAwIHx8IHJl cS0+ZWNjLmJ5dGVzIDw9IDApCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYgKHJlcS0+ ZWNjLm9vYm9mZnNldCA+PSAwICYmCj4gKwkgICAgcmVxLT5lY2Mub29ib2Zmc2V0ICsgcmVxLT5l Y2MuYnl0ZXMgPiByZXEtPm9vYnNpemUpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYg KHJlcS0+ZWNjLnNlY3RvcnNpemUgPT0gQVRNRUxfUE1FQ0NfU0VDVE9SX1NJWkVfQVVUTykgewo+ ICsJCWlmIChyZXEtPmVjYy5zdHJlbmd0aCAhPSBBVE1FTF9QTUVDQ19NQVhJTUlaRV9FQ0NfU1RS RU5HVEgpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCQlpZiAocmVxLT5wYWdlc2l6ZSA+ IDUxMikKPiArCQkJcmVxLT5lY2Muc2VjdG9yc2l6ZSA9IDEwMjQ7Cj4gKwkJZWxzZQo+ICsJCQly ZXEtPmVjYy5zZWN0b3JzaXplID0gNTEyOwo+ICsJfQo+ICsKPiArCWlmIChyZXEtPmVjYy5zZWN0 b3JzaXplICE9IDUxMiAmJiByZXEtPmVjYy5zZWN0b3JzaXplICE9IDEwMjQpCj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gKwo+ICsJaWYgKHJlcS0+cGFnZXNpemUgJSByZXEtPmVjYy5zZWN0b3JzaXpl KQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXJlcS0+ZWNjLm5zZWN0b3JzID0gcmVxLT5w YWdlc2l6ZSAvIHJlcS0+ZWNjLnNlY3RvcnNpemU7Cj4gKwo+ICsJbWF4X2VjY2J5dGVzID0gcmVx LT5lY2MuYnl0ZXM7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHBtZWNjLT5jYXBzLT5uc3RyZW5n dGhzOyBpKyspIHsKPiArCQlpbnQgbmJ5dGVzLCBzdHJlbmd0aCA9IHBtZWNjLT5jYXBzLT5zdHJl bmd0aHNbaV07Cj4gKwo+ICsJCWlmIChyZXEtPmVjYy5zdHJlbmd0aCAhPSBBVE1FTF9QTUVDQ19N QVhJTUlaRV9FQ0NfU1RSRU5HVEggJiYKPiArCQkgICAgc3RyZW5ndGggPCByZXEtPmVjYy5zdHJl bmd0aCkKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCW5ieXRlcyA9IERJVl9ST1VORF9VUChzdHJl bmd0aCAqIGZscyg4ICogcmVxLT5lY2Muc2VjdG9yc2l6ZSksCj4gKwkJCQkgICAgICA4KTsKPiAr CQluYnl0ZXMgKj0gcmVxLT5lY2MubnNlY3RvcnM7Cj4gKwo+ICsJCWlmIChuYnl0ZXMgPiBtYXhf ZWNjYnl0ZXMpCj4gKwkJCWJyZWFrOwo+ICsKPiArCQllY2NzdHJlbmd0aCA9IHN0cmVuZ3RoOwo+ ICsJCWVjY2J5dGVzID0gbmJ5dGVzOwo+ICsKPiArCQlpZiAocmVxLT5lY2Muc3RyZW5ndGggIT0g QVRNRUxfUE1FQ0NfTUFYSU1JWkVfRUNDX1NUUkVOR1RIKQo+ICsJCQlicmVhazsKPiArCX0KPiAr Cj4gKwlpZiAoIWVjY3N0cmVuZ3RoKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXJlcS0+ ZWNjLmJ5dGVzID0gZWNjYnl0ZXM7Cj4gKwlyZXEtPmVjYy5zdHJlbmd0aCA9IGVjY3N0cmVuZ3Ro Owo+ICsKPiArCWlmIChyZXEtPmVjYy5vb2JvZmZzZXQgPCAwKQo+ICsJCXJlcS0+ZWNjLm9vYm9m ZnNldCA9IHJlcS0+b29ic2l6ZSAtIGVjY2J5dGVzOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlciAqCj4gK2F0bWVsX3BtZWNjX2NyZWF0ZV91c2Vy KHN0cnVjdCBhdG1lbF9wbWVjYyAqcG1lY2MsCj4gKwkJCXN0cnVjdCBhdG1lbF9wbWVjY191c2Vy X3JlcSAqcmVxKQo+ICt7Cj4gKwlzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlciAqdXNlcjsKPiArCWNv bnN0IHN0cnVjdCBhdG1lbF9wbWVjY19nZl90YWJsZXMgKmdmX3RhYmxlczsKPiArCWludCBzdHJl bmd0aCwgc2l6ZSwgcmV0Owo+ICsKPiArCXJldCA9IGF0bWVsX3BtZWNjX3ByZXBhcmVfdXNlcl9y ZXEocG1lY2MsIHJlcSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiBFUlJfUFRSKHJldCk7Cj4g Kwo+ICsJc2l6ZSA9IHNpemVvZigqdXNlcik7Cj4gKwlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9m KHUxNikpOwo+ICsJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgcGFydGlhbF9zeW4sIHNpIGFuZCBzbXUg Ki8KPiArCXNpemUgKz0gKCgyICogcmVxLT5lY2Muc3RyZW5ndGgpICsgMSkgKiBzaXplb2YodTE2 KSAqCj4gKwkJKDIgKyByZXEtPmVjYy5zdHJlbmd0aCArIDIpOwo+ICsJLyogUmVzZXJ2ZSBzcGFj ZSBmb3IgbG11LiAqLwo+ICsJc2l6ZSArPSAocmVxLT5lY2Muc3RyZW5ndGggKyAxKSAqIHNpemVv Zih1MTYpOwo+ICsJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgbXUsIGRtdSBhbmQgZGVsdGEuICovCj4g KwlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9mKHMzMikpOwo+ICsJc2l6ZSArPSAocmVxLT5lY2Mu c3RyZW5ndGggKyAxKSAqIHNpemVvZihzMzIpOwo+ICsKPiArCXVzZXIgPSBremFsbG9jKHNpemUs IEdGUF9LRVJORUwpOwo+ICsJaWYgKCF1c2VyKQo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0p Owo+ICsKPiArCXVzZXItPnBtZWNjID0gcG1lY2M7Cj4gKwo+ICsJdXNlci0+cGFydGlhbF9zeW4g PSAodTE2ICopUFRSX0FMSUdOKHVzZXIgKyAxLCBzaXplb2YodTE2KSk7Cj4gKwl1c2VyLT5zaSA9 IHVzZXItPnBhcnRpYWxfc3luICsgKCgyICogcmVxLT5lY2Muc3RyZW5ndGgpICsgMSk7Cj4gKwl1 c2VyLT5sbXUgPSB1c2VyLT5zaSArICgoMiAqIHJlcS0+ZWNjLnN0cmVuZ3RoKSArIDEpOwo+ICsJ dXNlci0+c211ID0gdXNlci0+bG11ICsgKHJlcS0+ZWNjLnN0cmVuZ3RoICsgMSk7Cj4gKwl1c2Vy LT5tdSA9IChzMzIgKilQVFJfQUxJR04odXNlci0+c211ICsKPiArCQkJCSAgICAoKCgyICogcmVx LT5lY2Muc3RyZW5ndGgpICsgMSkgKgo+ICsJCQkJICAgICAocmVxLT5lY2Muc3RyZW5ndGggKyAy KSksCj4gKwkJCQkgICAgc2l6ZW9mKHMzMikpOwo+ICsJdXNlci0+ZG11ID0gdXNlci0+bXUgKyBy ZXEtPmVjYy5zdHJlbmd0aCArIDE7Cj4gKwl1c2VyLT5kZWx0YSA9IHVzZXItPmRtdSArIHJlcS0+ ZWNjLnN0cmVuZ3RoICsgMTsKPiArCj4gKwlnZl90YWJsZXMgPSBhdG1lbF9wbWVjY19nZXRfZ2Zf dGFibGVzKHJlcSk7Cj4gKwlpZiAoSVNfRVJSKGdmX3RhYmxlcykpIHsKPiArCQlrZnJlZSh1c2Vy KTsKPiArCQlyZXR1cm4gRVJSX0NBU1QoZ2ZfdGFibGVzKTsKPiArCX0KPiArCj4gKwl1c2VyLT5n Zl90YWJsZXMgPSBnZl90YWJsZXM7Cj4gKwo+ICsJdXNlci0+ZWNjYnl0ZXMgPSByZXEtPmVjYy5i eXRlcyAvIHJlcS0+ZWNjLm5zZWN0b3JzOwo+ICsKPiArCWZvciAoc3RyZW5ndGggPSAwOyBzdHJl bmd0aCA8IHBtZWNjLT5jYXBzLT5uc3RyZW5ndGhzOyBzdHJlbmd0aCsrKSB7Cj4gKwkJaWYgKHBt ZWNjLT5jYXBzLT5zdHJlbmd0aHNbc3RyZW5ndGhdID09IHJlcS0+ZWNjLnN0cmVuZ3RoKQo+ICsJ CQlicmVhazsKPiArCX0KPiArCj4gKwl1c2VyLT5jYWNoZS5jZmcgPSBQTUVDQ19DRkdfQkNIX1NU UkVOR1RIKHN0cmVuZ3RoKSB8Cj4gKwkJCSAgUE1FQ0NfQ0ZHX05TRUNUT1JTKHJlcS0+ZWNjLm5z ZWN0b3JzKTsKPiArCj4gKwlpZiAocmVxLT5lY2Muc2VjdG9yc2l6ZSA9PSAxMDI0KQo+ICsJCXVz ZXItPmNhY2hlLmNmZyB8PSBQTUVDQ19DRkdfU0VDVE9SMTAyNDsKPiArCj4gKwl1c2VyLT5jYWNo ZS5zYXJlYSA9IHJlcS0+b29ic2l6ZSAtIDE7Cj4gKwl1c2VyLT5jYWNoZS5zYWRkciA9IHJlcS0+ ZWNjLm9vYm9mZnNldDsKPiArCXVzZXItPmNhY2hlLmVhZGRyID0gcmVxLT5lY2Mub29ib2Zmc2V0 ICsgcmVxLT5lY2MuYnl0ZXMgLSAxOwo+ICsKPiArCXJldHVybiB1c2VyOwo+ICt9Cj4gK0VYUE9S VF9TWU1CT0xfR1BMKGF0bWVsX3BtZWNjX2NyZWF0ZV91c2VyKTsKPiArCj4gK3ZvaWQgYXRtZWxf cG1lY2NfZGVzdHJveV91c2VyKHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyKQo+ICt7Cj4g KwlrZnJlZSh1c2VyKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChhdG1lbF9wbWVjY19kZXN0 cm95X3VzZXIpOwo+ICsKPiArc3RhdGljIGludCBnZXRfc3RyZW5ndGgoc3RydWN0IGF0bWVsX3Bt ZWNjX3VzZXIgKnVzZXIpCj4gK3sKPiArCWNvbnN0IGludCAqc3RyZW5ndGhzID0gdXNlci0+cG1l Y2MtPmNhcHMtPnN0cmVuZ3RoczsKPiArCj4gKwlyZXR1cm4gc3RyZW5ndGhzW3VzZXItPmNhY2hl LmNmZyAmIFBNRUNDX0NGR19CQ0hfU1RSRU5HVEhfTUFTS107Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZ2V0X3NlY3RvcnNpemUoc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIpCj4gK3sKPiAr CXJldHVybiB1c2VyLT5jYWNoZS5jZmcgJiBQTUVDQ19MT09LVVBfVEFCTEVfU0laRV8xMDI0ID8g MTAyNCA6IDUxMjsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXRtZWxfcG1lY2NfZ2VuX3N5bmRy b21lKHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyLCBpbnQgc2VjdG9yKQo+ICt7Cj4gKwlp bnQgc3RyZW5ndGggPSBnZXRfc3RyZW5ndGgodXNlcik7Cj4gKwl1MzIgdmFsdWU7Cj4gKwlpbnQg aTsKPiArCj4gKwkvKiBGaWxsIG9kZCBzeW5kcm9tZXMgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBz dHJlbmd0aDsgaSsrKSB7Cj4gKwkJdmFsdWUgPSByZWFkbF9yZWxheGVkKHVzZXItPnBtZWNjLT5y ZWdzLmJhc2UgKwo+ICsJCQkJICAgICAgQVRNRUxfUE1FQ0NfUkVNKHNlY3RvciwgaSAvIDIpKTsK PiArCQlpZiAoaSAmIDEpCj4gKwkJCXZhbHVlID4+PSAxNjsKPiArCj4gKwkJdXNlci0+cGFydGlh bF9zeW5bKDIgKiBpKSArIDFdID0gdmFsdWU7Cj4gKwl9Cj4gK30KCldoYXQgYWJvdXQgc2F5aW5n IHNvbWV3aGVyZSBpbiB0aGlzIGZpbGUgKGhlYWRlcj8pIHRoYXQgYWxsIHRoaXMKY29tcHV0YXRp b24gaXMgZGVzY3JpYmVkIGluIHRoZSBwcm9kdWN0IGRhdGFzaGVldCBhbmQgdGhhdCBhIGhhcmR3 YXJlCnNvZnR3YXJlIGJpdCBjb3JyZWN0aW9uIGlzIHB1dCBpbiBwbGFjZSBmb2xsb3dpbmcgdGhl IHJlY29tYW5kYXRpb24gb2YKdGhlIGRhdGFzaGVldD8KCgo+ICtzdGF0aWMgdm9pZCBhdG1lbF9w bWVjY19zdWJzdGl0dXRlKHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyKQo+ICt7Cj4gKwlp bnQgZGVncmVlID0gZ2V0X3NlY3RvcnNpemUodXNlcikgPT0gNTEyID8gMTMgOiAxNDsKPiArCWlu dCBjd19sZW4gPSAoMSA8PCBkZWdyZWUpIC0gMTsKPiArCWludCBzdHJlbmd0aCA9IGdldF9zdHJl bmd0aCh1c2VyKTsKPiArCXMxNiAqYWxwaGFfdG8gPSB1c2VyLT5nZl90YWJsZXMtPmFscGhhX3Rv Owo+ICsJczE2ICppbmRleF9vZiA9IHVzZXItPmdmX3RhYmxlcy0+aW5kZXhfb2Y7Cj4gKwlzMTYg KnBhcnRpYWxfc3luID0gdXNlci0+cGFydGlhbF9zeW47Cj4gKwlzMTYgKnNpOwo+ICsJaW50IGks IGo7Cj4gKwo+ICsJLyoKPiArCSAqIHNpW10gaXMgYSB0YWJsZSB0aGF0IGhvbGRzIHRoZSBjdXJy ZW50IHN5bmRyb21lIHZhbHVlLAo+ICsJICogYW4gZWxlbWVudCBvZiB0aGF0IHRhYmxlIGJlbG9u Z3MgdG8gdGhlIGZpZWxkCj4gKwkgKi8KPiArCXNpID0gdXNlci0+c2k7Cj4gKwo+ICsJbWVtc2V0 KCZzaVsxXSwgMCwgc2l6ZW9mKHMxNikgKiAoKDIgKiBzdHJlbmd0aCkgLSAxKSk7Cj4gKwo+ICsJ LyogQ29tcHV0YXRpb24gMnQgc3luZHJvbWVzIGJhc2VkIG9uIFMoeCkgKi8KPiArCS8qIE9kZCBz eW5kcm9tZXMgKi8KPiArCWZvciAoaSA9IDE7IGkgPCAyICogc3RyZW5ndGg7IGkgKz0gMikgewo+ ICsJCWZvciAoaiA9IDA7IGogPCBkZWdyZWU7IGorKykgewo+ICsJCQlpZiAocGFydGlhbF9zeW5b aV0gJiAoKHVuc2lnbmVkIHNob3J0KTB4MSA8PCBqKSkKPiArCQkJCXNpW2ldID0gYWxwaGFfdG9b aSAqIGpdIF4gc2lbaV07Cj4gKwkJfQo+ICsJfQo+ICsJLyogRXZlbiBzeW5kcm9tZSA9IChPZGQg c3luZHJvbWUpICoqIDIgKi8KPiArCWZvciAoaSA9IDIsIGogPSAxOyBqIDw9IHN0cmVuZ3RoOyBp ID0gKytqIDw8IDEpIHsKPiArCQlpZiAoc2lbal0gPT0gMCkgewo+ICsJCQlzaVtpXSA9IDA7Cj4g KwkJfSBlbHNlIHsKPiArCQkJczE2IHRtcDsKPiArCj4gKwkJCXRtcCA9IGluZGV4X29mW3NpW2pd XTsKPiArCQkJdG1wID0gKHRtcCAqIDIpICUgY3dfbGVuOwo+ICsJCQlzaVtpXSA9IGFscGhhX3Rv W3RtcF07Cj4gKwkJfQo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhdG1lbF9wbWVjY19n ZXRfc2lnbWEoc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIpCj4gK3sKPiArCXMxNiAqbG11 ID0gdXNlci0+bG11Owo+ICsJczE2ICpzaSA9IHVzZXItPnNpOwo+ICsJczMyICptdSA9IHVzZXIt Pm11Owo+ICsJczMyICpkbXUgPSB1c2VyLT5kbXU7Cj4gKwlzMzIgKmRlbHRhID0gdXNlci0+ZGVs dGE7Cj4gKwlpbnQgZGVncmVlID0gZ2V0X3NlY3RvcnNpemUodXNlcikgPT0gNTEyID8gMTMgOiAx NDsKPiArCWludCBjd19sZW4gPSAoMSA8PCBkZWdyZWUpIC0gMTsKPiArCWludCBzdHJlbmd0aCA9 IGdldF9zdHJlbmd0aCh1c2VyKTsKPiArCWludCBudW0gPSAyICogc3RyZW5ndGggKyAxOwo+ICsJ czE2ICppbmRleF9vZiA9IHVzZXItPmdmX3RhYmxlcy0+aW5kZXhfb2Y7Cj4gKwlzMTYgKmFscGhh X3RvID0gdXNlci0+Z2ZfdGFibGVzLT5hbHBoYV90bzsKPiArCWludCBpLCBqLCBrOwo+ICsJdTMy IGRtdV8wX2NvdW50LCB0bXA7Cj4gKwlzMTYgKnNtdSA9IHVzZXItPnNtdTsKPiArCj4gKwkvKiBp bmRleCBvZiBsYXJnZXN0IGRlbHRhICovCj4gKwlpbnQgcm87Cj4gKwlpbnQgbGFyZ2VzdDsKPiAr CWludCBkaWZmOwo+ICsKPiArCWRtdV8wX2NvdW50ID0gMDsKPiArCj4gKwkvKiBGaXJzdCBSb3cg Ki8KPiArCj4gKwkvKiBNdSAqLwo+ICsJbXVbMF0gPSAtMTsKPiArCj4gKwltZW1zZXQoc211LCAw LCBzaXplb2YoczE2KSAqIG51bSk7Cj4gKwlzbXVbMF0gPSAxOwo+ICsKPiArCS8qIGRpc2NyZXBh bmN5IHNldCB0byAxICovCj4gKwlkbXVbMF0gPSAxOwo+ICsJLyogcG9seW5vbSBvcmRlciBzZXQg dG8gMCAqLwo+ICsJbG11WzBdID0gMDsKPiArCWRlbHRhWzBdID0gKG11WzBdICogMiAtIGxtdVsw XSkgPj4gMTsKPiArCj4gKwkvKiBTZWNvbmQgUm93ICovCj4gKwo+ICsJLyogTXUgKi8KPiArCW11 WzFdID0gMDsKPiArCS8qIFNpZ21hKHgpIHNldCB0byAxICovCj4gKwltZW1zZXQoJnNtdVtudW1d LCAwLCBzaXplb2YoczE2KSAqIG51bSk7Cj4gKwlzbXVbbnVtXSA9IDE7Cj4gKwo+ICsJLyogZGlz Y3JlcGFuY3kgc2V0IHRvIFMxICovCj4gKwlkbXVbMV0gPSBzaVsxXTsKPiArCj4gKwkvKiBwb2x5 bm9tIG9yZGVyIHNldCB0byAwICovCj4gKwlsbXVbMV0gPSAwOwo+ICsKPiArCWRlbHRhWzFdID0g KG11WzFdICogMiAtIGxtdVsxXSkgPj4gMTsKPiArCj4gKwkvKiBJbml0IHRoZSBTaWdtYSh4KSBs YXN0IHJvdyAqLwo+ICsJbWVtc2V0KCZzbXVbKHN0cmVuZ3RoICsgMSkgKiBudW1dLCAwLCBzaXpl b2YoczE2KSAqIG51bSk7Cj4gKwo+ICsJZm9yIChpID0gMTsgaSA8PSBzdHJlbmd0aDsgaSsrKSB7 Cj4gKwkJbXVbaSArIDFdID0gaSA8PCAxOwo+ICsJCS8qIEJlZ2luIENvbXB1dGluZyBTaWdtYSAo TXUrMSkgYW5kIEwobXUpICovCj4gKwkJLyogY2hlY2sgaWYgZGlzY3JlcGFuY3kgaXMgc2V0IHRv IDAgKi8KPiArCQlpZiAoZG11W2ldID09IDApIHsKPiArCQkJZG11XzBfY291bnQrKzsKPiArCj4g KwkJCXRtcCA9ICgoc3RyZW5ndGggLSAobG11W2ldID4+IDEpIC0gMSkgLyAyKTsKPiArCQkJaWYg KChzdHJlbmd0aCAtIChsbXVbaV0gPj4gMSkgLSAxKSAmIDB4MSkKPiArCQkJCXRtcCArPSAyOwo+ ICsJCQllbHNlCj4gKwkJCQl0bXAgKz0gMTsKPiArCj4gKwkJCWlmIChkbXVfMF9jb3VudCA9PSB0 bXApIHsKPiArCQkJCWZvciAoaiA9IDA7IGogPD0gKGxtdVtpXSA+PiAxKSArIDE7IGorKykKPiAr CQkJCQlzbXVbKHN0cmVuZ3RoICsgMSkgKiBudW0gKyBqXSA9Cj4gKwkJCQkJCQlzbXVbaSAqIG51 bSArIGpdOwo+ICsKPiArCQkJCWxtdVtzdHJlbmd0aCArIDFdID0gbG11W2ldOwo+ICsJCQkJcmV0 dXJuOwo+ICsJCQl9Cj4gKwo+ICsJCQkvKiBjb3B5IHBvbHlub20gKi8KPiArCQkJZm9yIChqID0g MDsgaiA8PSBsbXVbaV0gPj4gMTsgaisrKQo+ICsJCQkJc211WyhpICsgMSkgKiBudW0gKyBqXSA9 IHNtdVtpICogbnVtICsgal07Cj4gKwo+ICsJCQkvKiBjb3B5IHByZXZpb3VzIHBvbHlub20gb3Jk ZXIgdG8gdGhlIG5leHQgKi8KPiArCQkJbG11W2kgKyAxXSA9IGxtdVtpXTsKPiArCQl9IGVsc2Ug ewo+ICsJCQlybyA9IDA7Cj4gKwkJCWxhcmdlc3QgPSAtMTsKPiArCQkJLyogZmluZCBsYXJnZXN0 IGRlbHRhIHdpdGggZG11ICE9IDAgKi8KPiArCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewo+ ICsJCQkJaWYgKChkbXVbal0pICYmIChkZWx0YVtqXSA+IGxhcmdlc3QpKSB7Cj4gKwkJCQkJbGFy Z2VzdCA9IGRlbHRhW2pdOwo+ICsJCQkJCXJvID0gajsKPiArCQkJCX0KPiArCQkJfQo+ICsKPiAr CQkJLyogY29tcHV0ZSBkaWZmZXJlbmNlICovCj4gKwkJCWRpZmYgPSAobXVbaV0gLSBtdVtyb10p Owo+ICsKPiArCQkJLyogQ29tcHV0ZSBkZWdyZWUgb2YgdGhlIG5ldyBzbXUgcG9seW5vbWlhbCAq Lwo+ICsJCQlpZiAoKGxtdVtpXSA+PiAxKSA+ICgobG11W3JvXSA+PiAxKSArIGRpZmYpKQo+ICsJ CQkJbG11W2kgKyAxXSA9IGxtdVtpXTsKPiArCQkJZWxzZQo+ICsJCQkJbG11W2kgKyAxXSA9ICgo bG11W3JvXSA+PiAxKSArIGRpZmYpICogMjsKPiArCj4gKwkJCS8qIEluaXQgc211W2krMV0gd2l0 aCAwICovCj4gKwkJCWZvciAoayA9IDA7IGsgPCBudW07IGsrKykKPiArCQkJCXNtdVsoaSArIDEp ICogbnVtICsga10gPSAwOwo+ICsKPiArCQkJLyogQ29tcHV0ZSBzbXVbaSsxXSAqLwo+ICsJCQlm b3IgKGsgPSAwOyBrIDw9IGxtdVtyb10gPj4gMTsgaysrKSB7Cj4gKwkJCQlzMTYgYSwgYiwgYzsK PiArCj4gKwkJCQlpZiAoIShzbXVbcm8gKiBudW0gKyBrXSAmJiBkbXVbaV0pKQo+ICsJCQkJCWNv bnRpbnVlOwo+ICsKPiArCQkJCWEgPSBpbmRleF9vZltkbXVbaV1dOwo+ICsJCQkJYiA9IGluZGV4 X29mW2RtdVtyb11dOwo+ICsJCQkJYyA9IGluZGV4X29mW3NtdVtybyAqIG51bSArIGtdXTsKPiAr CQkJCXRtcCA9IGEgKyAoY3dfbGVuIC0gYikgKyBjOwo+ICsJCQkJYSA9IGFscGhhX3RvW3RtcCAl IGN3X2xlbl07Cj4gKwkJCQlzbXVbKGkgKyAxKSAqIG51bSArIChrICsgZGlmZildID0gYTsKPiAr CQkJfQo+ICsKPiArCQkJZm9yIChrID0gMDsgayA8PSBsbXVbaV0gPj4gMTsgaysrKQo+ICsJCQkJ c211WyhpICsgMSkgKiBudW0gKyBrXSBePSBzbXVbaSAqIG51bSArIGtdOwo+ICsJCX0KPiArCj4g KwkJLyogRW5kIENvbXB1dGluZyBTaWdtYSAoTXUrMSkgYW5kIEwobXUpICovCj4gKwkJLyogSW4g ZWl0aGVyIGNhc2UgY29tcHV0ZSBkZWx0YSAqLwo+ICsJCWRlbHRhW2kgKyAxXSA9IChtdVtpICsg MV0gKiAyIC0gbG11W2kgKyAxXSkgPj4gMTsKPiArCj4gKwkJLyogRG8gbm90IGNvbXB1dGUgZGlz Y3JlcGFuY3kgZm9yIHRoZSBsYXN0IGl0ZXJhdGlvbiAqLwo+ICsJCWlmIChpID49IHN0cmVuZ3Ro KQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJZm9yIChrID0gMDsgayA8PSAobG11W2kgKyAxXSA+ PiAxKTsgaysrKSB7Cj4gKwkJCXRtcCA9IDIgKiAoaSAtIDEpOwo+ICsJCQlpZiAoayA9PSAwKSB7 Cj4gKwkJCQlkbXVbaSArIDFdID0gc2lbdG1wICsgM107Cj4gKwkJCX0gZWxzZSBpZiAoc211Wyhp ICsgMSkgKiBudW0gKyBrXSAmJiBzaVt0bXAgKyAzIC0ga10pIHsKPiArCQkJCXMxNiBhLCBiLCBj Owo+ICsKPiArCQkJCWEgPSBpbmRleF9vZltzbXVbKGkgKyAxKSAqIG51bSArIGtdXTsKPiArCQkJ CWIgPSBzaVsyICogKGkgLSAxKSArIDMgLSBrXTsKPiArCQkJCWMgPSBpbmRleF9vZltiXTsKPiAr CQkJCXRtcCA9IGEgKyBjOwo+ICsJCQkJdG1wICU9IGN3X2xlbjsKPiArCQkJCWRtdVtpICsgMV0g PSBhbHBoYV90b1t0bXBdIF4gZG11W2kgKyAxXTsKPiArCQkJfQo+ICsJCX0KPiArCX0KPiArfQo+ ICsKPiArc3RhdGljIGludCBhdG1lbF9wbWVjY19lcnJfbG9jYXRpb24oc3RydWN0IGF0bWVsX3Bt ZWNjX3VzZXIgKnVzZXIpCj4gK3sKPiArCWludCBzZWN0b3Jfc2l6ZSA9IGdldF9zZWN0b3JzaXpl KHVzZXIpOwo+ICsJaW50IGRlZ3JlZSA9IHNlY3Rvcl9zaXplID09IDUxMiA/IDEzIDogMTQ7Cj4g KwlzdHJ1Y3QgYXRtZWxfcG1lY2MgKnBtZWNjID0gdXNlci0+cG1lY2M7Cj4gKwlpbnQgc3RyZW5n dGggPSBnZXRfc3RyZW5ndGgodXNlcik7Cj4gKwlpbnQgcmV0LCByb290c19uYnIsIGksIGVycl9u YnIgPSAwOwo+ICsJaW50IG51bSA9ICgyICogc3RyZW5ndGgpICsgMTsKPiArCXMxNiAqc211ID0g dXNlci0+c211Owo+ICsJdTMyIHZhbDsKPiArCj4gKwl3cml0ZWwoUE1FUlJMT0NfRElTQUJMRSwg cG1lY2MtPnJlZ3MuZXJybG9jICsgQVRNRUxfUE1FUlJMT0NfRUxESVMpOwo+ICsKPiArCWZvciAo aSA9IDA7IGkgPD0gdXNlci0+bG11W3N0cmVuZ3RoICsgMV0gPj4gMTsgaSsrKSB7Cj4gKwkJd3Jp dGVsX3JlbGF4ZWQoc211WyhzdHJlbmd0aCArIDEpICogbnVtICsgaV0sCj4gKwkJCSAgICAgICBw bWVjYy0+cmVncy5lcnJsb2MgKyBBVE1FTF9QTUVSUkxPQ19TSUdNQShpKSk7Cj4gKwkJZXJyX25i cisrOwo+ICsJfQo+ICsKPiArCXZhbCA9IChlcnJfbmJyIC0gMSkgPDwgMTY7Cj4gKwlpZiAoc2Vj dG9yX3NpemUgPT0gMTAyNCkKPiArCQl2YWwgfD0gMTsKPiArCj4gKwl3cml0ZWwodmFsLCBwbWVj Yy0+cmVncy5lcnJsb2MgKyBBVE1FTF9QTUVSUkxPQ19FTENGRyk7Cj4gKwl3cml0ZWwoKHNlY3Rv cl9zaXplICogOCkgKyAoZGVncmVlICogc3RyZW5ndGgpLAo+ICsJICAgICAgIHBtZWNjLT5yZWdz LmVycmxvYyArIEFUTUVMX1BNRVJSTE9DX0VMRU4pOwo+ICsKPiArCXJldCA9IHJlYWRsX3JlbGF4 ZWRfcG9sbF90aW1lb3V0KHBtZWNjLT5yZWdzLmVycmxvYyArCj4gKwkJCQkJIEFUTUVMX1BNRVJS TE9DX0VMSVNSLAo+ICsJCQkJCSB2YWwsIHZhbCAmIFBNRVJSTE9DX0NBTENfRE9ORSwgMCwKPiAr CQkJCQkgUE1FQ0NfTUFYX1RJTUVPVVRfTVMgKiAxMDAwKTsKPiArCWlmIChyZXQpIHsKPiArCQlk ZXZfZXJyKHBtZWNjLT5kZXYsCj4gKwkJCSJQTUVDQzogVGltZW91dCB0byBjYWxjdWxhdGUgZXJy b3IgbG9jYXRpb24uXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJvb3RzX25i ciA9ICh2YWwgJiBQTUVSUkxPQ19FUlJfTlVNX01BU0spID4+IDg7Cj4gKwkvKiBOdW1iZXIgb2Yg cm9vdHMgPT0gZGVncmVlIG9mIHNtdSBoZW5jZSA8PSBjYXAgKi8KPiArCWlmIChyb290c19uYnIg PT0gdXNlci0+bG11W3N0cmVuZ3RoICsgMV0gPj4gMSkKPiArCQlyZXR1cm4gZXJyX25iciAtIDE7 Cj4gKwo+ICsJLyoKPiArCSAqIE51bWJlciBvZiByb290cyBkb2VzIG5vdCBtYXRjaCB0aGUgZGVn cmVlIG9mIHNtdQo+ICsJICogdW5hYmxlIHRvIGNvcnJlY3QgZXJyb3IuCj4gKwkgKi8KPiArCXJl dHVybiAtRUJBRE1TRzsKPiArfQo+ICsKPiAraW50IGF0bWVsX3BtZWNjX2NvcnJlY3Rfc2VjdG9y KHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyLCBpbnQgc2VjdG9yLAo+ICsJCQkgICAgICAg dm9pZCAqZGF0YSwgdm9pZCAqZWNjKQo+ICt7Cj4gKwlzdHJ1Y3QgYXRtZWxfcG1lY2MgKnBtZWNj ID0gdXNlci0+cG1lY2M7Cj4gKwlpbnQgc2VjdG9yc2l6ZSA9IGdldF9zZWN0b3JzaXplKHVzZXIp Owo+ICsJaW50IGVjY2J5dGVzID0gdXNlci0+ZWNjYnl0ZXM7Cj4gKwlpbnQgaSwgbmVycm9yczsK PiArCj4gKwlpZiAoISh1c2VyLT5pc3IgJiBCSVQoc2VjdG9yKSkpCj4gKwkJcmV0dXJuIDA7Cj4g Kwo+ICsJYXRtZWxfcG1lY2NfZ2VuX3N5bmRyb21lKHVzZXIsIHNlY3Rvcik7Cj4gKwlhdG1lbF9w bWVjY19zdWJzdGl0dXRlKHVzZXIpOwo+ICsJYXRtZWxfcG1lY2NfZ2V0X3NpZ21hKHVzZXIpOwo+ ICsKPiArCW5lcnJvcnMgPSBhdG1lbF9wbWVjY19lcnJfbG9jYXRpb24odXNlcik7Cj4gKwlpZiAo bmVycm9ycyA8IDApCj4gKwkJcmV0dXJuIG5lcnJvcnM7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8 IG5lcnJvcnM7IGkrKykgewo+ICsJCWNvbnN0IGNoYXIgKmFyZWE7Cj4gKwkJaW50IGJ5dGUsIGJp dDsKPiArCQl1MzIgZXJycG9zOwo+ICsJCXU4ICpwdHI7Cj4gKwo+ICsJCWVycnBvcyA9IHJlYWRs X3JlbGF4ZWQocG1lY2MtPnJlZ3MuZXJybG9jICsKPiArCQkJCUFUTUVMX1BNRVJSTE9DX0VMKHBt ZWNjLT5jYXBzLT5lbF9vZmZzZXQsIGkpKTsKPiArCQllcnJwb3MtLTsKPiArCj4gKwkJYnl0ZSA9 IGVycnBvcyAvIDg7Cj4gKwkJYml0ID0gZXJycG9zICUgODsKPiArCj4gKwkJaWYgKGJ5dGUgPCBz ZWN0b3JzaXplKSB7Cj4gKwkJCXB0ciA9IGRhdGEgKyBieXRlOwo+ICsJCQlhcmVhID0gImRhdGEi Owo+ICsJCX0gZWxzZSBpZiAoYnl0ZSA8IHNlY3RvcnNpemUgKyBlY2NieXRlcykgewo+ICsJCQlw dHIgPSBlY2MgKyBieXRlIC0gc2VjdG9yc2l6ZTsKPiArCQkJYXJlYSA9ICJFQ0MiOwo+ICsJCX0g ZWxzZSB7Cj4gKwkJCWRldl9kYmcocG1lY2MtPmRldiwKPiArCQkJCSJJbnZhbGlkIGVycnBvcyB2 YWx1ZSAoJWQsIG1heCBpcyAlZClcbiIsCj4gKwkJCQllcnJwb3MsIChzZWN0b3JzaXplICsgZWNj Ynl0ZXMpICogOCk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCj4gKwkJZGV2X2Ri ZyhwbWVjYy0+ZGV2LAo+ICsJCQkiQml0IGZsaXAgaW4gJXMgYXJlYSwgYnl0ZSAlZDogMHglMDJ4 IC0+IDB4JTAyeFxuIiwKPiArCQkJYXJlYSwgYnl0ZSwgKnB0ciwgKHVuc2lnbmVkIGludCkoKnB0 ciBeIEJJVChiaXQpKSk7Cj4gKwo+ICsJCSpwdHIgXj0gQklUKGJpdCk7Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIG5lcnJvcnM7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoYXRtZWxfcG1lY2NfY29y cmVjdF9zZWN0b3IpOwo+ICsKPiArYm9vbCBhdG1lbF9wbWVjY19jb3JyZWN0X2VyYXNlZF9jaHVu a3Moc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIpCj4gK3sKPiArCXJldHVybiB1c2VyLT5w bWVjYy0+Y2Fwcy0+Y29ycmVjdF9lcmFzZWRfY2h1bmtzOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xf R1BMKGF0bWVsX3BtZWNjX2NvcnJlY3RfZXJhc2VkX2NodW5rcyk7Cj4gKwo+ICt2b2lkIGF0bWVs X3BtZWNjX2dldF9nZW5lcmF0ZWRfZWNjYnl0ZXMoc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVz ZXIsCj4gKwkJCQkJaW50IHNlY3Rvciwgdm9pZCAqZWNjKQo+ICt7Cj4gKwlzdHJ1Y3QgYXRtZWxf cG1lY2MgKnBtZWNjID0gdXNlci0+cG1lY2M7Cj4gKwl1OCAqcHRyID0gZWNjOwo+ICsJaW50IGk7 Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHVzZXItPmVjY2J5dGVzOyBpKyspCj4gKwkJcHRyW2ld ID0gcmVhZGJfcmVsYXhlZChwbWVjYy0+cmVncy5iYXNlICsKPiArCQkJCSAgICAgICBBVE1FTF9Q TUVDQ19FQ0Moc2VjdG9yLCBpKSk7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoYXRtZWxfcG1l Y2NfZ2V0X2dlbmVyYXRlZF9lY2NieXRlcyk7Cj4gKwo+ICtpbnQgYXRtZWxfcG1lY2NfZW5hYmxl KHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyLCBpbnQgb3ApCj4gK3sKPiArCXN0cnVjdCBh dG1lbF9wbWVjYyAqcG1lY2MgPSB1c2VyLT5wbWVjYzsKPiArCXUzMiBjZmc7Cj4gKwo+ICsJaWYg KG9wICE9IE5BTkRfRUNDX1JFQUQgJiYgb3AgIT0gTkFORF9FQ0NfV1JJVEUpIHsKPiArCQlkZXZf ZXJyKHBtZWNjLT5kZXYsICJCYWQgRUNDIG9wZXJhdGlvbiEiKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwltdXRleF9sb2NrKCZ1c2VyLT5wbWVjYy0+bG9jayk7Cj4gKwo+ICsJ Y2ZnID0gdXNlci0+Y2FjaGUuY2ZnOwo+ICsJaWYgKG9wID09IE5BTkRfRUNDX1dSSVRFKQo+ICsJ CWNmZyB8PSBQTUVDQ19DRkdfV1JJVEVfT1A7Cj4gKwllbHNlCj4gKwkJY2ZnIHw9IFBNRUNDX0NG R19BVVRPX0VOQUJMRTsKPiArCj4gKwl3cml0ZWwoY2ZnLCBwbWVjYy0+cmVncy5iYXNlICsgQVRN RUxfUE1FQ0NfQ0ZHKTsKPiArCXdyaXRlbCh1c2VyLT5jYWNoZS5zYXJlYSwgcG1lY2MtPnJlZ3Mu YmFzZSArIEFUTUVMX1BNRUNDX1NBUkVBKTsKPiArCXdyaXRlbCh1c2VyLT5jYWNoZS5zYWRkciwg cG1lY2MtPnJlZ3MuYmFzZSArIEFUTUVMX1BNRUNDX1NBRERSKTsKPiArCXdyaXRlbCh1c2VyLT5j YWNoZS5lYWRkciwgcG1lY2MtPnJlZ3MuYmFzZSArIEFUTUVMX1BNRUNDX0VBRERSKTsKPiArCj4g Kwl3cml0ZWwoUE1FQ0NfQ1RSTF9FTkFCTEUsIHBtZWNjLT5yZWdzLmJhc2UgKyBBVE1FTF9QTUVD Q19DVFJMKTsKPiArCXdyaXRlbChQTUVDQ19DVFJMX0RBVEEsIHBtZWNjLT5yZWdzLmJhc2UgKyBB VE1FTF9QTUVDQ19DVFJMKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICtFWFBPUlRfU1lNQk9M X0dQTChhdG1lbF9wbWVjY19lbmFibGUpOwo+ICsKPiArdm9pZCBhdG1lbF9wbWVjY19kaXNhYmxl KHN0cnVjdCBhdG1lbF9wbWVjY191c2VyICp1c2VyKQo+ICt7Cj4gKwlzdHJ1Y3QgYXRtZWxfcG1l Y2MgKnBtZWNjID0gdXNlci0+cG1lY2M7Cj4gKwo+ICsJd3JpdGVsKFBNRUNDX0NUUkxfUlNULCBw bWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0NfQ1RSTCk7Cj4gKwl3cml0ZWwoUE1FQ0NfQ1RS TF9ESVNBQkxFLCBwbWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0NfQ1RSTCk7Cj4gKwltdXRl eF91bmxvY2soJnVzZXItPnBtZWNjLT5sb2NrKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChh dG1lbF9wbWVjY19kaXNhYmxlKTsKPiArCj4gK2ludCBhdG1lbF9wbWVjY193YWl0X3JkeShzdHJ1 Y3QgYXRtZWxfcG1lY2NfdXNlciAqdXNlcikKPiArewo+ICsJc3RydWN0IGF0bWVsX3BtZWNjICpw bWVjYyA9IHVzZXItPnBtZWNjOwo+ICsJdTMyIHN0YXR1czsKPiArCWludCByZXQ7Cj4gKwo+ICsJ cmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQocG1lY2MtPnJlZ3MuYmFzZSArCj4gKwkJ CQkJIEFUTUVMX1BNRUNDX1NSLAo+ICsJCQkJCSBzdGF0dXMsICEoc3RhdHVzICYgUE1FQ0NfU1Jf QlVTWSksIDAsCj4gKwkJCQkJIFBNRUNDX01BWF9USU1FT1VUX01TICogMTAwMCk7Cj4gKwlpZiAo cmV0KSB7Cj4gKwkJZGV2X2VycihwbWVjYy0+ZGV2LAo+ICsJCQkiVGltZW91dCB3aGlsZSB3YWl0 aW5nIGZvciBQTUVDQyByZWFkeS5cbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJ dXNlci0+aXNyID0gcmVhZGxfcmVsYXhlZChwbWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0Nf SVNSKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChhdG1lbF9w bWVjY193YWl0X3JkeSk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGF0bWVsX3BtZWNjICphdG1lbF9w bWVjY19jcmVhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkJCQljb25zdCBz dHJ1Y3QgYXRtZWxfcG1lY2NfY2FwcyAqY2FwcywKPiArCQkJCQlpbnQgcG1lY2NfcmVzX2lkeCwg aW50IGVycmxvY19yZXNfaWR4KQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ ZGV2Owo+ICsJc3RydWN0IGF0bWVsX3BtZWNjICpwbWVjYzsKPiArCXN0cnVjdCByZXNvdXJjZSAq cmVzOwo+ICsKPiArCXBtZWNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwbWVjYyksIEdG UF9LRVJORUwpOwo+ICsJaWYgKCFwbWVjYykKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsK PiArCj4gKwlwbWVjYy0+Y2FwcyA9IGNhcHM7Cj4gKwlwbWVjYy0+ZGV2ID0gZGV2Owo+ICsJbXV0 ZXhfaW5pdCgmcG1lY2MtPmxvY2spOwo+ICsKPiArCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJj ZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG1lY2NfcmVzX2lkeCk7Cj4gKwlwbWVjYy0+cmVncy5i YXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKPiArCWlmIChJU19FUlIocG1l Y2MtPnJlZ3MuYmFzZSkpCj4gKwkJcmV0dXJuIEVSUl9DQVNUKHBtZWNjLT5yZWdzLmJhc2UpOwo+ ICsKPiArCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwg ZXJybG9jX3Jlc19pZHgpOwo+ICsJcG1lY2MtPnJlZ3MuZXJybG9jID0gZGV2bV9pb3JlbWFwX3Jl c291cmNlKGRldiwgcmVzKTsKPiArCWlmIChJU19FUlIocG1lY2MtPnJlZ3MuZXJybG9jKSkKPiAr CQlyZXR1cm4gRVJSX0NBU1QocG1lY2MtPnJlZ3MuZXJybG9jKTsKPiArCj4gKwkvKiBEaXNhYmxl IGFsbCBpbnRlcnJ1cHRzIGJlZm9yZSByZWdpc3RlcmluZyB0aGUgUE1FQ0MgaGFuZGxlci4gKi8K PiArCXdyaXRlbCgweGZmZmZmZmZmLCBwbWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0NfSURS KTsKPiArCj4gKwkvKiBSZXNldCB0aGUgRUNDIGVuZ2luZSAqLwo+ICsJd3JpdGVsKFBNRUNDX0NU UkxfUlNULCBwbWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0NfQ1RSTCk7Cj4gKwl3cml0ZWwo UE1FQ0NfQ1RSTF9ESVNBQkxFLCBwbWVjYy0+cmVncy5iYXNlICsgQVRNRUxfUE1FQ0NfQ1RSTCk7 Cj4gKwo+ICsJcmV0dXJuIHBtZWNjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkZXZtX2F0bWVs X3BtZWNjX3B1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKPiArewo+ICsJc3RydWN0 IGF0bWVsX3BtZWNjICoqcG1lY2MgPSByZXM7Cj4gKwo+ICsJcHV0X2RldmljZSgoKnBtZWNjKS0+ ZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBhdG1lbF9wbWVjYyAqYXRtZWxfcG1lY2Nf Z2V0X2J5X25vZGUoc3RydWN0IGRldmljZSAqdXNlcmRldiwKPiArCQkJCQkJICAgc3RydWN0IGRl dmljZV9ub2RlICpucCkKPiArewo+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKPiAr CXN0cnVjdCBhdG1lbF9wbWVjYyAqcG1lY2MsICoqcHRyOwo+ICsKPiArCXBkZXYgPSBvZl9maW5k X2RldmljZV9ieV9ub2RlKG5wKTsKPiArCWlmICghcGRldiB8fCAhcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldikpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Cj4gKwo+ICsJcHRy ID0gZGV2cmVzX2FsbG9jKGRldm1fYXRtZWxfcG1lY2NfcHV0LCBzaXplb2YoKnB0ciksIEdGUF9L RVJORUwpOwo+ICsJaWYgKCFwdHIpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gKwo+ ICsJZ2V0X2RldmljZSgmcGRldi0+ZGV2KTsKPiArCXBtZWNjID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7Cj4gKwo+ICsJKnB0ciA9IHBtZWNjOwo+ICsKPiArCWRldnJlc19hZGQodXNlcmRl diwgcHRyKTsKPiArCj4gKwlyZXR1cm4gcG1lY2M7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBp bnQgYXRtZWxfcG1lY2Nfc3RyZW5ndGhzW10gPSB7IDIsIDQsIDgsIDEyLCAyNCwgMzIgfTsKPiAr Cj4gK3N0cnVjdCBhdG1lbF9wbWVjY19jYXBzIGF0OTFzYW05ZzQ1X2NhcHMgPSB7Cj4gKwkuc3Ry ZW5ndGhzID0gYXRtZWxfcG1lY2Nfc3RyZW5ndGhzLAo+ICsJLm5zdHJlbmd0aHMgPSA1LAo+ICsJ LmVsX29mZnNldCA9IDB4OGMsCj4gK307Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfcG1lY2NfY2FwcyBz YW1hNWQ0X2NhcHMgPSB7Cj4gKwkuc3RyZW5ndGhzID0gYXRtZWxfcG1lY2Nfc3RyZW5ndGhzLAo+ ICsJLm5zdHJlbmd0aHMgPSA1LAo+ICsJLmVsX29mZnNldCA9IDB4OGMsCj4gKwkuY29ycmVjdF9l cmFzZWRfY2h1bmtzID0gdHJ1ZSwKPiArfTsKPiArCj4gK3N0cnVjdCBhdG1lbF9wbWVjY19jYXBz IHNhbWE1ZDJfY2FwcyA9IHsKPiArCS5zdHJlbmd0aHMgPSBhdG1lbF9wbWVjY19zdHJlbmd0aHMs Cj4gKwkubnN0cmVuZ3RocyA9IDYsCj4gKwkuZWxfb2Zmc2V0ID0gMHhhYywKPiArCS5jb3JyZWN0 X2VyYXNlZF9jaHVua3MgPSB0cnVlLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBv Zl9kZXZpY2VfaWQgYXRtZWxfcG1lY2NfbGVnYWN5X21hdGNoW10gPSB7Cj4gKwl7IC5jb21wYXRp YmxlID0gImF0bWVsLHNhbWE1ZDQtbmFuZCIsICZzYW1hNWQ0X2NhcHMgfSwKPiArCXsgLmNvbXBh dGlibGUgPSAiYXRtZWwsc2FtYTVkMi1uYW5kIiwgJnNhbWE1ZDJfY2FwcyB9LAo+ICsJeyAvKiBz ZW50aW5lbCAqLyB9Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgYXRtZWxfcG1lY2MgKmRldm1fYXRtZWxf cG1lY2NfZ2V0KHN0cnVjdCBkZXZpY2UgKnVzZXJkZXYpCj4gK3sKPiArCXN0cnVjdCBhdG1lbF9w bWVjYyAqcG1lY2M7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwo+ICsKPiArCWlmICghdXNl cmRldikKPiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiArCj4gKwlpZiAoIXVzZXJkZXYt Pm9mX25vZGUpCj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJbnAgPSBvZl9wYXJzZV9waGFuZGxl KHVzZXJkZXYtPm9mX25vZGUsICJlY2MtZW5naW5lIiwgMCk7Cj4gKwlpZiAobnApIHsKPiArCQlw bWVjYyA9IGF0bWVsX3BtZWNjX2dldF9ieV9ub2RlKHVzZXJkZXYsIG5wKTsKPiArCQlvZl9ub2Rl X3B1dChucCk7Cj4gKwl9IGVsc2Ugewo+ICsJCS8qCj4gKwkJICogU3VwcG9ydCBvbGQgRFQgYmlu ZGluZ3M6IGluIHRoaXMgY2FzZSB0aGUgUE1FQ0MgaW9tZW0KPiArCQkgKiByZXNvdXJjZXMgYXJl IGRpcmVjdGx5IGRlZmluZWQgaW4gdGhlIHVzZXIgcGRldiBhdCBwb3NpdGlvbgo+ICsJCSAqIDEg YW5kIDIuIEV4dHJhY3QgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlcmUuCj4gKwkJ ICovCj4gKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2Rldmlj ZSh1c2VyZGV2KTsKPiArCQljb25zdCBzdHJ1Y3QgYXRtZWxfcG1lY2NfY2FwcyAqY2FwczsKPiAr Cj4gKwkJLyogTm8gUE1FQ0MgZW5naW5lIGF2YWlsYWJsZS4gKi8KPiArCQlpZiAoIW9mX3Byb3Bl cnR5X3JlYWRfYm9vbCh1c2VyZGV2LT5vZl9ub2RlLAo+ICsJCQkJCSAgICJhdG1lbCxoYXMtcG1l Y2MiKSkKPiArCQkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJCWNhcHMgPSAmYXQ5MXNhbTlnNDVfY2Fw czsKPiArCj4gKwkJLyoKPiArCQkgKiBUcnkgdG8gZmluZCB0aGUgTkZDIHN1Ym5vZGUgYW5kIGV4 dHJhY3QgdGhlIGFzc29jaWF0ZWQgY2Fwcwo+ICsJCSAqIGZyb20gdGhlcmUuCj4gKwkJICovCj4g KwkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZSh1c2VyZGV2LT5vZl9ub2RlLCBOVUxMLAo+ ICsJCQkJCSAgICAgImF0bWVsLHNhbWE1ZDMtbmZjIik7Cj4gKwkJaWYgKG5wKSB7Cj4gKwkJCWNv bnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwo+ICsKPiArCQkJbWF0Y2ggPSBvZl9tYXRj aF9ub2RlKGF0bWVsX3BtZWNjX2xlZ2FjeV9tYXRjaCwgbnApOwo+ICsJCQlpZiAobWF0Y2ggJiYg bWF0Y2gtPmRhdGEpCj4gKwkJCQljYXBzID0gbWF0Y2gtPmRhdGE7Cj4gKwo+ICsJCQlvZl9ub2Rl X3B1dChucCk7Cj4gKwkJfQo+ICsKPiArCQlwbWVjYyA9IGF0bWVsX3BtZWNjX2NyZWF0ZShwZGV2 LCBjYXBzLCAxLCAyKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcG1lY2M7Cj4gK30KPiArRVhQT1JU X1NZTUJPTChkZXZtX2F0bWVsX3BtZWNjX2dldCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBhdG1lbF9wbWVjY19tYXRjaFtdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9 ICJhdG1lbCxhdDkxc2FtOWc0NS1wbWVjYyIsICZhdDkxc2FtOWc0NV9jYXBzIH0sCj4gKwl7IC5j b21wYXRpYmxlID0gImF0bWVsLHNhbWE1ZDQtcG1lY2MiLCAmc2FtYTVkNF9jYXBzIH0sCj4gKwl7 IC5jb21wYXRpYmxlID0gImF0bWVsLHNhbWE1ZDItcG1lY2MiLCAmc2FtYTVkMl9jYXBzIH0sCj4g Kwl7IC8qIHNlbnRpbmVsICovIH0KPiArfTsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXRt ZWxfcG1lY2NfbWF0Y2gpOwo+ICsKPiArc3RhdGljIGludCBhdG1lbF9wbWVjY19wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAm cGRldi0+ZGV2Owo+ICsJY29uc3Qgc3RydWN0IGF0bWVsX3BtZWNjX2NhcHMgKmNhcHM7Cj4gKwlz dHJ1Y3QgYXRtZWxfcG1lY2MgKnBtZWNjOwo+ICsKPiArCWNhcHMgPSBvZl9kZXZpY2VfZ2V0X21h dGNoX2RhdGEoJnBkZXYtPmRldik7Cj4gKwlpZiAoIWNhcHMpIHsKPiArCQlkZXZfZXJyKGRldiwg IkludmFsaWQgY2Fwc1xuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcG1l Y2MgPSBhdG1lbF9wbWVjY19jcmVhdGUocGRldiwgY2FwcywgMCwgMSk7Cj4gKwlpZiAoSVNfRVJS KHBtZWNjKSkKPiArCQlyZXR1cm4gUFRSX0VSUihwbWVjYyk7Cj4gKwo+ICsJcGxhdGZvcm1fc2V0 X2RydmRhdGEocGRldiwgcG1lY2MpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1lbF9wbWVjY19kcml2ZXIgPSB7Cj4gKwkuZHJp dmVyID0gewo+ICsJCS5uYW1lID0gImF0bWVsLXBtZWNjIiwKPiArCQkub2ZfbWF0Y2hfdGFibGUg PSBvZl9tYXRjaF9wdHIoYXRtZWxfcG1lY2NfbWF0Y2gpLAo+ICsJfSwKPiArCS5wcm9iZSA9IGF0 bWVsX3BtZWNjX3Byb2JlLAo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGF0bWVsX3Bt ZWNjX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gK01PRFVMRV9BVVRI T1IoIkJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGZyZWUtZWxlY3Ryb25zLmNvbT4i KTsKPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJQTUVDQyBlbmdpbmUgZHJpdmVyIik7Cj4gK01PRFVM RV9BTElBUygicGxhdGZvcm06YXRtZWxfcG1lY2MiKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9hdG1lbC9wbWVjYy5oIGIvZHJpdmVycy9tdGQvbmFuZC9hdG1lbC9wbWVjYy5oCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmE4ZGRiZmNhMmVhNQo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsL3BtZWNjLmgKPiBA QCAtMCwwICsxLDczIEBACj4gKy8qCj4gKyAqIMKpIENvcHlyaWdodCAyMDE2IEFUTUVMCj4gKyAq IMKpIENvcHlyaWdodCAyMDE2IEZyZWUgRWxlY3Ryb25zCgpEaXR0by4KCj4gKyAqIEF1dGhvcjog Qm9yaXMgQnJlemlsbG9uIDxib3Jpcy5icmV6aWxsb25AZnJlZS1lbGVjdHJvbnMuY29tPgo+ICsg Kgo+ICsgKiBEZXJpdmVkIGZyb20gdGhlIGF0bWVsX25hbmQuYyBkcml2ZXIgd2hpY2ggY29udGFp bmVkIHRoZSBmb2xsb3dpbmcKPiArICogY29weXJpZ2h0czoKPiArICoKPiArICogICAgQ29weXJp Z2h0IMKpIDIwMDMgUmljayBCcm9uc29uCj4gKyAqCj4gKyAqICAgIERlcml2ZWQgZnJvbSBkcml2 ZXJzL210ZC9uYW5kL2F1dGNwdTEyLmMKPiArICogICAgICAgIENvcHlyaWdodCDCqSAyMDAxIFRo b21hcyBHbGVpeG5lciAoZ2xlaXhuZXJAYXV0cm9uaXguZGUpCj4gKyAqCj4gKyAqICAgIERlcml2 ZWQgZnJvbSBkcml2ZXJzL210ZC9zcGlhLmMKPiArICogICAgICAgIENvcHlyaWdodCDCqSAyMDAw IFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAY290dy5jb20pCj4gKyAqCj4gKyAqCj4gKyAqICAgIEFk ZCBIYXJkd2FyZSBFQ0Mgc3VwcG9ydCBmb3IgQVQ5MVNBTTkyNjAgLyBBVDkxU0FNOTI2Mwo+ICsg KiAgICAgICAgUmljaGFyZCBHZW5vdWQgKHJpY2hhcmQuZ2Vub3VkQGdtYWlsLmNvbSksIEFkZW5l byBDb3B5cmlnaHQgwqkgMjAwNwo+ICsgKgo+ICsgKiAgICAgICAgRGVyaXZlZCBmcm9tIERhcyBV LUJvb3Qgc291cmNlIGNvZGUKPiArICogICAgICAgICAgICAgICh1LWJvb3QtMS4xLjUvYm9hcmQv YXRtZWwvYXQ5MXNhbTkyNjNlay9uYW5kLmMpCj4gKyAqICAgICAgICDCqSBDb3B5cmlnaHQgMjAw NiBBVE1FTCBSb3Vzc2V0LCBMYWNyZXNzb25uaWVyZSBOaWNvbGFzCj4gKyAqCj4gKyAqICAgIEFk ZCBQcm9ncmFtbWFibGUgTXVsdGliaXQgRUNDIHN1cHBvcnQgZm9yIHZhcmlvdXMgQVQ5MSBTb0MK PiArICogICAgICAgIMKpIENvcHlyaWdodCAyMDEyIEFUTUVMLCBIb25nIFh1Cj4gKyAqCj4gKyAq ICAgIEFkZCBOYW5kIEZsYXNoIENvbnRyb2xsZXIgc3VwcG9ydCBmb3IgU0FNQTUgU29DCj4gKyAq ICAgICAgICDCqSBDb3B5cmlnaHQgMjAxMyBBVE1FTCwgSm9zaCBXdSAoam9zaC53dUBhdG1lbC5j b20pCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCj4gKyAqIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsgKi8KPiArCj4gKyNp Zm5kZWYgQVRNRUxfUE1FQ0NfSAo+ICsjZGVmaW5lIEFUTUVMX1BNRUNDX0gKPiArCj4gKyNkZWZp bmUgQVRNRUxfUE1FQ0NfTUFYSU1JWkVfRUNDX1NUUkVOR1RICTAKPiArI2RlZmluZSBBVE1FTF9Q TUVDQ19TRUNUT1JfU0laRV9BVVRPCQkwCj4gKyNkZWZpbmUgQVRNRUxfUE1FQ0NfT09CT0ZGU0VU X0FVVE8JCS0xCj4gKwo+ICtzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlcl9yZXEgewo+ICsJaW50IHBh Z2VzaXplOwo+ICsJaW50IG9vYnNpemU7Cj4gKwlzdHJ1Y3Qgewo+ICsJCWludCBzdHJlbmd0aDsK PiArCQlpbnQgYnl0ZXM7Cj4gKwkJaW50IHNlY3RvcnNpemU7Cj4gKwkJaW50IG5zZWN0b3JzOwo+ ICsJCWludCBvb2JvZmZzZXQ7Cj4gKwl9IGVjYzsKPiArfTsKPiArCj4gK3N0cnVjdCBhdG1lbF9w bWVjYyAqZGV2bV9hdG1lbF9wbWVjY19nZXQoc3RydWN0IGRldmljZSAqZGV2KTsKPiArCj4gK3N0 cnVjdCBhdG1lbF9wbWVjY191c2VyICoKPiArYXRtZWxfcG1lY2NfY3JlYXRlX3VzZXIoc3RydWN0 IGF0bWVsX3BtZWNjICpwbWVjYywKPiArCQkJc3RydWN0IGF0bWVsX3BtZWNjX3VzZXJfcmVxICpy ZXEpOwo+ICt2b2lkIGF0bWVsX3BtZWNjX2Rlc3Ryb3lfdXNlcihzdHJ1Y3QgYXRtZWxfcG1lY2Nf dXNlciAqdXNlcik7Cj4gKwo+ICtpbnQgYXRtZWxfcG1lY2NfZW5hYmxlKHN0cnVjdCBhdG1lbF9w bWVjY191c2VyICp1c2VyLCBpbnQgb3ApOwo+ICt2b2lkIGF0bWVsX3BtZWNjX2Rpc2FibGUoc3Ry dWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIpOwo+ICtpbnQgYXRtZWxfcG1lY2Nfd2FpdF9yZHko c3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIpOwo+ICtpbnQgYXRtZWxfcG1lY2NfY29ycmVj dF9zZWN0b3Ioc3RydWN0IGF0bWVsX3BtZWNjX3VzZXIgKnVzZXIsIGludCBzZWN0b3IsCj4gKwkJ CSAgICAgICB2b2lkICpkYXRhLCB2b2lkICplY2MpOwo+ICtib29sIGF0bWVsX3BtZWNjX2NvcnJl Y3RfZXJhc2VkX2NodW5rcyhzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNlciAqdXNlcik7Cj4gK3ZvaWQg YXRtZWxfcG1lY2NfZ2V0X2dlbmVyYXRlZF9lY2NieXRlcyhzdHJ1Y3QgYXRtZWxfcG1lY2NfdXNl ciAqdXNlciwKPiArCQkJCQlpbnQgc2VjdG9yLCB2b2lkICplY2MpOwo+ICsKPiArI2VuZGlmIC8q IEFUTUVMX1BNRUNDX0ggKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9u YW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYwo+IGRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDllYmQ1ZWNlZmVhNi4uMDAwMDAwMDAwMDAwCj4gLS0tIGEvZHJpdmVy cy9tdGQvbmFuZC9hdG1lbF9uYW5kLmMKPiArKysgL2Rldi9udWxsCgpbLi5dCgoKLS0gCk5pY29s YXMgRmVycmUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1tdGQvCg==