From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Christian_K=c3=b6nig?= Subject: Re: [PATCH 2/2] drm/amdgpu: use ring buffer for fault handling on GMC 9 Date: Fri, 1 Feb 2019 14:23:57 +0100 Message-ID: <540f3688-6382-2cd1-f24c-aa378e7f596f@gmail.com> References: <20190124125256.9900-1-christian.koenig@amd.com> <20190124125256.9900-2-christian.koenig@amd.com> <39534cbd-d199-8a3d-2a8b-51f9d09e06e0@amd.com> Reply-To: christian.koenig-5C7GfCeVMHo@public.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <39534cbd-d199-8a3d-2a8b-51f9d09e06e0-5C7GfCeVMHo@public.gmane.org> Content-Language: en-US List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: "Kuehling, Felix" , "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" Cc: "Yang, Philip" SGkgRmVsaXgsCgpBbSAzMS4wMS4xOSB1bSAyMjozOCBzY2hyaWViIEt1ZWhsaW5nLCBGZWxpeDoK PiBJIGRvbid0IHNlZSBob3cgdGhpcyBzb2x2ZXMgYW55dGhpbmcuIFlvdSdsbCBzdGlsbCBuZWVk IHRvIHJlbW92ZQo+IGVudHJpZXMgZnJvbSB0aGlzIGZhdWx0IHJpbmcgYnVmZmVyLiBPdGhlcndp c2UgeW91J2xsIGlnbm9yZSBmYXVsdHMgZm9yCj4gYWRkcmVzc2VzIHRoYXQgaGF2ZSBmYXVsdGVk IHJlY2VudGx5LCBhbHRob3VnaCBpdCBtYXkgYmUgYSBuZXcgZmF1bHQuCj4KPiBBbHNvLCB0aGlz IHJlaW50cm9kdWNlcyBpbnRlcnJ1cHQgc3Rvcm1zIGFuZCByZXBlYXRlZCBwcm9jZXNzaW5nIG9m IHRoZQo+IHNhbWUgZmF1bHQgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBtb3JlIHRoYW4gNjQgZGlz dGluY3QgYWRkcmVzc2VzCj4gZmF1bHRpbmcgYXQgb25jZS4KClllYWgsIHRoaXMgaXMgbm90IG1l YW50IHRvIGJlIGEgcGVyZmVjdCBzb2x1dGlvbi4gSXQganVzdCB3b3JrcyBmb3Igbm93LgoKS2V5 IHBvaW50IGlzIHRoYXQgZnJvbSBteSBleHBlcmllbmNlIHRoZSBoYXJkd2FyZSBuZXZlciBmYXVs dHMgbW9yZSB0aGFuIAoyNiBkaWZmZXJlbnQgYWRkcmVzc2VzIGF0IHRoZSBzYW1lIHRpbWUgKGFu ZCBub3QgdGhlIHNsaWdodGVzdCBpZGVhIAp3aGVyZSB0aGlzIHJlc3RyaWN0aW9uIGNvbWVzIGZy b20pLiBTbyB3aXRoIDY0IGRpc3RpbmN0IGFkZHJlc3NlcyB3ZSAKc2hvdWxkIGJlIG9uIHRoZSBz YWZlIHNpZGUuCgpXaGF0IGNhbiBvYnZpb3VzbHkgaGFwcGVuIGlzIHRoYXQgaGFyZHdhcmUgZmF1 bHRzIGFkZHJlc3MgQSwgd2Ugc2VydmUgCnRoYXQgb25lLCBPUyBldmljdHMgcGFnZSBhdCBhZGRy ZXNzIEEsIGJ1dCBhZGRyZXNzIEEgaXMgc3RpbGwgaW4gdGhlIApmYXVsdCBoYW5kbGluZyBhbmQg d2UgbmV2ZXIgbm90aWNlIHRoYXQgaXQgaXMgZmF1bHRlZCBvbmNlIG1vcmUuCgo+IEkgdGhpbmsg dGhlIHNvbHV0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQuIFdlIGRvIG5lZWQgYSB3YXkgdG8gaWdu b3JlCj4gZHVwbGljYXRlIGZhdWx0cyBmb3IgdGhlIHNhbWUgYWRkcmVzcy4gVGhlIHByb2JsZW0g eW91IHJhbiBpbnRvIHdhcyB0aGF0Cj4gYWZ0ZXIgY2xlYXJpbmcgYW4gZW50cnksIHlvdSBnZXQg YWRkaXRpb25hbCBpbnRlcnJ1cHRzIGZvciB0aGUgc2FtZQo+IGFkZHJlc3MuIFRoaXMgY291bGQg YmUgaGFuZGxlZCBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBhZ2Ugb2YgSUggcmluZwo+IGVudHJp ZXMuIEFmdGVyIHdlIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZSBhbmQgZmx1c2ggVExCcywgdGhlcmUg bWF5IHN0aWxsCj4gYmUgc3RhbGUgZW50cmllcyBpbiB0aGUgSUggcmluZy4gQnV0IG5vIG5ldyBp bnRlcnJ1cHRzIHNob3VsZCBiZQo+IGdlbmVyYXRlZCAodW50aWwgdGhhdCBQVEUgaXMgaW52YWxp ZGF0ZWQgYWdhaW4pLiBTbyB3ZSBjYW4gY2hlY2sgdGhlCj4gY3VycmVudCBJSCB3cHRyLiBXaGVu IElIIHByb2Nlc3NpbmcgKHJwdHIpIGhhcyBjYXVnaHQgdXAgdG8gdGhhdCB2YWx1ZSwKPiBhbGwg dGhlIHN0YWxlIHJldHJ5IGludGVycnVwdHMgaGF2ZSBiZWVuIGZsdXNoZWQsIGFuZCB3ZSBjYW4g cmVtb3ZlIHRoZQo+IGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUgKG9yIHJpbmcgYnVmZmVyKS4g QW55IHN1YnNlcXVlbnQgaW50ZXJydXB0cwo+IGZvciB0aGUgc2FtZSBhZGRyZXNzIGFyZSBuZXcg YW5kIHNob3VsZCBiZSBoYW5kbGVkIGFnYWluLgoKVGhhdCdzIHdoYXQgSSB0aG91Z2h0IGluaXRp YWxseSBhcyB3ZWxsLCBidXQgdGhlIHByb2JsZW0gaXMgdGhpcyBoYXMgCmFic29sdXRlbHkgbm90 aGluZyB0b2RvIHdpdGggdGhlIElIIHJpbmcgYnVmZmVyIHNpemUuCgpTZWUgdGhlIElIIHJpbmcg aXMgb25seSAzMiBlbnRyaWVzLCBidXQgaW4gbXkgdGVzdHMgSSd2ZSBzb21ldGltZXMgZ290IAog PjIwMCBzdGFsZSBmYXVsdHMgZnJvbSB0aGUgaGFyZHdhcmUuCgpUaGUgZXhwbGFuYXRpb24gaXMg dGhhdCBJIHJlY2VudGx5IGxlYXJuZWQgZnJvbSB0aGUgaGFyZHdhcmUgZ3V5cyB0aGF0IAp0aGUg VkEgZmlmbyBvZiB0aGUgU0RNQSBpcyAyNTYgZW50cmllcyBsb25nISBBbmQgSSBzdXNwZWN0IHRo YXQgdGhlIEdGWCAKZmlmbyBpcyBub3Qgc2hvcnRlci4KClRvIG1ha2UgdGhlIHNpdHVhdGlvbiBl dmVuIHdvcnNlIEkgaGF2ZSBhIG5pY2UgbG9nIHdoZXJlIGEgcmVuZGVyaW5nIApvcGVyYXRpb24g Y29tcGxldGVkICh3aXRoIGludGVycnVwdCBhbmQgZXZlcnl0aGluZyBmaW5pc2hlZCksIGFjY29y ZGluZyAKdG8gdGhlIHJlZ2lzdGVycyB0aGUgR0ZYIGJsb2NrIGlzIGNvbXBsZXRlbHkgaWRsZSBh bmQgeW91IGFyZSBzdGlsbCAKZ2V0dGluZyBodW5kcmVkcyBvZiBzdGFsZSBmYXVsdHMgZm9yIHRo aXMgb3BlcmF0aW9uLgoKTmljZSBpc24ndCBpdD8gU28gd2UgY2FuIGNlcnRhaW5seSBub3QgdGll IHRoaXMgdG8gdGhlIFZNIG9yIHdlIGFyZSAKZ29pbmcgdG8gbmVlZCBzb21lIGdyYWNlIHBlcmlv ZCBiZWZvcmUgZGVzdHJveWluZyBWTXMgb3Igc29tZXRoaW5nIGxpa2UgCnRoaXMuCgpSZWdhcmRz LApDaHJpc3RpYW4uCgo+Cj4gUmVnYXJkcywKPiAgIMKgIEZlbGl4Cj4KPiBPbiAyMDE5LTAxLTI0 IDc6NTIgYS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToKPj4gRnVydGhlciB0ZXN0aW5nIHNo b3dlZCB0aGF0IHRoZSBpZGVhIHdpdGggdGhlIGNoYXNoIGRvZXNuJ3Qgd29yayBhcyBleHBlY3Rl ZC4KPj4gRXNwZWNpYWxseSB3ZSBjYW4ndCBwcmVkaWN0IHdoZW4gd2UgY2FuIHJlbW92ZSB0aGUg ZW50cmllcyBmcm9tIHRoZSBoYXNoIGFnYWluLgo+Pgo+PiBTbyByZXBsYWNlIHRoZSBjaGFzaCB3 aXRoIGEgc2ltcGxlIHJpbmcgYnVmZmVyIGZvciBub3cgdG8gZmlsdGVyIG91dCB0aGUKPj4gYWxy ZWFkeSBoYW5kbGVkIGZhdWx0cy4gQXMgbG9uZyBhcyB3ZSBzZWUgbGVzcyB0aGFuIDY0IGRpc3Rp bmN0IGFkZHJlc3NlcyB3ZQo+PiBzdGlsbCByZXBvcnQgdGhlbSBvbmx5IG9uY2UgdG8gdGhlIGZv bGxvd2luZyBoYW5kbGluZy4KPj4KPj4gU2lnbmVkLW9mZi1ieTogQ2hyaXN0aWFuIEvDtm5pZyA8 Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPgo+PiAtLS0KPj4gICAgZHJpdmVycy9ncHUvZHJtL0tj b25maWcgICAgICAgICAgICAgICAgICAgfCAgIDIgLQo+PiAgICBkcml2ZXJzL2dwdS9kcm0vTWFr ZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgMSAtCj4+ICAgIGRyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV9nbWMuaCAgIHwgICA4ICsKPj4gICAgZHJpdmVycy9ncHUvZHJtL2FtZC9h bWRncHUvYW1kZ3B1X3ZtLmMgICAgfCAxMDUgLS0tLQo+PiAgICBkcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdm0uaCAgICB8ICAxNCAtCj4+ICAgIGRyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2dtY192OV8wLmMgICAgIHwgIDQwICstCj4+ICAgIGRyaXZlcnMvZ3B1L2RybS9hbWQv aW5jbHVkZS9saW51eC9jaGFzaC5oIHwgMzY2IC0tLS0tLS0tLS0tLS0KPj4gICAgZHJpdmVycy9n cHUvZHJtL2FtZC9saWIvS2NvbmZpZyAgICAgICAgICAgfCAgMjggLQo+PiAgICBkcml2ZXJzL2dw dS9kcm0vYW1kL2xpYi9NYWtlZmlsZSAgICAgICAgICB8ICAzMiAtLQo+PiAgICBkcml2ZXJzL2dw dS9kcm0vYW1kL2xpYi9jaGFzaC5jICAgICAgICAgICB8IDYzOCAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tCj4+ICAgIDEwIGZpbGVzIGNoYW5nZWQsIDE2IGluc2VydGlvbnMoKyksIDEyMTggZGVsZXRp b25zKC0pCj4+ICAgIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1 ZGUvbGludXgvY2hhc2guaAo+PiAgICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJt L2FtZC9saWIvS2NvbmZpZwo+PiAgICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJt L2FtZC9saWIvTWFrZWZpbGUKPj4gICAgZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2Ry bS9hbWQvbGliL2NoYXNoLmMKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9LY29u ZmlnIGIvZHJpdmVycy9ncHUvZHJtL0tjb25maWcKPj4gaW5kZXggNDM4NWYwMGUxZDA1Li45OGIw MzNlNjc1ZGIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4+IEBAIC0yMjksOCArMjI5LDYgQEAgY29uZmlnIERS TV9BTURHUFUKPj4gICAgCj4+ICAgIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv S2NvbmZpZyIKPj4gICAgCj4+IC1zb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25m aWciCj4+IC0KPj4gICAgc291cmNlICJkcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIgo+ PiAgICAKPj4gICAgc291cmNlICJkcml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnIgo+PiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2Vm aWxlCj4+IGluZGV4IDdmM2JlMzUwNjA1Ny4uYWM2MjEzNTc1NjkxIDEwMDY0NAo+PiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxl Cj4+IEBAIC01Niw3ICs1Niw2IEBAIG9iai0kKENPTkZJR19EUk1fVFRNKQkrPSB0dG0vCj4+ICAg IG9iai0kKENPTkZJR19EUk1fU0NIRUQpCSs9IHNjaGVkdWxlci8KPj4gICAgb2JqLSQoQ09ORklH X0RSTV9UREZYKQkrPSB0ZGZ4Lwo+PiAgICBvYmotJChDT05GSUdfRFJNX1IxMjgpCSs9IHIxMjgv Cj4+IC1vYmoteQkJCSs9IGFtZC9saWIvCj4+ICAgIG9iai0kKENPTkZJR19IU0FfQU1EKSArPSBh bWQvYW1ka2ZkLwo+PiAgICBvYmotJChDT05GSUdfRFJNX1JBREVPTikrPSByYWRlb24vCj4+ICAg IG9iai0kKENPTkZJR19EUk1fQU1ER1BVKSs9IGFtZC9hbWRncHUvCj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ21jLmggYi9kcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9hbWRncHVfZ21jLmgKPj4gaW5kZXggODFlNjA3MGQyNTViLi44M2M0MTVlYjQw ZjQgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMu aAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ21jLmgKPj4gQEAg LTQzLDYgKzQzLDExIEBACj4+ICAgICAqLwo+PiAgICAjZGVmaW5lIEFNREdQVV9HTUNfSE9MRV9N QVNLCTB4MDAwMGZmZmZmZmZmZmZmZlVMTAo+PiAgICAKPj4gKy8qCj4+ICsgKiBOdW1iZXIgb2Yg ZW50cmllcyBmb3IgdGhlIGxvZyBvZiByZWNlbnQgVk0gZmF1bHRzCj4+ICsgKi8KPj4gKyNkZWZp bmUgQU1ER1BVX0dNQ19OVU1fVk1fRkFVTFRTCTY0Cj4+ICsKPj4gICAgc3RydWN0IGZpcm13YXJl Owo+PiAgICAKPj4gICAgLyoKPj4gQEAgLTE0Nyw2ICsxNTIsOSBAQCBzdHJ1Y3QgYW1kZ3B1X2dt YyB7Cj4+ICAgIAlzdHJ1Y3Qga2ZkX3ZtX2ZhdWx0X2luZm8gKnZtX2ZhdWx0X2luZm87Cj4+ICAg IAlhdG9taWNfdAkJdm1fZmF1bHRfaW5mb191cGRhdGVkOwo+PiAgICAKPj4gKwl1aW50NjRfdAkJ dm1fZmF1bHRzW0FNREdQVV9HTUNfTlVNX1ZNX0ZBVUxUU107Cj4+ICsJaW50CQkJdm1fZmF1bHRf aWR4Owo+PiArCj4+ICAgIAljb25zdCBzdHJ1Y3QgYW1kZ3B1X2dtY19mdW5jcwkqZ21jX2Z1bmNz Owo+PiAgICAKPj4gICAgCXN0cnVjdCBhbWRncHVfeGdtaSB4Z21pOwo+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9hbWRncHVfdm0uYwo+PiBpbmRleCAwYmM2ZjU1M2RjMDguLjMwNDFkNzJjNTQ3 OCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMK Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMKPj4gQEAgLTI5 NzIsMjIgKzI5NzIsNiBAQCB2b2lkIGFtZGdwdV92bV9hZGp1c3Rfc2l6ZShzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwgdWludDMyX3QgbWluX3ZtX3NpemUsCj4+ICAgIAkJIGFkZXYtPnZtX21h bmFnZXIuZnJhZ21lbnRfc2l6ZSk7Cj4+ICAgIH0KPj4gICAgCj4+IC1zdGF0aWMgc3RydWN0IGFt ZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqaW5pdF9mYXVsdF9oYXNoKHZvaWQpCj4+IC17Cj4+ IC0Jc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRfaGFzaDsKPj4gLQo+ PiAtCWZhdWx0X2hhc2ggPSBrbWFsbG9jKHNpemVvZigqZmF1bHRfaGFzaCksIEdGUF9LRVJORUwp Owo+PiAtCWlmICghZmF1bHRfaGFzaCkKPj4gLQkJcmV0dXJuIGZhdWx0X2hhc2g7Cj4+IC0KPj4g LQlJTklUX0NIQVNIX1RBQkxFKGZhdWx0X2hhc2gtPmhhc2gsCj4+IC0JCQlBTURHUFVfUEFHRUZB VUxUX0hBU0hfQklUUywgOCwgMCk7Cj4+IC0Jc3Bpbl9sb2NrX2luaXQoJmZhdWx0X2hhc2gtPmxv Y2spOwo+PiAtCWZhdWx0X2hhc2gtPmNvdW50ID0gMDsKPj4gLQo+PiAtCXJldHVybiBmYXVsdF9o YXNoOwo+PiAtfQo+PiAtCj4+ICAgIC8qKgo+PiAgICAgKiBhbWRncHVfdm1faW5pdCAtIGluaXRp YWxpemUgYSB2bSBpbnN0YW5jZQo+PiAgICAgKgo+PiBAQCAtMzA4MCwxMiArMzA2NCw2IEBAIGlu dCBhbWRncHVfdm1faW5pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgc3RydWN0IGFtZGdw dV92bSAqdm0sCj4+ICAgIAkJdm0tPnBhc2lkID0gcGFzaWQ7Cj4+ICAgIAl9Cj4+ICAgIAo+PiAt CXZtLT5mYXVsdF9oYXNoID0gaW5pdF9mYXVsdF9oYXNoKCk7Cj4+IC0JaWYgKCF2bS0+ZmF1bHRf aGFzaCkgewo+PiAtCQlyID0gLUVOT01FTTsKPj4gLQkJZ290byBlcnJvcl9mcmVlX3Jvb3Q7Cj4+ IC0JfQo+PiAtCj4+ICAgIAlJTklUX0tGSUZPKHZtLT5mYXVsdHMpOwo+PiAgICAKPj4gICAgCXJl dHVybiAwOwo+PiBAQCAtMzI0MSwxNSArMzIxOSwxMCBAQCB2b2lkIGFtZGdwdV92bV9maW5pKHN0 cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBzdHJ1Y3QgYW1kZ3B1X3ZtICp2bSkKPj4gICAgCXN0 cnVjdCBhbWRncHVfYm9fdmFfbWFwcGluZyAqbWFwcGluZywgKnRtcDsKPj4gICAgCWJvb2wgcHJ0 X2ZpbmlfbmVlZGVkID0gISFhZGV2LT5nbWMuZ21jX2Z1bmNzLT5zZXRfcHJ0Owo+PiAgICAJc3Ry dWN0IGFtZGdwdV9ibyAqcm9vdDsKPj4gLQl1NjQgZmF1bHQ7Cj4+ICAgIAlpbnQgaSwgcjsKPj4g ICAgCj4+ICAgIAlhbWRncHVfYW1ka2ZkX2dwdXZtX2Rlc3Ryb3lfY2IoYWRldiwgdm0pOwo+PiAg ICAKPj4gLQkvKiBDbGVhciBwZW5kaW5nIHBhZ2UgZmF1bHRzIGZyb20gSUggd2hlbiB0aGUgVk0g aXMgZGVzdHJveWVkICovCj4+IC0Jd2hpbGUgKGtmaWZvX2dldCgmdm0tPmZhdWx0cywgJmZhdWx0 KSkKPj4gLQkJYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHZtLT5mYXVsdF9oYXNoLCBmYXVsdCk7Cj4+ IC0KPj4gICAgCWlmICh2bS0+cGFzaWQpIHsKPj4gICAgCQl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ PiAgICAKPj4gQEAgLTMyNTgsOSArMzIzMSw2IEBAIHZvaWQgYW1kZ3B1X3ZtX2Zpbmkoc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHN0cnVjdCBhbWRncHVfdm0gKnZtKQo+PiAgICAJCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jaywgZmxhZ3MpOwo+ PiAgICAJfQo+PiAgICAKPj4gLQlrZnJlZSh2bS0+ZmF1bHRfaGFzaCk7Cj4+IC0Jdm0tPmZhdWx0 X2hhc2ggPSBOVUxMOwo+PiAtCj4+ICAgIAlkcm1fc2NoZWRfZW50aXR5X2Rlc3Ryb3koJnZtLT5l bnRpdHkpOwo+PiAgICAKPj4gICAgCWlmICghUkJfRU1QVFlfUk9PVCgmdm0tPnZhLnJiX3Jvb3Qp KSB7Cj4+IEBAIC0zNDI2LDc4ICszMzk2LDMgQEAgdm9pZCBhbWRncHVfdm1fc2V0X3Rhc2tfaW5m byhzdHJ1Y3QgYW1kZ3B1X3ZtICp2bSkKPj4gICAgCQl9Cj4+ICAgIAl9Cj4+ICAgIH0KPj4gLQo+ PiAtLyoqCj4+IC0gKiBhbWRncHVfdm1fYWRkX2ZhdWx0IC0gQWRkIGEgcGFnZSBmYXVsdCByZWNv cmQgdG8gZmF1bHQgaGFzaCB0YWJsZQo+PiAtICoKPj4gLSAqIEBmYXVsdF9oYXNoOiBmYXVsdCBo YXNoIHRhYmxlCj4+IC0gKiBAa2V5OiA2NC1iaXQgZW5jb2Rpbmcgb2YgUEFTSUQgYW5kIGFkZHJl c3MKPj4gLSAqCj4+IC0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHJldHJ5IHBhZ2Ug ZmF1bHQgaW50ZXJydXB0IGlzCj4+IC0gKiByZWNlaXZlZC4gSWYgdGhpcyBpcyBhIG5ldyBwYWdl IGZhdWx0LCBpdCB3aWxsIGJlIGFkZGVkIHRvIGEgaGFzaAo+PiAtICogdGFibGUuIFRoZSByZXR1 cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIG5ldyBmYXVsdCwgb3IKPj4gLSAq IGEgZmF1bHQgdGhhdCB3YXMgYWxyZWFkeSBrbm93biBhbmQgaXMgYWxyZWFkeSBiZWluZyBoYW5k bGVkLgo+PiAtICoKPj4gLSAqIElmIHRoZXJlIGFyZSB0b28gbWFueSBwZW5kaW5nIHBhZ2UgZmF1 bHRzLCB0aGlzIHdpbGwgZmFpbC4gUmV0cnkKPj4gLSAqIGludGVycnVwdHMgc2hvdWxkIGJlIGln bm9yZWQgaW4gdGhpcyBjYXNlIHVudGlsIHRoZXJlIGlzIGVub3VnaAo+PiAtICogZnJlZSBzcGFj ZS4KPj4gLSAqCj4+IC0gKiBSZXR1cm5zIDAgaWYgdGhlIGZhdWx0IHdhcyBhZGRlZCwgMSBpZiB0 aGUgZmF1bHQgd2FzIGFscmVhZHkga25vd24sCj4+IC0gKiAtRU5PU1BDIGlmIHRoZXJlIGFyZSB0 b28gbWFueSBwZW5kaW5nIGZhdWx0cy4KPj4gLSAqLwo+PiAtaW50IGFtZGdwdV92bV9hZGRfZmF1 bHQoc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRfaGFzaCwgdTY0IGtl eSkKPj4gLXsKPj4gLQl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiAtCWludCByID0gLUVOT1NQQzsK Pj4gLQo+PiAtCWlmIChXQVJOX09OX09OQ0UoIWZhdWx0X2hhc2gpKQo+PiAtCQkvKiBTaG91bGQg YmUgYWxsb2NhdGVkIGluIGFtZGdwdV92bV9pbml0Cj4+IC0JCSAqLwo+PiAtCQlyZXR1cm4gcjsK Pj4gLQo+PiAtCXNwaW5fbG9ja19pcnFzYXZlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7Cj4+ IC0KPj4gLQkvKiBPbmx5IGxldCB0aGUgaGFzaCB0YWJsZSBmaWxsIHVwIHRvIDUwJSBmb3IgYmVz dCBwZXJmb3JtYW5jZSAqLwo+PiAtCWlmIChmYXVsdF9oYXNoLT5jb3VudCA+PSAoMSA8PCAoQU1E R1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMtMSkpKQo+PiAtCQlnb3RvIHVubG9ja19vdXQ7Cj4+IC0K Pj4gLQlyID0gY2hhc2hfdGFibGVfY29weV9pbigmZmF1bHRfaGFzaC0+aGFzaCwga2V5LCBOVUxM KTsKPj4gLQlpZiAoIXIpCj4+IC0JCWZhdWx0X2hhc2gtPmNvdW50Kys7Cj4+IC0KPj4gLQkvKiBj aGFzaF90YWJsZV9jb3B5X2luIHNob3VsZCBuZXZlciBmYWlsIHVubGVzcyB3ZSdyZSBsb3Npbmcg Y291bnQgKi8KPj4gLQlXQVJOX09OX09OQ0UociA8IDApOwo+PiAtCj4+IC11bmxvY2tfb3V0Ogo+ PiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZhdWx0X2hhc2gtPmxvY2ssIGZsYWdzKTsKPj4g LQlyZXR1cm4gcjsKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBhbWRncHVfdm1fY2xlYXJfZmF1 bHQgLSBSZW1vdmUgYSBwYWdlIGZhdWx0IHJlY29yZAo+PiAtICoKPj4gLSAqIEBmYXVsdF9oYXNo OiBmYXVsdCBoYXNoIHRhYmxlCj4+IC0gKiBAa2V5OiA2NC1iaXQgZW5jb2Rpbmcgb2YgUEFTSUQg YW5kIGFkZHJlc3MKPj4gLSAqCj4+IC0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHBh Z2UgZmF1bHQgaGFzIGJlZW4gaGFuZGxlZC4gQW55Cj4+IC0gKiBmdXR1cmUgaW50ZXJydXB0IHdp dGggdGhpcyBrZXkgd2lsbCBiZSBwcm9jZXNzZWQgYXMgYSBuZXcKPj4gLSAqIHBhZ2UgZmF1bHQu Cj4+IC0gKi8KPj4gLXZvaWQgYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0 cnlmYXVsdF9oYXNodGFibGUgKmZhdWx0X2hhc2gsIHU2NCBrZXkpCj4+IC17Cj4+IC0JdW5zaWdu ZWQgbG9uZyBmbGFnczsKPj4gLQlpbnQgcjsKPj4gLQo+PiAtCWlmICghZmF1bHRfaGFzaCkKPj4g LQkJcmV0dXJuOwo+PiAtCj4+IC0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZhdWx0X2hhc2gtPmxvY2ss IGZsYWdzKTsKPj4gLQo+PiAtCXIgPSBjaGFzaF90YWJsZV9yZW1vdmUoJmZhdWx0X2hhc2gtPmhh c2gsIGtleSwgTlVMTCk7Cj4+IC0JaWYgKCFXQVJOX09OX09OQ0UociA8IDApKSB7Cj4+IC0JCWZh dWx0X2hhc2gtPmNvdW50LS07Cj4+IC0JCVdBUk5fT05fT05DRShmYXVsdF9oYXNoLT5jb3VudCA8 IDApOwo+PiAtCX0KPj4gLQo+PiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZhdWx0X2hhc2gt PmxvY2ssIGZsYWdzKTsKPj4gLX0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV92bS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3Zt LmgKPj4gaW5kZXggODFmZjgxNzdmMDkyLi43YzQ5MjM1YjYwNjQgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5oCj4+IEBAIC0zMCw3ICszMCw2IEBACj4+ICAgICNp bmNsdWRlIDxkcm0vZ3B1X3NjaGVkdWxlci5oPgo+PiAgICAjaW5jbHVkZSA8ZHJtL2RybV9maWxl Lmg+Cj4+ICAgICNpbmNsdWRlIDxkcm0vdHRtL3R0bV9ib19kcml2ZXIuaD4KPj4gLSNpbmNsdWRl IDxsaW51eC9jaGFzaC5oPgo+PiAgICAKPj4gICAgI2luY2x1ZGUgImFtZGdwdV9zeW5jLmgiCj4+ ICAgICNpbmNsdWRlICJhbWRncHVfcmluZy5oIgo+PiBAQCAtMTc5LDEzICsxNzgsNiBAQCBzdHJ1 Y3QgYW1kZ3B1X3Rhc2tfaW5mbyB7Cj4+ICAgIAlwaWRfdAl0Z2lkOwo+PiAgICB9Owo+PiAgICAK Pj4gLSNkZWZpbmUgQU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMgOAo+PiAtc3RydWN0IGFtZGdw dV9yZXRyeWZhdWx0X2hhc2h0YWJsZSB7Cj4+IC0JREVDTEFSRV9DSEFTSF9UQUJMRShoYXNoLCBB TURHUFVfUEFHRUZBVUxUX0hBU0hfQklUUywgOCwgMCk7Cj4+IC0Jc3BpbmxvY2tfdAlsb2NrOwo+ PiAtCWludAkJY291bnQ7Cj4+IC19Owo+PiAtCj4+ICAgIHN0cnVjdCBhbWRncHVfdm0gewo+PiAg ICAJLyogdHJlZSBvZiB2aXJ0dWFsIGFkZHJlc3NlcyBtYXBwZWQgKi8KPj4gICAgCXN0cnVjdCBy Yl9yb290X2NhY2hlZAl2YTsKPj4gQEAgLTI0NSw3ICsyMzcsNiBAQCBzdHJ1Y3QgYW1kZ3B1X3Zt IHsKPj4gICAgCXN0cnVjdCB0dG1fbHJ1X2J1bGtfbW92ZSBscnVfYnVsa19tb3ZlOwo+PiAgICAJ LyogbWFyayB3aGV0aGVyIGNhbiBkbyB0aGUgYnVsayBtb3ZlICovCj4+ICAgIAlib29sCQkJYnVs a19tb3ZlYWJsZTsKPj4gLQlzdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVs dF9oYXNoOwo+PiAgICB9Owo+PiAgICAKPj4gICAgc3RydWN0IGFtZGdwdV92bV9tYW5hZ2VyIHsK Pj4gQEAgLTM1OCwxMSArMzQ5LDYgQEAgdm9pZCBhbWRncHVfdm1fc2V0X3Rhc2tfaW5mbyhzdHJ1 Y3QgYW1kZ3B1X3ZtICp2bSk7Cj4+ICAgIAo+PiAgICB2b2lkIGFtZGdwdV92bV9tb3ZlX3RvX2xy dV90YWlsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAo+PiAgICAJCQkJc3RydWN0IGFtZGdw dV92bSAqdm0pOwo+PiAtCj4+IC1pbnQgYW1kZ3B1X3ZtX2FkZF9mYXVsdChzdHJ1Y3QgYW1kZ3B1 X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVsdF9oYXNoLCB1NjQga2V5KTsKPj4gLQo+PiAtdm9p ZCBhbWRncHVfdm1fY2xlYXJfZmF1bHQoc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJs ZSAqZmF1bHRfaGFzaCwgdTY0IGtleSk7Cj4+IC0KPj4gICAgdm9pZCBhbWRncHVfdm1fZGVsX2Zy b21fbHJ1X25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKPj4gICAgCj4+ICAg ICNlbmRpZgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5 XzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192OV8wLmMKPj4gaW5kZXggOWMw ODJmOWFlYTFhLi45NjRlNzg5OTA4ZDUgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L2dtY192OV8wLmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv Z21jX3Y5XzAuYwo+PiBAQCAtMjU1LDQ4ICsyNTUsMjQgQEAgc3RhdGljIGJvb2wgZ21jX3Y5XzBf cHJlc2NyZWVuX2l2KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAo+PiAgICAJCQkJICBzdHJ1 Y3QgYW1kZ3B1X2l2X2VudHJ5ICplbnRyeSwKPj4gICAgCQkJCSAgdWludDY0X3QgYWRkcikKPj4g ICAgewo+PiAtCXN0cnVjdCBhbWRncHVfdm0gKnZtOwo+PiArCXVuc2lnbmVkIGk7Cj4+ICAgIAl1 NjQga2V5Owo+PiAtCWludCByOwo+PiAgICAKPj4gICAgCS8qIE5vIFBBU0lELCBjYW4ndCBpZGVu dGlmeSBmYXVsdGluZyBwcm9jZXNzICovCj4+ICAgIAlpZiAoIWVudHJ5LT5wYXNpZCkKPj4gICAg CQlyZXR1cm4gdHJ1ZTsKPj4gICAgCj4+IC0JLyogTm90IGEgcmV0cnkgZmF1bHQgKi8KPj4gLQlp ZiAoIShlbnRyeS0+c3JjX2RhdGFbMV0gJiAweDgwKSkKPj4gLQkJcmV0dXJuIHRydWU7Cj4+IC0K Pj4gLQkvKiBUcmFjayByZXRyeSBmYXVsdHMgaW4gcGVyLVZNIGZhdWx0IEZJRk8uICovCj4+IC0J c3Bpbl9sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOwo+PiAtCXZtID0gaWRyX2Zp bmQoJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfaWRyLCBlbnRyeS0+cGFzaWQpOwo+PiAtCWlmICgh dm0pIHsKPj4gLQkJLyogVk0gbm90IGZvdW5kLCBwcm9jZXNzIGl0IG5vcm1hbGx5ICovCj4+IC0J CXNwaW5fdW5sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOwo+PiAtCQlyZXR1cm4g dHJ1ZTsKPj4gLQl9Cj4+IC0KPj4gICAgCWtleSA9IEFNREdQVV9WTV9GQVVMVChlbnRyeS0+cGFz aWQsIGFkZHIpOwo+PiAtCXIgPSBhbWRncHVfdm1fYWRkX2ZhdWx0KHZtLT5mYXVsdF9oYXNoLCBr ZXkpOwo+PiAgICAKPj4gLQkvKiBIYXNoIHRhYmxlIGlzIGZ1bGwgb3IgdGhlIGZhdWx0IGlzIGFs cmVhZHkgYmVpbmcgcHJvY2Vzc2VkLAo+PiAtCSAqIGlnbm9yZSBmdXJ0aGVyIHBhZ2UgZmF1bHRz Cj4+IC0JICovCj4+IC0JaWYgKHIgIT0gMCkgewo+PiAtCQlzcGluX3VubG9jaygmYWRldi0+dm1f bWFuYWdlci5wYXNpZF9sb2NrKTsKPj4gLQkJcmV0dXJuIGZhbHNlOwo+PiAtCX0KPj4gLQkvKiBO byBsb2NraW5nIHJlcXVpcmVkIHdpdGggc2luZ2xlIHdyaXRlciBhbmQgc2luZ2xlIHJlYWRlciAq Lwo+PiAtCXIgPSBrZmlmb19wdXQoJnZtLT5mYXVsdHMsIGtleSk7Cj4+IC0JaWYgKCFyKSB7Cj4+ IC0JCS8qIEZJRk8gaXMgZnVsbC4gSWdub3JlIGl0IHVudGlsIHRoZXJlIGlzIHNwYWNlICovCj4+ IC0JCWFtZGdwdV92bV9jbGVhcl9mYXVsdCh2bS0+ZmF1bHRfaGFzaCwga2V5KTsKPj4gLQkJc3Bp bl91bmxvY2soJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jayk7Cj4+IC0JCXJldHVybiBmYWxz ZTsKPj4gKwkvKiBUcmFjayB0aGUgbGFzdCBOIGZhdWx0cyBhbmQgZG9uJ3QgcmVwb3J0IHRoZW0g YWdhaW4gb24gcmV0cnkgKi8KPj4gKwlmb3IgKGkgPSAwOyBpIDwgQU1ER1BVX0dNQ19OVU1fVk1f RkFVTFRTOyArK2kpIHsKPj4gKwkJaWYgKGFkZXYtPmdtYy52bV9mYXVsdHNbaV0gPT0ga2V5KQo+ PiArCQkJcmV0dXJuIGZhbHNlOwo+PiAgICAJfQo+PiAgICAKPj4gLQlzcGluX3VubG9jaygmYWRl di0+dm1fbWFuYWdlci5wYXNpZF9sb2NrKTsKPj4gICAgCS8qIEl0J3MgdGhlIGZpcnN0IGZhdWx0 IGZvciB0aGlzIGFkZHJlc3MsIHByb2Nlc3MgaXQgbm9ybWFsbHkgKi8KPj4gKwlhZGV2LT5nbWMu dm1fZmF1bHRzW2FkZXYtPmdtYy52bV9mYXVsdF9pZHgrK10gPSBrZXk7Cj4+ICsJYWRldi0+Z21j LnZtX2ZhdWx0X2lkeCAlPSBBTURHUFVfR01DX05VTV9WTV9GQVVMVFM7Cj4+ICAgIAlyZXR1cm4g dHJ1ZTsKPj4gICAgfQo+PiAgICAKPj4gQEAgLTMxMiw3ICsyODgsNyBAQCBzdGF0aWMgaW50IGdt Y192OV8wX3Byb2Nlc3NfaW50ZXJydXB0KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAo+PiAg ICAJYWRkciA9ICh1NjQpZW50cnktPnNyY19kYXRhWzBdIDw8IDEyOwo+PiAgICAJYWRkciB8PSAo KHU2NCllbnRyeS0+c3JjX2RhdGFbMV0gJiAweGYpIDw8IDQ0Owo+PiAgICAKPj4gLQlpZiAoIWdt Y192OV8wX3ByZXNjcmVlbl9pdihhZGV2LCBlbnRyeSwgYWRkcikpCj4+ICsJaWYgKHJldHJ5X2Zh dWx0ICYmICFnbWNfdjlfMF9wcmVzY3JlZW5faXYoYWRldiwgZW50cnksIGFkZHIpKQo+PiAgICAJ CXJldHVybiAxOyAvKiBUaGlzIGFsc28gcHJldmVudHMgc2VuZGluZyBpdCB0byBLRkQgKi8KPj4g ICAgCj4+ICAgIAlpZiAoIWFtZGdwdV9zcmlvdl92ZihhZGV2KSkgewo+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmggYi9kcml2ZXJzL2dwdS9k cm0vYW1kL2luY2x1ZGUvbGludXgvY2hhc2guaAo+PiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK Pj4gaW5kZXggNmRjMTU5OTI0ZWQxLi4wMDAwMDAwMDAwMDAKPj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmgKPj4gKysrIC9kZXYvbnVsbAo+PiBAQCAtMSwz NjYgKzAsMCBAQAo+PiAtLyoKPj4gLSAqIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3JvIERl dmljZXMsIEluYy4KPj4gLSAqCj4+IC0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBm cmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+PiAtICogY29weSBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwKPj4gLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPj4gLSAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ PiAtICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCj4+IC0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28s IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+PiAtICoKPj4gLSAqIFRoZSBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJl IGluY2x1ZGVkIGluCj4+IC0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9m IHRoZSBTb2Z0d2FyZS4KPj4gLSAqCj4+IC0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFT IElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+PiAtICogSU1Q TElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFksCj4+IC0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQg Tk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPj4gLSAqIFRIRSBDT1BZUklHSFQg SE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBP Ugo+PiAtICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFD VCwgVE9SVCBPUiBPVEhFUldJU0UsCj4+IC0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPj4gLSAqIE9USEVSIERF QUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KPj4gLSAqCj4+IC0gKi8KPj4gLQo+PiAtI2lmbmRlZiBf TElOVVhfQ0hBU0hfSAo+PiAtI2RlZmluZSBfTElOVVhfQ0hBU0hfSAo+PiAtCj4+IC0jaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KPj4gLSNpbmNsdWRlIDxsaW51eC9oYXNoLmg+Cj4+IC0jaW5jbHVk ZSA8bGludXgvYnVnLmg+Cj4+IC0jaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+Cj4+IC0KPj4g LSNpZiBCSVRTX1BFUl9MT05HID09IDMyCj4+IC0jIGRlZmluZSBfQ0hBU0hfTE9OR19TSElGVCA1 Cj4+IC0jZWxpZiBCSVRTX1BFUl9MT05HID09IDY0Cj4+IC0jIGRlZmluZSBfQ0hBU0hfTE9OR19T SElGVCA2Cj4+IC0jZWxzZQo+PiAtIyBlcnJvciAiVW5leHBlY3RlZCBCSVRTX1BFUl9MT05HIgo+ PiAtI2VuZGlmCj4+IC0KPj4gLXN0cnVjdCBfX2NoYXNoX3RhYmxlIHsKPj4gLQl1OCBiaXRzOwo+ PiAtCXU4IGtleV9zaXplOwo+PiAtCXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwo+PiAtCXUzMiBz aXplX21hc2s7Cj4+IC0JdW5zaWduZWQgbG9uZyAqb2NjdXBfYml0bWFwLCAqdmFsaWRfYml0bWFw Owo+PiAtCXVuaW9uIHsKPj4gLQkJdTMyICprZXlzMzI7Cj4+IC0JCXU2NCAqa2V5czY0Owo+PiAt CX07Cj4+IC0JdTggKnZhbHVlczsKPj4gLQo+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwo+ PiAtCXU2NCBoaXRzLCBoaXRzX3N0ZXBzLCBoaXRzX3RpbWVfbnM7Cj4+IC0JdTY0IG1pc3MsIG1p c3Nfc3RlcHMsIG1pc3NfdGltZV9uczsKPj4gLQl1NjQgcmVsb2NzLCByZWxvY19kaXN0Owo+PiAt I2VuZGlmCj4+IC19Owo+PiAtCj4+IC0jZGVmaW5lIF9fQ0hBU0hfQklUTUFQX1NJWkUoYml0cykJ CQkJXAo+PiAtCSgoKDEgPDwgKGJpdHMpKSArIEJJVFNfUEVSX0xPTkcgLSAxKSAvIEJJVFNfUEVS X0xPTkcpCj4+IC0jZGVmaW5lIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBzaXplKQkJCQlcCj4+ IC0JKCgoKHNpemUpIDw8IChiaXRzKSkgKyBzaXplb2YobG9uZykgLSAxKSAvIHNpemVvZihsb25n KSkKPj4gLQo+PiAtI2RlZmluZSBfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBrZXlfc2l6ZSwgdmFs dWVfc2l6ZSkJXAo+PiAtCShfX0NIQVNIX0JJVE1BUF9TSVpFKGJpdHMpICogMiArCQlcCj4+IC0J IF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBrZXlfc2l6ZSkgKwkJXAo+PiAtCSBfX0NIQVNIX0FS UkFZX1NJWkUoYml0cywgdmFsdWVfc2l6ZSkpCj4+IC0KPj4gLSNkZWZpbmUgU1RSVUNUX0NIQVNI X1RBQkxFKGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKQkJCVwKPj4gLQlzdHJ1Y3QgewkJCQkJ CQlcCj4+IC0JCXN0cnVjdCBfX2NoYXNoX3RhYmxlIHRhYmxlOwkJCQlcCj4+IC0JCXVuc2lnbmVk IGxvbmcgZGF0YQkJCQkJXAo+PiAtCQkJW19fQ0hBU0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXpl LCB2YWx1ZV9zaXplKV07XAo+PiAtCX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBzdHJ1Y3QgY2hhc2hf dGFibGUgLSBEeW5hbWljYWxseSBhbGxvY2F0ZWQgY2xvc2VkIGhhc2ggdGFibGUKPj4gLSAqCj4+ IC0gKiBVc2UgdGhpcyBzdHJ1Y3QgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBoYXNoIHRhYmxl cyAodXNpbmcKPj4gLSAqIGNoYXNoX3RhYmxlX2FsbG9jIGFuZCBjaGFzaF90YWJsZV9mcmVlKSwg d2hlcmUgdGhlIHNpemUgaXMKPj4gLSAqIGRldGVybWluZWQgYXQgcnVudGltZS4KPj4gLSAqLwo+ PiAtc3RydWN0IGNoYXNoX3RhYmxlIHsKPj4gLQlzdHJ1Y3QgX19jaGFzaF90YWJsZSB0YWJsZTsK Pj4gLQl1bnNpZ25lZCBsb25nICpkYXRhOwo+PiAtfTsKPj4gLQo+PiAtLyoqCj4+IC0gKiBERUNM QVJFX0NIQVNIX1RBQkxFIC0gbWFjcm8gdG8gZGVjbGFyZSBhIGNsb3NlZCBoYXNoIHRhYmxlCj4+ IC0gKiBAdGFibGU6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKPj4gLSAqIEBidHM6 IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcwo+PiAtICogQGtleV9zejogU2l6ZSBv ZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAo+PiAtICogQHZhbF9zejogU2l6ZSBvZiBkYXRh IHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDAKPj4gLSAqCj4+IC0gKiBUaGlzIGRlY2xhcmVzIHRo ZSBoYXNoIHRhYmxlIHZhcmlhYmxlIHdpdGggYSBzdGF0aWMgc2l6ZS4KPj4gLSAqCj4+IC0gKiBU aGUgY2xvc2VkIGhhc2ggdGFibGUgc3RvcmVzIGtleS12YWx1ZSBwYWlycyB3aXRoIGxvdyBtZW1v cnkgYW5kCj4+IC0gKiBsb29rdXAgb3ZlcmhlYWQuIEluIG9wZXJhdGlvbiBpdCBwZXJmb3JtcyBu byBkeW5hbWljIG1lbW9yeQo+PiAtICogbWFuYWdlbWVudC4gVGhlIGRhdGEgYmVpbmcgc3RvcmVk IGRvZXMgbm90IHJlcXVpcmUgYW55Cj4+IC0gKiBsaXN0X2hlYWRzLiBUaGUgaGFzaCB0YWJsZSBw ZXJmb3JtcyBiZXN0IHdpdGggc21hbGwgQHZhbF9zeiBhbmQgYXMKPj4gLSAqIGxvbmcgYXMgc29t ZSBzcGFjZSAoYWJvdXQgNTAlKSBpcyBsZWZ0IGZyZWUgaW4gdGhlIHRhYmxlLiBCdXQgdGhlCj4+ IC0gKiB0YWJsZSBjYW4gc3RpbGwgd29yayByZWFzb25hYmx5IGVmZmljaWVudGx5IGV2ZW4gd2hl biBmaWxsZWQgdXAgdG8KPj4gLSAqIGFib3V0IDkwJS4gSWYgYmlnZ2VyIGRhdGEgaXRlbXMgbmVl ZCB0byBiZSBzdG9yZWQgYW5kIGxvb2tlZCB1cCwKPj4gLSAqIHN0b3JlIHRoZSBwb2ludGVyIHRv IGl0IGFzIHZhbHVlIGluIHRoZSBoYXNoIHRhYmxlLgo+PiAtICoKPj4gLSAqIEB2YWxfc3ogbWF5 IGJlIDAuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGFsbCB0aGUgc3RvcmVkCj4+IC0gKiBpbmZv cm1hdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGtleSBpdHNlbGYgYW5kIHRoZSBmYWN0IHRoYXQg aXQgaXMKPj4gLSAqIGluIHRoZSBoYXNoIHRhYmxlIChvciBub3QpLgo+PiAtICovCj4+IC0jZGVm aW5lIERFQ0xBUkVfQ0hBU0hfVEFCTEUodGFibGUsIGJ0cywga2V5X3N6LCB2YWxfc3opCQlcCj4+ IC0JU1RSVUNUX0NIQVNIX1RBQkxFKGJ0cywga2V5X3N6LCB2YWxfc3opIHRhYmxlCj4+IC0KPj4g LSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKPj4gLSNkZWZpbmUgX19DSEFTSF9TVEFUU19JTklU KHByZWZpeCksCQlcCj4+IC0JCXByZWZpeC5oaXRzID0gMCwJCVwKPj4gLQkJcHJlZml4LmhpdHNf c3RlcHMgPSAwLAkJXAo+PiAtCQlwcmVmaXguaGl0c190aW1lX25zID0gMCwJXAo+PiAtCQlwcmVm aXgubWlzcyA9IDAsCQlcCj4+IC0JCXByZWZpeC5taXNzX3N0ZXBzID0gMCwJCVwKPj4gLQkJcHJl Zml4Lm1pc3NfdGltZV9ucyA9IDAsCVwKPj4gLQkJcHJlZml4LnJlbG9jcyA9IDAsCQlcCj4+IC0J CXByZWZpeC5yZWxvY19kaXN0ID0gMAo+PiAtI2Vsc2UKPj4gLSNkZWZpbmUgX19DSEFTSF9TVEFU U19JTklUKHByZWZpeCkKPj4gLSNlbmRpZgo+PiAtCj4+IC0jZGVmaW5lIF9fQ0hBU0hfVEFCTEVf SU5JVChwcmVmaXgsIGRhdGEsIGJ0cywga2V5X3N6LCB2YWxfc3opCVwKPj4gLQlwcmVmaXguYml0 cyA9IChidHMpLAkJCQkJXAo+PiAtCQlwcmVmaXgua2V5X3NpemUgPSAoa2V5X3N6KSwJCQlcCj4+ IC0JCXByZWZpeC52YWx1ZV9zaXplID0gKHZhbF9zeiksCQkJXAo+PiAtCQlwcmVmaXguc2l6ZV9t YXNrID0gKCgxIDw8IGJ0cykgLSAxKSwJCVwKPj4gLQkJcHJlZml4Lm9jY3VwX2JpdG1hcCA9ICZk YXRhWzBdLAkJCVwKPj4gLQkJcHJlZml4LnZhbGlkX2JpdG1hcCA9ICZkYXRhCQkJXAo+PiAtCQkJ W19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKV0sCQlcCj4+IC0JCXByZWZpeC5rZXlzNjQgPSAodTY0 ICopJmRhdGEJCQlcCj4+IC0JCQlbX19DSEFTSF9CSVRNQVBfU0laRShidHMpICogMl0sCQlcCj4+ IC0JCXByZWZpeC52YWx1ZXMgPSAodTggKikmZGF0YQkJCVwKPj4gLQkJCVtfX0NIQVNIX0JJVE1B UF9TSVpFKGJ0cykgKiAyICsJCVwKPj4gLQkJCSBfX0NIQVNIX0FSUkFZX1NJWkUoYnRzLCBrZXlf c3opXQlcCj4+IC0JCV9fQ0hBU0hfU1RBVFNfSU5JVChwcmVmaXgpCj4+IC0KPj4gLS8qKgo+PiAt ICogREVGSU5FX0NIQVNIX1RBQkxFIC0gbWFjcm8gdG8gZGVmaW5lIGFuZCBpbml0aWFsaXplIGEg Y2xvc2VkIGhhc2ggdGFibGUKPj4gLSAqIEB0Ymw6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2gg dGFibGUKPj4gLSAqIEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcwo+PiAt ICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAo+PiAtICogQHZh bF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDAKPj4gLSAqCj4+IC0g KiBOb3RlOiB0aGUgbWFjcm8gY2FuIGJlIHVzZWQgZm9yIGdsb2JhbCBhbmQgbG9jYWwgaGFzaCB0 YWJsZSB2YXJpYWJsZXMuCj4+IC0gKi8KPj4gLSNkZWZpbmUgREVGSU5FX0NIQVNIX1RBQkxFKHRi bCwgYnRzLCBrZXlfc3osIHZhbF9zeikJCQlcCj4+IC0JREVDTEFSRV9DSEFTSF9UQUJMRSh0Ymws IGJ0cywga2V5X3N6LCB2YWxfc3opID0gewkJXAo+PiAtCQkudGFibGUgPSB7CQkJCQkJXAo+PiAt CQkJX19DSEFTSF9UQUJMRV9JTklUKCwgKHRibCkuZGF0YSwgYnRzLCBrZXlfc3osIHZhbF9zeikg XAo+PiAtCQl9LAkJCQkJCQlcCj4+IC0JCS5kYXRhID0gezB9CQkJCQkJXAo+PiAtCX0KPj4gLQo+ PiAtLyoqCj4+IC0gKiBJTklUX0NIQVNIX1RBQkxFIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUg ZGVjbGFyZWQgYnkgREVDTEFSRV9DSEFTSF9UQUJMRQo+PiAtICogQHRibDogbmFtZSBvZiB0aGUg ZGVjbGFyZWQgaGFzaCB0YWJsZQo+PiAtICogQGJ0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0 cyBlbnRyaWVzCj4+IC0gKiBAa2V5X3N6OiBTaXplIG9mIGhhc2gga2V5cyBpbiBieXRlcywgNCBv ciA4Cj4+IC0gKiBAdmFsX3N6OiBTaXplIG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUg MAo+PiAtICovCj4+IC0jZGVmaW5lIElOSVRfQ0hBU0hfVEFCTEUodGJsLCBidHMsIGtleV9zeiwg dmFsX3N6KQkJCVwKPj4gLQlfX0NIQVNIX1RBQkxFX0lOSVQoKCh0YmwpLnRhYmxlKSwgKHRibCku ZGF0YSwgYnRzLCBrZXlfc3osIHZhbF9zeikKPj4gLQo+PiAtaW50IGNoYXNoX3RhYmxlX2FsbG9j KHN0cnVjdCBjaGFzaF90YWJsZSAqdGFibGUsIHU4IGJpdHMsIHU4IGtleV9zaXplLAo+PiAtCQkg ICAgICB1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spOwo+PiAtdm9pZCBj aGFzaF90YWJsZV9mcmVlKHN0cnVjdCBjaGFzaF90YWJsZSAqdGFibGUpOwo+PiAtCj4+IC0vKioK Pj4gLSAqIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHMgLSBEdW1wIHN0YXRpc3RpY3Mgb2YgYSBjbG9z ZWQgaGFzaCB0YWJsZQo+PiAtICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJl Cj4+IC0gKgo+PiAtICogRHVtcHMgc29tZSBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIG9mIHRoZSB0 YWJsZSBnYXRoZXJlZCBpbiBvcGVyYXRpb24KPj4gLSAqIGluIHRoZSBrZXJuZWwgbG9nIHVzaW5n IHByX2RlYnVnLiBJZiBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBlbmFibGVkLAo+PiAtICogdXNl ciBtdXN0IHR1cm4gb24gbWVzc2FnZXMgZm9yIGNoYXNoLmMgKGZpbGUgY2hhc2guYyArcCkuCj4+ IC0gKi8KPj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKPj4gLSNkZWZpbmUgY2hhc2hfdGFi bGVfZHVtcF9zdGF0cyh0YmwpIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmKCp0YmwpLnRhYmxl KQo+PiAtCj4+IC12b2lkIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90 YWJsZSAqdGFibGUpOwo+PiAtI2Vsc2UKPj4gLSNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0 cyh0YmwpCj4+IC0jZW5kaWYKPj4gLQo+PiAtLyoqCj4+IC0gKiBjaGFzaF90YWJsZV9yZXNldF9z dGF0cyAtIFJlc2V0IHN0YXRpc3RpY3Mgb2YgYSBjbG9zZWQgaGFzaCB0YWJsZQo+PiAtICogQHRi bDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCj4+IC0gKi8KPj4gLSNpZmRlZiBDT05G SUdfQ0hBU0hfU1RBVFMKPj4gLSNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRfc3RhdHModGJsKSBf X2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKCYoKnRibCkudGFibGUpCj4+IC0KPj4gLXN0YXRpYyBp bmxpbmUgdm9pZCBfX2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHN0cnVjdCBfX2NoYXNoX3RhYmxl ICp0YWJsZSkKPj4gLXsKPj4gLQkodm9pZCl0YWJsZSBfX0NIQVNIX1NUQVRTX0lOSVQoKCp0YWJs ZSkpOwo+PiAtfQo+PiAtI2Vsc2UKPj4gLSNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRfc3RhdHMo dGJsKQo+PiAtI2VuZGlmCj4+IC0KPj4gLS8qKgo+PiAtICogY2hhc2hfdGFibGVfY29weV9pbiAt IENvcHkgYSBuZXcgdmFsdWUgaW50byB0aGUgaGFzaCB0YWJsZQo+PiAtICogQHRibDogUG9pbnRl ciB0byB0aGUgdGFibGUgc3RydWN0dXJlCj4+IC0gKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRv IGFkZCBvciB1cGRhdGUKPj4gLSAqIEB2YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBt YXkgYmUgTlVMTAo+PiAtICoKPj4gLSAqIElmIEBrZXkgYWxyZWFkeSBoYXMgYW4gZW50cnksIGl0 cyB2YWx1ZSBpcyByZXBsYWNlZC4gT3RoZXJ3aXNlIGEKPj4gLSAqIG5ldyBlbnRyeSBpcyBhZGRl ZC4gSWYgQHZhbHVlIGlzIE5VTEwsIHRoZSB2YWx1ZSBpcyBsZWZ0IHVuY2hhbmdlZAo+PiAtICog b3IgdW5pbml0aWFsaXplZC4gUmV0dXJucyAxIGlmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RlZCwg MCBpZiBhIG5ldwo+PiAtICogZW50cnkgd2FzIGFkZGVkIG9yICUtRU5PTUVNIGlmIHRoZXJlIHdh cyBubyBmcmVlIHNwYWNlIGluIHRoZQo+PiAtICogdGFibGUuCj4+IC0gKi8KPj4gLSNkZWZpbmUg Y2hhc2hfdGFibGVfY29weV9pbih0YmwsIGtleSwgdmFsdWUpCQkJXAo+PiAtCV9fY2hhc2hfdGFi bGVfY29weV9pbigmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlKQo+PiAtCj4+IC1pbnQgX19jaGFz aF90YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwKPj4g LQkJCSAgY29uc3Qgdm9pZCAqdmFsdWUpOwo+PiAtCj4+IC0vKioKPj4gLSAqIGNoYXNoX3RhYmxl X2NvcHlfb3V0IC0gQ29weSBhIHZhbHVlIG91dCBvZiB0aGUgaGFzaCB0YWJsZQo+PiAtICogQHRi bDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCj4+IC0gKiBAa2V5OiBLZXkgb2YgdGhl IGVudHJ5IHRvIGZpbmQKPj4gLSAqIEB2YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBt YXkgYmUgTlVMTAo+PiAtICoKPj4gLSAqIElmIEB2YWx1ZSBpcyBub3QgTlVMTCBhbmQgdGhlIHRh YmxlIGhhcyBhIG5vbi0wIHZhbHVlX3NpemUsIHRoZQo+PiAtICogdmFsdWUgYXQgQGtleSBpcyBj b3BpZWQgdG8gQHZhbHVlLiBSZXR1cm5zIHRoZSBzbG90IGluZGV4IG9mIHRoZQo+PiAtICogZW50 cnkgb3IgJS1FSU5WQUwgaWYgQGtleSB3YXMgbm90IGZvdW5kLgo+PiAtICovCj4+IC0jZGVmaW5l IGNoYXNoX3RhYmxlX2NvcHlfb3V0KHRibCwga2V5LCB2YWx1ZSkJCQlcCj4+IC0JX19jaGFzaF90 YWJsZV9jb3B5X291dCgmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlLCBmYWxzZSkKPj4gLQo+PiAt aW50IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlLCB1 NjQga2V5LAo+PiAtCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKTsKPj4gLQo+PiAtLyoq Cj4+IC0gKiBjaGFzaF90YWJsZV9yZW1vdmUgLSBSZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgaGFz aCB0YWJsZQo+PiAtICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCj4+IC0g KiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQKPj4gLSAqIEB2YWx1ZTogUG9pbnRlciB0 byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTAo+PiAtICoKPj4gLSAqIElmIEB2YWx1ZSBpcyBu b3QgTlVMTCBhbmQgdGhlIHRhYmxlIGhhcyBhIG5vbi0wIHZhbHVlX3NpemUsIHRoZQo+PiAtICog dmFsdWUgYXQgQGtleSBpcyBjb3BpZWQgdG8gQHZhbHVlLiBUaGUgZW50cnkgaXMgcmVtb3ZlZCBm cm9tIHRoZQo+PiAtICogdGFibGUuIFJldHVybnMgdGhlIHNsb3QgaW5kZXggb2YgdGhlIHJlbW92 ZWQgZW50cnkgb3IgJS1FSU5WQUwgaWYKPj4gLSAqIEBrZXkgd2FzIG5vdCBmb3VuZC4KPj4gLSAq Lwo+PiAtI2RlZmluZSBjaGFzaF90YWJsZV9yZW1vdmUodGJsLCBrZXksIHZhbHVlKQkJCVwKPj4g LQlfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KCYoKnRibCkudGFibGUsIGtleSwgdmFsdWUsIHRydWUp Cj4+IC0KPj4gLS8qCj4+IC0gKiBMb3cgbGV2ZWwgaXRlcmF0b3IgQVBJIHVzZWQgaW50ZXJuYWxs eSBieSB0aGUgYWJvdmUgZnVuY3Rpb25zLgo+PiAtICovCj4+IC1zdHJ1Y3QgY2hhc2hfaXRlciB7 Cj4+IC0Jc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlOwo+PiAtCXVuc2lnbmVkIGxvbmcgbWFz azsKPj4gLQlpbnQgc2xvdDsKPj4gLX07Cj4+IC0KPj4gLS8qKgo+PiAtICogQ0hBU0hfSVRFUl9J TklUIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgaXRlcmF0b3IKPj4gLSAqIEB0Ymw6IFBvaW50 ZXIgdG8gaGFzaCB0YWJsZSB0byBpdGVyYXRlIG92ZXIKPj4gLSAqIEBzOiBJbml0aWFsIHNsb3Qg bnVtYmVyCj4+IC0gKi8KPj4gLSNkZWZpbmUgQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCBzKSB7CQkJ XAo+PiAtCQl0YWJsZSwJCQkJCVwKPj4gLQkJMVVMIDw8ICgocykgJiAoQklUU19QRVJfTE9ORyAt IDEpKSwJXAo+PiAtCQlzCQkJCQlcCj4+IC0JfQo+PiAtLyoqCj4+IC0gKiBDSEFTSF9JVEVSX1NF VCAtIFNldCBoYXNoIHRhYmxlIGl0ZXJhdG9yIHRvIG5ldyBzbG90Cj4+IC0gKiBAaXRlcjogSXRl cmF0b3IKPj4gLSAqIEBzOiBTbG90IG51bWJlcgo+PiAtICovCj4+IC0jZGVmaW5lIENIQVNIX0lU RVJfU0VUKGl0ZXIsIHMpCQkJCQlcCj4+IC0JKGl0ZXIpLm1hc2sgPSAxVUwgPDwgKChzKSAmIChC SVRTX1BFUl9MT05HIC0gMSkpLAlcCj4+IC0JKGl0ZXIpLnNsb3QgPSAocykKPj4gLS8qKgo+PiAt ICogQ0hBU0hfSVRFUl9JTkMgLSBJbmNyZW1lbnQgaGFzaCB0YWJsZSBpdGVyYXRvcgo+PiAtICog QHRhYmxlOiBIYXNoIHRhYmxlIHRvIGl0ZXJhdGUgb3Zlcgo+PiAtICoKPj4gLSAqIFdyYXBzIGFy b3VuZCBhdCB0aGUgZW5kLgo+PiAtICovCj4+IC0jZGVmaW5lIENIQVNIX0lURVJfSU5DKGl0ZXIp IGRvIHsJCQkJCVwKPj4gLQkJKGl0ZXIpLm1hc2sgPSAoaXRlcikubWFzayA8PCAxIHwJCQlcCj4+ IC0JCQkoaXRlcikubWFzayA+PiAoQklUU19QRVJfTE9ORyAtIDEpOwkJXAo+PiAtCQkoaXRlciku c2xvdCA9ICgoaXRlcikuc2xvdCArIDEpICYgKGl0ZXIpLnRhYmxlLT5zaXplX21hc2s7IFwKPj4g LQl9IHdoaWxlICgwKQo+PiAtCj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc192 YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQo+PiAtewo+PiAtCUJVR19PTigodW5z aWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKPj4gLQlyZXR1cm4g ISEoaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9OR19TSElG VF0gJgo+PiAtCQkgIGl0ZXIubWFzayk7Cj4+IC19Cj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hh c2hfaXRlcl9pc19lbXB0eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQo+PiAtewo+PiAt CUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsK Pj4gLQlyZXR1cm4gIShpdGVyLnRhYmxlLT5vY2N1cF9iaXRtYXBbaXRlci5zbG90ID4+IF9DSEFT SF9MT05HX1NISUZUXSAmCj4+IC0JCSBpdGVyLm1hc2spOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMg aW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfdmFsaWQoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIg aXRlcikKPj4gLXsKPj4gLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVy LnRhYmxlLT5iaXRzKSk7Cj4+IC0JaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+ PiBfQ0hBU0hfTE9OR19TSElGVF0gfD0gaXRlci5tYXNrOwo+PiAtCWl0ZXIudGFibGUtPm9jY3Vw X2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdIHw9IGl0ZXIubWFzazsKPj4g LX0KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3NldF9pbnZhbGlkKGNvbnN0IHN0 cnVjdCBjaGFzaF9pdGVyIGl0ZXIpCj4+IC17Cj4+IC0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNs b3QgPj0gKDEgPDwgaXRlci50YWJsZS0+Yml0cykpOwo+PiAtCWl0ZXIudGFibGUtPnZhbGlkX2Jp dG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdICY9IH5pdGVyLm1hc2s7Cj4+IC19 Cj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfZW1wdHkoY29uc3Qgc3RydWN0 IGNoYXNoX2l0ZXIgaXRlcikKPj4gLXsKPj4gLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+ PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7Cj4+IC0JaXRlci50YWJsZS0+b2NjdXBfYml0bWFw W2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9OR19TSElGVF0gJj0gfml0ZXIubWFzazsKPj4gLX0KPj4g LQo+PiAtc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9rZXkzMihjb25zdCBzdHJ1Y3QgY2hh c2hfaXRlciBpdGVyKQo+PiAtewo+PiAtCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA0 KTsKPj4gLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5i aXRzKSk7Cj4+IC0JcmV0dXJuIGl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNsb3RdOwo+PiAtfQo+ PiAtc3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXk2NChjb25zdCBzdHJ1Y3QgY2hhc2hf aXRlciBpdGVyKQo+PiAtewo+PiAtCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsK Pj4gLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRz KSk7Cj4+IC0JcmV0dXJuIGl0ZXIudGFibGUtPmtleXM2NFtpdGVyLnNsb3RdOwo+PiAtfQo+PiAt c3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIg aXRlcikKPj4gLXsKPj4gLQlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVy LnRhYmxlLT5iaXRzKSk7Cj4+IC0JcmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/ Cj4+IC0JCWl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNsb3RdIDogaXRlci50YWJsZS0+a2V5czY0 W2l0ZXIuc2xvdF07Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJf aGFzaDMyKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpCj4+IC17Cj4+IC0JQlVHX09OKGl0 ZXIudGFibGUtPmtleV9zaXplICE9IDQpOwo+PiAtCXJldHVybiBoYXNoXzMyKGNoYXNoX2l0ZXJf a2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW5s aW5lIHUzMiBjaGFzaF9pdGVyX2hhc2g2NChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQo+ PiAtewo+PiAtCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsKPj4gLQlyZXR1cm4g aGFzaF82NChjaGFzaF9pdGVyX2tleTY0KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRzKTsKPj4gLX0K Pj4gLQo+PiAtc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9oYXNoKGNvbnN0IHN0cnVjdCBj aGFzaF9pdGVyIGl0ZXIpCj4+IC17Cj4+IC0JcmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9 PSA0KSA/Cj4+IC0JCWhhc2hfMzIoY2hhc2hfaXRlcl9rZXkzMihpdGVyKSwgaXRlci50YWJsZS0+ Yml0cykgOgo+PiAtCQloYXNoXzY0KGNoYXNoX2l0ZXJfa2V5NjQoaXRlciksIGl0ZXIudGFibGUt PmJpdHMpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgKmNoYXNoX2l0ZXJfdmFs dWUoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKPj4gLXsKPj4gLQlCVUdfT04oKHVuc2ln bmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7Cj4+IC0JcmV0dXJuIGl0 ZXIudGFibGUtPnZhbHVlcyArCj4+IC0JCSgodW5zaWduZWQgbG9uZylpdGVyLnNsb3QgKiBpdGVy LnRhYmxlLT52YWx1ZV9zaXplKTsKPj4gLX0KPj4gLQo+PiAtI2VuZGlmIC8qIF9MSU5VWF9DSEFT SF9IICovCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9LY29uZmlnIGIv ZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZwo+PiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2 NDQKPj4gaW5kZXggNzc2ZWYzNDM0YzEwLi4wMDAwMDAwMDAwMDAKPj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL2FtZC9saWIvS2NvbmZpZwo+PiArKysgL2Rldi9udWxsCj4+IEBAIC0xLDI4ICswLDAg QEAKPj4gLW1lbnUgIkFNRCBMaWJyYXJ5IHJvdXRpbmVzIgo+PiAtCj4+IC0jCj4+IC0jIENsb3Nl ZCBoYXNoIHRhYmxlCj4+IC0jCj4+IC1jb25maWcgQ0hBU0gKPj4gLQl0cmlzdGF0ZQo+PiAtCWRl ZmF1bHQgRFJNX0FNREdQVQo+PiAtCWhlbHAKPj4gLQkgU3RhdGljYWxseSBzaXplZCBjbG9zZWQg aGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGxvdwo+PiAtCSBtZW1vcnkgYW5kIENQVSBv dmVyaGVhZC4KPj4gLQo+PiAtY29uZmlnIENIQVNIX1NUQVRTCj4+IC0JYm9vbCAiQ2xvc2VkIGhh c2ggdGFibGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyIKPj4gLQlkZXBlbmRzIG9uIENIQVNICj4+ IC0JZGVmYXVsdCBuCj4+IC0JaGVscAo+PiAtCSBFbmFibGUgY29sbGVjdGlvbiBvZiBwZXJmb3Jt YW5jZSBzdGF0aXN0aWNzIGZvciBjbG9zZWQgaGFzaCB0YWJsZXMuCj4+IC0KPj4gLWNvbmZpZyBD SEFTSF9TRUxGVEVTVAo+PiAtCWJvb2wgIkNsb3NlZCBoYXNoIHRhYmxlIHNlbGYgdGVzdCIKPj4g LQlkZXBlbmRzIG9uIENIQVNICj4+IC0JZGVmYXVsdCBuCj4+IC0JaGVscAo+PiAtCSBSdW5zIGEg c2VsZnRlc3QgZHVyaW5nIG1vZHVsZSBsb2FkLiBTZXZlcmFsIG1vZHVsZSBwYXJhbWV0ZXJzCj4+ IC0JIGFyZSBhdmFpbGFibGUgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHRlc3QuCj4+ IC0KPj4gLWVuZG1lbnUKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01h a2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvTWFrZWZpbGUKPj4gZGVsZXRlZCBmaWxl IG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDY5MDI0MzAwMWUxYS4uMDAwMDAwMDAwMDAwCj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlCj4+ICsrKyAvZGV2L251bGwKPj4gQEAg LTEsMzIgKzAsMCBAQAo+PiAtIwo+PiAtIyBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBE ZXZpY2VzLCBJbmMuCj4+IC0jCj4+IC0jIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZy ZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4+IC0jIGNvcHkgb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksCj4+IC0jIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPj4gLSMgdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4+IC0j IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29u cyB0byB3aG9tIHRoZQo+PiAtIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+PiAtIwo+PiAtIyBUaGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRl ZCBpbgo+PiAtIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0 d2FyZS4KPj4gLSMKPj4gLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPj4gLSMgSU1QTElFRCwgSU5DTFVE SU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFks Cj4+IC0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1F TlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+PiAtIyBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBB VVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKPj4gLSMgT1RIRVIg TElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhF UldJU0UsCj4+IC0jIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgo+PiAtIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09G VFdBUkUuCj4+IC0jCj4+IC0jCj4+IC0jIE1ha2VmaWxlIGZvciBBTUQgbGlicmFyeSByb3V0aW5l cywgd2hpY2ggYXJlIHVzZWQgYnkgQU1EIGRyaXZlcgo+PiAtIyBjb21wb25lbnRzLgo+PiAtIwo+ PiAtIyBUaGlzIGlzIGZvciBjb21tb24gbGlicmFyeSByb3V0aW5lcyB0aGF0IGNhbiBiZSBzaGFy ZWQgYmV0d2VlbiBBTUQKPj4gLSMgZHJpdmVyIGNvbXBvbmVudHMgb3IgbGF0ZXIgbW92ZWQgdG8g a2VybmVsL2xpYiBmb3Igc2hhcmluZyB3aXRoCj4+IC0jIG90aGVyIGRyaXZlcnMuCj4+IC0KPj4g LWNjZmxhZ3MteSA6PSAtSSQoc3JjKS8uLi9pbmNsdWRlCj4+IC0KPj4gLW9iai0kKENPTkZJR19D SEFTSCkgKz0gY2hhc2gubwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIv Y2hhc2guYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMKPj4gZGVsZXRlZCBmaWxl IG1vZGUgMTAwNjQ0Cj4+IGluZGV4IGI4ZTQ1ZjM1NmExYy4uMDAwMDAwMDAwMDAwCj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMKPj4gKysrIC9kZXYvbnVsbAo+PiBAQCAt MSw2MzggKzAsMCBAQAo+PiAtLyoKPj4gLSAqIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3Jv IERldmljZXMsIEluYy4KPj4gLSAqCj4+IC0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+PiAtICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKPj4gLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPj4gLSAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAo+PiAtICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1p dCBwZXJzb25zIHRvIHdob20gdGhlCj4+IC0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8g c28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+PiAtICoKPj4gLSAqIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxs IGJlIGluY2x1ZGVkIGluCj4+IC0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25z IG9mIHRoZSBTb2Z0d2FyZS4KPj4gLSAqCj4+IC0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg IkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+PiAtICog SU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksCj4+IC0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPj4gLSAqIFRIRSBDT1BZUklH SFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdF UyBPUgo+PiAtICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCj4+IC0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPj4gLSAqIE9USEVS IERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KPj4gLSAqCj4+IC0gKi8KPj4gLQo+PiAtI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+Cj4+IC0jaW5jbHVkZSA8bGludXgvaGFzaC5oPgo+PiAtI2luY2x1 ZGUgPGxpbnV4L2J1Zy5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gLSNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KPj4gLSNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgo+PiAt I2luY2x1ZGUgPGFzbS9kaXY2NC5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4L2NoYXNoLmg+Cj4+IC0K Pj4gLS8qKgo+PiAtICogY2hhc2hfdGFibGVfYWxsb2MgLSBBbGxvY2F0ZSBjbG9zZWQgaGFzaCB0 YWJsZQo+PiAtICogQHRhYmxlOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUKPj4gLSAq IEBiaXRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMKPj4gLSAqIEBrZXlfc2l6 ZTogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAo+PiAtICogQHZhbHVlX3NpemU6 IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwCj4+IC0gKi8KPj4gLWludCBj aGFzaF90YWJsZV9hbGxvYyhzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBr ZXlfc2l6ZSwKPj4gLQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90IGdmcF9t YXNrKQo+PiAtewo+PiAtCWlmIChiaXRzID4gMzEpCj4+IC0JCXJldHVybiAtRUlOVkFMOwo+PiAt Cj4+IC0JaWYgKGtleV9zaXplICE9IDQgJiYga2V5X3NpemUgIT0gOCkKPj4gLQkJcmV0dXJuIC1F SU5WQUw7Cj4+IC0KPj4gLQl0YWJsZS0+ZGF0YSA9IGtjYWxsb2MoX19DSEFTSF9EQVRBX1NJWkUo Yml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpLAo+PiAtCQkgICAgICAgc2l6ZW9mKGxvbmcpLCBn ZnBfbWFzayk7Cj4+IC0JaWYgKCF0YWJsZS0+ZGF0YSkKPj4gLQkJcmV0dXJuIC1FTk9NRU07Cj4+ IC0KPj4gLQlfX0NIQVNIX1RBQkxFX0lOSVQodGFibGUtPnRhYmxlLCB0YWJsZS0+ZGF0YSwKPj4g LQkJCSAgIGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKTsKPj4gLQo+PiAtCXJldHVybiAwOwo+ PiAtfQo+PiAtRVhQT1JUX1NZTUJPTChjaGFzaF90YWJsZV9hbGxvYyk7Cj4+IC0KPj4gLS8qKgo+ PiAtICogY2hhc2hfdGFibGVfZnJlZSAtIEZyZWUgY2xvc2VkIGhhc2ggdGFibGUKPj4gLSAqIEB0 YWJsZTogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCj4+IC0gKi8KPj4gLXZvaWQgY2hh c2hfdGFibGVfZnJlZShzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlKQo+PiAtewo+PiAtCWtmcmVl KHRhYmxlLT5kYXRhKTsKPj4gLX0KPj4gLUVYUE9SVF9TWU1CT0woY2hhc2hfdGFibGVfZnJlZSk7 Cj4+IC0KPj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKPj4gLQo+PiAtI2RlZmluZSBESVZf RlJBQyhub20sIGRlbm9tLCBxdW90LCBmcmFjLCBmcmFjX2RpZ2l0cykgZG8gewkJXAo+PiAtCQl1 NjQgX19ub20gPSAobm9tKTsJCQkJCVwKPj4gLQkJdTY0IF9fZGVub20gPSAoZGVub20pOwkJCQkJ XAo+PiAtCQl1NjQgX19xdW90LCBfX2ZyYWM7CQkJCQlcCj4+IC0JCXUzMiBfX3JlbTsJCQkJCQlc Cj4+IC0JCQkJCQkJCQlcCj4+IC0JCXdoaWxlIChfX2Rlbm9tID4+IDMyKSB7CQkJCQlcCj4+IC0J CQlfX25vbSAgID4+PSAxOwkJCQkJXAo+PiAtCQkJX19kZW5vbSA+Pj0gMTsJCQkJCVwKPj4gLQkJ fQkJCQkJCQlcCj4+IC0JCV9fcXVvdCA9IF9fbm9tOwkJCQkJCVwKPj4gLQkJX19yZW0gID0gZG9f ZGl2KF9fcXVvdCwgX19kZW5vbSk7CQkJXAo+PiAtCQlfX2ZyYWMgPSBfX3JlbSAqIChmcmFjX2Rp Z2l0cykgKyAoX19kZW5vbSA+PiAxKTsJXAo+PiAtCQlkb19kaXYoX19mcmFjLCBfX2Rlbm9tKTsJ CQkJXAo+PiAtCQkocXVvdCkgPSBfX3F1b3Q7CQkJCQlcCj4+IC0JCShmcmFjKSA9IF9fZnJhYzsJ CQkJCVwKPj4gLQl9IHdoaWxlICgwKQo+PiAtCj4+IC12b2lkIF9fY2hhc2hfdGFibGVfZHVtcF9z dGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpCj4+IC17Cj4+IC0Jc3RydWN0IGNoYXNo X2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7Cj4+IC0JdTMyIGZpbGxlZCA9 IDAsIGVtcHR5ID0gMCwgdG9tYnN0b25lcyA9IDA7Cj4+IC0JdTY0IHF1b3QxLCBxdW90MjsKPj4g LQl1MzIgZnJhYzEsIGZyYWMyOwo+PiAtCj4+IC0JZG8gewo+PiAtCQlpZiAoY2hhc2hfaXRlcl9p c192YWxpZChpdGVyKSkKPj4gLQkJCWZpbGxlZCsrOwo+PiAtCQllbHNlIGlmIChjaGFzaF9pdGVy X2lzX2VtcHR5KGl0ZXIpKQo+PiAtCQkJZW1wdHkrKzsKPj4gLQkJZWxzZQo+PiAtCQkJdG9tYnN0 b25lcysrOwo+PiAtCQlDSEFTSF9JVEVSX0lOQyhpdGVyKTsKPj4gLQl9IHdoaWxlIChpdGVyLnNs b3QpOwo+PiAtCj4+IC0JcHJfZGVidWcoImNoYXNoOiBrZXkgc2l6ZSAldSwgdmFsdWUgc2l6ZSAl dVxuIiwKPj4gLQkJIHRhYmxlLT5rZXlfc2l6ZSwgdGFibGUtPnZhbHVlX3NpemUpOwo+PiAtCXBy X2RlYnVnKCIgIFNsb3RzIHRvdGFsL2ZpbGxlZC9lbXB0eS90b21ic3RvbmVzOiAldSAvICV1IC8g JXUgLyAldVxuIiwKPj4gLQkJIDEgPDwgdGFibGUtPmJpdHMsIGZpbGxlZCwgZW1wdHksIHRvbWJz dG9uZXMpOwo+PiAtCWlmICh0YWJsZS0+aGl0cyA+IDApIHsKPj4gLQkJRElWX0ZSQUModGFibGUt PmhpdHNfc3RlcHMsIHRhYmxlLT5oaXRzLCBxdW90MSwgZnJhYzEsIDEwMDApOwo+PiAtCQlESVZf RlJBQyh0YWJsZS0+aGl0cyAqIDEwMDAsIHRhYmxlLT5oaXRzX3RpbWVfbnMsCj4+IC0JCQkgcXVv dDIsIGZyYWMyLCAxMDAwKTsKPj4gLQl9IGVsc2Ugewo+PiAtCQlxdW90MSA9IHF1b3QyID0gMDsK Pj4gLQkJZnJhYzEgPSBmcmFjMiA9IDA7Cj4+IC0JfQo+PiAtCXByX2RlYnVnKCIgIEhpdHMgICAo YXZnLmNvc3QsIHJhdGUpOiAlbGx1ICglbGx1LiUwM3UsICVsbHUuJTAzdSBNL3MpXG4iLAo+PiAt CQkgdGFibGUtPmhpdHMsIHF1b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMyKTsKPj4gLQlpZiAodGFi bGUtPm1pc3MgPiAwKSB7Cj4+IC0JCURJVl9GUkFDKHRhYmxlLT5taXNzX3N0ZXBzLCB0YWJsZS0+ bWlzcywgcXVvdDEsIGZyYWMxLCAxMDAwKTsKPj4gLQkJRElWX0ZSQUModGFibGUtPm1pc3MgKiAx MDAwLCB0YWJsZS0+bWlzc190aW1lX25zLAo+PiAtCQkJIHF1b3QyLCBmcmFjMiwgMTAwMCk7Cj4+ IC0JfSBlbHNlIHsKPj4gLQkJcXVvdDEgPSBxdW90MiA9IDA7Cj4+IC0JCWZyYWMxID0gZnJhYzIg PSAwOwo+PiAtCX0KPj4gLQlwcl9kZWJ1ZygiICBNaXNzZXMgKGF2Zy5jb3N0LCByYXRlKTogJWxs dSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgTS9zKVxuIiwKPj4gLQkJIHRhYmxlLT5taXNzLCBxdW90 MSwgZnJhYzEsIHF1b3QyLCBmcmFjMik7Cj4+IC0JaWYgKHRhYmxlLT5oaXRzICsgdGFibGUtPm1p c3MgPiAwKSB7Cj4+IC0JCURJVl9GUkFDKHRhYmxlLT5oaXRzX3N0ZXBzICsgdGFibGUtPm1pc3Nf c3RlcHMsCj4+IC0JCQkgdGFibGUtPmhpdHMgKyB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMxLCAx MDAwKTsKPj4gLQkJRElWX0ZSQUMoKHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MpICogMTAwMCwK Pj4gLQkJCSAodGFibGUtPmhpdHNfdGltZV9ucyArIHRhYmxlLT5taXNzX3RpbWVfbnMpLAo+PiAt CQkJIHF1b3QyLCBmcmFjMiwgMTAwMCk7Cj4+IC0JfSBlbHNlIHsKPj4gLQkJcXVvdDEgPSBxdW90 MiA9IDA7Cj4+IC0JCWZyYWMxID0gZnJhYzIgPSAwOwo+PiAtCX0KPj4gLQlwcl9kZWJ1ZygiICBU b3RhbCAgKGF2Zy5jb3N0LCByYXRlKTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgTS9zKVxu IiwKPj4gLQkJIHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MsIHF1b3QxLCBmcmFjMSwgcXVvdDIs IGZyYWMyKTsKPj4gLQlpZiAodGFibGUtPnJlbG9jcyA+IDApIHsKPj4gLQkJRElWX0ZSQUModGFi bGUtPmhpdHMgKyB0YWJsZS0+bWlzcywgdGFibGUtPnJlbG9jcywKPj4gLQkJCSBxdW90MSwgZnJh YzEsIDEwMDApOwo+PiAtCQlESVZfRlJBQyh0YWJsZS0+cmVsb2NfZGlzdCwgdGFibGUtPnJlbG9j cywgcXVvdDIsIGZyYWMyLCAxMDAwKTsKPj4gLQkJcHJfZGVidWcoIiAgUmVsb2NhdGlvbnMgKGZy ZXEsIGF2Zy5kaXN0KTogJWxsdSAoMTolbGx1LiUwM3UsICVsbHUuJTAzdSlcbiIsCj4+IC0JCQkg dGFibGUtPnJlbG9jcywgcXVvdDEsIGZyYWMxLCBxdW90MiwgZnJhYzIpOwo+PiAtCX0gZWxzZSB7 Cj4+IC0JCXByX2RlYnVnKCIgIE5vIHJlbG9jYXRpb25zXG4iKTsKPj4gLQl9Cj4+IC19Cj4+IC1F WFBPUlRfU1lNQk9MKF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyk7Cj4+IC0KPj4gLSN1bmRlZiBE SVZfRlJBQwo+PiAtI2VuZGlmCj4+IC0KPj4gLSNkZWZpbmUgQ0hBU0hfSU5DKHRhYmxlLCBhKSAo KGEpID0gKChhKSArIDEpICYgKHRhYmxlKS0+c2l6ZV9tYXNrKQo+PiAtI2RlZmluZSBDSEFTSF9B REQodGFibGUsIGEsIGIpICgoKGEpICsgKGIpKSAmICh0YWJsZSktPnNpemVfbWFzaykKPj4gLSNk ZWZpbmUgQ0hBU0hfU1VCKHRhYmxlLCBhLCBiKSAoKChhKSAtIChiKSkgJiAodGFibGUpLT5zaXpl X21hc2spCj4+IC0jZGVmaW5lIENIQVNIX0lOX1JBTkdFKHRhYmxlLCBzbG90LCBmaXJzdCwgbGFz dCkgXAo+PiAtCShDSEFTSF9TVUIodGFibGUsIHNsb3QsIGZpcnN0KSA8PSBDSEFTSF9TVUIodGFi bGUsIGxhc3QsIGZpcnN0KSkKPj4gLQo+PiAtLyojZGVmaW5lIENIQVNIX0RFQlVHIFVuY29tbWVu dCB0aGlzIHRvIGVuYWJsZSB2ZXJib3NlIGRlYnVnIG91dHB1dCovCj4+IC0jaWZkZWYgQ0hBU0hf REVCVUcKPj4gLXN0YXRpYyB2b2lkIGNoYXNoX3RhYmxlX2R1bXAoc3RydWN0IF9fY2hhc2hfdGFi bGUgKnRhYmxlKQo+PiAtewo+PiAtCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVS X0lOSVQodGFibGUsIDApOwo+PiAtCj4+IC0JZG8gewo+PiAtCQlpZiAoKGl0ZXIuc2xvdCAmIDMp ID09IDApCj4+IC0JCQlwcl9kZWJ1ZygiJTA0eDogIiwgaXRlci5zbG90KTsKPj4gLQo+PiAtCQlp ZiAoY2hhc2hfaXRlcl9pc192YWxpZChpdGVyKSkKPj4gLQkJCXByX2RlYnVnKCJbJTAxNmxseF0g IiwgY2hhc2hfaXRlcl9rZXkoaXRlcikpOwo+PiAtCQllbHNlIGlmIChjaGFzaF9pdGVyX2lzX2Vt cHR5KGl0ZXIpKQo+PiAtCQkJcHJfZGVidWcoIlsgICAgPGVtcHR5PiAgICAgXSAiKTsKPj4gLQkJ ZWxzZQo+PiAtCQkJcHJfZGVidWcoIlsgIDx0b21ic3RvbmU+ICAgXSAiKTsKPj4gLQo+PiAtCQlp ZiAoKGl0ZXIuc2xvdCAmIDMpID09IDMpCj4+IC0JCQlwcl9kZWJ1ZygiXG4iKTsKPj4gLQo+PiAt CQlDSEFTSF9JVEVSX0lOQyhpdGVyKTsKPj4gLQl9IHdoaWxlIChpdGVyLnNsb3QpOwo+PiAtCj4+ IC0JaWYgKChpdGVyLnNsb3QgJiAzKSAhPSAwKQo+PiAtCQlwcl9kZWJ1ZygiXG4iKTsKPj4gLX0K Pj4gLQo+PiAtc3RhdGljIGludCBjaGFzaF90YWJsZV9jaGVjayhzdHJ1Y3QgX19jaGFzaF90YWJs ZSAqdGFibGUpCj4+IC17Cj4+IC0JdTMyIGhhc2g7Cj4+IC0Jc3RydWN0IGNoYXNoX2l0ZXIgaXRl ciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7Cj4+IC0Jc3RydWN0IGNoYXNoX2l0ZXIgY3Vy ID0gQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCAwKTsKPj4gLQo+PiAtCWRvIHsKPj4gLQkJaWYgKCFj aGFzaF9pdGVyX2lzX3ZhbGlkKGl0ZXIpKSB7Cj4+IC0JCQlDSEFTSF9JVEVSX0lOQyhpdGVyKTsK Pj4gLQkJCWNvbnRpbnVlOwo+PiAtCQl9Cj4+IC0KPj4gLQkJaGFzaCA9IGNoYXNoX2l0ZXJfaGFz aChpdGVyKTsKPj4gLQkJQ0hBU0hfSVRFUl9TRVQoY3VyLCBoYXNoKTsKPj4gLQkJd2hpbGUgKGN1 ci5zbG90ICE9IGl0ZXIuc2xvdCkgewo+PiAtCQkJaWYgKGNoYXNoX2l0ZXJfaXNfZW1wdHkoY3Vy KSkgewo+PiAtCQkJCXByX2VycigiUGF0aCB0byBlbGVtZW50IGF0ICV4IHdpdGggaGFzaCAleCBi cm9rZW4gYXQgc2xvdCAleFxuIiwKPj4gLQkJCQkgICAgICAgaXRlci5zbG90LCBoYXNoLCBjdXIu c2xvdCk7Cj4+IC0JCQkJY2hhc2hfdGFibGVfZHVtcCh0YWJsZSk7Cj4+IC0JCQkJcmV0dXJuIC1F SU5WQUw7Cj4+IC0JCQl9Cj4+IC0JCQlDSEFTSF9JVEVSX0lOQyhjdXIpOwo+PiAtCQl9Cj4+IC0K Pj4gLQkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7Cj4+IC0JfSB3aGlsZSAoaXRlci5zbG90KTsKPj4g LQo+PiAtCXJldHVybiAwOwo+PiAtfQo+PiAtI2VuZGlmCj4+IC0KPj4gLXN0YXRpYyB2b2lkIGNo YXNoX2l0ZXJfcmVsb2NhdGUoc3RydWN0IGNoYXNoX2l0ZXIgZHN0LCBzdHJ1Y3QgY2hhc2hfaXRl ciBzcmMpCj4+IC17Cj4+IC0JQlVHX09OKHNyYy50YWJsZSA9PSBkc3QudGFibGUgJiYgc3JjLnNs b3QgPT0gZHN0LnNsb3QpOwo+PiAtCUJVR19PTihzcmMudGFibGUtPmtleV9zaXplICE9IGRzdC50 YWJsZS0+a2V5X3NpemUpOwo+PiAtCUJVR19PTihzcmMudGFibGUtPnZhbHVlX3NpemUgIT0gZHN0 LnRhYmxlLT52YWx1ZV9zaXplKTsKPj4gLQo+PiAtCWlmIChkc3QudGFibGUtPmtleV9zaXplID09 IDQpCj4+IC0JCWRzdC50YWJsZS0+a2V5czMyW2RzdC5zbG90XSA9IHNyYy50YWJsZS0+a2V5czMy W3NyYy5zbG90XTsKPj4gLQllbHNlCj4+IC0JCWRzdC50YWJsZS0+a2V5czY0W2RzdC5zbG90XSA9 IHNyYy50YWJsZS0+a2V5czY0W3NyYy5zbG90XTsKPj4gLQo+PiAtCWlmIChkc3QudGFibGUtPnZh bHVlX3NpemUpCj4+IC0JCW1lbWNweShjaGFzaF9pdGVyX3ZhbHVlKGRzdCksIGNoYXNoX2l0ZXJf dmFsdWUoc3JjKSwKPj4gLQkJICAgICAgIGRzdC50YWJsZS0+dmFsdWVfc2l6ZSk7Cj4+IC0KPj4g LQljaGFzaF9pdGVyX3NldF92YWxpZChkc3QpOwo+PiAtCWNoYXNoX2l0ZXJfc2V0X2ludmFsaWQo c3JjKTsKPj4gLQo+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwo+PiAtCWlmIChzcmMudGFi bGUgPT0gZHN0LnRhYmxlKSB7Cj4+IC0JCWRzdC50YWJsZS0+cmVsb2NzKys7Cj4+IC0JCWRzdC50 YWJsZS0+cmVsb2NfZGlzdCArPQo+PiAtCQkJQ0hBU0hfU1VCKGRzdC50YWJsZSwgc3JjLnNsb3Qs IGRzdC5zbG90KTsKPj4gLQl9Cj4+IC0jZW5kaWYKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBf X2NoYXNoX3RhYmxlX2ZpbmQgLSBIZWxwZXIgZm9yIGxvb2tpbmcgdXAgYSBoYXNoIHRhYmxlIGVu dHJ5Cj4+IC0gKiBAaXRlcjogUG9pbnRlciB0byBoYXNoIHRhYmxlIGl0ZXJhdG9yCj4+IC0gKiBA a2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQKPj4gLSAqIEBmb3JfcmVtb3ZhbDogc2V0IHRv IHRydWUgaWYgdGhlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkIHNvb24KPj4gLSAqCj4+IC0gKiBT ZWFyY2hlcyBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgd2l0aCBhIGdpdmVuIGtleS4g aXRlciBtdXN0Cj4+IC0gKiBiZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyIHRvIHBvaW50IHRv IHRoZSBob21lIHBvc2l0aW9uIG9mIHRoZQo+PiAtICogaHlwb3RoZXRpY2FsIGVudHJ5LCBpLmUu IGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaGFzaCB0YWJsZQo+PiAtICogYW5kIHRo ZSBrZXkncyBoYXNoIGFzIHRoZSBpbml0aWFsIHNsb3QgZm9yIHRoZSBzZWFyY2guCj4+IC0gKgo+ PiAtICogVGhpcyBmdW5jdGlvbiBhbHNvIGRvZXMgc29tZSBsb2NhbCBjbGVhbi11cCB0byBzcGVl ZCB1cCBmdXR1cmUKPj4gLSAqIGxvb2stdXBzIGJ5IHJlbG9jYXRpbmcgZW50cmllcyB0byBiZXR0 ZXIgc2xvdHMgYW5kIHJlbW92aW5nCj4+IC0gKiB0b21ic3RvbmVzIHRoYXQgYXJlIG5vIGxvbmdl ciBuZWVkZWQuCj4+IC0gKgo+PiAtICogSWYgQGZvcl9yZW1vdmFsIGlzIHRydWUsIHRoZSBmdW5j dGlvbiBhdm9pZHMgcmVsb2NhdGluZyB0aGUgZW50cnkKPj4gLSAqIHRoYXQgaXMgYmVpbmcgcmV0 dXJuZWQuCj4+IC0gKgo+PiAtICogUmV0dXJucyAwIGlmIHRoZSBzZWFyY2ggaXMgc3VjY2Vzc2Z1 bC4gSW4gdGhpcyBjYXNlIGl0ZXIgaXMgdXBkYXRlZAo+PiAtICogdG8gcG9pbnQgdG8gdGhlIGZv dW5kIGVudHJ5LiBPdGhlcndpc2UgJS1FSU5WQUwgaXMgcmV0dXJuZWQgYW5kIHRoZQo+PiAtICog aXRlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgc2xvdCBmb3Ig dGhlIGdpdmVuCj4+IC0gKiBrZXkuIElmIHRoZSB0YWJsZSBpcyBmdWxsLCB0aGUgc2xvdCBpcyBz ZXQgdG8gLTEuCj4+IC0gKi8KPj4gLXN0YXRpYyBpbnQgY2hhc2hfdGFibGVfZmluZChzdHJ1Y3Qg Y2hhc2hfaXRlciAqaXRlciwgdTY0IGtleSwKPj4gLQkJCSAgICBib29sIGZvcl9yZW1vdmFsKQo+ PiAtewo+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwo+PiAtCXU2NCB0czEgPSBsb2NhbF9j bG9jaygpOwo+PiAtI2VuZGlmCj4+IC0JdTMyIGhhc2ggPSBpdGVyLT5zbG90Owo+PiAtCXN0cnVj dCBjaGFzaF9pdGVyIGZpcnN0X3JlZHVuZGFudCA9IENIQVNIX0lURVJfSU5JVChpdGVyLT50YWJs ZSwgLTEpOwo+PiAtCWludCBmaXJzdF9hdmFpbCA9IChmb3JfcmVtb3ZhbCA/IC0yIDogLTEpOwo+ PiAtCj4+IC0Jd2hpbGUgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKCppdGVyKSB8fCBjaGFzaF9pdGVy X2tleSgqaXRlcikgIT0ga2V5KSB7Cj4+IC0JCWlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KCppdGVy KSkgewo+PiAtCQkJLyogRm91bmQgYW4gZW1wdHkgc2xvdCwgd2hpY2ggZW5kcyB0aGUKPj4gLQkJ CSAqIHNlYXJjaC4gQ2xlYW4gdXAgYW55IHByZWNlZGluZyB0b21ic3RvbmVzCj4+IC0JCQkgKiB0 aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIGJlY2F1c2UgdGhleSBsZWFkCj4+IC0JCQkgKiB0byBu by13aGVyZQo+PiAtCQkJICovCj4+IC0JCQlpZiAoKGludClmaXJzdF9yZWR1bmRhbnQuc2xvdCA8 IDApCj4+IC0JCQkJZ290byBub3RfZm91bmQ7Cj4+IC0JCQl3aGlsZSAoZmlyc3RfcmVkdW5kYW50 LnNsb3QgIT0gaXRlci0+c2xvdCkgewo+PiAtCQkJCWlmICghY2hhc2hfaXRlcl9pc192YWxpZChm aXJzdF9yZWR1bmRhbnQpKQo+PiAtCQkJCQljaGFzaF9pdGVyX3NldF9lbXB0eShmaXJzdF9yZWR1 bmRhbnQpOwo+PiAtCQkJCUNIQVNIX0lURVJfSU5DKGZpcnN0X3JlZHVuZGFudCk7Cj4+IC0JCQl9 Cj4+IC0jaWZkZWYgQ0hBU0hfREVCVUcKPj4gLQkJCWNoYXNoX3RhYmxlX2NoZWNrKGl0ZXItPnRh YmxlKTsKPj4gLSNlbmRpZgo+PiAtCQkJZ290byBub3RfZm91bmQ7Cj4+IC0JCX0gZWxzZSBpZiAo IWNoYXNoX2l0ZXJfaXNfdmFsaWQoKml0ZXIpKSB7Cj4+IC0JCQkvKiBGb3VuZCBhIHRvbWJzdG9u ZS4gUmVtZW1iZXIgaXQgYXMgY2FuZGlkYXRlCj4+IC0JCQkgKiBmb3IgcmVsb2NhdGluZyB0aGUg ZW50cnkgd2UncmUgbG9va2luZyBmb3IKPj4gLQkJCSAqIG9yIGZvciBhZGRpbmcgYSBuZXcgZW50 cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5Cj4+IC0JCQkgKi8KPj4gLQkJCWlmIChmaXJzdF9hdmFpbCA9 PSAtMSkKPj4gLQkJCQlmaXJzdF9hdmFpbCA9IGl0ZXItPnNsb3Q7Cj4+IC0JCQkvKiBPciBtYXJr IGl0IGFzIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZgo+PiAtCQkJICogcG90ZW50aWFsbHkgcmVk dW5kYW50IHRvbWJzdG9uZXMKPj4gLQkJCSAqLwo+PiAtCQkJZWxzZSBpZiAoZmlyc3RfcmVkdW5k YW50LnNsb3QgPT0gLTEpCj4+IC0JCQkJQ0hBU0hfSVRFUl9TRVQoZmlyc3RfcmVkdW5kYW50LCBp dGVyLT5zbG90KTsKPj4gLQkJfSBlbHNlIGlmIChmaXJzdF9yZWR1bmRhbnQuc2xvdCA+PSAwKSB7 Cj4+IC0JCQkvKiBGb3VuZCBhIHZhbGlkLCBvY2N1cGllZCBzbG90IHdpdGggYQo+PiAtCQkJICog cHJlY2VkaW5nIHNlcmllcyBvZiB0b21ic3RvbmVzLiBSZWxvY2F0ZSBpdAo+PiAtCQkJICogdG8g YSBiZXR0ZXIgcG9zaXRpb24gdGhhdCBubyBsb25nZXIgZGVwZW5kcwo+PiAtCQkJICogb24gdGhv c2UgdG9tYnN0b25lcwo+PiAtCQkJICovCj4+IC0JCQl1MzIgY3VyX2hhc2ggPSBjaGFzaF9pdGVy X2hhc2goKml0ZXIpOwo+PiAtCj4+IC0JCQlpZiAoIUNIQVNIX0lOX1JBTkdFKGl0ZXItPnRhYmxl LCBjdXJfaGFzaCwKPj4gLQkJCQkJICAgIGZpcnN0X3JlZHVuZGFudC5zbG90ICsgMSwKPj4gLQkJ CQkJICAgIGl0ZXItPnNsb3QpKSB7Cj4+IC0JCQkJLyogVGhpcyBlbnRyeSBoYXMgYSBoYXNoIGF0 IG9yIGJlZm9yZQo+PiAtCQkJCSAqIHRoZSBmaXJzdCB0b21ic3RvbmUgd2UgZm91bmQuIFdlCj4+ IC0JCQkJICogY2FuIHJlbG9jYXRlIGl0IHRvIHRoYXQgdG9tYnN0b25lCj4+IC0JCQkJICogYW5k IGFkdmFuY2UgdG8gdGhlIG5leHQgdG9tYnN0b25lCj4+IC0JCQkJICovCj4+IC0JCQkJY2hhc2hf aXRlcl9yZWxvY2F0ZShmaXJzdF9yZWR1bmRhbnQsICppdGVyKTsKPj4gLQkJCQlkbyB7Cj4+IC0J CQkJCUNIQVNIX0lURVJfSU5DKGZpcnN0X3JlZHVuZGFudCk7Cj4+IC0JCQkJfSB3aGlsZSAoY2hh c2hfaXRlcl9pc192YWxpZChmaXJzdF9yZWR1bmRhbnQpKTsKPj4gLQkJCX0gZWxzZSBpZiAoY3Vy X2hhc2ggIT0gaXRlci0+c2xvdCkgewo+PiAtCQkJCS8qIFJlbG9jYXRlIGVudHJ5IHRvIGl0cyBo b21lIHBvc2l0aW9uCj4+IC0JCQkJICogb3IgYXMgY2xvc2UgYXMgcG9zc2libGUgc28gaXQgbm8K Pj4gLQkJCQkgKiBsb25nZXIgZGVwZW5kcyBvbiBhbnkgcHJlY2VkaW5nCj4+IC0JCQkJICogdG9t YnN0b25lcwo+PiAtCQkJCSAqLwo+PiAtCQkJCXN0cnVjdCBjaGFzaF9pdGVyIG5ld19pdGVyID0K Pj4gLQkJCQkJQ0hBU0hfSVRFUl9JTklUKGl0ZXItPnRhYmxlLCBjdXJfaGFzaCk7Cj4+IC0KPj4g LQkJCQl3aGlsZSAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90ICYmCj4+IC0JCQkJICAgICAg IGNoYXNoX2l0ZXJfaXNfdmFsaWQobmV3X2l0ZXIpKQo+PiAtCQkJCQlDSEFTSF9JVEVSX0lOQyhu ZXdfaXRlcik7Cj4+IC0KPj4gLQkJCQlpZiAobmV3X2l0ZXIuc2xvdCAhPSBpdGVyLT5zbG90KQo+ PiAtCQkJCQljaGFzaF9pdGVyX3JlbG9jYXRlKG5ld19pdGVyLCAqaXRlcik7Cj4+IC0JCQl9Cj4+ IC0JCX0KPj4gLQo+PiAtCQlDSEFTSF9JVEVSX0lOQygqaXRlcik7Cj4+IC0JCWlmIChpdGVyLT5z bG90ID09IGhhc2gpIHsKPj4gLQkJCWl0ZXItPnNsb3QgPSAtMTsKPj4gLQkJCWdvdG8gbm90X2Zv dW5kOwo+PiAtCQl9Cj4+IC0JfQo+PiAtCj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTCj4+ IC0JaXRlci0+dGFibGUtPmhpdHMrKzsKPj4gLQlpdGVyLT50YWJsZS0+aGl0c19zdGVwcyArPSBD SEFTSF9TVUIoaXRlci0+dGFibGUsIGl0ZXItPnNsb3QsIGhhc2gpICsgMTsKPj4gLSNlbmRpZgo+ PiAtCj4+IC0JaWYgKGZpcnN0X2F2YWlsID49IDApIHsKPj4gLQkJQ0hBU0hfSVRFUl9TRVQoZmly c3RfcmVkdW5kYW50LCBmaXJzdF9hdmFpbCk7Cj4+IC0JCWNoYXNoX2l0ZXJfcmVsb2NhdGUoZmly c3RfcmVkdW5kYW50LCAqaXRlcik7Cj4+IC0JCWl0ZXItPnNsb3QgPSBmaXJzdF9yZWR1bmRhbnQu c2xvdDsKPj4gLQkJaXRlci0+bWFzayA9IGZpcnN0X3JlZHVuZGFudC5tYXNrOwo+PiAtCX0KPj4g LQo+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUwo+PiAtCWl0ZXItPnRhYmxlLT5oaXRzX3Rp bWVfbnMgKz0gbG9jYWxfY2xvY2soKSAtIHRzMTsKPj4gLSNlbmRpZgo+PiAtCj4+IC0JcmV0dXJu IDA7Cj4+IC0KPj4gLW5vdF9mb3VuZDoKPj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKPj4g LQlpdGVyLT50YWJsZS0+bWlzcysrOwo+PiAtCWl0ZXItPnRhYmxlLT5taXNzX3N0ZXBzICs9IChp dGVyLT5zbG90IDwgMCkgPwo+PiAtCQkoMSA8PCBpdGVyLT50YWJsZS0+Yml0cykgOgo+PiAtCQlD SEFTSF9TVUIoaXRlci0+dGFibGUsIGl0ZXItPnNsb3QsIGhhc2gpICsgMTsKPj4gLSNlbmRpZgo+ PiAtCj4+IC0JaWYgKGZpcnN0X2F2YWlsID49IDApCj4+IC0JCUNIQVNIX0lURVJfU0VUKCppdGVy LCBmaXJzdF9hdmFpbCk7Cj4+IC0KPj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKPj4gLQlp dGVyLT50YWJsZS0+bWlzc190aW1lX25zICs9IGxvY2FsX2Nsb2NrKCkgLSB0czE7Cj4+IC0jZW5k aWYKPj4gLQo+PiAtCXJldHVybiAtRUlOVkFMOwo+PiAtfQo+PiAtCj4+IC1pbnQgX19jaGFzaF90 YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwKPj4gLQkJ CSAgY29uc3Qgdm9pZCAqdmFsdWUpCj4+IC17Cj4+IC0JdTMyIGhhc2ggPSAodGFibGUtPmtleV9z aXplID09IDQpID8KPj4gLQkJaGFzaF8zMihrZXksIHRhYmxlLT5iaXRzKSA6IGhhc2hfNjQoa2V5 LCB0YWJsZS0+Yml0cyk7Cj4+IC0Jc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJf SU5JVCh0YWJsZSwgaGFzaCk7Cj4+IC0JaW50IHIgPSBjaGFzaF90YWJsZV9maW5kKCZpdGVyLCBr ZXksIGZhbHNlKTsKPj4gLQo+PiAtCS8qIEZvdW5kIGFuIGV4aXN0aW5nIGVudHJ5ICovCj4+IC0J aWYgKCFyKSB7Cj4+IC0JCWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkKPj4gLQkJCW1l bWNweShjaGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB2YWx1ZSwKPj4gLQkJCSAgICAgICB0YWJsZS0+ dmFsdWVfc2l6ZSk7Cj4+IC0JCXJldHVybiAxOwo+PiAtCX0KPj4gLQo+PiAtCS8qIElzIHRoZXJl IGEgcGxhY2UgdG8gYWRkIGEgbmV3IGVudHJ5PyAqLwo+PiAtCWlmIChpdGVyLnNsb3QgPCAwKSB7 Cj4+IC0JCXByX2VycigiSGFzaCB0YWJsZSBvdmVyZmxvd1xuIik7Cj4+IC0JCXJldHVybiAtRU5P TUVNOwo+PiAtCX0KPj4gLQo+PiAtCWNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGl0ZXIpOwo+PiAtCj4+ IC0JaWYgKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KQo+PiAtCQl0YWJsZS0+a2V5czMyW2l0ZXIuc2xv dF0gPSBrZXk7Cj4+IC0JZWxzZQo+PiAtCQl0YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF0gPSBrZXk7 Cj4+IC0JaWYgKHZhbHVlICYmIHRhYmxlLT52YWx1ZV9zaXplKQo+PiAtCQltZW1jcHkoY2hhc2hf aXRlcl92YWx1ZShpdGVyKSwgdmFsdWUsIHRhYmxlLT52YWx1ZV9zaXplKTsKPj4gLQo+PiAtCXJl dHVybiAwOwo+PiAtfQo+PiAtRVhQT1JUX1NZTUJPTChfX2NoYXNoX3RhYmxlX2NvcHlfaW4pOwo+ PiAtCj4+IC1pbnQgX19jaGFzaF90YWJsZV9jb3B5X291dChzdHJ1Y3QgX19jaGFzaF90YWJsZSAq dGFibGUsIHU2NCBrZXksCj4+IC0JCQkgICB2b2lkICp2YWx1ZSwgYm9vbCByZW1vdmUpCj4+IC17 Cj4+IC0JdTMyIGhhc2ggPSAodGFibGUtPmtleV9zaXplID09IDQpID8KPj4gLQkJaGFzaF8zMihr ZXksIHRhYmxlLT5iaXRzKSA6IGhhc2hfNjQoa2V5LCB0YWJsZS0+Yml0cyk7Cj4+IC0Jc3RydWN0 IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgaGFzaCk7Cj4+IC0JaW50 IHIgPSBjaGFzaF90YWJsZV9maW5kKCZpdGVyLCBrZXksIHJlbW92ZSk7Cj4+IC0KPj4gLQlpZiAo ciA8IDApCj4+IC0JCXJldHVybiByOwo+PiAtCj4+IC0JaWYgKHZhbHVlICYmIHRhYmxlLT52YWx1 ZV9zaXplKQo+PiAtCQltZW1jcHkodmFsdWUsIGNoYXNoX2l0ZXJfdmFsdWUoaXRlciksIHRhYmxl LT52YWx1ZV9zaXplKTsKPj4gLQo+PiAtCWlmIChyZW1vdmUpCj4+IC0JCWNoYXNoX2l0ZXJfc2V0 X2ludmFsaWQoaXRlcik7Cj4+IC0KPj4gLQlyZXR1cm4gaXRlci5zbG90Owo+PiAtfQo+PiAtRVhQ T1JUX1NZTUJPTChfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KTsKPj4gLQo+PiAtI2lmZGVmIENPTkZJ R19DSEFTSF9TRUxGVEVTVAo+PiAtLyoqCj4+IC0gKiBjaGFzaF9zZWxmX3Rlc3QgLSBSdW4gYSBz ZWxmLXRlc3Qgb2YgdGhlIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24KPj4gLSAqIEBiaXRzOiBU YWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMKPj4gLSAqIEBrZXlfc2l6ZTogU2l6ZSBv ZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAo+PiAtICogQG1pbl9maWxsOiBNaW5pbXVtIGZp bGwgbGV2ZWwgZHVyaW5nIHRoZSB0ZXN0Cj4+IC0gKiBAbWF4X2ZpbGw6IE1heGltdW0gZmlsbCBs ZXZlbCBkdXJpbmcgdGhlIHRlc3QKPj4gLSAqIEBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGVzdCBp dGVyYXRpb25zCj4+IC0gKgo+PiAtICogVGhlIHRlc3QgYWRkcyBhbmQgcmVtb3ZlcyBlbnRyaWVz IGZyb20gYSBoYXNoIHRhYmxlLCBjeWNsaW5nIHRoZQo+PiAtICogZmlsbCBsZXZlbCBiZXR3ZWVu IG1pbl9maWxsIGFuZCBtYXhfZmlsbCBlbnRyaWVzLiBBbHNvIHRlc3RzIGxvb2t1cAo+PiAtICog YW5kIHZhbHVlIHJldHJpZXZhbC4KPj4gLSAqLwo+PiAtc3RhdGljIGludCBfX2luaXQgY2hhc2hf c2VsZl90ZXN0KHU4IGJpdHMsIHU4IGtleV9zaXplLAo+PiAtCQkJCSAgaW50IG1pbl9maWxsLCBp bnQgbWF4X2ZpbGwsCj4+IC0JCQkJICB1NjQgaXRlcmF0aW9ucykKPj4gLXsKPj4gLQlzdHJ1Y3Qg Y2hhc2hfdGFibGUgdGFibGU7Cj4+IC0JaW50IHJldDsKPj4gLQl1NjQgYWRkX2NvdW50LCBybXZf Y291bnQ7Cj4+IC0JdTY0IHZhbHVlOwo+PiAtCj4+IC0JaWYgKGtleV9zaXplID09IDQgJiYgaXRl cmF0aW9ucyA+IDB4ZmZmZmZmZmYpCj4+IC0JCXJldHVybiAtRUlOVkFMOwo+PiAtCWlmIChtaW5f ZmlsbCA+PSBtYXhfZmlsbCkKPj4gLQkJcmV0dXJuIC1FSU5WQUw7Cj4+IC0KPj4gLQlyZXQgPSBj aGFzaF90YWJsZV9hbGxvYygmdGFibGUsIGJpdHMsIGtleV9zaXplLCBzaXplb2YodTY0KSwKPj4g LQkJCQlHRlBfS0VSTkVMKTsKPj4gLQlpZiAocmV0KSB7Cj4+IC0JCXByX2VycigiY2hhc2hfdGFi bGVfYWxsb2MgZmFpbGVkOiAlZFxuIiwgcmV0KTsKPj4gLQkJcmV0dXJuIHJldDsKPj4gLQl9Cj4+ IC0KPj4gLQlmb3IgKGFkZF9jb3VudCA9IDAsIHJtdl9jb3VudCA9IDA7IGFkZF9jb3VudCA8IGl0 ZXJhdGlvbnM7Cj4+IC0JICAgICBhZGRfY291bnQrKykgewo+PiAtCQkvKiBXaGVuIHdlIGhpdCB0 aGUgbWF4X2ZpbGwgbGV2ZWwsIHJlbW92ZSBlbnRyaWVzIGRvd24KPj4gLQkJICogdG8gbWluX2Zp bGwKPj4gLQkJICovCj4+IC0JCWlmIChhZGRfY291bnQgLSBybXZfY291bnQgPT0gbWF4X2ZpbGwp IHsKPj4gLQkJCXU2NCBmaW5kX2NvdW50ID0gcm12X2NvdW50Owo+PiAtCj4+IC0JCQkvKiBGaXJz dCB0cnkgdG8gZmluZCBhbGwgZW50cmllcyB0aGF0IHdlJ3JlCj4+IC0JCQkgKiBhYm91dCB0byBy ZW1vdmUsIGNvbmZpcm0gdGhlaXIgdmFsdWUsIHRlc3QKPj4gLQkJCSAqIHdyaXRpbmcgdGhlbSBi YWNrIGEgc2Vjb25kIHRpbWUuCj4+IC0JCQkgKi8KPj4gLQkJCWZvciAoOyBhZGRfY291bnQgLSBm aW5kX2NvdW50ID4gbWluX2ZpbGw7Cj4+IC0JCQkgICAgIGZpbmRfY291bnQrKykgewo+PiAtCQkJ CXJldCA9IGNoYXNoX3RhYmxlX2NvcHlfb3V0KCZ0YWJsZSwgZmluZF9jb3VudCwKPj4gLQkJCQkJ CQkgICAmdmFsdWUpOwo+PiAtCQkJCWlmIChyZXQgPCAwKSB7Cj4+IC0JCQkJCXByX2VycigiY2hh c2hfdGFibGVfY29weV9vdXQgZmFpbGVkOiAlZFxuIiwKPj4gLQkJCQkJICAgICAgIHJldCk7Cj4+ IC0JCQkJCWdvdG8gb3V0Owo+PiAtCQkJCX0KPj4gLQkJCQlpZiAodmFsdWUgIT0gfmZpbmRfY291 bnQpIHsKPj4gLQkJCQkJcHJfZXJyKCJXcm9uZyB2YWx1ZSByZXRyaWV2ZWQgZm9yIGtleSAweCVs bHgsIGV4cGVjdGVkIDB4JWxseCBnb3QgMHglbGx4XG4iLAo+PiAtCQkJCQkgICAgICAgZmluZF9j b3VudCwgfmZpbmRfY291bnQsIHZhbHVlKTsKPj4gLSNpZmRlZiBDSEFTSF9ERUJVRwo+PiAtCQkJ CQljaGFzaF90YWJsZV9kdW1wKCZ0YWJsZS50YWJsZSk7Cj4+IC0jZW5kaWYKPj4gLQkJCQkJcmV0 ID0gLUVGQVVMVDsKPj4gLQkJCQkJZ290byBvdXQ7Cj4+IC0JCQkJfQo+PiAtCQkJCXJldCA9IGNo YXNoX3RhYmxlX2NvcHlfaW4oJnRhYmxlLCBmaW5kX2NvdW50LAo+PiAtCQkJCQkJCSAgJnZhbHVl KTsKPj4gLQkJCQlpZiAocmV0ICE9IDEpIHsKPj4gLQkJCQkJcHJfZXJyKCJjb3B5X2luIHNlY29u ZCB0aW1lIHJldHVybmVkICVkLCBleHBlY3RlZCAxXG4iLAo+PiAtCQkJCQkgICAgICAgcmV0KTsK Pj4gLQkJCQkJcmV0ID0gLUVGQVVMVDsKPj4gLQkJCQkJZ290byBvdXQ7Cj4+IC0JCQkJfQo+PiAt CQkJfQo+PiAtCQkJLyogUmVtb3ZlIHRoZW0gdW50aWwgd2UgaGl0IG1pbl9maWxsIGxldmVsICov Cj4+IC0JCQlmb3IgKDsgYWRkX2NvdW50IC0gcm12X2NvdW50ID4gbWluX2ZpbGw7IHJtdl9jb3Vu dCsrKSB7Cj4+IC0JCQkJcmV0ID0gY2hhc2hfdGFibGVfcmVtb3ZlKCZ0YWJsZSwgcm12X2NvdW50 LAo+PiAtCQkJCQkJCSBOVUxMKTsKPj4gLQkJCQlpZiAocmV0IDwgMCkgewo+PiAtCQkJCQlwcl9l cnIoImNoYXNoX3RhYmxlX3JlbW92ZSBmYWlsZWQ6ICVkXG4iLAo+PiAtCQkJCQkgICAgICAgcmV0 KTsKPj4gLQkJCQkJZ290byBvdXQ7Cj4+IC0JCQkJfQo+PiAtCQkJfQo+PiAtCQl9Cj4+IC0KPj4g LQkJLyogQWRkIGEgbmV3IHZhbHVlICovCj4+IC0JCXZhbHVlID0gfmFkZF9jb3VudDsKPj4gLQkJ cmV0ID0gY2hhc2hfdGFibGVfY29weV9pbigmdGFibGUsIGFkZF9jb3VudCwgJnZhbHVlKTsKPj4g LQkJaWYgKHJldCAhPSAwKSB7Cj4+IC0JCQlwcl9lcnIoImNvcHlfaW4gZmlyc3QgdGltZSByZXR1 cm5lZCAlZCwgZXhwZWN0ZWQgMFxuIiwKPj4gLQkJCSAgICAgICByZXQpOwo+PiAtCQkJcmV0ID0g LUVGQVVMVDsKPj4gLQkJCWdvdG8gb3V0Owo+PiAtCQl9Cj4+IC0JfQo+PiAtCj4+IC0JY2hhc2hf dGFibGVfZHVtcF9zdGF0cygmdGFibGUpOwo+PiAtCWNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKCZ0 YWJsZSk7Cj4+IC0KPj4gLW91dDoKPj4gLQljaGFzaF90YWJsZV9mcmVlKCZ0YWJsZSk7Cj4+IC0J cmV0dXJuIHJldDsKPj4gLX0KPj4gLQo+PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0 X2JpdHMgPSAxMDsKPj4gLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9iaXRzLAo+PiAtCQkgIlNlbGZ0 ZXN0IG51bWJlciBvZiBoYXNoIGJpdHMgKFs0Li4yMF0sIGRlZmF1bHQ9MTApIik7Cj4+IC1tb2R1 bGVfcGFyYW1fbmFtZWQodGVzdF9iaXRzLCBjaGFzaF90ZXN0X2JpdHMsIHVpbnQsIDA0NDQpOwo+ PiAtCj4+IC1zdGF0aWMgdW5zaWduZWQgaW50IGNoYXNoX3Rlc3Rfa2V5c2l6ZSA9IDg7Cj4+IC1N T0RVTEVfUEFSTV9ERVNDKHRlc3Rfa2V5c2l6ZSwgIlNlbGZ0ZXN0IGtleXNpemUgKDQgb3IgOCwg ZGVmYXVsdD04KSIpOwo+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3Rfa2V5c2l6ZSwgY2hhc2hf dGVzdF9rZXlzaXplLCB1aW50LCAwNDQ0KTsKPj4gLQo+PiAtc3RhdGljIHVuc2lnbmVkIGludCBj aGFzaF90ZXN0X21pbmZpbGw7Cj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfbWluZmlsbCwgIlNl bGZ0ZXN0IG1pbmltdW0gI2VudHJpZXMgKGRlZmF1bHQ9NTAlKSIpOwo+PiAtbW9kdWxlX3BhcmFt X25hbWVkKHRlc3RfbWluZmlsbCwgY2hhc2hfdGVzdF9taW5maWxsLCB1aW50LCAwNDQ0KTsKPj4g LQo+PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21heGZpbGw7Cj4+IC1NT0RVTEVf UEFSTV9ERVNDKHRlc3RfbWF4ZmlsbCwgIlNlbGZ0ZXN0IG1heGltdW0gI2VudHJpZXMgKGRlZmF1 bHQ9ODAlKSIpOwo+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfbWF4ZmlsbCwgY2hhc2hfdGVz dF9tYXhmaWxsLCB1aW50LCAwNDQ0KTsKPj4gLQo+PiAtc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hh c2hfdGVzdF9pdGVyczsKPj4gLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9pdGVycywgIlNlbGZ0ZXN0 IGl0ZXJhdGlvbnMgKGRlZmF1bHQ9MTAwMCB4ICNlbnRyaWVzKSIpOwo+PiAtbW9kdWxlX3BhcmFt X25hbWVkKHRlc3RfaXRlcnMsIGNoYXNoX3Rlc3RfaXRlcnMsIHVsb25nLCAwNDQ0KTsKPj4gLQo+ PiAtc3RhdGljIGludCBfX2luaXQgY2hhc2hfaW5pdCh2b2lkKQo+PiAtewo+PiAtCWludCByZXQ7 Cj4+IC0JdTY0IHRzMV9uczsKPj4gLQo+PiAtCS8qIFNraXAgc2VsZiB0ZXN0IG9uIHVzZXIgZXJy b3JzICovCj4+IC0JaWYgKGNoYXNoX3Rlc3RfYml0cyA8IDQgfHwgY2hhc2hfdGVzdF9iaXRzID4g MjApIHsKPj4gLQkJcHJfZXJyKCJjaGFzaDogdGVzdF9iaXRzIG91dCBvZiByYW5nZSBbNC4uMjBd LlxuIik7Cj4+IC0JCXJldHVybiAwOwo+PiAtCX0KPj4gLQlpZiAoY2hhc2hfdGVzdF9rZXlzaXpl ICE9IDQgJiYgY2hhc2hfdGVzdF9rZXlzaXplICE9IDgpIHsKPj4gLQkJcHJfZXJyKCJjaGFzaDog dGVzdF9rZXlzaXplIGludmFsaWQuIE11c3QgYmUgNCBvciA4LlxuIik7Cj4+IC0JCXJldHVybiAw Owo+PiAtCX0KPj4gLQo+PiAtCWlmICghY2hhc2hfdGVzdF9taW5maWxsKQo+PiAtCQljaGFzaF90 ZXN0X21pbmZpbGwgPSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpIC8gMjsKPj4gLQlpZiAoIWNoYXNo X3Rlc3RfbWF4ZmlsbCkKPj4gLQkJY2hhc2hfdGVzdF9tYXhmaWxsID0gKDEgPDwgY2hhc2hfdGVz dF9iaXRzKSAqIDQgLyA1Owo+PiAtCWlmICghY2hhc2hfdGVzdF9pdGVycykKPj4gLQkJY2hhc2hf dGVzdF9pdGVycyA9ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykgKiAxMDAwOwo+PiAtCj4+IC0JaWYg KGNoYXNoX3Rlc3RfbWluZmlsbCA+PSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpKSB7Cj4+IC0JCXBy X2VycigiY2hhc2g6IHRlc3RfbWluZmlsbCB0b28gYmlnLiBNdXN0IGJlIDwgdGFibGUgc2l6ZS5c biIpOwo+PiAtCQlyZXR1cm4gMDsKPj4gLQl9Cj4+IC0JaWYgKGNoYXNoX3Rlc3RfbWF4ZmlsbCA+ PSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpKSB7Cj4+IC0JCXByX2VycigiY2hhc2g6IHRlc3RfbWF4 ZmlsbCB0b28gYmlnLiBNdXN0IGJlIDwgdGFibGUgc2l6ZS5cbiIpOwo+PiAtCQlyZXR1cm4gMDsK Pj4gLQl9Cj4+IC0JaWYgKGNoYXNoX3Rlc3RfbWluZmlsbCA+PSBjaGFzaF90ZXN0X21heGZpbGwp IHsKPj4gLQkJcHJfZXJyKCJjaGFzaDogdGVzdF9taW5maWxsIG11c3QgYmUgPCB0ZXN0X21heGZp bGwuXG4iKTsKPj4gLQkJcmV0dXJuIDA7Cj4+IC0JfQo+PiAtCWlmIChjaGFzaF90ZXN0X2tleXNp emUgPT0gNCAmJiBjaGFzaF90ZXN0X2l0ZXJzID4gMHhmZmZmZmZmZikgewo+PiAtCQlwcl9lcnIo ImNoYXNoOiB0ZXN0X2l0ZXJzIG11c3QgYmUgPCA0RyBmb3IgNCBieXRlIGtleXMuXG4iKTsKPj4g LQkJcmV0dXJuIDA7Cj4+IC0JfQo+PiAtCj4+IC0JdHMxX25zID0gbG9jYWxfY2xvY2soKTsKPj4g LQlyZXQgPSBjaGFzaF9zZWxmX3Rlc3QoY2hhc2hfdGVzdF9iaXRzLCBjaGFzaF90ZXN0X2tleXNp emUsCj4+IC0JCQkgICAgICBjaGFzaF90ZXN0X21pbmZpbGwsIGNoYXNoX3Rlc3RfbWF4ZmlsbCwK Pj4gLQkJCSAgICAgIGNoYXNoX3Rlc3RfaXRlcnMpOwo+PiAtCWlmICghcmV0KSB7Cj4+IC0JCXU2 NCB0c19kZWx0YV91cyA9IGxvY2FsX2Nsb2NrKCkgLSB0czFfbnM7Cj4+IC0JCXU2NCBpdGVyc19w ZXJfc2Vjb25kID0gKHU2NCljaGFzaF90ZXN0X2l0ZXJzICogMTAwMDAwMDsKPj4gLQo+PiAtCQlk b19kaXYodHNfZGVsdGFfdXMsIDEwMDApOwo+PiAtCQlkb19kaXYoaXRlcnNfcGVyX3NlY29uZCwg dHNfZGVsdGFfdXMpOwo+PiAtCQlwcl9pbmZvKCJjaGFzaDogc2VsZiB0ZXN0IHRvb2sgJWxsdSB1 cywgJWxsdSBpdGVyYXRpb25zL3NcbiIsCj4+IC0JCQl0c19kZWx0YV91cywgaXRlcnNfcGVyX3Nl Y29uZCk7Cj4+IC0JfSBlbHNlIHsKPj4gLQkJcHJfZXJyKCJjaGFzaDogc2VsZiB0ZXN0IGZhaWxl ZDogJWRcbiIsIHJldCk7Cj4+IC0JfQo+PiAtCj4+IC0JcmV0dXJuIHJldDsKPj4gLX0KPj4gLQo+ PiAtbW9kdWxlX2luaXQoY2hhc2hfaW5pdCk7Cj4+IC0KPj4gLSNlbmRpZiAvKiBDT05GSUdfQ0hB U0hfU0VMRlRFU1QgKi8KPj4gLQo+PiAtTU9EVUxFX0RFU0NSSVBUSU9OKCJDbG9zZWQgaGFzaCB0 YWJsZSIpOwo+PiAtTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmFtZC1nZngg bWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=