From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from esa6.microchip.iphmx.com ([216.71.154.253]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUrfC-0006wf-Tf for linux-mtd@lists.infradead.org; Thu, 06 Dec 2018 11:17:53 +0000 From: To: , CC: , , , Subject: Re: [PATCH v3 2/5] mtd: spi-nor: Avoid forward declaration of internal functions Date: Thu, 6 Dec 2018 11:17:32 +0000 Message-ID: <26c77708-9b5e-085c-cdf0-bb8055a2906c@microchip.com> References: <20181206104120.6280-1-boris.brezillon@bootlin.com> <20181206104120.6280-3-boris.brezillon@bootlin.com> In-Reply-To: <20181206104120.6280-3-boris.brezillon@bootlin.com> Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , DQoNCk9uIDEyLzA2LzIwMTggMTI6NDEgUE0sIEJvcmlzIEJyZXppbGxvbiB3cm90ZToNCj4gUmVv cmdhbml6ZSB0aGUgY29kZSB0byBraWxsIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHNwaV9ub3Jf bWF0Y2hfaWQoKQ0KPiBtYWNyb25peF9xdWFkX2VuYWJsZSgpIGFuZCBzcGlfbm9yX2h3Y2Fwc19y ZWFkMmNtZCgpLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogQm9yaXMgQnJlemlsbG9uIDxib3Jpcy5i cmV6aWxsb25AYm9vdGxpbi5jb20+DQoNClJldmlld2VkLWJ5OiBUdWRvciBBbWJhcnVzIDx0dWRv ci5hbWJhcnVzQG1pY3JvY2hpcC5jb20+DQoNCj4gLS0tDQo+IENoYW5nZXMgaW4gdjM6DQo+IC0g R3JvdXAgYWxsIF9xdWFkX2VuYWJsZSgpIGltcGxlbXMNCj4gLSBNb3ZlIHNwaV9ub3JfaHdjYXBz X3h4MmNtZCgpIGp1c3QgYWZ0ZXIgc3BpX25vcl9zZXRfcHBfc2V0dGluZ3MoKQ0KPiANCj4gQ2hh bmdlcyBpbiB2MjoNCj4gLSBOb25lDQo+IC0tLQ0KPiAgZHJpdmVycy9tdGQvc3BpLW5vci9zcGkt bm9yLmMgfCA2MTQgKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLQ0KPiAgMSBmaWxl IGNoYW5nZWQsIDMwNCBpbnNlcnRpb25zKCspLCAzMTAgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9tdGQvc3BpLW5vci9zcGktbm9yLmMgYi9kcml2ZXJzL210ZC9zcGkt bm9yL3NwaS1ub3IuYw0KPiBpbmRleCBkMDk5YWVlMDc1ZTkuLmI0NDBmMjk2MzdhYiAxMDA2NDQN Cj4gLS0tIGEvZHJpdmVycy9tdGQvc3BpLW5vci9zcGktbm9yLmMNCj4gKysrIGIvZHJpdmVycy9t dGQvc3BpLW5vci9zcGktbm9yLmMNCj4gQEAgLTI4OSw4ICsyODksNiBAQCBzdHJ1Y3QgZmxhc2hf aW5mbyB7DQo+ICANCj4gICNkZWZpbmUgSkVERUNfTUZSKGluZm8pCSgoaW5mbyktPmlkWzBdKQ0K PiAgDQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IGZsYXNoX2luZm8gKnNwaV9ub3JfbWF0Y2hfaWQo Y29uc3QgY2hhciAqbmFtZSk7DQo+IC0NCj4gIC8qDQo+ICAgKiBSZWFkIHRoZSBzdGF0dXMgcmVn aXN0ZXIsIHJldHVybmluZyBpdHMgdmFsdWUgaW4gdGhlIGxvY2F0aW9uDQo+ICAgKiBSZXR1cm4g dGhlIHN0YXR1cyByZWdpc3RlciB2YWx1ZS4NCj4gQEAgLTEzOTUsNyArMTM5MywyNDcgQEAgc3Rh dGljIGludCBzcGlfbm9yX2lzX2xvY2tlZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9m cywgdWludDY0X3QgbGVuKQ0KPiAgCXJldHVybiByZXQ7DQo+ICB9DQo+ICANCj4gLXN0YXRpYyBp bnQgbWFjcm9uaXhfcXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcik7DQo+ICsvKg0KPiAr ICogV3JpdGUgc3RhdHVzIFJlZ2lzdGVyIGFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdpdGgg MiBieXRlcw0KPiArICogVGhlIGZpcnN0IGJ5dGUgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzdGF0 dXMgcmVnaXN0ZXIsIHdoaWxlIHRoZQ0KPiArICogc2Vjb25kIGJ5dGUgd2lsbCBiZSB3cml0dGVu IHRvIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLg0KPiArICogUmV0dXJuIG5lZ2F0aXZlIGlm IGVycm9yIG9jY3VycmVkLg0KPiArICovDQo+ICtzdGF0aWMgaW50IHdyaXRlX3NyX2NyKHN0cnVj dCBzcGlfbm9yICpub3IsIHU4ICpzcl9jcikNCj4gK3sNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJ d3JpdGVfZW5hYmxlKG5vcik7DQo+ICsNCj4gKwlyZXQgPSBub3ItPndyaXRlX3JlZyhub3IsIFNQ SU5PUl9PUF9XUlNSLCBzcl9jciwgMik7DQo+ICsJaWYgKHJldCA8IDApIHsNCj4gKwkJZGV2X2Vy cihub3ItPmRldiwNCj4gKwkJCSJlcnJvciB3aGlsZSB3cml0aW5nIGNvbmZpZ3VyYXRpb24gcmVn aXN0ZXJcbiIpOw0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKwl9DQo+ICsNCj4gKwlyZXQgPSBz cGlfbm9yX3dhaXRfdGlsbF9yZWFkeShub3IpOw0KPiArCWlmIChyZXQpIHsNCj4gKwkJZGV2X2Vy cihub3ItPmRldiwNCj4gKwkJCSJ0aW1lb3V0IHdoaWxlIHdyaXRpbmcgY29uZmlndXJhdGlvbiBy ZWdpc3RlclxuIik7DQo+ICsJCXJldHVybiByZXQ7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIDA7 DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICogbWFjcm9uaXhfcXVhZF9lbmFibGUoKSAtIHNldCBR RSBiaXQgaW4gU3RhdHVzIFJlZ2lzdGVyLg0KPiArICogQG5vcjoJcG9pbnRlciB0byBhICdzdHJ1 Y3Qgc3BpX25vcicNCj4gKyAqDQo+ICsgKiBTZXQgdGhlIFF1YWQgRW5hYmxlIChRRSkgYml0IGlu IHRoZSBTdGF0dXMgUmVnaXN0ZXIuDQo+ICsgKg0KPiArICogYml0IDYgb2YgdGhlIFN0YXR1cyBS ZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBNYWNyb25peCBsaWtlIFFTUEkgbWVtb3JpZXMuDQo+ ICsgKg0KPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuDQo+ICsg Ki8NCj4gK3N0YXRpYyBpbnQgbWFjcm9uaXhfcXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5v cikNCj4gK3sNCj4gKwlpbnQgcmV0LCB2YWw7DQo+ICsNCj4gKwl2YWwgPSByZWFkX3NyKG5vcik7 DQo+ICsJaWYgKHZhbCA8IDApDQo+ICsJCXJldHVybiB2YWw7DQo+ICsJaWYgKHZhbCAmIFNSX1FV QURfRU5fTVgpDQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJd3JpdGVfZW5hYmxlKG5vcik7DQo+ ICsNCj4gKwl3cml0ZV9zcihub3IsIHZhbCB8IFNSX1FVQURfRU5fTVgpOw0KPiArDQo+ICsJcmV0 ID0gc3BpX25vcl93YWl0X3RpbGxfcmVhZHkobm9yKTsNCj4gKwlpZiAocmV0KQ0KPiArCQlyZXR1 cm4gcmV0Ow0KPiArDQo+ICsJcmV0ID0gcmVhZF9zcihub3IpOw0KPiArCWlmICghKHJldCA+IDAg JiYgKHJldCAmIFNSX1FVQURfRU5fTVgpKSkgew0KPiArCQlkZXZfZXJyKG5vci0+ZGV2LCAiTWFj cm9uaXggUXVhZCBiaXQgbm90IHNldFxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0N Cj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIHNwYW5zaW9uX3F1 YWRfZW5hYmxlKCkgLSBzZXQgUUUgYml0IGluIENvbmZpZ3VyYWl0b24gUmVnaXN0ZXIuDQo+ICsg KiBAbm9yOglwb2ludGVyIHRvIGEgJ3N0cnVjdCBzcGlfbm9yJw0KPiArICoNCj4gKyAqIFNldCB0 aGUgUXVhZCBFbmFibGUgKFFFKSBiaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuDQo+ ICsgKiBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGxlZ2FjeSBwdXJwb3NlIGJlY2F1c2UgaXQg aGFzIGJlZW4gdXNlZCBmb3IgYQ0KPiArICogbG9uZyB0aW1lIHdpdGhvdXQgYW55Ym9keSBjb21w bGFpbmluZyBidXQgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMNCj4gKyAqIGRlcHJlY2F0ZWQg YW5kIG1heWJlIGJ1Z2d5Lg0KPiArICogRmlyc3QsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjYXJl IGFib3V0IHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlIFN0YXR1cw0KPiArICogYW5kIENvbmZp Z3VyYXRpb24gUmVnaXN0ZXJzIHdoZW4gaXQgc2V0cyB0aGUgUUUgYml0IChiaXQgMSkgaW4gdGhl DQo+ICsgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyOiBhbGwgb3RoZXIgYml0cyBhcmUgY2xlYXJl ZCwgd2hpY2ggbWF5IGhhdmUgdW53YW50ZWQNCj4gKyAqIHNpZGUgZWZmZWN0cyBsaWtlIHJlbW92 aW5nIHNvbWUgYmxvY2sgcHJvdGVjdGlvbnMuDQo+ICsgKiBTZWNvbmRseSwgaXQgdXNlcyB0aGUg UmVhZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICgzNWgpIGluc3RydWN0aW9uIHRob3VnaA0KPiAr ICogc29tZSB2ZXJ5IG9sZCBhbmQgZmV3IG1lbW9yaWVzIGRvbid0IHN1cHBvcnQgdGhpcyBpbnN0 cnVjdGlvbi4gSWYgYSBwdWxsLXVwDQo+ICsgKiByZXNpc3RvciBpcyBwcmVzZW50IG9uIHRoZSBN SVNPL0lPMSBsaW5lLCB3ZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIHBhc3MgdGhlDQo+ICsgKiAi cmVhZCBiYWNrIiB0ZXN0IGJlY2F1c2UgdGhlIFFTUEkgbWVtb3J5IGRvZXNuJ3QgcmVjb2duaXpl IHRoZSBjb21tYW5kLA0KPiArICogc28gbGVhdmVzIHRoZSBNSVNPL0lPMSBsaW5lIHN0YXRlIHVu Y2hhbmdlZCwgaGVuY2UgcmVhZF9jcigpIHJldHVybnMgMHhGRi4NCj4gKyAqDQo+ICsgKiBiaXQg MSBvZiB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBTcGFuc2lv biBsaWtlIFFTUEkNCj4gKyAqIG1lbW9yaWVzLg0KPiArICoNCj4gKyAqIFJldHVybjogMCBvbiBz dWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLg0KPiArICovDQo+ICtzdGF0aWMgaW50IHNwYW5zaW9u X3F1YWRfZW5hYmxlKHN0cnVjdCBzcGlfbm9yICpub3IpDQo+ICt7DQo+ICsJdTggc3JfY3JbMl0g PSB7MCwgQ1JfUVVBRF9FTl9TUEFOfTsNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJcmV0ID0gd3Jp dGVfc3JfY3Iobm9yLCBzcl9jcik7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4g Kw0KPiArCS8qIHJlYWQgYmFjayBhbmQgY2hlY2sgaXQgKi8NCj4gKwlyZXQgPSByZWFkX2NyKG5v cik7DQo+ICsJaWYgKCEocmV0ID4gMCAmJiAocmV0ICYgQ1JfUVVBRF9FTl9TUEFOKSkpIHsNCj4g KwkJZGV2X2Vycihub3ItPmRldiwgIlNwYW5zaW9uIFF1YWQgYml0IG5vdCBzZXRcbiIpOw0KPiAr CQlyZXR1cm4gLUVJTlZBTDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0K PiArLyoqDQo+ICsgKiBzcGFuc2lvbl9ub19yZWFkX2NyX3F1YWRfZW5hYmxlKCkgLSBzZXQgUUUg Yml0IGluIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuDQo+ICsgKiBAbm9yOglwb2ludGVyIHRvIGEg J3N0cnVjdCBzcGlfbm9yJw0KPiArICoNCj4gKyAqIFNldCB0aGUgUXVhZCBFbmFibGUgKFFFKSBi aXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuDQo+ICsgKiBUaGlzIGZ1bmN0aW9uIHNo b3VsZCBiZSB1c2VkIHdpdGggUVNQSSBtZW1vcmllcyBub3Qgc3VwcG9ydGluZyB0aGUgUmVhZA0K PiArICogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoMzVoKSBpbnN0cnVjdGlvbi4NCj4gKyAqDQo+ ICsgKiBiaXQgMSBvZiB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZv ciBTcGFuc2lvbiBsaWtlIFFTUEkNCj4gKyAqIG1lbW9yaWVzLg0KPiArICoNCj4gKyAqIFJldHVy bjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLg0KPiArICovDQo+ICtzdGF0aWMgaW50 IHNwYW5zaW9uX25vX3JlYWRfY3JfcXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4g K3sNCj4gKwl1OCBzcl9jclsyXTsNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJLyogS2VlcCB0aGUg Y3VycmVudCB2YWx1ZSBvZiB0aGUgU3RhdHVzIFJlZ2lzdGVyLiAqLw0KPiArCXJldCA9IHJlYWRf c3Iobm9yKTsNCj4gKwlpZiAocmV0IDwgMCkgew0KPiArCQlkZXZfZXJyKG5vci0+ZGV2LCAiZXJy b3Igd2hpbGUgcmVhZGluZyBzdGF0dXMgcmVnaXN0ZXJcbiIpOw0KPiArCQlyZXR1cm4gLUVJTlZB TDsNCj4gKwl9DQo+ICsJc3JfY3JbMF0gPSByZXQ7DQo+ICsJc3JfY3JbMV0gPSBDUl9RVUFEX0VO X1NQQU47DQo+ICsNCj4gKwlyZXR1cm4gd3JpdGVfc3JfY3Iobm9yLCBzcl9jcik7DQo+ICt9DQo+ ICsNCj4gKy8qKg0KPiArICogc3BhbnNpb25fcmVhZF9jcl9xdWFkX2VuYWJsZSgpIC0gc2V0IFFF IGJpdCBpbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLg0KPiArICogQG5vcjoJcG9pbnRlciB0byBh ICdzdHJ1Y3Qgc3BpX25vcicNCj4gKyAqDQo+ICsgKiBTZXQgdGhlIFF1YWQgRW5hYmxlIChRRSkg Yml0IGluIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLg0KPiArICogVGhpcyBmdW5jdGlvbiBz aG91bGQgYmUgdXNlZCB3aXRoIFFTUEkgbWVtb3JpZXMgc3VwcG9ydGluZyB0aGUgUmVhZA0KPiAr ICogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoMzVoKSBpbnN0cnVjdGlvbi4NCj4gKyAqDQo+ICsg KiBiaXQgMSBvZiB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBT cGFuc2lvbiBsaWtlIFFTUEkNCj4gKyAqIG1lbW9yaWVzLg0KPiArICoNCj4gKyAqIFJldHVybjog MCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLg0KPiArICovDQo+ICtzdGF0aWMgaW50IHNw YW5zaW9uX3JlYWRfY3JfcXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4gK3sNCj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBub3ItPmRldjsNCj4gKwl1OCBzcl9jclsyXTsNCj4gKwlp bnQgcmV0Ow0KPiArDQo+ICsJLyogQ2hlY2sgY3VycmVudCBRdWFkIEVuYWJsZSBiaXQgdmFsdWUu ICovDQo+ICsJcmV0ID0gcmVhZF9jcihub3IpOw0KPiArCWlmIChyZXQgPCAwKSB7DQo+ICsJCWRl dl9lcnIoZGV2LCAiZXJyb3Igd2hpbGUgcmVhZGluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyXG4i KTsNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ICsJaWYgKHJldCAmIENSX1FV QURfRU5fU1BBTikNCj4gKwkJcmV0dXJuIDA7DQo+ICsNCj4gKwlzcl9jclsxXSA9IHJldCB8IENS X1FVQURfRU5fU1BBTjsNCj4gKw0KPiArCS8qIEtlZXAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhl IFN0YXR1cyBSZWdpc3Rlci4gKi8NCj4gKwlyZXQgPSByZWFkX3NyKG5vcik7DQo+ICsJaWYgKHJl dCA8IDApIHsNCj4gKwkJZGV2X2VycihkZXYsICJlcnJvciB3aGlsZSByZWFkaW5nIHN0YXR1cyBy ZWdpc3RlclxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKwlzcl9jclswXSA9 IHJldDsNCj4gKw0KPiArCXJldCA9IHdyaXRlX3NyX2NyKG5vciwgc3JfY3IpOw0KPiArCWlmIChy ZXQpDQo+ICsJCXJldHVybiByZXQ7DQo+ICsNCj4gKwkvKiBSZWFkIGJhY2sgYW5kIGNoZWNrIGl0 LiAqLw0KPiArCXJldCA9IHJlYWRfY3Iobm9yKTsNCj4gKwlpZiAoIShyZXQgPiAwICYmIChyZXQg JiBDUl9RVUFEX0VOX1NQQU4pKSkgew0KPiArCQlkZXZfZXJyKG5vci0+ZGV2LCAiU3BhbnNpb24g UXVhZCBiaXQgbm90IHNldFxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0K PiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIHNyMl9iaXQ3X3F1YWRfZW5h YmxlKCkgLSBzZXQgUUUgYml0IGluIFN0YXR1cyBSZWdpc3RlciAyLg0KPiArICogQG5vcjoJcG9p bnRlciB0byBhICdzdHJ1Y3Qgc3BpX25vcicNCj4gKyAqDQo+ICsgKiBTZXQgdGhlIFF1YWQgRW5h YmxlIChRRSkgYml0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIgMi4NCj4gKyAqDQo+ICsgKiBUaGlz IGlzIG9uZSBvZiB0aGUgcHJvY2VkdXJlcyB0byBzZXQgdGhlIFFFIGJpdCBkZXNjcmliZWQgaW4g dGhlIFNGRFANCj4gKyAqIChKRVNEMjE2IHJldiBCKSBzcGVjaWZpY2F0aW9uIGJ1dCBubyBtYW51 ZmFjdHVyZXIgdXNpbmcgdGhpcyBwcm9jZWR1cmUgaGFzDQo+ICsgKiBiZWVuIGlkZW50aWZpZWQg eWV0LCBoZW5jZSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uDQo+ICsgKg0KPiArICogUmV0dXJu OiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbnQg c3IyX2JpdDdfcXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4gK3sNCj4gKwl1OCBz cjI7DQo+ICsJaW50IHJldDsNCj4gKw0KPiArCS8qIENoZWNrIGN1cnJlbnQgUXVhZCBFbmFibGUg Yml0IHZhbHVlLiAqLw0KPiArCXJldCA9IG5vci0+cmVhZF9yZWcobm9yLCBTUElOT1JfT1BfUkRT UjIsICZzcjIsIDEpOw0KPiArCWlmIChyZXQpDQo+ICsJCXJldHVybiByZXQ7DQo+ICsJaWYgKHNy MiAmIFNSMl9RVUFEX0VOX0JJVDcpDQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJLyogVXBkYXRl IHRoZSBRdWFkIEVuYWJsZSBiaXQuICovDQo+ICsJc3IyIHw9IFNSMl9RVUFEX0VOX0JJVDc7DQo+ ICsNCj4gKwl3cml0ZV9lbmFibGUobm9yKTsNCj4gKw0KPiArCXJldCA9IG5vci0+d3JpdGVfcmVn KG5vciwgU1BJTk9SX09QX1dSU1IyLCAmc3IyLCAxKTsNCj4gKwlpZiAocmV0IDwgMCkgew0KPiAr CQlkZXZfZXJyKG5vci0+ZGV2LCAiZXJyb3Igd2hpbGUgd3JpdGluZyBzdGF0dXMgcmVnaXN0ZXIg MlxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0KPiArCXJldCA9IHNwaV9u b3Jfd2FpdF90aWxsX3JlYWR5KG5vcik7DQo+ICsJaWYgKHJldCA8IDApIHsNCj4gKwkJZGV2X2Vy cihub3ItPmRldiwgInRpbWVvdXQgd2hpbGUgd3JpdGluZyBzdGF0dXMgcmVnaXN0ZXIgMlxuIik7 DQo+ICsJCXJldHVybiByZXQ7DQo+ICsJfQ0KPiArDQo+ICsJLyogUmVhZCBiYWNrIGFuZCBjaGVj ayBpdC4gKi8NCj4gKwlyZXQgPSBub3ItPnJlYWRfcmVnKG5vciwgU1BJTk9SX09QX1JEU1IyLCAm c3IyLCAxKTsNCj4gKwlpZiAoIShyZXQgPiAwICYmIChzcjIgJiBTUjJfUVVBRF9FTl9CSVQ3KSkp IHsNCj4gKwkJZGV2X2Vycihub3ItPmRldiwgIlNSMiBRdWFkIGJpdCBub3Qgc2V0XG4iKTsNCj4g KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICAN Cj4gIC8qIFVzZWQgd2hlbiB0aGUgIl9leHRfaWQiIGlzIHR3byBieXRlcyBhdCBtb3N0ICovDQo+ ICAjZGVmaW5lIElORk8oX2plZGVjX2lkLCBfZXh0X2lkLCBfc2VjdG9yX3NpemUsIF9uX3NlY3Rv cnMsIF9mbGFncykJXA0KPiBAQCAtMjAwMiwyNDggKzIyNDAsNiBAQCBzdGF0aWMgaW50IHNwaV9u b3Jfd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwNCj4g IAlyZXR1cm4gcmV0Ow0KPiAgfQ0KPiAgDQo+IC0vKioNCj4gLSAqIG1hY3Jvbml4X3F1YWRfZW5h YmxlKCkgLSBzZXQgUUUgYml0IGluIFN0YXR1cyBSZWdpc3Rlci4NCj4gLSAqIEBub3I6CXBvaW50 ZXIgdG8gYSAnc3RydWN0IHNwaV9ub3InDQo+IC0gKg0KPiAtICogU2V0IHRoZSBRdWFkIEVuYWJs ZSAoUUUpIGJpdCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLg0KPiAtICoNCj4gLSAqIGJpdCA2IG9m IHRoZSBTdGF0dXMgUmVnaXN0ZXIgaXMgdGhlIFFFIGJpdCBmb3IgTWFjcm9uaXggbGlrZSBRU1BJ IG1lbW9yaWVzLg0KPiAtICoNCj4gLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb3Ro ZXJ3aXNlLg0KPiAtICovDQo+IC1zdGF0aWMgaW50IG1hY3Jvbml4X3F1YWRfZW5hYmxlKHN0cnVj dCBzcGlfbm9yICpub3IpDQo+IC17DQo+IC0JaW50IHJldCwgdmFsOw0KPiAtDQo+IC0JdmFsID0g cmVhZF9zcihub3IpOw0KPiAtCWlmICh2YWwgPCAwKQ0KPiAtCQlyZXR1cm4gdmFsOw0KPiAtCWlm ICh2YWwgJiBTUl9RVUFEX0VOX01YKQ0KPiAtCQlyZXR1cm4gMDsNCj4gLQ0KPiAtCXdyaXRlX2Vu YWJsZShub3IpOw0KPiAtDQo+IC0Jd3JpdGVfc3Iobm9yLCB2YWwgfCBTUl9RVUFEX0VOX01YKTsN Cj4gLQ0KPiAtCXJldCA9IHNwaV9ub3Jfd2FpdF90aWxsX3JlYWR5KG5vcik7DQo+IC0JaWYgKHJl dCkNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQ0KPiAtCXJldCA9IHJlYWRfc3Iobm9yKTsNCj4gLQlp ZiAoIShyZXQgPiAwICYmIChyZXQgJiBTUl9RVUFEX0VOX01YKSkpIHsNCj4gLQkJZGV2X2Vycihu b3ItPmRldiwgIk1hY3Jvbml4IFF1YWQgYml0IG5vdCBzZXRcbiIpOw0KPiAtCQlyZXR1cm4gLUVJ TlZBTDsNCj4gLQl9DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtLyoNCj4gLSAq IFdyaXRlIHN0YXR1cyBSZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciB3aXRoIDIg Ynl0ZXMNCj4gLSAqIFRoZSBmaXJzdCBieXRlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc3RhdHVz IHJlZ2lzdGVyLCB3aGlsZSB0aGUNCj4gLSAqIHNlY29uZCBieXRlIHdpbGwgYmUgd3JpdHRlbiB0 byB0aGUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4NCj4gLSAqIFJldHVybiBuZWdhdGl2ZSBpZiBl cnJvciBvY2N1cnJlZC4NCj4gLSAqLw0KPiAtc3RhdGljIGludCB3cml0ZV9zcl9jcihzdHJ1Y3Qg c3BpX25vciAqbm9yLCB1OCAqc3JfY3IpDQo+IC17DQo+IC0JaW50IHJldDsNCj4gLQ0KPiAtCXdy aXRlX2VuYWJsZShub3IpOw0KPiAtDQo+IC0JcmV0ID0gbm9yLT53cml0ZV9yZWcobm9yLCBTUElO T1JfT1BfV1JTUiwgc3JfY3IsIDIpOw0KPiAtCWlmIChyZXQgPCAwKSB7DQo+IC0JCWRldl9lcnIo bm9yLT5kZXYsDQo+IC0JCQkiZXJyb3Igd2hpbGUgd3JpdGluZyBjb25maWd1cmF0aW9uIHJlZ2lz dGVyXG4iKTsNCj4gLQkJcmV0dXJuIC1FSU5WQUw7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0ID0gc3Bp X25vcl93YWl0X3RpbGxfcmVhZHkobm9yKTsNCj4gLQlpZiAocmV0KSB7DQo+IC0JCWRldl9lcnIo bm9yLT5kZXYsDQo+IC0JCQkidGltZW91dCB3aGlsZSB3cml0aW5nIGNvbmZpZ3VyYXRpb24gcmVn aXN0ZXJcbiIpOw0KPiAtCQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0K PiAtfQ0KPiAtDQo+IC0vKioNCj4gLSAqIHNwYW5zaW9uX3F1YWRfZW5hYmxlKCkgLSBzZXQgUUUg Yml0IGluIENvbmZpZ3VyYWl0b24gUmVnaXN0ZXIuDQo+IC0gKiBAbm9yOglwb2ludGVyIHRvIGEg J3N0cnVjdCBzcGlfbm9yJw0KPiAtICoNCj4gLSAqIFNldCB0aGUgUXVhZCBFbmFibGUgKFFFKSBi aXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuDQo+IC0gKiBUaGlzIGZ1bmN0aW9uIGlz IGtlcHQgZm9yIGxlZ2FjeSBwdXJwb3NlIGJlY2F1c2UgaXQgaGFzIGJlZW4gdXNlZCBmb3IgYQ0K PiAtICogbG9uZyB0aW1lIHdpdGhvdXQgYW55Ym9keSBjb21wbGFpbmluZyBidXQgaXQgc2hvdWxk IGJlIGNvbnNpZGVyZWQgYXMNCj4gLSAqIGRlcHJlY2F0ZWQgYW5kIG1heWJlIGJ1Z2d5Lg0KPiAt ICogRmlyc3QsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjYXJlIGFib3V0IHRoZSBwcmV2aW91cyB2 YWx1ZXMgb2YgdGhlIFN0YXR1cw0KPiAtICogYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIHdo ZW4gaXQgc2V0cyB0aGUgUUUgYml0IChiaXQgMSkgaW4gdGhlDQo+IC0gKiBDb25maWd1cmF0aW9u IFJlZ2lzdGVyOiBhbGwgb3RoZXIgYml0cyBhcmUgY2xlYXJlZCwgd2hpY2ggbWF5IGhhdmUgdW53 YW50ZWQNCj4gLSAqIHNpZGUgZWZmZWN0cyBsaWtlIHJlbW92aW5nIHNvbWUgYmxvY2sgcHJvdGVj dGlvbnMuDQo+IC0gKiBTZWNvbmRseSwgaXQgdXNlcyB0aGUgUmVhZCBDb25maWd1cmF0aW9uIFJl Z2lzdGVyICgzNWgpIGluc3RydWN0aW9uIHRob3VnaA0KPiAtICogc29tZSB2ZXJ5IG9sZCBhbmQg ZmV3IG1lbW9yaWVzIGRvbid0IHN1cHBvcnQgdGhpcyBpbnN0cnVjdGlvbi4gSWYgYSBwdWxsLXVw DQo+IC0gKiByZXNpc3RvciBpcyBwcmVzZW50IG9uIHRoZSBNSVNPL0lPMSBsaW5lLCB3ZSBtaWdo dCBzdGlsbCBiZSBhYmxlIHRvIHBhc3MgdGhlDQo+IC0gKiAicmVhZCBiYWNrIiB0ZXN0IGJlY2F1 c2UgdGhlIFFTUEkgbWVtb3J5IGRvZXNuJ3QgcmVjb2duaXplIHRoZSBjb21tYW5kLA0KPiAtICog c28gbGVhdmVzIHRoZSBNSVNPL0lPMSBsaW5lIHN0YXRlIHVuY2hhbmdlZCwgaGVuY2UgcmVhZF9j cigpIHJldHVybnMgMHhGRi4NCj4gLSAqDQo+IC0gKiBiaXQgMSBvZiB0aGUgQ29uZmlndXJhdGlv biBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBTcGFuc2lvbiBsaWtlIFFTUEkNCj4gLSAqIG1l bW9yaWVzLg0KPiAtICoNCj4gLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3 aXNlLg0KPiAtICovDQo+IC1zdGF0aWMgaW50IHNwYW5zaW9uX3F1YWRfZW5hYmxlKHN0cnVjdCBz cGlfbm9yICpub3IpDQo+IC17DQo+IC0JdTggc3JfY3JbMl0gPSB7MCwgQ1JfUVVBRF9FTl9TUEFO fTsNCj4gLQlpbnQgcmV0Ow0KPiAtDQo+IC0JcmV0ID0gd3JpdGVfc3JfY3Iobm9yLCBzcl9jcik7 DQo+IC0JaWYgKHJldCkNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQ0KPiAtCS8qIHJlYWQgYmFjayBh bmQgY2hlY2sgaXQgKi8NCj4gLQlyZXQgPSByZWFkX2NyKG5vcik7DQo+IC0JaWYgKCEocmV0ID4g MCAmJiAocmV0ICYgQ1JfUVVBRF9FTl9TUEFOKSkpIHsNCj4gLQkJZGV2X2Vycihub3ItPmRldiwg IlNwYW5zaW9uIFF1YWQgYml0IG5vdCBzZXRcbiIpOw0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4g LQl9DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtLyoqDQo+IC0gKiBzcGFuc2lv bl9ub19yZWFkX2NyX3F1YWRfZW5hYmxlKCkgLSBzZXQgUUUgYml0IGluIENvbmZpZ3VyYXRpb24g UmVnaXN0ZXIuDQo+IC0gKiBAbm9yOglwb2ludGVyIHRvIGEgJ3N0cnVjdCBzcGlfbm9yJw0KPiAt ICoNCj4gLSAqIFNldCB0aGUgUXVhZCBFbmFibGUgKFFFKSBiaXQgaW4gdGhlIENvbmZpZ3VyYXRp b24gUmVnaXN0ZXIuDQo+IC0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdpdGggUVNQ SSBtZW1vcmllcyBub3Qgc3VwcG9ydGluZyB0aGUgUmVhZA0KPiAtICogQ29uZmlndXJhdGlvbiBS ZWdpc3RlciAoMzVoKSBpbnN0cnVjdGlvbi4NCj4gLSAqDQo+IC0gKiBiaXQgMSBvZiB0aGUgQ29u ZmlndXJhdGlvbiBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBTcGFuc2lvbiBsaWtlIFFTUEkN Cj4gLSAqIG1lbW9yaWVzLg0KPiAtICoNCj4gLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJy bm8gb3RoZXJ3aXNlLg0KPiAtICovDQo+IC1zdGF0aWMgaW50IHNwYW5zaW9uX25vX3JlYWRfY3Jf cXVhZF9lbmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4gLXsNCj4gLQl1OCBzcl9jclsyXTsN Cj4gLQlpbnQgcmV0Ow0KPiAtDQo+IC0JLyogS2VlcCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUg U3RhdHVzIFJlZ2lzdGVyLiAqLw0KPiAtCXJldCA9IHJlYWRfc3Iobm9yKTsNCj4gLQlpZiAocmV0 IDwgMCkgew0KPiAtCQlkZXZfZXJyKG5vci0+ZGV2LCAiZXJyb3Igd2hpbGUgcmVhZGluZyBzdGF0 dXMgcmVnaXN0ZXJcbiIpOw0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQl9DQo+IC0Jc3JfY3Jb MF0gPSByZXQ7DQo+IC0Jc3JfY3JbMV0gPSBDUl9RVUFEX0VOX1NQQU47DQo+IC0NCj4gLQlyZXR1 cm4gd3JpdGVfc3JfY3Iobm9yLCBzcl9jcik7DQo+IC19DQo+IC0NCj4gLS8qKg0KPiAtICogc3Bh bnNpb25fcmVhZF9jcl9xdWFkX2VuYWJsZSgpIC0gc2V0IFFFIGJpdCBpbiBDb25maWd1cmF0aW9u IFJlZ2lzdGVyLg0KPiAtICogQG5vcjoJcG9pbnRlciB0byBhICdzdHJ1Y3Qgc3BpX25vcicNCj4g LSAqDQo+IC0gKiBTZXQgdGhlIFF1YWQgRW5hYmxlIChRRSkgYml0IGluIHRoZSBDb25maWd1cmF0 aW9uIFJlZ2lzdGVyLg0KPiAtICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aXRoIFFT UEkgbWVtb3JpZXMgc3VwcG9ydGluZyB0aGUgUmVhZA0KPiAtICogQ29uZmlndXJhdGlvbiBSZWdp c3RlciAoMzVoKSBpbnN0cnVjdGlvbi4NCj4gLSAqDQo+IC0gKiBiaXQgMSBvZiB0aGUgQ29uZmln dXJhdGlvbiBSZWdpc3RlciBpcyB0aGUgUUUgYml0IGZvciBTcGFuc2lvbiBsaWtlIFFTUEkNCj4g LSAqIG1lbW9yaWVzLg0KPiAtICoNCj4gLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8g b3RoZXJ3aXNlLg0KPiAtICovDQo+IC1zdGF0aWMgaW50IHNwYW5zaW9uX3JlYWRfY3JfcXVhZF9l bmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4gLXsNCj4gLQlzdHJ1Y3QgZGV2aWNlICpkZXYg PSBub3ItPmRldjsNCj4gLQl1OCBzcl9jclsyXTsNCj4gLQlpbnQgcmV0Ow0KPiAtDQo+IC0JLyog Q2hlY2sgY3VycmVudCBRdWFkIEVuYWJsZSBiaXQgdmFsdWUuICovDQo+IC0JcmV0ID0gcmVhZF9j cihub3IpOw0KPiAtCWlmIChyZXQgPCAwKSB7DQo+IC0JCWRldl9lcnIoZGV2LCAiZXJyb3Igd2hp bGUgcmVhZGluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyXG4iKTsNCj4gLQkJcmV0dXJuIC1FSU5W QUw7DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKHJldCAmIENSX1FVQURfRU5fU1BBTikNCj4gLQkJcmV0 dXJuIDA7DQo+IC0NCj4gLQlzcl9jclsxXSA9IHJldCB8IENSX1FVQURfRU5fU1BBTjsNCj4gLQ0K PiAtCS8qIEtlZXAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFN0YXR1cyBSZWdpc3Rlci4gKi8N Cj4gLQlyZXQgPSByZWFkX3NyKG5vcik7DQo+IC0JaWYgKHJldCA8IDApIHsNCj4gLQkJZGV2X2Vy cihkZXYsICJlcnJvciB3aGlsZSByZWFkaW5nIHN0YXR1cyByZWdpc3RlclxuIik7DQo+IC0JCXJl dHVybiAtRUlOVkFMOw0KPiAtCX0NCj4gLQlzcl9jclswXSA9IHJldDsNCj4gLQ0KPiAtCXJldCA9 IHdyaXRlX3NyX2NyKG5vciwgc3JfY3IpOw0KPiAtCWlmIChyZXQpDQo+IC0JCXJldHVybiByZXQ7 DQo+IC0NCj4gLQkvKiBSZWFkIGJhY2sgYW5kIGNoZWNrIGl0LiAqLw0KPiAtCXJldCA9IHJlYWRf Y3Iobm9yKTsNCj4gLQlpZiAoIShyZXQgPiAwICYmIChyZXQgJiBDUl9RVUFEX0VOX1NQQU4pKSkg ew0KPiAtCQlkZXZfZXJyKG5vci0+ZGV2LCAiU3BhbnNpb24gUXVhZCBiaXQgbm90IHNldFxuIik7 DQo+IC0JCXJldHVybiAtRUlOVkFMOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0K PiAtDQo+IC0vKioNCj4gLSAqIHNyMl9iaXQ3X3F1YWRfZW5hYmxlKCkgLSBzZXQgUUUgYml0IGlu IFN0YXR1cyBSZWdpc3RlciAyLg0KPiAtICogQG5vcjoJcG9pbnRlciB0byBhICdzdHJ1Y3Qgc3Bp X25vcicNCj4gLSAqDQo+IC0gKiBTZXQgdGhlIFF1YWQgRW5hYmxlIChRRSkgYml0IGluIHRoZSBT dGF0dXMgUmVnaXN0ZXIgMi4NCj4gLSAqDQo+IC0gKiBUaGlzIGlzIG9uZSBvZiB0aGUgcHJvY2Vk dXJlcyB0byBzZXQgdGhlIFFFIGJpdCBkZXNjcmliZWQgaW4gdGhlIFNGRFANCj4gLSAqIChKRVNE MjE2IHJldiBCKSBzcGVjaWZpY2F0aW9uIGJ1dCBubyBtYW51ZmFjdHVyZXIgdXNpbmcgdGhpcyBw cm9jZWR1cmUgaGFzDQo+IC0gKiBiZWVuIGlkZW50aWZpZWQgeWV0LCBoZW5jZSB0aGUgbmFtZSBv ZiB0aGUgZnVuY3Rpb24uDQo+IC0gKg0KPiAtICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1lcnJu byBvdGhlcndpc2UuDQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgc3IyX2JpdDdfcXVhZF9lbmFibGUo c3RydWN0IHNwaV9ub3IgKm5vcikNCj4gLXsNCj4gLQl1OCBzcjI7DQo+IC0JaW50IHJldDsNCj4g LQ0KPiAtCS8qIENoZWNrIGN1cnJlbnQgUXVhZCBFbmFibGUgYml0IHZhbHVlLiAqLw0KPiAtCXJl dCA9IG5vci0+cmVhZF9yZWcobm9yLCBTUElOT1JfT1BfUkRTUjIsICZzcjIsIDEpOw0KPiAtCWlm IChyZXQpDQo+IC0JCXJldHVybiByZXQ7DQo+IC0JaWYgKHNyMiAmIFNSMl9RVUFEX0VOX0JJVDcp DQo+IC0JCXJldHVybiAwOw0KPiAtDQo+IC0JLyogVXBkYXRlIHRoZSBRdWFkIEVuYWJsZSBiaXQu ICovDQo+IC0Jc3IyIHw9IFNSMl9RVUFEX0VOX0JJVDc7DQo+IC0NCj4gLQl3cml0ZV9lbmFibGUo bm9yKTsNCj4gLQ0KPiAtCXJldCA9IG5vci0+d3JpdGVfcmVnKG5vciwgU1BJTk9SX09QX1dSU1Iy LCAmc3IyLCAxKTsNCj4gLQlpZiAocmV0IDwgMCkgew0KPiAtCQlkZXZfZXJyKG5vci0+ZGV2LCAi ZXJyb3Igd2hpbGUgd3JpdGluZyBzdGF0dXMgcmVnaXN0ZXIgMlxuIik7DQo+IC0JCXJldHVybiAt RUlOVkFMOw0KPiAtCX0NCj4gLQ0KPiAtCXJldCA9IHNwaV9ub3Jfd2FpdF90aWxsX3JlYWR5KG5v cik7DQo+IC0JaWYgKHJldCA8IDApIHsNCj4gLQkJZGV2X2Vycihub3ItPmRldiwgInRpbWVvdXQg d2hpbGUgd3JpdGluZyBzdGF0dXMgcmVnaXN0ZXIgMlxuIik7DQo+IC0JCXJldHVybiByZXQ7DQo+ IC0JfQ0KPiAtDQo+IC0JLyogUmVhZCBiYWNrIGFuZCBjaGVjayBpdC4gKi8NCj4gLQlyZXQgPSBu b3ItPnJlYWRfcmVnKG5vciwgU1BJTk9SX09QX1JEU1IyLCAmc3IyLCAxKTsNCj4gLQlpZiAoIShy ZXQgPiAwICYmIChzcjIgJiBTUjJfUVVBRF9FTl9CSVQ3KSkpIHsNCj4gLQkJZGV2X2Vycihub3It PmRldiwgIlNSMiBRdWFkIGJpdCBub3Qgc2V0XG4iKTsNCj4gLQkJcmV0dXJuIC1FSU5WQUw7DQo+ IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gIHN0YXRpYyBpbnQgc3BpX25v cl9jaGVjayhzdHJ1Y3Qgc3BpX25vciAqbm9yKQ0KPiAgew0KPiAgCWlmICghbm9yLT5kZXYgfHwg IW5vci0+cmVhZCB8fCAhbm9yLT53cml0ZSB8fA0KPiBAQCAtMjMxOCw2ICsyMzE0LDU3IEBAIHNw aV9ub3Jfc2V0X3BwX3NldHRpbmdzKHN0cnVjdCBzcGlfbm9yX3BwX2NvbW1hbmQgKnBwLA0KPiAg CXBwLT5wcm90byA9IHByb3RvOw0KPiAgfQ0KPiAgDQo+ICtzdGF0aWMgaW50IHNwaV9ub3JfaHdj YXBzMmNtZCh1MzIgaHdjYXBzLCBjb25zdCBpbnQgdGFibGVbXVsyXSwgc2l6ZV90IHNpemUpDQo+ ICt7DQo+ICsJc2l6ZV90IGk7DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0K PiArCQlpZiAodGFibGVbaV1bMF0gPT0gKGludClod2NhcHMpDQo+ICsJCQlyZXR1cm4gdGFibGVb aV1bMV07DQo+ICsNCj4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlu dCBzcGlfbm9yX2h3Y2Fwc19yZWFkMmNtZCh1MzIgaHdjYXBzKQ0KPiArew0KPiArCXN0YXRpYyBj b25zdCBpbnQgaHdjYXBzX3JlYWQyY21kW11bMl0gPSB7DQo+ICsJCXsgU05PUl9IV0NBUFNfUkVB RCwJCVNOT1JfQ01EX1JFQUQgfSwNCj4gKwkJeyBTTk9SX0hXQ0FQU19SRUFEX0ZBU1QsCVNOT1Jf Q01EX1JFQURfRkFTVCB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzFfRFRSLAlTTk9S X0NNRF9SRUFEXzFfMV8xX0RUUiB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzIsCVNO T1JfQ01EX1JFQURfMV8xXzIgfSwNCj4gKwkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfMl8yLAlTTk9S X0NNRF9SRUFEXzFfMl8yIH0sDQo+ICsJCXsgU05PUl9IV0NBUFNfUkVBRF8yXzJfMiwJU05PUl9D TURfUkVBRF8yXzJfMiB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8yXzJfRFRSLAlTTk9S X0NNRF9SRUFEXzFfMl8yX0RUUiB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzQsCVNO T1JfQ01EX1JFQURfMV8xXzQgfSwNCj4gKwkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfNF80LAlTTk9S X0NNRF9SRUFEXzFfNF80IH0sDQo+ICsJCXsgU05PUl9IV0NBUFNfUkVBRF80XzRfNCwJU05PUl9D TURfUkVBRF80XzRfNCB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV80XzRfRFRSLAlTTk9S X0NNRF9SRUFEXzFfNF80X0RUUiB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzgsCVNO T1JfQ01EX1JFQURfMV8xXzggfSwNCj4gKwkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfOF84LAlTTk9S X0NNRF9SRUFEXzFfOF84IH0sDQo+ICsJCXsgU05PUl9IV0NBUFNfUkVBRF84XzhfOCwJU05PUl9D TURfUkVBRF84XzhfOCB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1JFQURfMV84XzhfRFRSLAlTTk9S X0NNRF9SRUFEXzFfOF84X0RUUiB9LA0KPiArCX07DQo+ICsNCj4gKwlyZXR1cm4gc3BpX25vcl9o d2NhcHMyY21kKGh3Y2FwcywgaHdjYXBzX3JlYWQyY21kLA0KPiArCQkJCSAgQVJSQVlfU0laRSho d2NhcHNfcmVhZDJjbWQpKTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBzcGlfbm9yX2h3Y2Fw c19wcDJjbWQodTMyIGh3Y2FwcykNCj4gK3sNCj4gKwlzdGF0aWMgY29uc3QgaW50IGh3Y2Fwc19w cDJjbWRbXVsyXSA9IHsNCj4gKwkJeyBTTk9SX0hXQ0FQU19QUCwJCVNOT1JfQ01EX1BQIH0sDQo+ ICsJCXsgU05PUl9IV0NBUFNfUFBfMV8xXzQsCQlTTk9SX0NNRF9QUF8xXzFfNCB9LA0KPiArCQl7 IFNOT1JfSFdDQVBTX1BQXzFfNF80LAkJU05PUl9DTURfUFBfMV80XzQgfSwNCj4gKwkJeyBTTk9S X0hXQ0FQU19QUF80XzRfNCwJCVNOT1JfQ01EX1BQXzRfNF80IH0sDQo+ICsJCXsgU05PUl9IV0NB UFNfUFBfMV8xXzgsCQlTTk9SX0NNRF9QUF8xXzFfOCB9LA0KPiArCQl7IFNOT1JfSFdDQVBTX1BQ XzFfOF84LAkJU05PUl9DTURfUFBfMV84XzggfSwNCj4gKwkJeyBTTk9SX0hXQ0FQU19QUF84Xzhf OCwJCVNOT1JfQ01EX1BQXzhfOF84IH0sDQo+ICsJfTsNCj4gKw0KPiArCXJldHVybiBzcGlfbm9y X2h3Y2FwczJjbWQoaHdjYXBzLCBod2NhcHNfcHAyY21kLA0KPiArCQkJCSAgQVJSQVlfU0laRSho d2NhcHNfcHAyY21kKSk7DQo+ICt9DQo+ICsNCj4gIC8qDQo+ICAgKiBTZXJpYWwgRmxhc2ggRGlz Y292ZXJhYmxlIFBhcmFtZXRlcnMgKFNGRFApIHBhcnNpbmcuDQo+ICAgKi8NCj4gQEAgLTI1Mjcs OCArMjU3NCw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2ZkcF9iZnB0X2VyYXNlIHNmZHBfYmZw dF9lcmFzZXNbXSA9IHsNCj4gIAl7QkZQVF9EV09SRCg5KSwgMTZ9LA0KPiAgfTsNCj4gIA0KPiAt c3RhdGljIGludCBzcGlfbm9yX2h3Y2Fwc19yZWFkMmNtZCh1MzIgaHdjYXBzKTsNCj4gLQ0KPiAg LyoqDQo+ICAgKiBzcGlfbm9yX3NldF9lcmFzZV90eXBlKCkgLSBzZXQgYSBTUEkgTk9SIGVyYXNl IHR5cGUNCj4gICAqIEBlcmFzZToJcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJl cyBhIFNQSSBOT1IgZXJhc2UgdHlwZQ0KPiBAQCAtMzM0Miw1NyArMzM4Nyw2IEBAIHN0YXRpYyBp bnQgc3BpX25vcl9pbml0X3BhcmFtcyhzdHJ1Y3Qgc3BpX25vciAqbm9yLA0KPiAgCXJldHVybiAw Ow0KPiAgfQ0KPiAgDQo+IC1zdGF0aWMgaW50IHNwaV9ub3JfaHdjYXBzMmNtZCh1MzIgaHdjYXBz LCBjb25zdCBpbnQgdGFibGVbXVsyXSwgc2l6ZV90IHNpemUpDQo+IC17DQo+IC0Jc2l6ZV90IGk7 DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KPiAtCQlpZiAodGFibGVbaV1b MF0gPT0gKGludClod2NhcHMpDQo+IC0JCQlyZXR1cm4gdGFibGVbaV1bMV07DQo+IC0NCj4gLQly ZXR1cm4gLUVJTlZBTDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGludCBzcGlfbm9yX2h3Y2Fwc19y ZWFkMmNtZCh1MzIgaHdjYXBzKQ0KPiAtew0KPiAtCXN0YXRpYyBjb25zdCBpbnQgaHdjYXBzX3Jl YWQyY21kW11bMl0gPSB7DQo+IC0JCXsgU05PUl9IV0NBUFNfUkVBRCwJCVNOT1JfQ01EX1JFQUQg fSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19SRUFEX0ZBU1QsCVNOT1JfQ01EX1JFQURfRkFTVCB9LA0K PiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzFfRFRSLAlTTk9SX0NNRF9SRUFEXzFfMV8xX0RU UiB9LA0KPiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzIsCVNOT1JfQ01EX1JFQURfMV8xXzIg fSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfMl8yLAlTTk9SX0NNRF9SRUFEXzFfMl8yIH0s DQo+IC0JCXsgU05PUl9IV0NBUFNfUkVBRF8yXzJfMiwJU05PUl9DTURfUkVBRF8yXzJfMiB9LA0K PiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8yXzJfRFRSLAlTTk9SX0NNRF9SRUFEXzFfMl8yX0RU UiB9LA0KPiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzQsCVNOT1JfQ01EX1JFQURfMV8xXzQg fSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfNF80LAlTTk9SX0NNRF9SRUFEXzFfNF80IH0s DQo+IC0JCXsgU05PUl9IV0NBUFNfUkVBRF80XzRfNCwJU05PUl9DTURfUkVBRF80XzRfNCB9LA0K PiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV80XzRfRFRSLAlTTk9SX0NNRF9SRUFEXzFfNF80X0RU UiB9LA0KPiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV8xXzgsCVNOT1JfQ01EX1JFQURfMV8xXzgg fSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19SRUFEXzFfOF84LAlTTk9SX0NNRF9SRUFEXzFfOF84IH0s DQo+IC0JCXsgU05PUl9IV0NBUFNfUkVBRF84XzhfOCwJU05PUl9DTURfUkVBRF84XzhfOCB9LA0K PiAtCQl7IFNOT1JfSFdDQVBTX1JFQURfMV84XzhfRFRSLAlTTk9SX0NNRF9SRUFEXzFfOF84X0RU UiB9LA0KPiAtCX07DQo+IC0NCj4gLQlyZXR1cm4gc3BpX25vcl9od2NhcHMyY21kKGh3Y2Fwcywg aHdjYXBzX3JlYWQyY21kLA0KPiAtCQkJCSAgQVJSQVlfU0laRShod2NhcHNfcmVhZDJjbWQpKTsN Cj4gLX0NCj4gLQ0KPiAtc3RhdGljIGludCBzcGlfbm9yX2h3Y2Fwc19wcDJjbWQodTMyIGh3Y2Fw cykNCj4gLXsNCj4gLQlzdGF0aWMgY29uc3QgaW50IGh3Y2Fwc19wcDJjbWRbXVsyXSA9IHsNCj4g LQkJeyBTTk9SX0hXQ0FQU19QUCwJCVNOT1JfQ01EX1BQIH0sDQo+IC0JCXsgU05PUl9IV0NBUFNf UFBfMV8xXzQsCQlTTk9SX0NNRF9QUF8xXzFfNCB9LA0KPiAtCQl7IFNOT1JfSFdDQVBTX1BQXzFf NF80LAkJU05PUl9DTURfUFBfMV80XzQgfSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19QUF80XzRfNCwJ CVNOT1JfQ01EX1BQXzRfNF80IH0sDQo+IC0JCXsgU05PUl9IV0NBUFNfUFBfMV8xXzgsCQlTTk9S X0NNRF9QUF8xXzFfOCB9LA0KPiAtCQl7IFNOT1JfSFdDQVBTX1BQXzFfOF84LAkJU05PUl9DTURf UFBfMV84XzggfSwNCj4gLQkJeyBTTk9SX0hXQ0FQU19QUF84XzhfOCwJCVNOT1JfQ01EX1BQXzhf OF84IH0sDQo+IC0JfTsNCj4gLQ0KPiAtCXJldHVybiBzcGlfbm9yX2h3Y2FwczJjbWQoaHdjYXBz LCBod2NhcHNfcHAyY21kLA0KPiAtCQkJCSAgQVJSQVlfU0laRShod2NhcHNfcHAyY21kKSk7DQo+ IC19DQo+IC0NCj4gIHN0YXRpYyBpbnQgc3BpX25vcl9zZWxlY3RfcmVhZChzdHJ1Y3Qgc3BpX25v ciAqbm9yLA0KPiAgCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzcGlfbm9yX2ZsYXNoX3BhcmFtZXRl ciAqcGFyYW1zLA0KPiAgCQkJICAgICAgIHUzMiBzaGFyZWRfaHdjYXBzKQ0KPiBAQCAtMzY2OSw2 ICszNjYzLDE4IEBAIHZvaWQgc3BpX25vcl9yZXN0b3JlKHN0cnVjdCBzcGlfbm9yICpub3IpDQo+ ICB9DQo+ICBFWFBPUlRfU1lNQk9MX0dQTChzcGlfbm9yX3Jlc3RvcmUpOw0KPiAgDQo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IGZsYXNoX2luZm8gKnNwaV9ub3JfbWF0Y2hfaWQoY29uc3QgY2hhciAq bmFtZSkNCj4gK3sNCj4gKwljb25zdCBzdHJ1Y3QgZmxhc2hfaW5mbyAqaWQgPSBzcGlfbm9yX2lk czsNCj4gKw0KPiArCXdoaWxlIChpZC0+bmFtZSkgew0KPiArCQlpZiAoIXN0cmNtcChuYW1lLCBp ZC0+bmFtZSkpDQo+ICsJCQlyZXR1cm4gaWQ7DQo+ICsJCWlkKys7DQo+ICsJfQ0KPiArCXJldHVy biBOVUxMOw0KPiArfQ0KPiArDQo+ICBpbnQgc3BpX25vcl9zY2FuKHN0cnVjdCBzcGlfbm9yICpu b3IsIGNvbnN0IGNoYXIgKm5hbWUsDQo+ICAJCSBjb25zdCBzdHJ1Y3Qgc3BpX25vcl9od2NhcHMg Kmh3Y2FwcykNCj4gIHsNCj4gQEAgLTM4NzIsMTggKzM4NzgsNiBAQCBpbnQgc3BpX25vcl9zY2Fu KHN0cnVjdCBzcGlfbm9yICpub3IsIGNvbnN0IGNoYXIgKm5hbWUsDQo+ICB9DQo+ICBFWFBPUlRf U1lNQk9MX0dQTChzcGlfbm9yX3NjYW4pOw0KPiAgDQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IGZs YXNoX2luZm8gKnNwaV9ub3JfbWF0Y2hfaWQoY29uc3QgY2hhciAqbmFtZSkNCj4gLXsNCj4gLQlj b25zdCBzdHJ1Y3QgZmxhc2hfaW5mbyAqaWQgPSBzcGlfbm9yX2lkczsNCj4gLQ0KPiAtCXdoaWxl IChpZC0+bmFtZSkgew0KPiAtCQlpZiAoIXN0cmNtcChuYW1lLCBpZC0+bmFtZSkpDQo+IC0JCQly ZXR1cm4gaWQ7DQo+IC0JCWlkKys7DQo+IC0JfQ0KPiAtCXJldHVybiBOVUxMOw0KPiAtfQ0KPiAt DQo+ICBNT0RVTEVfTElDRU5TRSgiR1BMIik7DQo+ICBNT0RVTEVfQVVUSE9SKCJIdWFuZyBTaGlq aWUgPHNoaWppZThAZ21haWwuY29tPiIpOw0KPiAgTU9EVUxFX0FVVEhPUigiTWlrZSBMYXZlbmRl ciIpOw0KPiANCg==