From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Andrew F. Davis" Subject: Re: [RFC][PATCH 2/5 v2] dma-buf: heaps: Add heap helpers Date: Wed, 13 Mar 2019 18:42:00 -0500 Message-ID: References: <1551819273-640-1-git-send-email-john.stultz@linaro.org> <1551819273-640-3-git-send-email-john.stultz@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from lelv0142.ext.ti.com (lelv0142.ext.ti.com [198.47.23.249]) by gabe.freedesktop.org (Postfix) with ESMTPS id 10E726E113 for ; Wed, 13 Mar 2019 23:42:09 +0000 (UTC) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Liam Mark Cc: Alistair Strachan , Greg KH , Chenbo Feng , lkml , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gMy8xMy8xOSA1OjU3IFBNLCBMaWFtIE1hcmsgd3JvdGU6Cj4gT24gV2VkLCAxMyBNYXIgMjAx OSwgQW5kcmV3IEYuIERhdmlzIHdyb3RlOgo+IAo+PiBPbiAzLzEzLzE5IDM6MTggUE0sIExpYW0g TWFyayB3cm90ZToKPj4+IE9uIFR1ZSwgNSBNYXIgMjAxOSwgSm9obiBTdHVsdHogd3JvdGU6Cj4+ Pgo+Pj4+IEFkZCBnZW5lcmljIGhlbHBlciBkbWFidWYgb3BzIGZvciBkbWEgaGVhcHMsIHNvIHdl IGNhbiByZWR1Y2UKPj4+PiB0aGUgYW1vdW50IG9mIGR1cGxpY2F0aXZlIGNvZGUgZm9yIHRoZSBl eHBvcnRlZCBkbWFidWZzLgo+Pj4+Cj4+Pj4gVGhpcyBjb2RlIGlzIGFuIGV2b2x1dGlvbiBvZiB0 aGUgQW5kcm9pZCBJT04gaW1wbGVtZW50YXRpb24sIHNvCj4+Pj4gdGhhbmtzIHRvIGl0cyBvcmln aW5hbCBhdXRob3JzIGFuZCBtYWludGFpbnRlcnM6Cj4+Pj4gICBSZWJlY2NhIFNjaHVsdHogWmF2 aW4sIENvbGluIENyb3NzLCBMYXVyYSBBYmJvdHQsIGFuZCBvdGhlcnMhCj4+Pj4KPj4+PiBDYzog TGF1cmEgQWJib3R0IDxsYWJib3R0QHJlZGhhdC5jb20+Cj4+Pj4gQ2M6IEJlbmphbWluIEdhaWdu YXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgo+Pj4+IENjOiBHcmVnIEtIIDxncmVn a2hAbGludXhmb3VuZGF0aW9uLm9yZz4KPj4+PiBDYzogU3VtaXQgU2Vtd2FsIDxzdW1pdC5zZW13 YWxAbGluYXJvLm9yZz4KPj4+PiBDYzogTGlhbSBNYXJrIDxsbWFya0Bjb2RlYXVyb3JhLm9yZz4K Pj4+PiBDYzogQnJpYW4gU3RhcmtleSA8QnJpYW4uU3RhcmtleUBhcm0uY29tPgo+Pj4+IENjOiBB bmRyZXcgRi4gRGF2aXMgPGFmZEB0aS5jb20+Cj4+Pj4gQ2M6IENoZW5ibyBGZW5nIDxmZW5nY0Bn b29nbGUuY29tPgo+Pj4+IENjOiBBbGlzdGFpciBTdHJhY2hhbiA8YXN0cmFjaGFuQGdvb2dsZS5j b20+Cj4+Pj4gQ2M6IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPj4+PiBTaWduZWQt b2ZmLWJ5OiBKb2huIFN0dWx0eiA8am9obi5zdHVsdHpAbGluYXJvLm9yZz4KPj4+PiAtLS0KPj4+ PiB2MjoKPj4+PiAqIFJlbW92ZWQgY2FjaGUgbWFuYWdlbWVudCBwZXJmb3JtYW5jZSBoYWNrIHRo YXQgSSBoYWQKPj4+PiAgIGFjY2lkZW50YWxseSBmb2xkZWQgaW4uCj4+Pj4gKiBSZW1vdmVkIHN0 YXRzIGNvZGUgdGhhdCB3YXMgaW4gaGVscGVycwo+Pj4+ICogTG90cyBvZiBjaGVja3BhdGNoIGNs ZWFudXBzCj4+Pj4gLS0tCj4+Pj4gIGRyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZSAgICAgICAgICAg ICB8ICAgMSArCj4+Pj4gIGRyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9NYWtlZmlsZSAgICAgICB8ICAg MiArCj4+Pj4gIGRyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9oZWFwLWhlbHBlcnMuYyB8IDMzNSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+Pj4+ICBkcml2ZXJzL2RtYS1idWYvaGVh cHMvaGVhcC1oZWxwZXJzLmggfCAgNDggKysrKysKPj4+PiAgNCBmaWxlcyBjaGFuZ2VkLCAzODYg aW5zZXJ0aW9ucygrKQo+Pj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEtYnVmL2hl YXBzL01ha2VmaWxlCj4+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS1idWYvaGVh cHMvaGVhcC1oZWxwZXJzLmMKPj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1hLWJ1 Zi9oZWFwcy9oZWFwLWhlbHBlcnMuaAo+Pj4+Cj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1h LWJ1Zi9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZQo+Pj4+IGluZGV4IGIwMzMy ZjEuLjA5YzJmMmQgMTAwNjQ0Cj4+Pj4gLS0tIGEvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlCj4+ Pj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlCj4+Pj4gQEAgLTEsNCArMSw1IEBACj4+ Pj4gIG9iai15IDo9IGRtYS1idWYubyBkbWEtZmVuY2UubyBkbWEtZmVuY2UtYXJyYXkubyByZXNl cnZhdGlvbi5vIHNlcW5vLWZlbmNlLm8KPj4+PiArb2JqLSQoQ09ORklHX0RNQUJVRl9IRUFQUykJ Kz0gaGVhcHMvCj4+Pj4gIG9iai0kKENPTkZJR19ETUFCVUZfSEVBUFMpCSs9IGRtYS1oZWFwLm8K Pj4+PiAgb2JqLSQoQ09ORklHX1NZTkNfRklMRSkJCSs9IHN5bmNfZmlsZS5vCj4+Pj4gIG9iai0k KENPTkZJR19TV19TWU5DKQkJKz0gc3dfc3luYy5vIHN5bmNfZGVidWcubwo+Pj4+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2RtYS1idWYvaGVhcHMvTWFrZWZpbGUgYi9kcml2ZXJzL2RtYS1idWYvaGVh cHMvTWFrZWZpbGUKPj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAu LmRlNDk4OTgKPj4+PiAtLS0gL2Rldi9udWxsCj4+Pj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2hl YXBzL01ha2VmaWxlCj4+Pj4gQEAgLTAsMCArMSwyIEBACj4+Pj4gKyMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAKPj4+PiArb2JqLXkJCQkJCSs9IGhlYXAtaGVscGVycy5vCj4+Pj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9oZWFwLWhlbHBlcnMuYyBiL2RyaXZl cnMvZG1hLWJ1Zi9oZWFwcy9oZWFwLWhlbHBlcnMuYwo+Pj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4+Pj4gaW5kZXggMDAwMDAwMC4uYWU1ZTlkMAo+Pj4+IC0tLSAvZGV2L251bGwKPj4+PiArKysg Yi9kcml2ZXJzL2RtYS1idWYvaGVhcHMvaGVhcC1oZWxwZXJzLmMKPj4+PiBAQCAtMCwwICsxLDMz NSBAQAo+Pj4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+Pj4+ICsjaW5j bHVkZSA8bGludXgvZGV2aWNlLmg+Cj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+Cj4+ Pj4gKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KPj4+PiArI2luY2x1ZGUgPGxpbnV4L2lkci5oPgo+ Pj4+ICsjaW5jbHVkZSA8bGludXgvbGlzdC5oPgo+Pj4+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5o Pgo+Pj4+ICsjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgo+Pj4+ICsjaW5jbHVkZSA8dWFwaS9s aW51eC9kbWEtaGVhcC5oPgo+Pj4+ICsKPj4+PiArI2luY2x1ZGUgImhlYXAtaGVscGVycy5oIgo+ Pj4+ICsKPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkICpkbWFfaGVhcF9tYXBfa2VybmVsKHN0cnVj dCBoZWFwX2hlbHBlcl9idWZmZXIgKmJ1ZmZlcikKPj4+PiArewo+Pj4+ICsJc3RydWN0IHNjYXR0 ZXJsaXN0ICpzZzsKPj4+PiArCWludCBpLCBqOwo+Pj4+ICsJdm9pZCAqdmFkZHI7Cj4+Pj4gKwlw Z3Byb3RfdCBwZ3Byb3Q7Cj4+Pj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5z Z190YWJsZTsKPj4+PiArCWludCBucGFnZXMgPSBQQUdFX0FMSUdOKGJ1ZmZlci0+aGVhcF9idWZm ZXIuc2l6ZSkgLyBQQUdFX1NJWkU7Cj4+Pj4gKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gdm1hbGxv YyhhcnJheV9zaXplKG5wYWdlcywKPj4+PiArCQkJCQkJIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkp Owo+Pj4+ICsJc3RydWN0IHBhZ2UgKip0bXAgPSBwYWdlczsKPj4+PiArCj4+Pj4gKwlpZiAoIXBh Z2VzKQo+Pj4+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4+ICsKPj4+PiArCXBncHJv dCA9IFBBR0VfS0VSTkVMOwo+Pj4+ICsKPj4+PiArCWZvcl9lYWNoX3NnKHRhYmxlLT5zZ2wsIHNn LCB0YWJsZS0+bmVudHMsIGkpIHsKPj4+PiArCQlpbnQgbnBhZ2VzX3RoaXNfZW50cnkgPSBQQUdF X0FMSUdOKHNnLT5sZW5ndGgpIC8gUEFHRV9TSVpFOwo+Pj4+ICsJCXN0cnVjdCBwYWdlICpwYWdl ID0gc2dfcGFnZShzZyk7Cj4+Pj4gKwo+Pj4+ICsJCVdBUk5fT04oaSA+PSBucGFnZXMpOwo+Pj4+ ICsJCWZvciAoaiA9IDA7IGogPCBucGFnZXNfdGhpc19lbnRyeTsgaisrKQo+Pj4+ICsJCQkqKHRt cCsrKSA9IHBhZ2UrKzsKPj4+PiArCX0KPj4+PiArCXZhZGRyID0gdm1hcChwYWdlcywgbnBhZ2Vz LCBWTV9NQVAsIHBncHJvdCk7Cj4+Pj4gKwl2ZnJlZShwYWdlcyk7Cj4+Pj4gKwo+Pj4+ICsJaWYg KCF2YWRkcikKPj4+PiArCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPj4+PiArCj4+Pj4gKwly ZXR1cm4gdmFkZHI7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyBpbnQgZG1hX2hlYXBfbWFw X3VzZXIoc3RydWN0IGhlYXBfaGVscGVyX2J1ZmZlciAqYnVmZmVyLAo+Pj4+ICsJCQkgc3RydWN0 IHZtX2FyZWFfc3RydWN0ICp2bWEpCj4+Pj4gK3sKPj4+PiArCXN0cnVjdCBzZ190YWJsZSAqdGFi bGUgPSBidWZmZXItPnNnX3RhYmxlOwo+Pj4+ICsJdW5zaWduZWQgbG9uZyBhZGRyID0gdm1hLT52 bV9zdGFydDsKPj4+PiArCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiAqIFBB R0VfU0laRTsKPj4+PiArCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Cj4+Pj4gKwlpbnQgaTsKPj4+ PiArCWludCByZXQ7Cj4+Pj4gKwo+Pj4+ICsJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRh YmxlLT5uZW50cywgaSkgewo+Pj4+ICsJCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzZyk7 Cj4+Pj4gKwkJdW5zaWduZWQgbG9uZyByZW1haW5kZXIgPSB2bWEtPnZtX2VuZCAtIGFkZHI7Cj4+ Pj4gKwkJdW5zaWduZWQgbG9uZyBsZW4gPSBzZy0+bGVuZ3RoOwo+Pj4+ICsKPj4+PiArCQlpZiAo b2Zmc2V0ID49IHNnLT5sZW5ndGgpIHsKPj4+PiArCQkJb2Zmc2V0IC09IHNnLT5sZW5ndGg7Cj4+ Pj4gKwkJCWNvbnRpbnVlOwo+Pj4+ICsJCX0gZWxzZSBpZiAob2Zmc2V0KSB7Cj4+Pj4gKwkJCXBh Z2UgKz0gb2Zmc2V0IC8gUEFHRV9TSVpFOwo+Pj4+ICsJCQlsZW4gPSBzZy0+bGVuZ3RoIC0gb2Zm c2V0Owo+Pj4+ICsJCQlvZmZzZXQgPSAwOwo+Pj4+ICsJCX0KPj4+PiArCQlsZW4gPSBtaW4obGVu LCByZW1haW5kZXIpOwo+Pj4+ICsJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIGFkZHIsIHBh Z2VfdG9fcGZuKHBhZ2UpLCBsZW4sCj4+Pj4gKwkJCQkgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCk7 Cj4+Pj4gKwkJaWYgKHJldCkKPj4+PiArCQkJcmV0dXJuIHJldDsKPj4+PiArCQlhZGRyICs9IGxl bjsKPj4+PiArCQlpZiAoYWRkciA+PSB2bWEtPnZtX2VuZCkKPj4+PiArCQkJcmV0dXJuIDA7Cj4+ Pj4gKwl9Cj4+Pj4gKwo+Pj4+ICsJcmV0dXJuIDA7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gKwo+Pj4+ ICt2b2lkIGRtYV9oZWFwX2J1ZmZlcl9kZXN0cm95KHN0cnVjdCBkbWFfaGVhcF9idWZmZXIgKmhl YXBfYnVmZmVyKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1Y3QgaGVhcF9oZWxwZXJfYnVmZmVyICpidWZm ZXIgPSB0b19oZWxwZXJfYnVmZmVyKGhlYXBfYnVmZmVyKTsKPj4+PiArCj4+Pj4gKwlpZiAoYnVm ZmVyLT5rbWFwX2NudCA+IDApIHsKPj4+PiArCQlwcl93YXJuX29uY2UoIiVzOiBidWZmZXIgc3Rp bGwgbWFwcGVkIGluIHRoZSBrZXJuZWxcbiIsCj4+Pj4gKwkJCSAgICAgX19mdW5jX18pOwo+Pj4+ ICsJCXZ1bm1hcChidWZmZXItPnZhZGRyKTsKPj4+PiArCX0KPj4+PiArCj4+Pj4gKwlidWZmZXIt PmZyZWUoYnVmZmVyKTsKPj4+PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgKmRtYV9oZWFw X2J1ZmZlcl9rbWFwX2dldChzdHJ1Y3QgZG1hX2hlYXBfYnVmZmVyICpoZWFwX2J1ZmZlcikKPj4+ PiArewo+Pj4+ICsJc3RydWN0IGhlYXBfaGVscGVyX2J1ZmZlciAqYnVmZmVyID0gdG9faGVscGVy X2J1ZmZlcihoZWFwX2J1ZmZlcik7Cj4+Pj4gKwl2b2lkICp2YWRkcjsKPj4+PiArCj4+Pj4gKwlp ZiAoYnVmZmVyLT5rbWFwX2NudCkgewo+Pj4+ICsJCWJ1ZmZlci0+a21hcF9jbnQrKzsKPj4+PiAr CQlyZXR1cm4gYnVmZmVyLT52YWRkcjsKPj4+PiArCX0KPj4+PiArCXZhZGRyID0gZG1hX2hlYXBf bWFwX2tlcm5lbChidWZmZXIpOwo+Pj4+ICsJaWYgKFdBUk5fT05DRSghdmFkZHIsCj4+Pj4gKwkJ ICAgICAgImhlYXAtPm9wcy0+bWFwX2tlcm5lbCBzaG91bGQgcmV0dXJuIEVSUl9QVFIgb24gZXJy b3IiKSkKPj4+PiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPj4+PiArCWlmIChJU19FUlIo dmFkZHIpKQo+Pj4+ICsJCXJldHVybiB2YWRkcjsKPj4+PiArCWJ1ZmZlci0+dmFkZHIgPSB2YWRk cjsKPj4+PiArCWJ1ZmZlci0+a21hcF9jbnQrKzsKPj4+PiArCXJldHVybiB2YWRkcjsKPj4+PiAr fQo+Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgZG1hX2hlYXBfYnVmZmVyX2ttYXBfcHV0KHN0cnVj dCBkbWFfaGVhcF9idWZmZXIgKmhlYXBfYnVmZmVyKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1Y3QgaGVh cF9oZWxwZXJfYnVmZmVyICpidWZmZXIgPSB0b19oZWxwZXJfYnVmZmVyKGhlYXBfYnVmZmVyKTsK Pj4+PiArCj4+Pj4gKwlidWZmZXItPmttYXBfY250LS07Cj4+Pj4gKwlpZiAoIWJ1ZmZlci0+a21h cF9jbnQpIHsKPj4+PiArCQl2dW5tYXAoYnVmZmVyLT52YWRkcik7Cj4+Pj4gKwkJYnVmZmVyLT52 YWRkciA9IE5VTEw7Cj4+Pj4gKwl9Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyBzdHJ1Y3Qg c2dfdGFibGUgKmR1cF9zZ190YWJsZShzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlKQo+Pj4+ICt7Cj4+ Pj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKm5ld190YWJsZTsKPj4+PiArCWludCByZXQsIGk7Cj4+Pj4g KwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCAqbmV3X3NnOwo+Pj4+ICsKPj4+PiArCW5ld190YWJs ZSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfdGFibGUpLCBHRlBfS0VSTkVMKTsKPj4+PiArCWlmICgh bmV3X3RhYmxlKQo+Pj4+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4+ICsKPj4+PiAr CXJldCA9IHNnX2FsbG9jX3RhYmxlKG5ld190YWJsZSwgdGFibGUtPm5lbnRzLCBHRlBfS0VSTkVM KTsKPj4+PiArCWlmIChyZXQpIHsKPj4+PiArCQlrZnJlZShuZXdfdGFibGUpOwo+Pj4+ICsJCXJl dHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4+ICsJfQo+Pj4+ICsKPj4+PiArCW5ld19zZyA9IG5l d190YWJsZS0+c2dsOwo+Pj4+ICsJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5u ZW50cywgaSkgewo+Pj4+ICsJCW1lbWNweShuZXdfc2csIHNnLCBzaXplb2YoKnNnKSk7Cj4+Pj4g KwkJbmV3X3NnLT5kbWFfYWRkcmVzcyA9IDA7Cj4+Pj4gKwkJbmV3X3NnID0gc2dfbmV4dChuZXdf c2cpOwo+Pj4+ICsJfQo+Pj4+ICsKPj4+PiArCXJldHVybiBuZXdfdGFibGU7Cj4+Pj4gK30KPj4+ PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGZyZWVfZHVwZWRfdGFibGUoc3RydWN0IHNnX3RhYmxlICp0 YWJsZSkKPj4+PiArewo+Pj4+ICsJc2dfZnJlZV90YWJsZSh0YWJsZSk7Cj4+Pj4gKwlrZnJlZSh0 YWJsZSk7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0cnVjdCBkbWFfaGVhcHNfYXR0YWNobWVudCB7 Cj4+Pj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4+Pj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxl Owo+Pj4+ICsJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArc3Rh dGljIGludCBkbWFfaGVhcF9hdHRhY2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKPj4+PiArCQkJ ICAgICAgc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNobWVudCkKPj4+PiArewo+Pj4+ ICsJc3RydWN0IGRtYV9oZWFwc19hdHRhY2htZW50ICphOwo+Pj4+ICsJc3RydWN0IHNnX3RhYmxl ICp0YWJsZTsKPj4+PiArCXN0cnVjdCBkbWFfaGVhcF9idWZmZXIgKmhlYXBfYnVmZmVyID0gZG1h YnVmLT5wcml2Owo+Pj4+ICsJc3RydWN0IGhlYXBfaGVscGVyX2J1ZmZlciAqYnVmZmVyID0gdG9f aGVscGVyX2J1ZmZlcihoZWFwX2J1ZmZlcik7Cj4+Pj4gKwo+Pj4+ICsJYSA9IGt6YWxsb2Moc2l6 ZW9mKCphKSwgR0ZQX0tFUk5FTCk7Cj4+Pj4gKwlpZiAoIWEpCj4+Pj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4+Pj4gKwo+Pj4+ICsJdGFibGUgPSBkdXBfc2dfdGFibGUoYnVmZmVyLT5zZ190YWJsZSk7 Cj4+Pj4gKwlpZiAoSVNfRVJSKHRhYmxlKSkgewo+Pj4+ICsJCWtmcmVlKGEpOwo+Pj4+ICsJCXJl dHVybiAtRU5PTUVNOwo+Pj4+ICsJfQo+Pj4+ICsKPj4+PiArCWEtPnRhYmxlID0gdGFibGU7Cj4+ Pj4gKwlhLT5kZXYgPSBhdHRhY2htZW50LT5kZXY7Cj4+Pj4gKwlJTklUX0xJU1RfSEVBRCgmYS0+ bGlzdCk7Cj4+Pj4gKwo+Pj4+ICsJYXR0YWNobWVudC0+cHJpdiA9IGE7Cj4+Pj4gKwo+Pj4+ICsJ bXV0ZXhfbG9jaygmYnVmZmVyLT5sb2NrKTsKPj4+PiArCWxpc3RfYWRkKCZhLT5saXN0LCAmYnVm ZmVyLT5hdHRhY2htZW50cyk7Cj4+Pj4gKwltdXRleF91bmxvY2soJmJ1ZmZlci0+bG9jayk7Cj4+ Pj4gKwo+Pj4+ICsJcmV0dXJuIDA7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGRt YV9oZWFwX2RldGF0Y2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKPj4+PiArCQkJCXN0cnVjdCBk bWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaG1lbnQpCj4+Pj4gK3sKPj4+PiArCXN0cnVjdCBkbWFf aGVhcHNfYXR0YWNobWVudCAqYSA9IGF0dGFjaG1lbnQtPnByaXY7Cj4+Pj4gKwlzdHJ1Y3QgZG1h X2hlYXBfYnVmZmVyICpoZWFwX2J1ZmZlciA9IGRtYWJ1Zi0+cHJpdjsKPj4+PiArCXN0cnVjdCBo ZWFwX2hlbHBlcl9idWZmZXIgKmJ1ZmZlciA9IHRvX2hlbHBlcl9idWZmZXIoaGVhcF9idWZmZXIp Owo+Pj4+ICsKPj4+PiArCW11dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwlsaXN0X2Rl bCgmYS0+bGlzdCk7Cj4+Pj4gKwltdXRleF91bmxvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwlm cmVlX2R1cGVkX3RhYmxlKGEtPnRhYmxlKTsKPj4+PiArCj4+Pj4gKwlrZnJlZShhKTsKPj4+PiAr fQo+Pj4+ICsKPj4+PiArc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqZG1hX2hlYXBfbWFwX2RtYV9i dWYoCj4+Pj4gKwkJCQkJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNobWVudCwKPj4+ PiArCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCj4+Pj4gK3sKPj4+PiAr CXN0cnVjdCBkbWFfaGVhcHNfYXR0YWNobWVudCAqYSA9IGF0dGFjaG1lbnQtPnByaXY7Cj4+Pj4g KwlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlOwo+Pj4+ICsKPj4+PiArCXRhYmxlID0gYS0+dGFibGU7 Cj4+Pj4gKwo+Pj4+ICsJaWYgKCFkbWFfbWFwX3NnKGF0dGFjaG1lbnQtPmRldiwgdGFibGUtPnNn bCwgdGFibGUtPm5lbnRzLAo+Pj4+ICsJCQlkaXJlY3Rpb24pKQo+Pj4KPj4+IFNpbmNlIHRoaXMg Y29kZSBpcyB1c2VkIGZvciBzeXN0ZW0gaGVhcCBhbmQgYW5kIGFzIHRoZSByZWZlcmVuY2UuCj4+ PiBJbiBtdWx0aW1lZGlhIHVzZXMgY2FzZXMgdmVyeSBsYXJnZSBidWZmZXJzIGNhbiBiZSBhbGxv Y2F0ZWQgZnJvbSBzeXN0ZW0gCj4+PiBoZWFwLCBhbmQgc2luY2Ugc3lzdGVtIGhlYXAgYWxsb2Nh dGlvbnMgaGF2ZSBhIGNhY2hlZCBrZXJuZWwgbWFwcGluZyBpdCAKPj4+IGhhcyBiZWVuIGRpZmZp Y3VsdCB0byBzdXBwb3J0IHVuY2FjaGVkIGFsbG9jYXRpb25zIHNvIGNsaWVudHMgd2lsbCBsaWtl bHkgCj4+PiBhbGxvY2F0ZSB0aGVtIGFzIGNhY2hlZCBhbGxvY2F0aW9ucy4KPj4+IE1vc3QgYWNj ZXNzIHRvIHRoZXNlIGJ1ZmZlcnMgd2lsbCBvY2N1ciBmcm9tIG5vbiBJTy1jb2hlcmVudCBkZXZp Y2VzLCAKPj4+IGhvd2V2ZXIgaW4gZnJhbWV3b3JrcyBzdWNoIGFzIEFuZHJvaWQgdGhlc2UgYnVm ZmVycyB3aWxsIGJlIGRtYSBtYXBwZWQgYW5kIAo+Pj4gZG1hIHVubWFwcGVkIGZyZXF1ZW50bHks IGZvciBldmVyeSBmcmFtZSBhbmQgZm9yIGVhY2ggZGV2aWNlIGluIHRoZSAKPj4+ICJidWZmZXIg cGlwZWxpbmUiLCB3aGljaCBsZWFkcyB0byBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBjYWNoZSBtYWlu dGVuYW5jZSAKPj4+IGluIHRoZSBkbWEgbWFwIGFuZCBkbWEgdW5tYXAgY2FsbHMuCj4+PiBGcm9t IHByZXZpb3VzIGRpc2N1c3Npb25zIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHRoaXMgY291bGQgYmUg b3B0aW1pemVkIGJ5IAo+Pj4gb25seSBtYWtpbmcgY2hhbmdlcyB0byBkbWEtYnVmIGhlYXBzIGZy YW1ld29yay4KPj4+Cj4+PiBTbyBJIHRoaW5rIGl0IHdvdWxkIGJlIGhlbHBmdWwgdG8gdHJ5IGFu ZCBhZ3JlZSBvbiB3aGF0IHR5cGVzIG9mIGNoYW5nZXMgCj4+PiB3b3VsZCBiZSByZXF1aXJlZCB0 byB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgYW5kIHBvc3NpYmx5IHRoZSBkbWEtYnVmIGhlYXBzIAo+ Pj4gZnJhbWV3b3JrIHRvIHJlc29sdmUgdGhpcy4KPj4+IEV4YW1wbGUKPj4+Cj4+PiAtIEhhdmUg QW5kcm9pZCBmcmFtZXdvcmsga2VlcCBidWZmZXJzIGRtYSBtYXBwZWQgZm9yIHRoZSB3aG9sZSB1 c2UgY2FzZQo+Pj4KPj4+IC0gT3IgcGVyaGFwcyBoYXZlIEFuZHJvaWQga2VlcCByZXF1aXJlZCBk ZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIgYXMgCj4+PiB0aGV5IGFyZSAicGlwZWxpbmVk IiBzbyB0aGF0IGNhY2hlIG1haW50ZW5hbmNlIGNhbiBiZSBza2lwcGVkIGluIGRtYSBtYXAgCj4+ PiBhbmQgZG1hIHVtbmFwIGJ1dCByZWxpYWJseSBhcHBsaWVkIGluIGJlZ2luL2VuZF9jcHVfYWNj ZXNzLgo+Pj4KPj4KPj4gSSBkb24ndCBoYXZlIGEgc3Ryb25nIG9waW5pb24gb24gdGhlIHNvbHV0 aW9uIGhlcmUgZm9yIEFuZHJvaWQsIGJ1dCBmcm9tCj4+IGtlcm5lbC9oYXJkd2FyZSBzaWRlIEkg Y2FuIHNlZSB3ZSBkb24ndCBoYXZlIGEgZ29vZCBvd25lcnNoaXAgbW9kZWwgZm9yCj4+IGRtYS1i dWYgYW5kIHRoYXQgbG9va3MgdG8gYmUgY2F1c2luZyB5b3VyIHVubmVlZGVkIGNhY2hlIG9wcy4K Pj4KPj4gTGV0IG15IGdpdmUgbXkgdmlzaW9uIGZvciB0aGUgbW9kZWwgeW91IHJlcXVlc3QgYmVs b3cuCj4+Cj4+Cj4+Pj4gKwkgdGFibGUgPSBFUlJfUFRSKC1FTk9NRU0pOyAKPj4+PiArCSByZXR1 cm4gdGFibGU7IAo+Pj4+ICt9IAo+Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgZG1hX2hlYXBfdW5t YXBfZG1hX2J1ZihzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2htZW50LAo+Pj4+ICsJ CQkgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlLAo+Pj4+ICsJCQkgICAgICBlbnVtIGRtYV9k YXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCj4+Pj4gK3sKPj4+PiArCWRtYV91bm1hcF9zZyhhdHRh Y2htZW50LT5kZXYsIHRhYmxlLT5zZ2wsIHRhYmxlLT5uZW50cywgZGlyZWN0aW9uKTsKPj4+PiAr fQo+Pj4+ICsKPj4+PiArc3RhdGljIGludCBkbWFfaGVhcF9tbWFwKHN0cnVjdCBkbWFfYnVmICpk bWFidWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1Y3Qg ZG1hX2hlYXBfYnVmZmVyICpoZWFwX2J1ZmZlciA9IGRtYWJ1Zi0+cHJpdjsKPj4+PiArCXN0cnVj dCBoZWFwX2hlbHBlcl9idWZmZXIgKmJ1ZmZlciA9IHRvX2hlbHBlcl9idWZmZXIoaGVhcF9idWZm ZXIpOwo+Pj4+ICsJaW50IHJldCA9IDA7Cj4+Pj4gKwo+Pj4+ICsJbXV0ZXhfbG9jaygmYnVmZmVy LT5sb2NrKTsKPj4+PiArCS8qIG5vdyBtYXAgaXQgdG8gdXNlcnNwYWNlICovCj4+Pj4gKwlyZXQg PSBkbWFfaGVhcF9tYXBfdXNlcihidWZmZXIsIHZtYSk7Cj4+Pgo+Pj4gU2luY2UgdGhpcyBjb2Rl IGlzIHVzZWQgZm9yIHN5c3RlbSBoZWFwIGFuZCBhbmQgYXMgdGhlIHJlZmVyZW5jZS4KPj4+IEN1 cnJlbnRseSBpbiBBbmRyb2lkIHdoZW4gYSBzeXN0ZW0gaGVhcCBidWZmZXIgaXMgbW92aW5nIGRv d24gdGhlIAo+Pj4gInBpcGVsaW5lIiBDUFUgYWNjZXNzIG1heSBvY2N1ciBhbmQgdGhlcmUgbWF5 IGJlIG5vIGRldmljZSBhdHRhY2hlZC4KPj4+IEluIHRoZSBwYXN0IHBlb3BsZSBoYXZlIHJhaXNl ZCBjb25jZXJucyB0aGF0IHRoaXMgc2hvdWxkIHBlcmhhcHMgbm90IGJlIAo+Pj4gc3VwcG9ydGVk IGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBkZXZpY2Ugc2hvdWxkIGJlIGF0dGFjaGVkIHdoZW4gQ1BV IGFjY2VzcyAKPj4+IG9jY3Vycy4KPj4+Cj4+PiBDYW4gd2UgZGVjaWRlLCBmcm9tIGEgZG1hLWJ1 ZiBjb250cmFjdCBwZXJzcGVjdGl2ZSwgb24gd2hldGhlciBDUFUgYWNjZXNzIAo+Pj4gd2l0aG91 dCBhIGRldmljZSBhdHRhY2hlZCBzaG91bGQgYWxsb3dlZCBhbmQgbWFrZSBpdCBjbGVhciBpbiB0 aGUgZG1hLWJ1ZiAKPj4+IGRvY3VtZW50YXRpb24gZWl0aGVyIHdheT8KPj4+Cj4+PiBJZiBpdCBz aG91bGQgbm90IGJlIGFsbG93ZWQgd2UgY2FuIHRyeSB0byB3b3JrIHdpdGggQW5kcm9pZCB0byBz ZWUgaG93IAo+Pj4gdGhleSBjYW4gY2hhbmdlIHRoZWlyIGZyYW1ld29yayB0byBhbGlnbiB3aXRo IHRoZSBkbWEtYnVmIHNwZWMuCj4+Pgo+Pgo+PiBBcyB5b3Ugc2F5LCByaWdodCBub3cgRE1BLUJV RiBkb2VzIG5vdCByZWFsbHkgcHJvdmlkZSBndWlkZWxpbmVzIGZvcgo+PiAid2VsbCBiZWhhdmVk IiBoZWFwcywgYW5kIGFzIHN1Y2ggd2UgYWxsIGVuZCB1cCBtYWtpbmcgZGlmZmVyZW50Cj4+IGFz c3VtcHRpb25zLiBBbHRob3VnaCBJIGRvbid0IHRoaW5rIHRoZXkgYmVsb3cgc2hvdWxkIGJlIGVu Zm9yY2VkIGZvcgo+PiBhbGwgRE1BLUJVRnMgaXQgc2hvdWxkIGJlIHVzZWQgZm9yIG91ciBmaXJz dCBzZXQgb2YgcmVmZXJlbmNlIGhlYXBzLgo+Pgo+PiBTbyBmcm9tIHRoZSBzdGFydCwgbGV0cyBs b29rcyBhdCBETUEtQlVGIGJ1ZmZlciBsaWZldGltZXMuIEEgYnVmZmVyCj4+IGJlZ2lucyBieSBi ZWluZyBhbGxvY2F0ZWQsIGF0IHRoaXMgcG9pbnQgdGhlIGJhY2tpbmcgcmVzb3VyY2VzICh1c3Vh bGx5Cj4+IHNvbWUgcGFnZXMgaW4gcGh5c2ljYWwgQ1BVIGFkZHJlc3NhYmxlIFJBTSkgaGF2ZSAq bm90KiBiZWVuIGFsbG9jYXRlZAo+PiB0aGlzIGlzIGEgY29yZSBmZWF0dXJlIG9mIERNQS1CVUYg YWxsb3dpbmcgc21hcnQgYWxsb2NhdGlvbnMgYXQgbWFwCj4+IHRpbWUuIEF0IHRoaXMgcG9pbnQg d2Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBidWZmZXIgaW4gYSBzdGF0ZSAibm9uLW93bmVkCj4+IG5v bi1iYWNrZWQiLgo+Pgo+PiBOZXh0IHdlIGhhdmUgdGhyZWUgdmFsaWQgYWN0aW9uczoKPj4gICog Q1BVIHVzZQo+PiAgKiBkZXZpY2UgYXR0YWNobWVudHMKPj4gICogZnJlZQo+Pgo+PiBDUFUgdXNl IHN0YXJ0cyB3aXRoIGEgY2FsbCB0byBiZWdpbl9jcHVfYWNjZXNzKCksIHRoZSBidWZmZXIgd2ls bCBub3cKPj4gYm90aCBiZWNvbWUgQ1BVIG93bmVkIGFuZCB3aWxsIHBpbiBpdCdzIGJhY2tpbmcg YnVmZmVyLiBUaGlzIGxhc3QgcGFydAo+PiBjYW4gY2F1c2UgYmVnaW5fY3B1X2FjY2VzcygpIHRv IGZhaWwgZm9yIHNvbWUgdHlwZXMgb2YgYnVmZmVycyB0aGF0IG9ubHkKPj4gcGljayB0aGVpciBi YWNraW5nIHJlc291cmNlIGJhc2VkIG9uIHRoZSBzZXQgb2YgYXR0YWNoZWQgZGV2aWNlcywgd2hp Y2gKPj4gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vbmUuIEZvciBoZWFwcyBsaWtlICJzeXN0ZW0i IGhlYXAgdGhpcyBzaG91bGQgbm90Cj4+IGJlIGEgcHJvYmxlbSBhcyB0aGUgYmFja2luZyBzdG9y YWdlIGlzIGFscmVhZHkgc2VsZWN0ZWQgYXQgYWxsb2NhdGlvbiB0aW1lLgo+Pgo+PiBEZXZpY2Ug YXR0YWNobWVudHMgYW5kIG1hcHBpbmcgc2hvdWxkIGJlaGF2ZSBhcyB0aGV5IGRvIG5vdy4gQWZ0 ZXIKPj4gbWFwcGluZywgdGhlIGJ1ZmZlciBpcyBub3cgb3duZWQgYnkgdGhlIGF0dGFjaGVkIGRl dmljZXMgYW5kIGJhY2tlZC4gVGhlCj4+IG93bmVyc2hpcCBjYW4gYmUgdHJhbnNmZXJlZCB0byB0 aGUgQ1BVIGFuZCBiYWNrIGFzIHVzdWFsIHdpdGgKPj4ge2JlZ2luLGVuZH1fY3B1X2FjY2Vzcygp Lgo+Pgo+PiBGcmVlIHJpZ2h0IGFmdGVyIGFsbG9jYXRpb24gd2l0aG91dCBhbnlvbmUgdGFraW5n IG93bmVyc2hpcCBpcyB0cml2aWFsLgo+Pgo+PiBOb3cgaGVyZSBpcyB3aGVyZSB0aGluZ3MgbWF5 IGdldCBpbnRlcmVzdGluZywgd2UgY2FuIG5vdyBiZSBpbiB0aGUKPj4gZm9sbG93aW5nIHN0YXRl czoKPj4KPj4gQ1BVIG93bmVkIGJhY2tlZAo+PiBEZXZpY2Ugb3duZWQgYmFja2VkCj4+Cj4+IFdo YXQgc2hvdWxkIHdlIGRvIHdoZW4gQ1BVIG93bmVkIGFuZCBlbmRfY3B1X2FjY2VzcygpIGlzIGNh bGxlZCBvciB3aGVuCj4+IERldmljZSBvd25lZCBhbmQgYWxsIGRldmljZXMgZGV0YWNoLiBXaGF0 IHN0YXRlIGRvIHdlIGdvIGludG8/IE15Cj4+IG9waW5pb24gd291bGQgYmUgdG8gcmV0dXJuIHRv ICJub24tb3duZWQgbm9uLWJhY2tlZCIgd2hpY2ggbWVhbnMgdGhlCj4+IGJhY2tpbmcgcmVzb3Vy Y2UgY2FuIGJlIGZyZWVkLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxlYXZlIGl0IGJhY2tlZC4g SQo+PiBiZWxlYXZlIHRoaXMgaXMgd2hhdCBBbmRyb2lkIGV4cGVjdHMgcmlnaHQgbm93IGFzIGl0 IHJldHVybnMgYnVmZmVycyB0bwo+PiBhICJCdWZmZXJRdWV1ZSIgdG8gbGF0ZXIgYmUgZGVxdWV1 ZWQgYW5kIHVzZWQgYWdhaW4gaW4gdGhlIHNhbWUgd2F5Cj4+IHdpdGhvdXQgdGltZSBjb25zdW1p bmcgcmVhbGxvY2F0aW9ucy4KPj4KPiAKPiBJIHRoaW5rIHRoZSBpc3N1ZSBtYXkgYmUgbW9yZSBz ZXJpb3VzIHdpdGggQW5kcm9pZCB0aGFuIGFsbG93IGltcHJvdmluZyAKPiB0aGUgcGVyZm9ybWFu Y2Ugb2YgYnVmZmVyIHJlLWFsbG9jYXRpb24uCj4gCj4gSW4gY2FzZXMgc3VjaCBhcyB2aWRlbyBw bGF5YmFjazoKPiAjMSB2aWRlbyBkZXZpY2UgcmVhZHMgYW5kIHRyYW5zZm9ybXMgdGhlIHZpZGVv IGRhdGEgCj4gIzIgb3B0aW9uYWxseSB0aGVyZSBtYXkgYmUgc29tZSBzb2Z0d2FyZSB2aWRlbyBw b3N0IHByb2Nlc3NpbmcgCj4gIzMgc3VyZmFjZSBmbGluZ2VyIAo+ICM0IEhBTCAKPiAjNSBkaXNw bGF5IGRldmljZSBldmVudHVhbGx5IGdldHMgdGhlIGJ1ZmZlcgo+IAo+IE15IHVuZGVyc3RhbmRp bmcgaXMgdGhlIGxhc3QgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIgKHRoZSB2aWRlbyAK PiBkZXZpY2UpIGNhbiBiZSBkZXRhY2hlZCBiZWZvcmUgQW5kcm9pZCBzZW5kcyB0aGUgYnVmZmVy IGRvd24gdGhlIAo+ICJwaXBlbGluZSIgd2hlcmUgc29tZSBzb2Z0d2FyZSBtb2R1bGUgbWF5IGRv IENQVSBhY2Nlc3MgYW5kIHdoZXJlIAo+IGV2ZW50dWFsbHkgYSBuZXcgZGV2aWNlIGlzIGF0dGFj aGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBnb2luZyB0byBiZSBhY2NlZGVkIAo+IGJ5IGEgZGV2aWNl LiAKPiAKPiBTbyBBbmRyb2lkIGlzIGNvdW50aW5nIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgYnVm ZmVyIGJlaW5nIHJldGFpbmVkIHdoaWxlIAo+IGl0IGlzICJub24tb3duZWQiLgo+IAoKSXQgd291 bGQgbm90IGJlIG93bmVkLCBidXQgc3RpbGwgImJhY2tlZCIsIGFmdGVyIGl0IGhhcyBiZWVuIG9u Y2UKYXR0YWNoZWQvbWFwcGVkIGl0IHNob3VsZCBpdCBhbHdheXMga2VlcCB0aGUgc2FtZSBkYXRh LCBldmVuIGlmIHRoYXQKZGF0YSBoYXMgdG8gYmUgbWlncmF0ZWQgdG8gZGlmZmVyZW50IGJhY2tp bmcgcmVzb3VyY2VzIGJhc2VkIG9uIG5ldwphdHRhY2htZW50cy4gRm9yIGluc3RhbmNlIGlmIHRo ZSB2aWRlbyBkZXZpY2UgYW5kIHRoZSBkaXNwbGF5IGRldmljZQpoYXZlIHNvbWUgbWVtb3J5IHRo YXQgdGhlIG90aGVyIGNhbm5vdCBhY2Nlc3MsIGFmdGVyIHRoZSB2aWRlbyBkZXZpY2UKbWFwcyBp dCB0aGUgaGVhcCBtYXkgcHV0IHRoZSBiYWNraW5nIG1lbW9yeSBpbiBhIHNwb3QgdGhhdCBjYW5u b3QgYmUKcmVhY2hlZCBieSB0aGUgZGlzcGxheSBkZXZpY2UuCgpUaGlzIGlzIHdoeSBhIGNvcmUg cGFydCBvZiBETUEtQlVGIGlzIHRoYXQgYWxsIHVzZXJzIHNob3VsZCBiZSBhdHRhY2hlZApiZWZv cmUgdGhlIGZpcnN0IG1hcCBzbyBzbWFydCBkZWNpc2lvbnMgY2FuIGJlIG1hZGUgYWJvdXQgdGhl IGJhY2tpbmcKbWVtb3J5LiBXaGF0IEFuZHJvaWQgZG9lcyBoZXJlIGlzIHRvIGFzc3VtZSBETUEt QlVGIGlzIGFsd2F5cyBsaWtlCnJlZ3VsYXIgbWVtb3J5LCBpdCBnZXRzIG5vIHVzZSBmcm9tIHRo ZSBsYXRlLWFsbG9jYXRlIGZlYXR1cmVzIGFuZCBzbwptYXkgc3VmZmVyIHNvbWUgcGVyZm9ybWFu Y2UgcGVuYWx0aWVzIGluIHNvbWUgY2FzZXMgZm9yIHNvbWUgaGVhcHMuCgo+PiBGb3IgInN5c3Rl bSIgaGVhcHMgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBvdXRzaWRlIG9mIHRoZSBjYWNoZSBvcHMs IGlmCj4+IHdlIG1haW50YWluIGEgYnVmZmVyIHN0YXRlIGxpa2UgdGhlIGFib3ZlIHdlIGNhbiBh bHdheXMga25vdyB3aGVuIGEKPj4gY2FjaGUgb3Agb3Igc2ltaWxhciBpcyBuZWVkZWQgKG9ubHkg d2hlbiB0cmFuc2l0aW9uaW5nIG93bmVycywgbm90IG9uCj4+IGV2ZXJ5IG1hcC91bm1hcCkuIAo+ IAo+IEFzc3VtaW5nIEkgdW5kZXJzdG9vZCB5b3VyIGNvbW1lbnRzIGNvcnJlY3RseSwgSSBhZ3Jl ZSB0aGF0IHdlIHdpbGwga25vdyAKPiAid2hlbiIgdG8gb3B0aW1hbGx5IGFwcGx5IHRoZSBjYWNo ZSBtYWludGVuYW5jZSBidXQgdGhlIHByb2JsZW0gd2l0aCAKPiBhbGxvd2luZyBDUFUgYWNjZXNz IHRvIGJ1ZmZlcnMgdGhhdCBhcmUgbm93ICJub24tb3duZWQiIGlzIHRoYXQgd2UgY2FuJ3QgCj4g YXBwbHkgdGhlIGNhY2hlIG1haW50ZW5hbmNlIHdoZW4gaXQgaXMgcmVxdWlyZWQgKGJlY2F1c2Ug dGhlcmUgaXMgbm8gCj4gbG9uZ2VyIGEgZGV2aWNlIGF2YWlsYWJsZSkuCj4gCgpBbmQgd2l0aG91 dCBrbm93aW5nIHdoYXQgZGV2aWNlIHdhcyBsYXN0IGF0dGFjaGVkIHdlIHJlYWxseSBjYW5ub3QK YWx3YXlzIGRvIHRoZSByaWdodCB0aGluZy4gRm9yIGV4YW1wbGUsIGlmIG91ciBhYm92ZSB2aWRl byBkZXZpY2Ugd2FzIElPCmNvaGVyZW50IHRoZSB3cml0dGVuIGRhdGEgbWF5IGhhdmUgbGFuZGVk IGluIEwzIGNhY2hlLiBTbyB0aGUgc3RhbmRhcmQKY2FjaGUgbWFpbnRlbmFuY2UgKGNhY2hlIGlu dmFsaWRhdGUpIHdlIHdvdWxkIG5vcm1hbGx5IGRvIHdvdWxkIGFjdHVhbGx5CndpcGUgb3V0IHRo ZSBkYXRhIHdlIGFyZSBsb29raW5nIGZvciwgYnV0IGlmIGl0IHdhcyBub3QgSU8gY29oZXJlbnQg aXQKd291bGQgYmUgbmVlZGVkLiBUaGlzIGlzIHdoeSB0aGUgRE1BIGZyYW1ld29yayBkb2Vzbid0 IGxpa2UgZG9pbmcKbWFpbnRlbmFuY2Ugd2l0aG91dCB0YXJnZXRlZCBkZXZpY2UuCgpXaGF0IHlv dSBjb3VsZCBkbyBpZiB5b3UgcmVhbGx5IHdhbnQgdGhvc2Ugc2F2aW5ncyAoSSdtIHN0aWxsIG5v dCBzdXJlCnRoZXkgYXJlIHdvcnRoIGFueXRoaW5nLCBidXQgaXQncyB5b3VyIHBsYXRmb3JtKSB5 b3UgY291bGQgdHJhY2sgdGhlIHNldApvZiBsYXN0IGF0dGFjaGVkIGRldmljZXMsIHRoZW4gb25s eSB3aGVuIG5lZWRlZCBwZXJmb3JtIHRoZSBvcHMuIEkgZG9uJ3QKdGhpbmsgdGhhdCB3aWxsIHNj YWxlIHZlcnkgd2VsbCwgdG8gbWUgdGhlIGxhc3QgdmFsaWQgdGltZSB0byBkbyB0aGUKbWFpbnRl bmFuY2UgaXMgb24gZGV2aWNlIHVubWFwLCBhbmQgc28gdW5sZXNzIHdlIGNhbiBwcm92ZSB0aGUg Q1BVIHdpbGwKbm90IGFjY2VzcyB0aGUgZGF0YSBiZXR3ZWVuIHRoZW4gYW5kIHRoZSBuZXh0IG1h cCAoYW5kIHRoYXQgdGhlIG5leHQKbWFwcGluZyBkZXZpY2UgaXNuJ3QgSU8gY29oZXJlbnQpLCB0 aGVuIEkgcmVhbGx5IGNhbnQgc2VlIGEgZ2VuZXJpYyB3YXkKdG8gYXZvaWQgdGhvc2Ugb3BzLgoK QW5kcmV3Cgo+IAo+PiBGb3IgbW9yZSBjb21wbGV4IGhlYXBzIHdlIGNhbiBkbyBzb21ldGhpbmcg c2ltaWxhcgo+PiB3aGVuIHRyYW5zaXRpb25pbmcgZnJvbSBiYWNrZWQgdG8gbm9uLWJhY2tlZCAo YW5kIHZpY2UtdmVyc2EpIHN1Y2ggYXMKPj4gbWlncmF0aW5nIHRoZSBiYWNraW5nIGRhdGEgdG8g YSBtb3JlIGFwcHJvcHJpYXRlIHJlc291cmNlIGdpdmVuIHRoZSBuZXcKPj4gc2V0IG9mIGF0dGFj aGluZy9tYXBwaW5nIGRldmljZXMuCj4+Cj4+IEEgbW9yZSBjb21wbGV0ZSBzdGF0ZSB0cmFuc2l0 aW9uIG1hcCB3aWxsIHByb2JhYmx5IGJlIG5lZWRlZCB0byBmaWxsIG91dAo+PiB3aGF0IHNob3Vs ZCBiZSBhbGxvd2VkIGFuZCB3aGF0IHRvIGRvIHdoZW4sIGFuZCBJIGFncmVlIGl0IHdpbGwgYmUg Z29vZAo+PiB0byBoYXZlIHRoYXQgZm9yIHRoaXMgZmlyc3Qgc2V0IG9mIHJlZmVyZW5jZSBoZWFw cy4gQnV0IGFsbCBvZiB0aGlzIGNhbgo+PiBiZSBkb25lIG5vdyB3aXRoIERNQS1oZWFwcywgc28g SSBkb24ndCB3YW50IHRvIHRpZSB1cCB0aGUgY29yZQo+PiBkZS1zdGFnaW5nIHRvbyBtdWNoIG9u IGdldHRpbmcgZXZlcnkgcG9zc2libGUgaGVhcCB0byBiZWhhdmUganVzdCByaWdodAo+PiBlaXRo ZXIuLgo+Pgo+Pj4+ICsJbXV0ZXhfdW5sb2NrKCZidWZmZXItPmxvY2spOwo+Pj4+ICsKPj4+PiAr CWlmIChyZXQpCj4+Pj4gKwkJcHJfZXJyKCIlczogZmFpbHVyZSBtYXBwaW5nIGJ1ZmZlciB0byB1 c2Vyc3BhY2VcbiIsCj4+Pj4gKwkJICAgICAgIF9fZnVuY19fKTsKPj4+PiArCj4+Pj4gKwlyZXR1 cm4gcmV0Owo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgdm9pZCBkbWFfaGVhcF9kbWFfYnVm X3JlbGVhc2Uoc3RydWN0IGRtYV9idWYgKmRtYWJ1ZikKPj4+PiArewo+Pj4+ICsJc3RydWN0IGRt YV9oZWFwX2J1ZmZlciAqYnVmZmVyID0gZG1hYnVmLT5wcml2Owo+Pj4+ICsKPj4+PiArCWRtYV9o ZWFwX2J1ZmZlcl9kZXN0cm95KGJ1ZmZlcik7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2 b2lkICpkbWFfaGVhcF9kbWFfYnVmX2ttYXAoc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKPj4+PiAr CQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKPj4+PiArewo+Pj4+ICsJc3RydWN0IGRtYV9oZWFw X2J1ZmZlciAqaGVhcF9idWZmZXIgPSBkbWFidWYtPnByaXY7Cj4+Pj4gKwlzdHJ1Y3QgaGVhcF9o ZWxwZXJfYnVmZmVyICpidWZmZXIgPSB0b19oZWxwZXJfYnVmZmVyKGhlYXBfYnVmZmVyKTsKPj4+ PiArCj4+Pj4gKwlyZXR1cm4gYnVmZmVyLT52YWRkciArIG9mZnNldCAqIFBBR0VfU0laRTsKPj4+ PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgZG1hX2hlYXBfZG1hX2J1Zl9rdW5tYXAoc3Ry dWN0IGRtYV9idWYgKmRtYWJ1ZiwKPj4+PiArCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKPj4+ PiArCQkJCQl2b2lkICpwdHIpCj4+Pj4gK3sKPj4+PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIGlu dCBkbWFfaGVhcF9kbWFfYnVmX2JlZ2luX2NwdV9hY2Nlc3Moc3RydWN0IGRtYV9idWYgKmRtYWJ1 ZiwKPj4+PiArCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCj4+Pj4gK3sK Pj4+PiArCXN0cnVjdCBkbWFfaGVhcF9idWZmZXIgKmhlYXBfYnVmZmVyID0gZG1hYnVmLT5wcml2 Owo+Pj4+ICsJc3RydWN0IGhlYXBfaGVscGVyX2J1ZmZlciAqYnVmZmVyID0gdG9faGVscGVyX2J1 ZmZlcihoZWFwX2J1ZmZlcik7Cj4+Pj4gKwl2b2lkICp2YWRkcjsKPj4+PiArCXN0cnVjdCBkbWFf aGVhcHNfYXR0YWNobWVudCAqYTsKPj4+PiArCWludCByZXQgPSAwOwo+Pj4+ICsKPj4+PiArCW11 dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwl2YWRkciA9IGRtYV9oZWFwX2J1ZmZlcl9r bWFwX2dldChoZWFwX2J1ZmZlcik7Cj4+Pgo+Pj4gU2luY2UgdGhpcyBjb2RlIGlzIHVzZWQgZm9y IHN5c3RlbSBoZWFwIGFuZCBhbmQgYXMgdGhlIHJlZmVyZW5jZS4KPj4+IEFzIGhhcyBiZWVuIGRp c2N1c3NlZCBpbiB0aGUgcGFzdCB0aGVyZSBhcmUgc2V2ZXJhbCBkaXNhZHZhbnRhZ2VzIHRvIAo+ Pj4gY3JlYXRpbmcgYSBrZXJuZWwgbWFwcGluZyBvbiBlYWNoIGNhbGwgdG8gYmVnaW5fY3B1X2Fj Y2Vzcy4KPj4+Cj4+PiBUaGUgcmVzdWx0aW5nIGNhbGwgdG8gYWxsb2Nfdm1hcF9hcmVhIGlzIGV4 cGVuc2l2ZSBhbmQgY2FuIGh1cnQgY2xpZW50IAo+Pj4gS1BJcwo+Pj4KPj4+IEFsbG93aW5nIHVz ZXJzcGFjZSBjbGllbnRzIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBrZXJuZWwgbWFwcGluZ3MgY2Fu IAo+Pj4gcHJvdmlkZSBvcHBvcnR1bml0aWVzIHRvIGNyYXNoIHRoZSBrZXJuZWwuCj4+Pgo+Pj4g Q2FuIHdlIGxvb2sgYXQgcmVtb3ZpbmcgdGhlIGNyZWF0aW9uIG9mIGEga2VybmVsIG1hcHBpbmcg aW4gCj4+PiBiZWdpbl9jcHVfYWNjZXNzIGFuZCBlaXRoZXIgaW50cm9kdWNlIHN1cHBvcnQgZm9y IGRtYV9idWZfdm1hcCBhbmQgaGF2ZSAKPj4+IGNsaWVudHMgdXNlIHRoYXQgaW5zdGVhZCBvciBw ZXJhaHBzIGNoYW5nZSAKPj4+IHRoZSBjb250cmFjdCBmb3IgZG1hX2J1Zl9rbWFwIHNvIHRoYXQg aXQgZG9lc24ndCBhbHdheXMgbmVlZCB0byBzdWNjZWVkPwo+Pj4KPj4KPj4gQWdyZWUsIGZvciB0 aGlzIHdlIHNob3VsZCBqdXN0IGZhaWwgKG9yIHN1Y2NlZWQgYnV0IHBlcmZvcm0gbm8gYWN0aW9u PykKPj4gaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBtYXBwaW5ncyAobmVpdGhlciBpbiBrZXJuZWwg KGttYXAsIHZtYXApIG5vciBpbgo+PiB1c2Vyc3BhY2UgKG1tYXApKSwgZm9yY2luZyBhIG5ldyBt YXBwaW5nIGp1c3QgdG8ga2VlcAo+PiBkbWFfc3luY19zZ19mb3JfY3B1KCkgaGFwcHkgaXMgbm90 IHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGhlcmUuCj4+Cj4+Pj4gKwlpZiAoSVNfRVJSKHZhZGRy KSkgewo+Pj4+ICsJCXJldCA9IFBUUl9FUlIodmFkZHIpOwo+Pj4+ICsJCWdvdG8gdW5sb2NrOwo+ Pj4+ICsJfQo+Pj4+ICsJbXV0ZXhfdW5sb2NrKCZidWZmZXItPmxvY2spOwo+Pj4+ICsKPj4+PiAr CW11dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEs ICZidWZmZXItPmF0dGFjaG1lbnRzLCBsaXN0KSB7Cj4+Pj4gKwkJZG1hX3N5bmNfc2dfZm9yX2Nw dShhLT5kZXYsIGEtPnRhYmxlLT5zZ2wsIGEtPnRhYmxlLT5uZW50cywKPj4+PiArCQkJCSAgICBk aXJlY3Rpb24pOwo+Pj4KPj4+IFNpbmNlIHRoaXMgY29kZSBpcyB1c2VkIGZvciBzeXN0ZW0gaGVh cCBhbmQgYW5kIGFzIHRoZSByZWZlcmVuY2UuCj4+PiBOb3QgYSBtYWpvciBpc3N1ZSBmb3IgbmV3 ZXIga2VybmVscyBidXQgSSBzdGlsbCBkb24ndCB0aGluayBpdCBtYWtlcyBzZW5zZSAKPj4+IHRv IGFwcGx5IGNhY2hlIG1haW50ZW5hbmNlIHdoZW4gdGhlIGJ1ZmZlciBpcyBub3QgZG1hIG1hcHBl ZCwgaXQgZG9lc24ndCAKPj4+IG1ha2VzIHNlbnNlIHRvIG1lIGZyb20gYSBsb2dpY2FsIHBlcnNw ZWN0aXZlIGFuZCBmcm9tIGEgcGVyZm9ybWFuY2UgCj4+PiBwZXJzcGVjdGl2ZS4KPj4+Cj4+Cj4+ IEFncmVlIGFnYWluLCB0aGlzIGlzIG9ubHkgbmVlZGVkIHdoZW4gd2UgYXJlIHRyYW5zaXRpb25p bmcgb3V0IG9mIHN0YXRlCj4+ICJkZXZpY2Ugb3duZWQiIHdoaWNoIHdlIHdpbGwgbm90IGJlIGlu IGlmIHdlIGhhdmUgbm8gYWN0aXZlCj4+IGF0dGFjaGVkL21hcHBlZCBkZXZpY2VzLgo+Pgo+Pj4K Pj4+PiArCX0KPj4+PiArCj4+Pj4gK3VubG9jazoKPj4+PiArCW11dGV4X3VubG9jaygmYnVmZmVy LT5sb2NrKTsKPj4+PiArCXJldHVybiByZXQ7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyBp bnQgZG1hX2hlYXBfZG1hX2J1Zl9lbmRfY3B1X2FjY2VzcyhzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVm LAo+Pj4+ICsJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQo+Pj4+ ICt7Cj4+Pj4gKwlzdHJ1Y3QgZG1hX2hlYXBfYnVmZmVyICpoZWFwX2J1ZmZlciA9IGRtYWJ1Zi0+ cHJpdjsKPj4+PiArCXN0cnVjdCBoZWFwX2hlbHBlcl9idWZmZXIgKmJ1ZmZlciA9IHRvX2hlbHBl cl9idWZmZXIoaGVhcF9idWZmZXIpOwo+Pj4+ICsJc3RydWN0IGRtYV9oZWFwc19hdHRhY2htZW50 ICphOwo+Pj4+ICsKPj4+PiArCW11dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwlkbWFf aGVhcF9idWZmZXJfa21hcF9wdXQoaGVhcF9idWZmZXIpOwo+Pj4+ICsJbXV0ZXhfdW5sb2NrKCZi dWZmZXItPmxvY2spOwo+Pj4+ICsKPj4+PiArCW11dGV4X2xvY2soJmJ1ZmZlci0+bG9jayk7Cj4+ Pj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZidWZmZXItPmF0dGFjaG1lbnRzLCBsaXN0KSB7 Cj4+Pj4gKwkJZG1hX3N5bmNfc2dfZm9yX2RldmljZShhLT5kZXYsIGEtPnRhYmxlLT5zZ2wsIGEt PnRhYmxlLT5uZW50cywKPj4+PiArCQkJCSAgICAgICBkaXJlY3Rpb24pOwo+Pj4KPj4+IFRoZXJl IGFyZSB1c2UgY2FzZXMgaW4gQW5kcm9pZCB3aGljaCByZXN1bHQgaW4gb25seSBzbWFsbCBwYXJ0 cyBvZiBhIGxhcmdlIAo+Pj4gYnVmZmVyIGFyZSB3cml0dGVuIGRvIGR1cmluZyBvZiBDUFUgYWNj ZXNzLgo+Pj4KPj4KPj4gV2UgaGF2ZSB0aGUgc2FtZSByZXF1aXJlbWVudHMgZm9yIHNvbWUgT3Bl bkNMIHVzZS1jYXNlcwo+PiAoY2xDcmVhdGVTdWJCdWZmZXIpLCB3aGljaCBhbGxvd3MgZm9yIGNo dW5rcyBvZiBhIGxhcmdlciBidWZmZXIgdG8gaGF2ZQo+PiBkaWZmZXJlbnQgcHJvcGVydGllcyBh bmQgdGhlcmVmb3IgY2FjaGUgb3BlcmF0aW9ucyBkaWZmZXJlbnQgZnJvbSB0aGUKPj4gbGFyZ2Vy IHBhcnJlbnQgYnVmZmVyLgo+Pgo+Pj4gQXBwbHlpbmcgY2FjaGUgbWFpbnRlbmFuY2UgdG8gdGhl IGNvbXBsZXRlIGJ1ZmZlciByZXN1bHRzIGluIGEgbG90IG9mIAo+Pj4gdW5uZWNlc3NhcnkgY2Fj aGUgbWFpbnRlbmFuY2UgdGhhdCBjYW4gYWZmZWN0IEtQSXMuCj4+Pgo+Pj4gSSBiZWxpZXZlIHRo ZSBBbmRyb2lkIHRlYW0gaXMgd29uZGVyaW5nIGlmIHRoZXJlIGNvdWxkIGJlIGEgd2F5IHRvIHN1 cHBvcnQgCj4+PiBwYXJ0aWFsIG1haW50ZW5hbmNlIGluICB3aGVyZSB1c2Vyc3BhY2UgY291bGQg ZGVzY3JpYmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIAo+Pj4gdGhleSBoYXZlIG1hZGUuCj4+Pgo+Pgo+ PiBUaGUgaXNzdWUgSSBoYXZlIHdpdGggdGhhdCBpcyBpdCB3b3VsZCByZXF1aXJlIHVzZXJzcGFj ZSB0byBrbm93IGFib3V0Cj4+IHRoZSBjYWNoZSBsaW5lIHNpemUgb2YgYWxsIGludm9sdmVkIGRl dmljZXMsIG90aGVyd2lzZSB5b3Ugd291bGQgaGF2ZQo+PiB1c2VycyB3cml0aW5nIHRvIHRoZSBm aXJzdCA2NEIgYW5kIGludmFsaWRhdGUgdG8gcmVhZCB0aGUgc2Vjb25kIDY0Qgo+PiB3cml0dGVu IGZyb20gYSBETUEgZGV2aWNlIG91dHNpZGUgdGhlIGNhY2hlLCBpbiBhIHN5c3RlbSB3aXRoIDEy OEIKPj4gY2FjaGUtbGluZXMgeW91IHdpbGwgYWx3YXlzIGxvc2Ugc29tZSBkYXRhIGhlcmUuCj4+ Cj4gCj4gR29vZCBwb2ludC4KPiAKPj4+IEkgdGhpbmsgaXQgd291bGQgYmUgdXNlZnVsIHRvIG1h a2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgbGVhc3QgYSBwYXRoIAo+Pj4gZm9yd2FyZCB3aXRoIHRo ZSBjdXJyZW50IGRtYS1idWYgaGVhcHMgZnJhbWV3b3JrIHRvIHNvbHZlIHRoaXMgZm9yIHN5c3Rl bSAKPj4+IGhlYXAgYWxsb2NhdGlvbnMuCj4+Pgo+Pgo+PiBETUEtQlVGIHN5bmMgb3BlcmF0aW9u cyBhbHdheXMgYWN0IG9uIHRoZSBmdWxsIGJ1ZmZlciwgY2hhbmdpbmcgdGhpcwo+PiB3b3VsZCBy ZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGNvcmUgRE1BLUJVRiBmcmFtZXdvcmsgKHNvIG91dHNpZGUg dGhlCj4+IHNjb3BlIG9mIHRoaXMgc2V0KSA6KQo+Pgo+PiBBbmRyZXcKPj4KPj4+IEkgY2FuIGdl dCBtb3JlIGRldGFpbHMgb24gdGhlIHNwZWNpZmljIHVzZSBjYXNlcyBpZiByZXF1aXJlZC4KPj4+ Cj4+Pj4gKwl9Cj4+Pj4gKwltdXRleF91bmxvY2soJmJ1ZmZlci0+bG9jayk7Cj4+Pj4gKwo+Pj4+ ICsJcmV0dXJuIDA7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK2NvbnN0IHN0cnVjdCBkbWFfYnVmX29w cyBoZWFwX2hlbHBlcl9vcHMgPSB7Cj4+Pj4gKwkubWFwX2RtYV9idWYgPSBkbWFfaGVhcF9tYXBf ZG1hX2J1ZiwKPj4+PiArCS51bm1hcF9kbWFfYnVmID0gZG1hX2hlYXBfdW5tYXBfZG1hX2J1ZiwK Pj4+PiArCS5tbWFwID0gZG1hX2hlYXBfbW1hcCwKPj4+PiArCS5yZWxlYXNlID0gZG1hX2hlYXBf ZG1hX2J1Zl9yZWxlYXNlLAo+Pj4+ICsJLmF0dGFjaCA9IGRtYV9oZWFwX2F0dGFjaCwKPj4+PiAr CS5kZXRhY2ggPSBkbWFfaGVhcF9kZXRhdGNoLAo+Pj4+ICsJLmJlZ2luX2NwdV9hY2Nlc3MgPSBk bWFfaGVhcF9kbWFfYnVmX2JlZ2luX2NwdV9hY2Nlc3MsCj4+Pj4gKwkuZW5kX2NwdV9hY2Nlc3Mg PSBkbWFfaGVhcF9kbWFfYnVmX2VuZF9jcHVfYWNjZXNzLAo+Pj4+ICsJLm1hcCA9IGRtYV9oZWFw X2RtYV9idWZfa21hcCwKPj4+PiArCS51bm1hcCA9IGRtYV9oZWFwX2RtYV9idWZfa3VubWFwLAo+ Pj4+ICt9Owo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvaGVhcHMvaGVhcC1oZWxw ZXJzLmggYi9kcml2ZXJzL2RtYS1idWYvaGVhcHMvaGVhcC1oZWxwZXJzLmgKPj4+PiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAuLjBiZDg2NDMKPj4+PiAtLS0gL2Rldi9u dWxsCj4+Pj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2hlYXBzL2hlYXAtaGVscGVycy5oCj4+Pj4g QEAgLTAsMCArMSw0OCBAQAo+Pj4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCAqLwo+Pj4+ICsvKgo+Pj4+ICsgKiBETUFCVUYgSGVhcHMgaGVscGVyIGNvZGUKPj4+PiArICoK Pj4+PiArICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgo+Pj4+ICsgKiBDb3B5cmln aHQgKEMpIDIwMTkgTGluYXJvIEx0ZC4KPj4+PiArICovCj4+Pj4gKwo+Pj4+ICsjaWZuZGVmIF9I RUFQX0hFTFBFUlNfSAo+Pj4+ICsjZGVmaW5lIF9IRUFQX0hFTFBFUlNfSAo+Pj4+ICsKPj4+PiAr I2luY2x1ZGUgPGxpbnV4L2RtYS1oZWFwLmg+Cj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+ Cj4+Pj4gKwo+Pj4+ICtzdHJ1Y3QgaGVhcF9oZWxwZXJfYnVmZmVyIHsKPj4+PiArCXN0cnVjdCBk bWFfaGVhcF9idWZmZXIgaGVhcF9idWZmZXI7Cj4+Pj4gKwo+Pj4+ICsJdW5zaWduZWQgbG9uZyBw cml2YXRlX2ZsYWdzOwo+Pj4+ICsJdm9pZCAqcHJpdl92aXJ0Owo+Pj4+ICsJc3RydWN0IG11dGV4 IGxvY2s7Cj4+Pj4gKwlpbnQga21hcF9jbnQ7Cj4+Pj4gKwl2b2lkICp2YWRkcjsKPj4+PiArCXN0 cnVjdCBzZ190YWJsZSAqc2dfdGFibGU7Cj4+Pj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGF0dGFjaG1l bnRzOwo+Pj4+ICsKPj4+PiArCXZvaWQgKCpmcmVlKShzdHJ1Y3QgaGVhcF9oZWxwZXJfYnVmZmVy ICpidWZmZXIpOwo+Pj4+ICsKPj4+PiArfTsKPj4+PiArCj4+Pj4gKyNkZWZpbmUgdG9faGVscGVy X2J1ZmZlcih4KSBcCj4+Pj4gKwljb250YWluZXJfb2YoeCwgc3RydWN0IGhlYXBfaGVscGVyX2J1 ZmZlciwgaGVhcF9idWZmZXIpCj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaW5saW5lIHZvaWQgSU5JVF9I RUFQX0hFTFBFUl9CVUZGRVIoc3RydWN0IGhlYXBfaGVscGVyX2J1ZmZlciAqYnVmZmVyLAo+Pj4+ ICsJCQkJIHZvaWQgKCpmcmVlKShzdHJ1Y3QgaGVhcF9oZWxwZXJfYnVmZmVyICopKQo+Pj4+ICt7 Cj4+Pj4gKwlidWZmZXItPnByaXZhdGVfZmxhZ3MgPSAwOwo+Pj4+ICsJYnVmZmVyLT5wcml2X3Zp cnQgPSBOVUxMOwo+Pj4+ICsJbXV0ZXhfaW5pdCgmYnVmZmVyLT5sb2NrKTsKPj4+PiArCWJ1ZmZl ci0+a21hcF9jbnQgPSAwOwo+Pj4+ICsJYnVmZmVyLT52YWRkciA9IE5VTEw7Cj4+Pj4gKwlidWZm ZXItPnNnX3RhYmxlID0gTlVMTDsKPj4+PiArCUlOSVRfTElTVF9IRUFEKCZidWZmZXItPmF0dGFj aG1lbnRzKTsKPj4+PiArCWJ1ZmZlci0+ZnJlZSA9IGZyZWU7Cj4+Pj4gK30KPj4+PiArCj4+Pj4g K2V4dGVybiBjb25zdCBzdHJ1Y3QgZG1hX2J1Zl9vcHMgaGVhcF9oZWxwZXJfb3BzOwo+Pj4+ICsK Pj4+PiArI2VuZGlmIC8qIF9IRUFQX0hFTFBFUlNfSCAqLwo+Pj4+IC0tIAo+Pj4+IDIuNy40Cj4+ Pj4KPj4+Pgo+Pj4KPj4+IFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVt YmVyIG9mIENvZGUgQXVyb3JhIEZvcnVtLAo+Pj4gYSBMaW51eCBGb3VuZGF0aW9uIENvbGxhYm9y YXRpdmUgUHJvamVjdAo+Pj4KPj4KPiAKPiBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5j LiBpcyBhIG1lbWJlciBvZiBDb2RlIEF1cm9yYSBGb3J1bSwKPiBhIExpbnV4IEZvdW5kYXRpb24g Q29sbGFib3JhdGl2ZSBQcm9qZWN0Cj4gCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbA==