From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: Re: [DPU PATCH v2 2/3] drm/msm/dp: add displayPort driver support Date: Mon, 7 Jan 2019 16:13:27 -0700 Message-ID: <20190107231327.GA14059@jcrouse-lnx.qualcomm.com> References: <1546894271-25870-1-git-send-email-chandanu@codeaurora.org> <1546894271-25870-3-git-send-email-chandanu@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1546894271-25870-3-git-send-email-chandanu-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: Chandan Uddaraju Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, nganji-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org, jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org T24gTW9uLCBKYW4gMDcsIDIwMTkgYXQgMTI6NTE6MTBQTSAtMDgwMCwgQ2hhbmRhbiBVZGRhcmFq dSB3cm90ZToKPiBBZGQgdGhlIG5lZWRlZCBkaXNwbGF5UG9ydCBmaWxlcyB0byBlbmFibGUgRFAg ZHJpdmVyCj4gb24gbXNtIHRhcmdldC4KPiAKPiAiZHBfZGlzcGxheSIgbW9kdWxlIGlzIHRoZSBt YWluIG1vZHVsZSB0aGF0IGNhbGxzIGludG8KPiBvdGhlciBzdWItbW9kdWxlcy4gImRwX2RybSIg ZmlsZSByZXByZXNlbnRzIHRoZSBpbnRlcmZhY2UKPiBiZXR3ZWVuIERSTSBmcmFtZXdvcmsgYW5k IERQIGRyaXZlci4KPiAKPiBjaGFuZ2VzIGluIHYyOgo+IC0tIFVwZGF0ZSBjb3B5cmlnaHQgbWFy a2luZ3Mgb24gYWxsIHJlbGV2YW50IGZpbGVzLgo+IC0tIENoYW5nZSBwcl9lcnIoKSB0byBEUk1f RVJST1IoKQo+IC0tIFVzZSBBUElzIGRpcmVjdGx5IGluc3RlYWQgb2YgZnVuY3Rpb24gcG9pbnRl cnMuCj4gLS0gVXNlIGRybV9kaXNwbGF5X21vZGUgc3RydWN0dXJlIHRvIHN0b3JlIGxpbmsgcGFy YW1ldGVycyBpbiB0aGUgZHJpdmVyLgo+IC0tIFVzZSBtYWNyb3MgZm9yIHJlZ2lzdGVyIGRlZmlu aXRpb25zIGluc3RlYWQgb2YgaGFyZGNvZGVkIHZhbHVlcy4KPiAtLSBSZXBsYWNlIHdyaXRlbF9y ZWxheGVkL3JlYWRsX3JlbGF4ZWQgd2l0aCB3cml0ZWwvcmVhZGwKPiAgICBhbmQgcmVtb3ZlIG1l bW9yeSBiYXJyaWVycy4KPiAtLSBSZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MuCj4gLS0g VXNlIGRybSBoZWxwZXIgZnVuY3Rpb25zIGZvciBkcGNkIHJlYWQvd3JpdGUuCj4gLS0gVXNlIERS TV9ERUJVR19EUCBmb3IgZGVidWcgbXNncy4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBDaGFuZGFuIFVk ZGFyYWp1IDxjaGFuZGFudUBjb2RlYXVyb3JhLm9yZz4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJt L21zbS9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAgIDkgKwo+ICBkcml2ZXJzL2dwdS9kcm0v bXNtL01ha2VmaWxlICAgICAgICAgICAgICAgIHwgICAxMiArCj4gIGRyaXZlcnMvZ3B1L2RybS9t c20vZGlzcC9kcHUxL2RwdV9lbmNvZGVyLmMgfCAgIDIwICsKPiAgZHJpdmVycy9ncHUvZHJtL21z bS9kaXNwL2RwdTEvZHB1X2lvX3V0aWwuYyB8ICAgIDIgKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNt L2Rpc3AvZHB1MS9kcHVfaW9fdXRpbC5oIHwgICAyNiArCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20v ZHAvZHBfYXV4LmMgICAgICAgICAgICAgfCAgNTQ4ICsrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9k cm0vbXNtL2RwL2RwX2F1eC5oICAgICAgICAgICAgIHwgICAzNyArCj4gIGRyaXZlcnMvZ3B1L2Ry bS9tc20vZHAvZHBfY2F0YWxvZy5jICAgICAgICAgfCAgOTk2ICsrKysrKysrKysrKysrKysrCj4g IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oICAgICAgICAgfCAgMTA4ICsrCj4g IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5jICAgICAgICAgICAgfCAxNjExICsrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwu aCAgICAgICAgICAgIHwgICAzNiArCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGlzcGxh eS5jICAgICAgICAgfCAgOTQxICsrKysrKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9kaXNwbGF5LmggICAgICAgICB8ICAgMjggKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNt L2RwL2RwX2RybS5jICAgICAgICAgICAgIHwgIDE4OSArKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9t c20vZHAvZHBfZHJtLmggICAgICAgICAgICAgfCAgIDIwICsKPiAgZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9leHRjb24uYyAgICAgICAgICB8ICAyMjggKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX2V4dGNvbi5oICAgICAgICAgIHwgICA4NSArKwo+ICBkcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX2xpbmsuYyAgICAgICAgICAgIHwgMTIxNiArKysrKysrKysrKysrKysrKysrKwo+ ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaCAgICAgICAgICAgIHwgIDEzMiArKysK PiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5jICAgICAgICAgICB8ICA1MDQgKysr KysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuaCAgICAgICAgICAgfCAg IDkxICsrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmMgICAgICAgICAgfCAg NjIxICsrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmggICAg ICAgICAgfCAgMTk2ICsrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wb3dlci5jICAg ICAgICAgICB8ICA3MzMgKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf cG93ZXIuaCAgICAgICAgICAgfCAgIDUxICsKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9y ZWcuaCAgICAgICAgICAgICB8ICA0NzUgKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9t c21fZHJ2LmMgICAgICAgICAgICAgICB8ICAgIDIgKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL21z bV9kcnYuaCAgICAgICAgICAgICAgIHwgICA0MSArCj4gIDI4IGZpbGVzIGNoYW5nZWQsIDg5NTgg aW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9k cC9kcF9hdXguYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9k cF9hdXguaAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9j YXRhbG9nLmMKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf Y2F0YWxvZy5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2Rw X2N0cmwuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9j dHJsLmgKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGlz cGxheS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rp c3BsYXkuaAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9k cm0uYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0u aAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9leHRjb24u Ywo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9leHRjb24u aAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9saW5rLmMK PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5oCj4g IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhbmVsLmMKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuaAo+ICBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuYwo+ICBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuaAo+ICBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wb3dlci5jCj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmgKPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcmVnLmgKPiAKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL21z bS9LY29uZmlnCj4gaW5kZXggY2Y1NDlmMS4uYzZiMmUwNyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vbXNtL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25maWcK PiBAQCAtNDksNiArNDksMTUgQEAgY29uZmlnIERSTV9NU01fSERNSV9IRENQCj4gIAloZWxwCj4g IAkgIENob29zZSB0aGlzIG9wdGlvbiB0byBlbmFibGUgSERDUCBzdGF0ZSBtYWNoaW5lCj4gIAo+ ICtjb25maWcgRFJNX01TTV9EUAo+ICsJYm9vbCAiRW5hYmxlIERQIHN1cHBvcnQgaW4gTVNNIERS TSBkcml2ZXIiCj4gKwlkZXBlbmRzIG9uIERSTV9NU00KPiArCWRlZmF1bHQgbgoKZGVmYXVsdCAn bicgaXMgdGhlIGRlZmF1bHQgc28geW91IHNob3VsZG4ndCBuZWVkIHRoaXMuCgo+ICsJaGVscAo+ ICsJICBDb21waWxlIGluIHN1cHBvcnQgZm9yIERQIGRyaXZlciBpbiBtc20gZHJtIGRyaXZlci4g RFAgZXh0ZXJuYWwKPiArCSAgZGlzcGxheSBzdXBwb3J0IGlzIGVuYWJsZWQgdGhyb3VnaCB0aGlz IGNvbmZpZyBvcHRpb24uIEl0IGNhbgo+ICsJICBiZSBwcmltYXJ5IG9yIHNlY29uZGFyeSBkaXNw bGF5IG9uIGRldmljZS4KPiArCj4gIGNvbmZpZyBEUk1fTVNNX0RTSQo+ICAJYm9vbCAiRW5hYmxl IERTSSBzdXBwb3J0IGluIE1TTSBEUk0gZHJpdmVyIgo+ICAJZGVwZW5kcyBvbiBEUk1fTVNNCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL01ha2VmaWxlCj4gaW5kZXggNTZhNzBjNy4uNDUxNjZlZiAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9N YWtlZmlsZQo+IEBAIC0yLDYgKzIsNyBAQAo+ICBjY2ZsYWdzLXkgOj0gLUlkcml2ZXJzL2dwdS9k cm0vbXNtCj4gIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUxCj4g IGNjZmxhZ3MtJChDT05GSUdfRFJNX01TTV9EU0kpICs9IC1JZHJpdmVycy9ncHUvZHJtL21zbS9k c2kKPiArY2NmbGFncy0kKENPTkZJR19EUk1fTVNNX0RQKSArPSAtSWRyaXZlcnMvZ3B1L2RybS9t c20vZHAKPiAgCj4gIG1zbS15IDo9IFwKPiAgCWFkcmVuby9hZHJlbm9fZGV2aWNlLm8gXAo+IEBA IC05Niw2ICs5NywxNyBAQCBtc20teSA6PSBcCj4gIAo+ICBtc20tJChDT05GSUdfREVCVUdfRlMp ICs9IGFkcmVuby9hNXh4X2RlYnVnZnMubwo+ICAKPiArbXNtLSQoQ09ORklHX0RSTV9NU01fRFAp Kz0gZHAvZHBfYXV4Lm8gXAo+ICsJZHAvZHBfY2F0YWxvZy5vIFwKPiArCWRwL2RwX2N0cmwubyBc Cj4gKwlkcC9kcF9kaXNwbGF5Lm8gXAo+ICsJZHAvZHBfZHJtLm8gXAo+ICsJZHAvZHBfZXh0Y29u Lm8gXAo+ICsJZHAvZHBfbGluay5vIFwKPiArCWRwL2RwX3BhbmVsLm8gXAo+ICsJZHAvZHBfcGFy c2VyLm8gXAo+ICsJZHAvZHBfcG93ZXIubwo+ICsKPiAgbXNtLSQoQ09ORklHX0RSTV9GQkRFVl9F TVVMQVRJT04pICs9IG1zbV9mYmRldi5vCj4gIG1zbS0kKENPTkZJR19DT01NT05fQ0xLKSArPSBk aXNwL21kcDQvbWRwNF9sdmRzX3BsbC5vCj4gIG1zbS0kKENPTkZJR19DT01NT05fQ0xLKSArPSBo ZG1pL2hkbWlfcGxsXzg5NjAubwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rp c3AvZHB1MS9kcHVfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1 X2VuY29kZXIuYwo+IGluZGV4IDBkZGE0YTYuLmU2ZjgxYTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2VuY29kZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vZGlzcC9kcHUxL2RwdV9lbmNvZGVyLmMKPiBAQCAtOTkxLDYgKzk5MSw5IEBAIHN0 YXRpYyB2b2lkIGRwdV9lbmNvZGVyX3ZpcnRfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICpk cm1fZW5jLAo+ICAKPiAgCXRyYWNlX2RwdV9lbmNfbW9kZV9zZXQoRFJNSUQoZHJtX2VuYykpOwo+ ICAKPiArCWlmIChkcm1fZW5jLT5lbmNvZGVyX3R5cGUgPT0gRFJNX01PREVfRU5DT0RFUl9UTURT ICYmIHByaXYtPmRwKQo+ICsJCW1zbV9kcF9kaXNwbGF5X21vZGVfc2V0KHByaXYtPmRwLCBkcm1f ZW5jLCBtb2RlLCBhZGpfbW9kZSk7Cj4gKwo+ICAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uX2l0 ZXIsIGNvbm5lY3Rvcl9saXN0LCBoZWFkKQo+ICAJCWlmIChjb25uX2l0ZXItPmVuY29kZXIgPT0g ZHJtX2VuYykKPiAgCQkJY29ubiA9IGNvbm5faXRlcjsKPiBAQCAtMTExNCw2ICsxMTE3LDcgQEAg c3RhdGljIHZvaWQgZHB1X2VuY29kZXJfdmlydF9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICpk cm1fZW5jKQo+ICB7Cj4gIAlzdHJ1Y3QgZHB1X2VuY29kZXJfdmlydCAqZHB1X2VuYyA9IE5VTEw7 Cj4gIAlpbnQgcmV0ID0gMDsKPiArCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXY7Cj4gIAlz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqY3VyX21vZGUgPSBOVUxMOwo+ICAKPiAgCWlmICghZHJt X2VuYykgewo+IEBAIC0xMTI0LDYgKzExMjgsNyBAQCBzdGF0aWMgdm9pZCBkcHVfZW5jb2Rlcl92 aXJ0X2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmRybV9lbmMpCj4gIAo+ICAJbXV0ZXhfbG9j aygmZHB1X2VuYy0+ZW5jX2xvY2spOwo+ICAJY3VyX21vZGUgPSAmZHB1X2VuYy0+YmFzZS5jcnRj LT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKPiArCXByaXYgPSBkcm1fZW5jLT5kZXYtPmRldl9wcml2 YXRlOwo+ICAKPiAgCXRyYWNlX2RwdV9lbmNfZW5hYmxlKERSTUlEKGRybV9lbmMpLCBjdXJfbW9k ZS0+aGRpc3BsYXksCj4gIAkJCSAgICAgY3VyX21vZGUtPnZkaXNwbGF5KTsKPiBAQCAtMTE0NCw2 ICsxMTQ5LDE1IEBAIHN0YXRpYyB2b2lkIGRwdV9lbmNvZGVyX3ZpcnRfZW5hYmxlKHN0cnVjdCBk cm1fZW5jb2RlciAqZHJtX2VuYykKPiAgCj4gIAlfZHB1X2VuY29kZXJfdmlydF9lbmFibGVfaGVs cGVyKGRybV9lbmMpOwo+ICAKPiArCWlmIChkcm1fZW5jLT5lbmNvZGVyX3R5cGUgPT0gRFJNX01P REVfRU5DT0RFUl9UTURTICYmIHByaXYtPmRwKSB7Cj4gKwkJcmV0ID0gbXNtX2RwX2Rpc3BsYXlf ZW5hYmxlKHByaXYtPmRwLAo+ICsJCQkJCQlkcm1fZW5jKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJ CURQVV9FUlJPUl9FTkMoZHB1X2VuYywgImRwIGRpc3BsYXkgZW5hYmxlIGZhaWxlZDogJWRcbiIs Cj4gKwkJCQlyZXQpOwo+ICsJCQlnb3RvIG91dDsKPiArCQl9Cj4gKwl9Cj4gIAlkcHVfZW5jLT5l bmFibGVkID0gdHJ1ZTsKPiAgCj4gIG91dDoKPiBAQCAtMTE4MCw2ICsxMTk0LDEyIEBAIHN0YXRp YyB2b2lkIGRwdV9lbmNvZGVyX3ZpcnRfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmRybV9l bmMpCj4gIAlwcml2ID0gZHJtX2VuYy0+ZGV2LT5kZXZfcHJpdmF0ZTsKPiAgCWRwdV9rbXMgPSB0 b19kcHVfa21zKHByaXYtPmttcyk7Cj4gIAo+ICsJaWYgKGRybV9lbmMtPmVuY29kZXJfdHlwZSA9 PSBEUk1fTU9ERV9FTkNPREVSX1RNRFMgJiYgcHJpdi0+ZHApIHsKPiArCQlpZiAobXNtX2RwX2Rp c3BsYXlfZGlzYWJsZShwcml2LT5kcCwgZHJtX2VuYykpIHsKPiArCQkJRFBVX0VSUk9SX0VOQyhk cHVfZW5jLCAiZHAgZGlzcGxheSBkaXNhYmxlIGZhaWxlZFxuIik7Cj4gKwkJCXJldHVybjsKPiAr CQkgIH0KPiArCX0KPiAgCXRyYWNlX2RwdV9lbmNfZGlzYWJsZShEUk1JRChkcm1fZW5jKSk7Cj4g IAo+ICAJLyogd2FpdCBmb3IgaWRsZSAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v bXNtL2Rpc3AvZHB1MS9kcHVfaW9fdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2Rw dTEvZHB1X2lvX3V0aWwuYwo+IGluZGV4IDc4ODMzYzIuLmI0YjFkYjAgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2lvX3V0aWwuYwo+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZGlzcC9kcHUxL2RwdV9pb191dGlsLmMKPiBAQCAtMTQsNyArMTQsOSBA QAo+ICAjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9jbGsvY2xrLWNv bmYuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4K PiAgI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgoKV2hh dCBhcmUgdGhlc2UgZm9yPyBUaGVyZSBhcmVuJ3QgYW55IG90aGVyIGNoYW5nZXMgdG8gdGhlIGZp bGUuICBUaGUgc2Vjb25kIG9uZQplc3BlY2lhbGx5IHNob3VsZG4ndCBiZSBuZWVkZWQgZm9yIHRo aXMgcGFydGljdWxhciBmaWxlLgoKPiAgCj4gICNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4g IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9kcHVfaW9fdXRp bC5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2lvX3V0aWwuaAo+IGluZGV4 IGJjMDczODEuLmExZDNlMDUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNw L2RwdTEvZHB1X2lvX3V0aWwuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUx L2RwdV9pb191dGlsLmgKPiBAQCAtMTUsNiArMTUsNyBAQAo+ICAKPiAgI2luY2x1ZGUgPGxpbnV4 L2dwaW8uaD4KPiAgI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVk ZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4gICNpbmNsdWRlIDxsaW51eC90eXBlcy5o Pgo+ICAKPiAgI2RlZmluZSBERVZfREJHKGZtdCwgYXJncy4uLikgICBwcl9kZWJ1ZyhmbXQsICMj YXJncykKPiBAQCAtMjIsNiArMjMsMjkgQEAKPiAgI2RlZmluZSBERVZfV0FSTihmbXQsIGFyZ3Mu Li4pICBwcl93YXJuKGZtdCwgIyNhcmdzKQo+ICAjZGVmaW5lIERFVl9FUlIoZm10LCBhcmdzLi4u KSAgIHByX2VycihmbXQsICMjYXJncykKPiAgCj4gK3N0cnVjdCBkc3NfaW9fZGF0YSB7Cj4gKwl1 MzIgbGVuOwo+ICsJdm9pZCBfX2lvbWVtICpiYXNlOwo+ICt9Owo+ICsKPiArZW51bSBkc3NfdnJl Z190eXBlIHsKPiArCURTU19SRUdfTERPLAo+ICsJRFNTX1JFR19WUywKPiArfTsKPiArCj4gK3N0 cnVjdCBkc3NfdnJlZyB7Cj4gKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVnOyAvKiB2cmVnIGhhbmRs ZSAqLwo+ICsJY2hhciB2cmVnX25hbWVbMzJdOwo+ICsJaW50IG1pbl92b2x0YWdlOwo+ICsJaW50 IG1heF92b2x0YWdlOwo+ICsJaW50IGVuYWJsZV9sb2FkOwo+ICsJaW50IGRpc2FibGVfbG9hZDsK PiArCWludCBwcmVfb25fc2xlZXA7Cj4gKwlpbnQgcG9zdF9vbl9zbGVlcDsKPiArCWludCBwcmVf b2ZmX3NsZWVwOwo+ICsJaW50IHBvc3Rfb2ZmX3NsZWVwOwo+ICt9Owo+ICsKPiAgc3RydWN0IGRz c19ncGlvIHsKPiAgCXVuc2lnbmVkIGludCBncGlvOwo+ICAJdW5zaWduZWQgaW50IHZhbHVlOwo+ IEBAIC00Miw2ICs2Niw4IEBAIHN0cnVjdCBkc3NfY2xrIHsKPiAgfTsKPiAgCj4gIHN0cnVjdCBk c3NfbW9kdWxlX3Bvd2VyIHsKPiArCXVuc2lnbmVkIGludCBudW1fdnJlZzsKPiArCXN0cnVjdCBk c3NfdnJlZyAqdnJlZ19jb25maWc7Cj4gIAl1bnNpZ25lZCBpbnQgbnVtX2dwaW87Cj4gIAlzdHJ1 Y3QgZHNzX2dwaW8gKmdwaW9fY29uZmlnOwo+ICAJdW5zaWduZWQgaW50IG51bV9jbGs7Cj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmMgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL2RwL2RwX2F1eC5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAw Li5lZjBiZTEwCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAv ZHBfYXV4LmMKPiBAQCAtMCwwICsxLDU0OCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE5LCBUaGUg TGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICovCj4gKwo+ICsjZGVm aW5lIHByX2ZtdChmbXQpCSJbZHJtLWRwXSAlczogIiBmbXQsIF9fZnVuY19fCj4gKwo+ICsjaW5j bHVkZSA8bGludXgvZGVsYXkuaD4KPiArCj4gKyNpbmNsdWRlICJkcF9hdXguaCIKPiArCj4gKyNk ZWZpbmUgRFBfQVVYX0VOVU1fU1RSKHgpCQkjeAo+ICsKPiArZW51bSB7Cj4gKwlEUF9BVVhfREFU QV9JTkRFWF9XUklURSA9IEJJVCgzMSksCj4gK307CgpBbiBhbm9ueW1vdXMgZW51bSBvZiAxIGlz bid0IHVzZWZ1bCwgZXNwZWNpYWxseSB3aGVuIGl0IGlzIGZvciBhbiBvYnZpb3VzIApiaXRtYXNr LiAgVGhpcyB3b3VsZCBkbyBiZXR0ZXIgYXMgYSAjZGVmaW5lCgo+ICsKPiArc3RydWN0IGRwX2F1 eF9wcml2YXRlIHsKPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCXN0cnVjdCBkcF9hdXggZHBf YXV4Owo+ICsJc3RydWN0IGRwX2NhdGFsb2dfYXV4ICpjYXRhbG9nOwo+ICsKPiArCXN0cnVjdCBt dXRleCBtdXRleDsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7Cj4gKwo+ICsJdTMyIGF1eF9l cnJvcl9udW07Cj4gKwl1MzIgcmV0cnlfY250Owo+ICsJYm9vbCBjbWRfYnVzeTsKPiArCWJvb2wg bmF0aXZlOwo+ICsJYm9vbCByZWFkOwo+ICsJYm9vbCBub19zZW5kX2FkZHI7Cj4gKwlib29sIG5v X3NlbmRfc3RvcDsKPiArCXUzMiBvZmZzZXQ7Cj4gKwl1MzIgc2VnbWVudDsKPiArCj4gKwlzdHJ1 Y3QgZHJtX2RwX2F1eCBkcm1fYXV4Owo+ICt9Owo+ICsKPiArc3RhdGljIGNoYXIgKmRwX2F1eF9n ZXRfZXJyb3IodTMyIGF1eF9lcnJvcikKPiArewo+ICsJc3dpdGNoIChhdXhfZXJyb3IpIHsKPiAr CWNhc2UgRFBfQVVYX0VSUl9OT05FOgo+ICsJCXJldHVybiBEUF9BVVhfRU5VTV9TVFIoRFBfQVVY X0VSUl9OT05FKTsKPiArCWNhc2UgRFBfQVVYX0VSUl9BRERSOgo+ICsJCXJldHVybiBEUF9BVVhf RU5VTV9TVFIoRFBfQVVYX0VSUl9BRERSKTsKPiArCWNhc2UgRFBfQVVYX0VSUl9UT1VUOgo+ICsJ CXJldHVybiBEUF9BVVhfRU5VTV9TVFIoRFBfQVVYX0VSUl9UT1VUKTsKPiArCWNhc2UgRFBfQVVY X0VSUl9OQUNLOgo+ICsJCXJldHVybiBEUF9BVVhfRU5VTV9TVFIoRFBfQVVYX0VSUl9OQUNLKTsK PiArCWNhc2UgRFBfQVVYX0VSUl9ERUZFUjoKPiArCQlyZXR1cm4gRFBfQVVYX0VOVU1fU1RSKERQ X0FVWF9FUlJfREVGRVIpOwo+ICsJY2FzZSBEUF9BVVhfRVJSX05BQ0tfREVGRVI6Cj4gKwkJcmV0 dXJuIERQX0FVWF9FTlVNX1NUUihEUF9BVVhfRVJSX05BQ0tfREVGRVIpOwo+ICsJZGVmYXVsdDoK PiArCQlyZXR1cm4gInVua25vd24iOwoKRnJvbSB0aGUgcmVzdCBvZiB0aGUgY29kZSBjb250ZXh0 LCBpdCBzZWVtcyBsaWtlIHRoaXMgaXNuJ3QgcG9zc2libGU/ICBZb3UKYWx3YXlzIHNldCB0aGUg ZXJyb3IgdG8gYSBrbm93biB2YWx1ZS4KCj4gKwl9Cj4gK30KClRoaXMgZnVuY3Rpb24gZ29lcyBv dXQgb2YgaXRzIHdheSB0byB0cnkgdG8gdXNlIHN0cmluZ2lmaWNhdGlvbiB3aGljaCBzZWVtcwp1 bm5lY2Vzc2FyeSBhbmQgZG9lc24ndCBzYXZlIHlvdSBhbnkga2V5c3Ryb2tlcy4gcmV0dXJuICJE UF9BVVhfRVJSX05PTkUiIAp3b3JrcyBqdXN0IGFzIHdlbGw7Cgo+ICsKPiArc3RhdGljIHUzMiBk cF9hdXhfd3JpdGUoc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXgsCj4gKwkJCXN0cnVjdCBkcm1f ZHBfYXV4X21zZyAqbXNnKQo+ICt7Cj4gKwl1MzIgZGF0YVs0XSwgcmVnLCBsZW47Cj4gKwl1OCAq bXNnZGF0YSA9IG1zZy0+YnVmZmVyOwo+ICsJaW50IGNvbnN0IGF1eF9jbWRfZmlmb19sZW4gPSAx Mjg7CgpQbGVhc2UgZG9uJ3QgdXNlIGNvbnN0IHJlZ2lzdGVycy4gIElmIHlvdSBoYXZlIHRvIHVz ZSBhICNkZWZpbmUgYnV0IGl0cyBhbHNvCm9rYXkgdG8gdXNlIGNvbnN0YW50IG51bWJlcnMgZm9y IHRoaW5ncyBsaWtlIHRoaXMuCgo+ICsJaW50IGkgPSAwOwo+ICsKPiArCWlmIChhdXgtPnJlYWQp Cj4gKwkJbGVuID0gNDsKPiArCWVsc2UKPiArCQlsZW4gPSBtc2ctPnNpemUgKyA0Owo+ICsKPiAr CS8qCj4gKwkgKiBjbWQgZmlmbyBvbmx5IGhhcyBkZXB0aCBvZiAxNDQgYnl0ZXMKPiArCSAqIGxp bWl0IGJ1ZiBsZW5ndGggdG8gMTI4IGJ5dGVzIGhlcmUKPiArCSAqLwo+ICsJaWYgKGxlbiA+IGF1 eF9jbWRfZmlmb19sZW4pIHsKCkVzcGVjaWFsbHkgaGVyZSwgd2hlcmUgeW91IHNwZWNpZmljYWxs eSBtZW50aW9uIHRoYXQgeW91IGFyZSBsaW1pdGluZyB0byAxMjgKYnl0ZXMuIEl0IGlzIGEgbG90 IGVhc2llciB0byByZWFkIGlmIChsZW4gPiAxMjgpIHRoYW4gaXQgaXMgdG8gZ28gYmFjayBhbmQK ZmlndXJlIG91dCB3aGF0IGF1eF9jbWRfZmlmb19sZW4gaXMuCgo+ICsJCURSTV9FUlJPUigiYnVm IGxlbiBlcnJvclxuIik7CgpQZXJoYXBzIG1vcmUgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGhlcmUg aWYgdGhpcyBpcyBhbiBleHBlY3RlZCBydW50aW1lIGlzc3VlLgpJZiB0aGlzIGlzIGp1c3QgYSBw b3RlbnRpYWwgZGV2ZWxvcGVyIG1pc3Rha2UgYSBXQVJOX09OKCkgd291bGQgYmUgYmV0dGVyIHRo YW4gYQpjdXN0b20gc3RyaW5nLgoKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwkvKiBQYWNr IGNtZCBhbmQgd3JpdGUgdG8gSFcgKi8KPiArCWRhdGFbMF0gPSAobXNnLT5hZGRyZXNzID4+IDE2 KSAmIDB4ZjsgLyogYWRkclsxOToxNl0gKi8KPiArCWlmIChhdXgtPnJlYWQpCj4gKwkJZGF0YVsw XSB8PSAgQklUKDQpOyAvKiBSL1cgKi8KPiArCj4gKwlkYXRhWzFdID0gKG1zZy0+YWRkcmVzcyA+ PiA4KSAmIDB4ZmY7CS8qIGFkZHJbMTU6OF0gKi8KPiArCWRhdGFbMl0gPSBtc2ctPmFkZHJlc3Mg JiAweGZmOwkJLyogYWRkcls3OjBdICovCj4gKwlkYXRhWzNdID0gKG1zZy0+c2l6ZSAtIDEpICYg MHhmZjsJLyogbGVuWzc6MF0gKi8KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK PiArCQlyZWcgPSAoaSA8IDQpID8gZGF0YVtpXSA6IG1zZ2RhdGFbaSAtIDRdOwo+ICsJCXJlZyA9 ICgocmVnKSA8PCA4KSAmIDB4MDAwMGZmMDA7IC8qIGluZGV4ID0gMCwgd3JpdGUgKi8KPiArCQlp ZiAoaSA9PSAwKQo+ICsJCQlyZWcgfD0gRFBfQVVYX0RBVEFfSU5ERVhfV1JJVEU7Cj4gKwkJYXV4 LT5jYXRhbG9nLT5kYXRhID0gcmVnOwo+ICsJCWRwX2NhdGFsb2dfYXV4X3dyaXRlX2RhdGEoYXV4 LT5jYXRhbG9nKTsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2F1eF9jbGVhcl90cmFucyhhdXgt PmNhdGFsb2csIGZhbHNlKTsKPiArCj4gKwlyZWcgPSAwOyAvKiBUcmFuc2FjdGlvbiBudW1iZXIg PT0gMSAqLwo+ICsJaWYgKCFhdXgtPm5hdGl2ZSkgeyAvKiBpMmMgKi8KPiArCQlyZWcgfD0gQklU KDgpOwo+ICsKPiArCQlpZiAoYXV4LT5ub19zZW5kX2FkZHIpCj4gKwkJCXJlZyB8PSBCSVQoMTAp Owo+ICsKPiArCQlpZiAoYXV4LT5ub19zZW5kX3N0b3ApCj4gKwkJCXJlZyB8PSBCSVQoMTEpOwo+ ICsJfQo+ICsKPiArCXJlZyB8PSBCSVQoOSk7Cj4gKwlhdXgtPmNhdGFsb2ctPmRhdGEgPSByZWc7 Cj4gKwlkcF9jYXRhbG9nX2F1eF93cml0ZV90cmFucyhhdXgtPmNhdGFsb2cpOwo+ICsKPiArCXJl dHVybiBsZW47Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfYXV4X2NtZF9maWZvX3R4KHN0cnVj dCBkcF9hdXhfcHJpdmF0ZSAqYXV4LAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cg Km1zZykKPiArewo+ICsJdTMyIHJldCA9IDAsIGxlbiA9IDAsIHRpbWVvdXQ7Cj4gKwlpbnQgY29u c3QgYXV4X3RpbWVvdXRfbXMgPSBIWi80Owo+ICsKPiArCXJlaW5pdF9jb21wbGV0aW9uKCZhdXgt PmNvbXApOwo+ICsKPiArCWxlbiA9IGRwX2F1eF93cml0ZShhdXgsIG1zZyk7Cj4gKwlpZiAobGVu ID09IDApIHsKPiArCQlEUk1fRVJST1IoIkRQIEFVWCB3cml0ZSBmYWlsZWRcbiIpOwoKVGhlcmUg aXMgb25seSBvbmUgd2F5IGZvciBkcF9hdXhfd3JpdGUoKSB0byBmYWlsLCBhbmQgdGhhdCBwYXRo IGFscmVhZHkgcHJpbnRzIGEKbG9nIG1lc3NhZ2UuIEFub3RoZXIgb25lIGlzIG5vdCBuZWVkZWQu Cgo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXRpbWVvdXQgPSB3YWl0X2Zvcl9j b21wbGV0aW9uX3RpbWVvdXQoJmF1eC0+Y29tcCwgYXV4X3RpbWVvdXRfbXMpOwo+ICsJaWYgKCF0 aW1lb3V0KSB7Cj4gKwkJRFJNX0VSUk9SKCJhdXggJXMgdGltZW91dFxuIiwgKGF1eC0+cmVhZCA/ ICJyZWFkIiA6ICJ3cml0ZSIpKTsKPiArCQlyZXR1cm4gLUVUSU1FRE9VVDsKPiArCX0KPiArCj4g KwlpZiAoYXV4LT5hdXhfZXJyb3JfbnVtID09IERQX0FVWF9FUlJfTk9ORSkgewo+ICsJCXJldCA9 IGxlbjsKPiArCX0gZWxzZSB7Cj4gKwkJRFJNX0VSUk9SX1JBVEVMSU1JVEVEKCJhdXggZXJyOiAl c1xuIiwKPiArCQkJZHBfYXV4X2dldF9lcnJvcihhdXgtPmF1eF9lcnJvcl9udW0pKTsKPiArCj4g KwkJcmV0ID0gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBkcF9hdXhfY21kX2ZpZm9fcngoc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXgs Cj4gKwkJc3RydWN0IGRybV9kcF9hdXhfbXNnICptc2cpCj4gK3sKPiArCXUzMiBkYXRhOwo+ICsJ dTggKmRwOwo+ICsJdTMyIGksIGFjdHVhbF9pOwo+ICsJdTMyIGxlbiA9IG1zZy0+c2l6ZTsKPiAr Cj4gKwlkcF9jYXRhbG9nX2F1eF9jbGVhcl90cmFucyhhdXgtPmNhdGFsb2csIHRydWUpOwo+ICsK PiArCWRhdGEgPSAwOwo+ICsJZGF0YSB8PSBEUF9BVVhfREFUQV9JTkRFWF9XUklURTsgLyogSU5E RVhfV1JJVEUgKi8KPiArCWRhdGEgfD0gQklUKDApOyAgLyogcmVhZCAqLwo+ICsKPiArCWF1eC0+ Y2F0YWxvZy0+ZGF0YSA9IGRhdGE7Cj4gKwlkcF9jYXRhbG9nX2F1eF93cml0ZV9kYXRhKGF1eC0+ Y2F0YWxvZyk7Cj4gKwo+ICsJZHAgPSBtc2ctPmJ1ZmZlcjsKPiArCj4gKwkvKiBkaXNjYXJkIGZp cnN0IGJ5dGUgKi8KPiArCWRhdGEgPSBkcF9jYXRhbG9nX2F1eF9yZWFkX2RhdGEoYXV4LT5jYXRh bG9nKTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKPiArCQlkYXRhID0gZHBf Y2F0YWxvZ19hdXhfcmVhZF9kYXRhKGF1eC0+Y2F0YWxvZyk7Cj4gKwkJKmRwKysgPSAodTgpKChk YXRhID4+IDgpICYgMHhmZik7Cj4gKwo+ICsJCWFjdHVhbF9pID0gKGRhdGEgPj4gMTYpICYgMHhG RjsKPiArCQlpZiAoaSAhPSBhY3R1YWxfaSkKPiArCQkJcHJfd2FybigiSW5kZXggbWlzbWF0Y2g6 IGV4cGVjdGVkICVkLCBmb3VuZCAlZFxuIiwKPiArCQkJCWksIGFjdHVhbF9pKTsKClRoaXMgc2hv dWxkIG1hdGNoIHRoZSBvdGhlciBEUk1fIG1hY3Jvcy4gIEEgbW9yZSBpbmZvcm1hdGl2ZSBlcnJv ciBtZXNzYWdlIHdvdWxkCmJlIG5pY2UgLSBJJ20gbm90IHF1aXRlIHN1cmUgZnJvbSB0aGUgY29k ZSBjb250ZXh0IHdoYXQgYSBpbmRleCBtaXNtYXRjaCBpcyBvcgpob3cgaXQgY291bGQgcG9zc2li bHkgaGFwcGVuLgoKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHBfYXV4X25hdGl2ZV9o YW5kbGVyKHN0cnVjdCBkcF9hdXhfcHJpdmF0ZSAqYXV4KQo+ICt7Cj4gKwl1MzIgaXNyID0gYXV4 LT5jYXRhbG9nLT5pc3I7Cj4gKwo+ICsJaWYgKGlzciAmIERQX0lOVFJfQVVYX0kyQ19ET05FKQo+ ICsJCWF1eC0+YXV4X2Vycm9yX251bSA9IERQX0FVWF9FUlJfTk9ORTsKPiArCWVsc2UgaWYgKGlz ciAmIERQX0lOVFJfV1JPTkdfQUREUikKPiArCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhf RVJSX0FERFI7Cj4gKwllbHNlIGlmIChpc3IgJiBEUF9JTlRSX1RJTUVPVVQpCj4gKwkJYXV4LT5h dXhfZXJyb3JfbnVtID0gRFBfQVVYX0VSUl9UT1VUOwo+ICsJaWYgKGlzciAmIERQX0lOVFJfTkFD S19ERUZFUikKPiArCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX05BQ0s7Cj4gKwo+ ICsJY29tcGxldGUoJmF1eC0+Y29tcCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2F1eF9p MmNfaGFuZGxlcihzdHJ1Y3QgZHBfYXV4X3ByaXZhdGUgKmF1eCkKPiArewo+ICsJdTMyIGlzciA9 IGF1eC0+Y2F0YWxvZy0+aXNyOwo+ICsKPiArCWlmIChpc3IgJiBEUF9JTlRSX0FVWF9JMkNfRE9O RSkgewo+ICsJCWlmIChpc3IgJiAoRFBfSU5UUl9JMkNfTkFDSyB8IERQX0lOVFJfSTJDX0RFRkVS KSkKPiArCQkJYXV4LT5hdXhfZXJyb3JfbnVtID0gRFBfQVVYX0VSUl9OQUNLOwo+ICsJCWVsc2UK PiArCQkJYXV4LT5hdXhfZXJyb3JfbnVtID0gRFBfQVVYX0VSUl9OT05FOwo+ICsJfSBlbHNlIHsK PiArCQlpZiAoaXNyICYgRFBfSU5UUl9XUk9OR19BRERSKQo+ICsJCQlhdXgtPmF1eF9lcnJvcl9u dW0gPSBEUF9BVVhfRVJSX0FERFI7Cj4gKwkJZWxzZSBpZiAoaXNyICYgRFBfSU5UUl9USU1FT1VU KQo+ICsJCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX1RPVVQ7Cj4gKwkJaWYgKGlz ciAmIERQX0lOVFJfTkFDS19ERUZFUikKPiArCQkJYXV4LT5hdXhfZXJyb3JfbnVtID0gRFBfQVVY X0VSUl9OQUNLX0RFRkVSOwo+ICsJCWlmIChpc3IgJiBEUF9JTlRSX0kyQ19OQUNLKQo+ICsJCQlh dXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX05BQ0s7Cj4gKwkJaWYgKGlzciAmIERQX0lO VFJfSTJDX0RFRkVSKQo+ICsJCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX0RFRkVS Owo+ICsJfQo+ICsKPiArCWNvbXBsZXRlKCZhdXgtPmNvbXApOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBkcF9hdXhfdXBkYXRlX29mZnNldF9hbmRfc2VnbWVudChzdHJ1Y3QgZHBfYXV4X3ByaXZh dGUgKmF1eCwKPiArCQkJCQkgICAgIHN0cnVjdCBkcm1fZHBfYXV4X21zZyAqaW5wdXRfbXNnKQo+ ICt7Cj4gKwl1MzIgY29uc3QgZWRpZF9hZGRyZXNzID0gMHg1MDsKPiArCXUzMiBjb25zdCBzZWdt ZW50X2FkZHJlc3MgPSAweDMwOwoKQXMgYWJvdmUsIHByZWZlciBpZiB5b3UgdXNlZCAjZGVmaW5l IG9yIGlubGluZSBjb25zdGFudHMgcmF0aGVyIHRoYW4gY29uc3QgaGVyZQphbmQgdGhyb3VnaG91 dCB0aGlzIGNvZGUuCgo+ICsJYm9vbCBpMmNfcmVhZCA9IGlucHV0X21zZy0+cmVxdWVzdCAmCj4g KwkJKERQX0FVWF9JMkNfUkVBRCAmIERQX0FVWF9OQVRJVkVfUkVBRCk7Cj4gKwl1OCAqZGF0YSA9 IE5VTEw7Cj4gKwo+ICsJaWYgKGF1eC0+bmF0aXZlIHx8IGkyY19yZWFkIHx8ICgoaW5wdXRfbXNn LT5hZGRyZXNzICE9IGVkaWRfYWRkcmVzcykgJiYKPiArCQkoaW5wdXRfbXNnLT5hZGRyZXNzICE9 IHNlZ21lbnRfYWRkcmVzcykpKQo+ICsJCXJldHVybjsKPiArCj4gKwo+ICsJZGF0YSA9IGlucHV0 X21zZy0+YnVmZmVyOwo+ICsJaWYgKGlucHV0X21zZy0+YWRkcmVzcyA9PSBzZWdtZW50X2FkZHJl c3MpCj4gKwkJYXV4LT5zZWdtZW50ID0gKmRhdGE7Cj4gKwllbHNlCj4gKwkJYXV4LT5vZmZzZXQg PSAqZGF0YTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRwX2F1eF90cmFuc2Zlcl9oZWxwZXIoKSAt IGhlbHBlciBmdW5jdGlvbiBmb3IgRURJRCByZWFkIHRyYW5zYWN0aW9ucwo+ICsgKgo+ICsgKiBA YXV4OiBEUCBBVVggcHJpdmF0ZSBzdHJ1Y3R1cmUKPiArICogQGlucHV0X21zZzogaW5wdXQgbWVz c2FnZSBmcm9tIERSTSB1cHN0cmVhbSBBUElzCj4gKyAqCj4gKyAqIHJldHVybjogdm9pZAo+ICsg Kgo+ICsgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpeCBFRElEIHJlYWRzIGZv ciBub24tY29tcGxpYW50Cj4gKyAqIHNpbmtzIHRoYXQgZG8gbm90IGhhbmRsZSB0aGUgaTJjIG1p ZGRsZS1vZi10cmFuc2FjdGlvbiBmbGFnIGNvcnJlY3RseS4KPiArICovCj4gK3N0YXRpYyB2b2lk IGRwX2F1eF90cmFuc2Zlcl9oZWxwZXIoc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXgsCj4gKwkJ CQkgICBzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgKmlucHV0X21zZykKPiArewo+ICsJc3RydWN0IGRy bV9kcF9hdXhfbXNnIGhlbHBlcl9tc2c7Cj4gKwl1MzIgY29uc3QgbWVzc2FnZV9zaXplID0gMHgx MDsKPiArCXUzMiBjb25zdCBzZWdtZW50X2FkZHJlc3MgPSAweDMwOwo+ICsJYm9vbCBpMmNfbW90 ID0gaW5wdXRfbXNnLT5yZXF1ZXN0ICYgRFBfQVVYX0kyQ19NT1Q7Cj4gKwlib29sIGkyY19yZWFk ID0gaW5wdXRfbXNnLT5yZXF1ZXN0ICYKPiArCQkoRFBfQVVYX0kyQ19SRUFEICYgRFBfQVVYX05B VElWRV9SRUFEKTsKPiArCj4gKwlpZiAoIWkyY19tb3QgfHwgIWkyY19yZWFkIHx8IChpbnB1dF9t c2ctPnNpemUgPT0gMCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWF1eC0+cmVhZCA9IGZhbHNlOwo+ ICsJYXV4LT5jbWRfYnVzeSA9IHRydWU7Cj4gKwlhdXgtPm5vX3NlbmRfYWRkciA9IHRydWU7Cj4g KwlhdXgtPm5vX3NlbmRfc3RvcCA9IHRydWU7Cj4gKwo+ICsJLyoKPiArCSAqIFNlbmQgdGhlIHNl Z21lbnQgYWRkcmVzcyBmb3IgZXZlcnkgaTJjIHJlYWQgaW4gd2hpY2ggdGhlCj4gKwkgKiBtaWRk bGUtb2YtdHJhbmFjdGlvbiBmbGFnIGlzIHNldC4gVGhpcyBpcyByZXF1aXJlZCB0byBzdXBwb3J0 IEVESUQKPiArCSAqIHJlYWRzIG9mIG1vcmUgdGhhbiAyIGJsb2NrcyBhcyB0aGUgc2VnbWVudCBh ZGRyZXNzIGlzIHJlc2V0IHRvIDAKPiArCSAqIHNpbmNlIHdlIGFyZSBvdmVycmlkaW5nIHRoZSBt aWRkbGUtb2YtdHJhbnNhY3Rpb24gZmxhZyBmb3IgcmVhZAo+ICsJICogdHJhbnNhY3Rpb25zLgo+ ICsJICovCj4gKwltZW1zZXQoJmhlbHBlcl9tc2csIDAsIHNpemVvZihoZWxwZXJfbXNnKSk7Cj4g KwloZWxwZXJfbXNnLmFkZHJlc3MgPSBzZWdtZW50X2FkZHJlc3M7Cj4gKwloZWxwZXJfbXNnLmJ1 ZmZlciA9ICZhdXgtPnNlZ21lbnQ7Cj4gKwloZWxwZXJfbXNnLnNpemUgPSAxOwo+ICsJZHBfYXV4 X2NtZF9maWZvX3R4KGF1eCwgJmhlbHBlcl9tc2cpOwo+ICsKPiArCS8qCj4gKwkgKiBTZW5kIHRo ZSBvZmZzZXQgYWRkcmVzcyBmb3IgZXZlcnkgaTJjIHJlYWQgaW4gd2hpY2ggdGhlCj4gKwkgKiBt aWRkbGUtb2YtdHJhbnNhY3Rpb24gZmxhZyBpcyBzZXQuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0 aGUgc2luawo+ICsJICogd2lsbCB1cGRhdGUgaXRzIHJlYWQgcG9pbnRlciBhbmQgcmV0dXJuIHRo ZSBjb3JyZWN0IHBvcnRpb24gb2YgdGhlCj4gKwkgKiBFRElEIGJ1ZmZlciBpbiB0aGUgc3Vic2Vx dWVudCBpMmMgcmVhZCB0cmFzbnRpb24gdHJpZ2dlcmVkIGluIHRoZQo+ICsJICogbmF0aXZlIEFV WCB0cmFuc2ZlciBmdW5jdGlvbi4KPiArCSAqLwo+ICsJbWVtc2V0KCZoZWxwZXJfbXNnLCAwLCBz aXplb2YoaGVscGVyX21zZykpOwo+ICsJaGVscGVyX21zZy5hZGRyZXNzID0gaW5wdXRfbXNnLT5h ZGRyZXNzOwo+ICsJaGVscGVyX21zZy5idWZmZXIgPSAmYXV4LT5vZmZzZXQ7Cj4gKwloZWxwZXJf bXNnLnNpemUgPSAxOwo+ICsJZHBfYXV4X2NtZF9maWZvX3R4KGF1eCwgJmhlbHBlcl9tc2cpOwo+ ICsJYXV4LT5vZmZzZXQgKz0gbWVzc2FnZV9zaXplOwo+ICsKPiArCWlmIChhdXgtPm9mZnNldCA9 PSAweDgwIHx8IGF1eC0+b2Zmc2V0ID09IDB4MTAwKQo+ICsJCWF1eC0+c2VnbWVudCA9IDB4MDsg LyogcmVzZXQgc2VnbWVudCBhdCBlbmQgb2YgYmxvY2sgKi8KPiArfQo+ICsKPiArLyoKPiArICog VGhpcyBmdW5jdGlvbiBkb2VzIHRoZSByZWFsIGpvYiB0byBwcm9jZXNzIGFuIEFVWCB0cmFuc2Fj dGlvbi4KPiArICogSXQgd2lsbCBjYWxsIGF1eF9yZXNldCgpIGZ1bmN0aW9uIHRvIHJlc2V0IHRo ZSBBVVggY2hhbm5lbCwKPiArICogaWYgdGhlIHdhaXRpbmcgaXMgdGltZW91dC4KPiArICovCj4g K3N0YXRpYyBzc2l6ZV90IGRwX2F1eF90cmFuc2ZlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqZHJtX2F1 eCwKPiArCQkJICAgICAgIHN0cnVjdCBkcm1fZHBfYXV4X21zZyAqbXNnKQo+ICt7Cj4gKwlzc2l6 ZV90IHJldDsKPiArCWludCBjb25zdCBhdXhfY21kX25hdGl2ZV9tYXggPSAxNjsKPiArCWludCBj b25zdCBhdXhfY21kX2kyY19tYXggPSAxMjg7Cj4gKwlpbnQgY29uc3QgcmV0cnlfY291bnQgPSA1 Owo+ICsJc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXggPSBjb250YWluZXJfb2YoZHJtX2F1eCwK PiArCQlzdHJ1Y3QgZHBfYXV4X3ByaXZhdGUsIGRybV9hdXgpOwo+ICsKPiArCW11dGV4X2xvY2so JmF1eC0+bXV0ZXgpOwo+ICsKPiArCWF1eC0+bmF0aXZlID0gbXNnLT5yZXF1ZXN0ICYgKERQX0FV WF9OQVRJVkVfV1JJVEUgJiBEUF9BVVhfTkFUSVZFX1JFQUQpOwo+ICsKPiArCS8qIElnbm9yZSBh ZGRyZXNzIG9ubHkgbWVzc2FnZSAqLwo+ICsJaWYgKChtc2ctPnNpemUgPT0gMCkgfHwgKG1zZy0+ YnVmZmVyID09IE5VTEwpKSB7Cj4gKwkJbXNnLT5yZXBseSA9IGF1eC0+bmF0aXZlID8KPiArCQkJ RFBfQVVYX05BVElWRV9SRVBMWV9BQ0sgOiBEUF9BVVhfSTJDX1JFUExZX0FDSzsKPiArCQlyZXQg PSBtc2ctPnNpemU7Cj4gKwkJZ290byB1bmxvY2tfZXhpdDsKPiArCX0KPiArCj4gKwkvKiBtc2cg c2FuaXR5IGNoZWNrICovCj4gKwlpZiAoKGF1eC0+bmF0aXZlICYmIChtc2ctPnNpemUgPiBhdXhf Y21kX25hdGl2ZV9tYXgpKSB8fAo+ICsJCShtc2ctPnNpemUgPiBhdXhfY21kX2kyY19tYXgpKSB7 Cj4gKwkJRFJNX0VSUk9SKCIlczogaW52YWxpZCBtc2c6IHNpemUoJXp1KSwgcmVxdWVzdCgleClc biIsCj4gKwkJCV9fZnVuY19fLCBtc2ctPnNpemUsIG1zZy0+cmVxdWVzdCk7Cj4gKwkJcmV0ID0g LUVJTlZBTDsKPiArCQlnb3RvIHVubG9ja19leGl0Owo+ICsJfQo+ICsKPiArCWRwX2F1eF91cGRh dGVfb2Zmc2V0X2FuZF9zZWdtZW50KGF1eCwgbXNnKTsKPiArCWRwX2F1eF90cmFuc2Zlcl9oZWxw ZXIoYXV4LCBtc2cpOwo+ICsKPiArCWF1eC0+cmVhZCA9IG1zZy0+cmVxdWVzdCAmIChEUF9BVVhf STJDX1JFQUQgJiBEUF9BVVhfTkFUSVZFX1JFQUQpOwo+ICsJYXV4LT5jbWRfYnVzeSA9IHRydWU7 Cj4gKwo+ICsJaWYgKGF1eC0+cmVhZCkgewo+ICsJCWF1eC0+bm9fc2VuZF9hZGRyID0gdHJ1ZTsK PiArCQlhdXgtPm5vX3NlbmRfc3RvcCA9IGZhbHNlOwo+ICsJfSBlbHNlIHsKPiArCQlhdXgtPm5v X3NlbmRfYWRkciA9IHRydWU7Cj4gKwkJYXV4LT5ub19zZW5kX3N0b3AgPSB0cnVlOwo+ICsJfQo+ ICsKPiArCXJldCA9IGRwX2F1eF9jbWRfZmlmb190eChhdXgsIG1zZyk7Cj4gKwlpZiAoKHJldCA8 IDApICYmIGF1eC0+bmF0aXZlKSB7Cj4gKwkJYXV4LT5yZXRyeV9jbnQrKzsKPiArCQlpZiAoIShh dXgtPnJldHJ5X2NudCAlIHJldHJ5X2NvdW50KSkKPiArCQkJZHBfY2F0YWxvZ19hdXhfdXBkYXRl X2NmZyhhdXgtPmNhdGFsb2csCj4gKwkJCQlhdXgtPmRwX2F1eC5jZmcsIFBIWV9BVVhfQ0ZHMSk7 Cj4gKwkJZHBfY2F0YWxvZ19hdXhfcmVzZXQoYXV4LT5jYXRhbG9nKTsKPiArCQlnb3RvIHVubG9j a19leGl0Owo+ICsJfSBlbHNlIGlmIChyZXQgPCAwKSB7Cj4gKwkJZ290byB1bmxvY2tfZXhpdDsK PiArCX0KPiArCj4gKwlpZiAoYXV4LT5hdXhfZXJyb3JfbnVtID09IERQX0FVWF9FUlJfTk9ORSkg ewo+ICsJCWlmIChhdXgtPnJlYWQpCj4gKwkJCWRwX2F1eF9jbWRfZmlmb19yeChhdXgsIG1zZyk7 Cj4gKwo+ICsJCW1zZy0+cmVwbHkgPSBhdXgtPm5hdGl2ZSA/Cj4gKwkJCURQX0FVWF9OQVRJVkVf UkVQTFlfQUNLIDogRFBfQVVYX0kyQ19SRVBMWV9BQ0s7Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIFJl cGx5IGRlZmVyIHRvIHJldHJ5ICovCj4gKwkJbXNnLT5yZXBseSA9IGF1eC0+bmF0aXZlID8KPiAr CQkJRFBfQVVYX05BVElWRV9SRVBMWV9ERUZFUiA6IERQX0FVWF9JMkNfUkVQTFlfREVGRVI7Cj4g Kwl9Cj4gKwo+ICsJLyogUmV0dXJuIHJlcXVlc3RlZCBzaXplIGZvciBzdWNjZXNzIG9yIHJldHJ5 ICovCj4gKwlyZXQgPSBtc2ctPnNpemU7Cj4gKwlhdXgtPnJldHJ5X2NudCA9IDA7Cj4gKwo+ICt1 bmxvY2tfZXhpdDoKPiArCWF1eC0+Y21kX2J1c3kgPSBmYWxzZTsKPiArCW11dGV4X3VubG9jaygm YXV4LT5tdXRleCk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9h dXhfcmVzZXRfcGh5X2NvbmZpZ19pbmRpY2VzKHN0cnVjdCBkcF9hdXhfY2ZnICphdXhfY2ZnKQo+ ICt7Cj4gKwlpbnQgaSA9IDA7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IFBIWV9BVVhfQ0ZHX01B WDsgaSsrKQo+ICsJCWF1eF9jZmdbaV0uY3VycmVudF9pbmRleCA9IDA7Cj4gK30KPiArCj4gK3Zv aWQgZHBfYXV4X2lzcihzdHJ1Y3QgZHBfYXV4ICpkcF9hdXgpCj4gK3sKPiArCXN0cnVjdCBkcF9h dXhfcHJpdmF0ZSAqYXV4Owo+ICsKPiArCWlmICghZHBfYXV4KSB7Cj4gKwkJRFJNX0VSUk9SKCJp bnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJYXV4ID0gY29udGFp bmVyX29mKGRwX2F1eCwgc3RydWN0IGRwX2F1eF9wcml2YXRlLCBkcF9hdXgpOwo+ICsKPiArCWRw X2NhdGFsb2dfYXV4X2dldF9pcnEoYXV4LT5jYXRhbG9nLCBhdXgtPmNtZF9idXN5KTsKPiArCj4g KwlpZiAoIWF1eC0+Y21kX2J1c3kpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWlmIChhdXgtPm5hdGl2 ZSkKPiArCQlkcF9hdXhfbmF0aXZlX2hhbmRsZXIoYXV4KTsKPiArCWVsc2UKPiArCQlkcF9hdXhf aTJjX2hhbmRsZXIoYXV4KTsKPiArfQo+ICsKPiArdm9pZCBkcF9hdXhfcmVjb25maWcoc3RydWN0 IGRwX2F1eCAqZHBfYXV4KQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfYXV4X3ByaXZhdGUgKmF1eDsKPiAr Cj4gKwlhdXggPSBjb250YWluZXJfb2YoZHBfYXV4LCBzdHJ1Y3QgZHBfYXV4X3ByaXZhdGUsIGRw X2F1eCk7Cj4gKwo+ICsJZHBfY2F0YWxvZ19hdXhfdXBkYXRlX2NmZyhhdXgtPmNhdGFsb2csCj4g KwkJCWRwX2F1eC0+Y2ZnLCBQSFlfQVVYX0NGRzEpOwo+ICsJZHBfY2F0YWxvZ19hdXhfcmVzZXQo YXV4LT5jYXRhbG9nKTsKPiArfQo+ICsKPiArdm9pZCBkcF9hdXhfaW5pdChzdHJ1Y3QgZHBfYXV4 ICpkcF9hdXgsIHN0cnVjdCBkcF9hdXhfY2ZnICphdXhfY2ZnKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBf YXV4X3ByaXZhdGUgKmF1eDsKPiArCj4gKwlpZiAoIWRwX2F1eCB8fCAhYXV4X2NmZykgewo+ICsJ CURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiAr CWF1eCA9IGNvbnRhaW5lcl9vZihkcF9hdXgsIHN0cnVjdCBkcF9hdXhfcHJpdmF0ZSwgZHBfYXV4 KTsKPiArCj4gKwlkcF9hdXhfcmVzZXRfcGh5X2NvbmZpZ19pbmRpY2VzKGF1eF9jZmcpOwo+ICsJ ZHBfY2F0YWxvZ19hdXhfc2V0dXAoYXV4LT5jYXRhbG9nLCBhdXhfY2ZnKTsKPiArCWRwX2NhdGFs b2dfYXV4X3Jlc2V0KGF1eC0+Y2F0YWxvZyk7Cj4gKwlkcF9jYXRhbG9nX2F1eF9lbmFibGUoYXV4 LT5jYXRhbG9nLCB0cnVlKTsKPiArCWF1eC0+cmV0cnlfY250ID0gMDsKPiArfQo+ICsKPiArdm9p ZCBkcF9hdXhfZGVpbml0KHN0cnVjdCBkcF9hdXggKmRwX2F1eCkKPiArewo+ICsJc3RydWN0IGRw X2F1eF9wcml2YXRlICphdXg7Cj4gKwo+ICsJaWYgKCFkcF9hdXgpIHsKPiArCQlEUk1fRVJST1Io ImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlhdXggPSBjb250 YWluZXJfb2YoZHBfYXV4LCBzdHJ1Y3QgZHBfYXV4X3ByaXZhdGUsIGRwX2F1eCk7Cj4gKwo+ICsJ ZHBfY2F0YWxvZ19hdXhfZW5hYmxlKGF1eC0+Y2F0YWxvZywgZmFsc2UpOwo+ICt9Cj4gKwo+ICtp bnQgZHBfYXV4X3JlZ2lzdGVyKHN0cnVjdCBkcF9hdXggKmRwX2F1eCkKPiArewo+ICsJc3RydWN0 IGRwX2F1eF9wcml2YXRlICphdXg7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlpZiAoIWRwX2F1 eCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7CgpUaGlzIGNhbiBqdXN0IGJl IHJldHVybiAtRUlOVkFMOwoKPiArCQlyZXQgPSAtRUlOVkFMOwoKPiArCQlnb3RvIGV4aXQ7Cj4g Kwl9Cj4gKwo+ICsJYXV4ID0gY29udGFpbmVyX29mKGRwX2F1eCwgc3RydWN0IGRwX2F1eF9wcml2 YXRlLCBkcF9hdXgpOwo+ICsKPiArCWF1eC0+ZHJtX2F1eC5uYW1lID0gImRwdV9kcF9hdXgiOwo+ ICsJYXV4LT5kcm1fYXV4LmRldiA9IGF1eC0+ZGV2Owo+ICsJYXV4LT5kcm1fYXV4LnRyYW5zZmVy ID0gZHBfYXV4X3RyYW5zZmVyOwo+ICsJcmV0ID0gZHJtX2RwX2F1eF9yZWdpc3RlcigmYXV4LT5k cm1fYXV4KTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoIiVzOiBmYWlsZWQgdG8gcmVn aXN0ZXIgZHJtIGF1eDogJWRcbiIsIF9fZnVuY19fLCByZXQpOwo+ICsJCWdvdG8gZXhpdDsKVGhp cyBjYW4ganVzdCBiZSByZXR1cm4gcmV0Owo+ICsJfQo+ICsJZHBfYXV4LT5kcm1fYXV4ID0gJmF1 eC0+ZHJtX2F1eDsKPiArZXhpdDoKPiArCXJldHVybiByZXQ7CgpUaGUgbGFiZWwgY2FuIGdvIGF3 YXkgYW5kIHRoaXMgd2lsbCBiZSBqdXN0IHJldHVybiAwOwoKPiArfQo+ICsKPiArdm9pZCBkcF9h dXhfdW5yZWdpc3RlcihzdHJ1Y3QgZHBfYXV4ICpkcF9hdXgpCj4gK3sKPiArCXN0cnVjdCBkcF9h dXhfcHJpdmF0ZSAqYXV4Owo+ICsKPiArCWlmICghZHBfYXV4KSB7Cj4gKwkJRFJNX0VSUk9SKCJp bnZhbGlkIGlucHV0XG4iKTsKCkEgZXJyb3IgbWVzc2FnZSBpc24ndCBuZWVkZWQgaGVyZSwgeW91 IGNhbiBqdXN0IHF1aWV0bHkgcmV0dXJuLgoKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJYXV4 ID0gY29udGFpbmVyX29mKGRwX2F1eCwgc3RydWN0IGRwX2F1eF9wcml2YXRlLCBkcF9hdXgpOwo+ ICsJZHJtX2RwX2F1eF91bnJlZ2lzdGVyKCZhdXgtPmRybV9hdXgpOwo+ICt9Cj4gKwo+ICtzdHJ1 Y3QgZHBfYXV4ICpkcF9hdXhfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX2NhdGFs b2dfYXV4ICpjYXRhbG9nLAo+ICsJCQkgIHN0cnVjdCBkcF9hdXhfY2ZnICphdXhfY2ZnKQo+ICt7 Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXg7Cj4gKwlzdHJ1 Y3QgZHBfYXV4ICpkcF9hdXg7Cj4gKwo+ICsJaWYgKCFjYXRhbG9nIHx8ICFhdXhfY2ZnKSB7Cj4g KwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKClRoaXMgY2FuIGp1c3QgYmUgcmV0dXJu IEVSUl9QVFIoLUVOT0RFVik7Cgo+ICsJCXJjID0gLUVOT0RFVjsKPiArCQlnb3RvIGVycm9yOwo+ ICsJfQo+ICsKPiArCWF1eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYXV4KSwgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIWF1eCkgewoKVGhpcyBjYW4ganVzdCBiZSByZXR1cm4gRVJSX1BUUigt RU5PTUVNKTsKPiArCQlyYyA9IC1FTk9NRU07Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPiArCj4g Kwlpbml0X2NvbXBsZXRpb24oJmF1eC0+Y29tcCk7Cj4gKwlhdXgtPmNtZF9idXN5ID0gZmFsc2U7 Cj4gKwltdXRleF9pbml0KCZhdXgtPm11dGV4KTsKPiArCj4gKwlhdXgtPmRldiA9IGRldjsKPiAr CWF1eC0+Y2F0YWxvZyA9IGNhdGFsb2c7Cj4gKwlhdXgtPmRwX2F1eC5jZmcgPSBhdXhfY2ZnOwo+ ICsJZHBfYXV4ID0gJmF1eC0+ZHBfYXV4Owo+ICsJYXV4LT5yZXRyeV9jbnQgPSAwOwo+ICsKPiAr CXJldHVybiBkcF9hdXg7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIEVSUl9QVFIocmMpOwoKTGFiZWwg aXMgbm90IG5lZWRlZAoKPiArfQo+ICsKPiArdm9pZCBkcF9hdXhfcHV0KHN0cnVjdCBkcF9hdXgg KmRwX2F1eCkKPiArewo+ICsJc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXg7Cj4gKwo+ICsJaWYg KCFkcF9hdXgpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWF1eCA9IGNvbnRhaW5lcl9vZihkcF9hdXgs IHN0cnVjdCBkcF9hdXhfcHJpdmF0ZSwgZHBfYXV4KTsKPiArCj4gKwltdXRleF9kZXN0cm95KCZh dXgtPm11dGV4KTsKCllvdSBzaG91bGRuJ3QgbmVlZCB0aGlzIGlmIHRoZSBtZW1vcnkgaXMgYmVp bmcgZnJlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcy4KCj4gKwlkZXZtX2tmcmVlKGF1eC0+ZGV2 LCBhdXgpOwoKWW91IHNob3VsZG4ndCBuZWVkIHRvIGNhbGwgdGhpcyBpZiB0aGlzIGZ1bmN0aW9u IGlzIG9ubHkgYmVpbmcgY2FsbGVkIHJpZ2h0CmJlZm9yZSB0aGUgY29tcG9uZW50IG9yIGRldmlj ZSBpcyByZW1vdmVkLiAgSWYgdGhhdCBpc24ndCB0aGUgY2FzZSAoaS5lLiB0aGUKbWVtb3J5IGlz IGJlaW5nIGFsbG9jYXRlZCBhbmQgZnJlZWQgZHVyaW5nIHJ1bnRpbWUpIHRoZW4gZG9uJ3QgdXNl IGRldm1fLgoKSWYgZGV2bV8gaXMgaW5kZWVkIGFwcHJvcHJpYXRlIHRoZW4gbm9uZSBvZiB0aGlz IGZ1bmN0aW9uIGlzIHVzZWZ1bCBhbmQgaXQgY2FuCmJlIHJlbW92ZWQuCgo+ICt9Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmggYi9kcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX2F1eC5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi45 ODQ5NWM1Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf YXV4LmgKPiBAQCAtMCwwICsxLDM3IEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wLW9ubHkgKi8KPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTksIFRoZSBM aW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNpZm5k ZWYgX0RQX0FVWF9IXwo+ICsjZGVmaW5lIF9EUF9BVVhfSF8KPiArCj4gKyNpbmNsdWRlICJkcF9j YXRhbG9nLmgiCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgo+ICsKPiArZW51bSBk cF9hdXhfZXJyb3Igewo+ICsJRFBfQVVYX0VSUl9OT05FCT0gMCwKPiArCURQX0FVWF9FUlJfQURE Ugk9IC0xLAo+ICsJRFBfQVVYX0VSUl9UT1VUCT0gLTIsCj4gKwlEUF9BVVhfRVJSX05BQ0sJPSAt MywKPiArCURQX0FVWF9FUlJfREVGRVIJPSAtNCwKPiArCURQX0FVWF9FUlJfTkFDS19ERUZFUgk9 IC01LAo+ICt9OwoKRm9yIG1lLCBhIGVudW0gd2l0aCBuZWdhdGl2ZSB2YWx1ZXMgaXMgbmV2ZXIg dXNlZnVsIGJlY2F1c2UgaXQgd291bGRuJ3QgdGFrZQphZHZhbnRhZ2Ugb2YgYW55IG9mIHRoZSBs aW1pdGVkIGZlYXR1cmVzIG9mIGFuIGVudW0uIFRoaXMgY2FuIGp1c3QgYXMgZWFzaWx5IGJlCiNk ZWZpbmUuCgo+ICsKPiArc3RydWN0IGRwX2F1eCB7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2F1eCAqZHJt X2F1eDsKPiArCXN0cnVjdCBkcF9hdXhfY2ZnICpjZmc7Cj4gK307Cj4gKwo+ICtpbnQgZHBfYXV4 X3JlZ2lzdGVyKHN0cnVjdCBkcF9hdXggKmF1eCk7Cj4gK3ZvaWQgZHBfYXV4X3VucmVnaXN0ZXIo c3RydWN0IGRwX2F1eCAqYXV4KTsKPiArdm9pZCBkcF9hdXhfaXNyKHN0cnVjdCBkcF9hdXggKmF1 eCk7Cj4gK3ZvaWQgZHBfYXV4X2luaXQoc3RydWN0IGRwX2F1eCAqYXV4LCBzdHJ1Y3QgZHBfYXV4 X2NmZyAqYXV4X2NmZyk7Cj4gK3ZvaWQgZHBfYXV4X2RlaW5pdChzdHJ1Y3QgZHBfYXV4ICphdXgp Owo+ICt2b2lkIGRwX2F1eF9yZWNvbmZpZyhzdHJ1Y3QgZHBfYXV4ICphdXgpOwo+ICsKPiArc3Ry dWN0IGRwX2F1eCAqZHBfYXV4X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9jYXRh bG9nX2F1eCAqY2F0YWxvZywKPiArCQkJICBzdHJ1Y3QgZHBfYXV4X2NmZyAqYXV4X2NmZyk7Cj4g K3ZvaWQgZHBfYXV4X3B1dChzdHJ1Y3QgZHBfYXV4ICphdXgpOwo+ICsKPiArI2VuZGlmIC8qX19E UF9BVVhfSF8qLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2NhdGFs b2cuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5jCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5kNmM0NjFiCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5jCj4gQEAgLTAsMCArMSw5OTYgQEAK PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ICsvKgo+ICsgKiBD b3B5cmlnaHQgKGMpIDIwMTctMjAxOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMg cmVzZXJ2ZWQuCj4gKyAqLwo+ICsKPiArI2RlZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6 ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pb3BvbGwuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+Cj4g Kwo+ICsjaW5jbHVkZSAiZHBfY2F0YWxvZy5oIgo+ICsjaW5jbHVkZSAiZHBfcmVnLmgiCj4gKwo+ ICsjZGVmaW5lIFBPTExJTkdfU0xFRVBfVVMJCQkxMDAwCj4gKyNkZWZpbmUgUE9MTElOR19USU1F T1VUX1VTCQkJMTAwMDAKPiArCj4gKyNkZWZpbmUgUkVGVElNRVJfREVGQVVMVF9WQUxVRQkJCTB4 MjAwMDAKPiArI2RlZmluZSBTQ1JBTUJMRVJfUkVTRVRfQ09VTlRfVkFMVUUJCTB4RkMKPiArCj4g KyNkZWZpbmUgZHBfY2F0YWxvZ19nZXRfcHJpdih4KSB7IFwKPiArCXN0cnVjdCBkcF9jYXRhbG9n ICpkcF9jYXRhbG9nOyBcCj4gKwlkcF9jYXRhbG9nID0gY29udGFpbmVyX29mKHgsIHN0cnVjdCBk cF9jYXRhbG9nLCB4KTsgXAo+ICsJY2F0YWxvZyA9IGNvbnRhaW5lcl9vZihkcF9jYXRhbG9nLCBz dHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlLCBcCj4gKwkJCQlkcF9jYXRhbG9nKTsgXAo+ICt9CgpU aGlzIHNob3VsZCBiZSBhIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24uCgo+ICsjZGVmaW5lIERQX0lO VEVSUlVQVF9TVEFUVVMxIFwKPiArCShEUF9JTlRSX0FVWF9JMkNfRE9ORXwgXAo+ICsJRFBfSU5U Ul9XUk9OR19BRERSIHwgRFBfSU5UUl9USU1FT1VUIHwgXAo+ICsJRFBfSU5UUl9OQUNLX0RFRkVS IHwgRFBfSU5UUl9XUk9OR19EQVRBX0NOVCB8IFwKPiArCURQX0lOVFJfSTJDX05BQ0sgfCBEUF9J TlRSX0kyQ19ERUZFUiB8IFwKPiArCURQX0lOVFJfUExMX1VOTE9DS0VEIHwgRFBfSU5UUl9BVVhf RVJST1IpCj4gKwo+ICsjZGVmaW5lIERQX0lOVEVSUlVQVF9TVEFUVVMxX01BU0sJKERQX0lOVEVS UlVQVF9TVEFUVVMxIDw8IDIpCj4gKwo+ICsjZGVmaW5lIERQX0lOVEVSUlVQVF9TVEFUVVMyIFwK PiArCShEUF9JTlRSX1JFQURZX0ZPUl9WSURFTyB8IERQX0lOVFJfSURMRV9QQVRURVJOX1NFTlQg fCBcCj4gKwlEUF9JTlRSX0ZSQU1FX0VORCB8IERQX0lOVFJfQ1JDX1VQREFURUQpCj4gKwo+ICsj ZGVmaW5lIERQX0lOVEVSUlVQVF9TVEFUVVMyX01BU0sJKERQX0lOVEVSUlVQVF9TVEFUVVMyIDw8 IDIpCj4gKwo+ICtzdGF0aWMgdTggY29uc3Qgdm1fcHJlX2VtcGhhc2lzWzRdWzRdID0gewo+ICsJ ezB4MDAsIDB4MEIsIDB4MTIsIDB4RkZ9LCAgICAgICAvKiBwZTAsIDAgZGIgKi8KPiArCXsweDAw LCAweDBBLCAweDEyLCAweEZGfSwgICAgICAgLyogcGUxLCAzLjUgZGIgKi8KPiArCXsweDAwLCAw eDBDLCAweEZGLCAweEZGfSwgICAgICAgLyogcGUyLCA2LjAgZGIgKi8KPiArCXsweEZGLCAweEZG LCAweEZGLCAweEZGfSAgICAgICAgLyogcGUzLCA5LjUgZGIgKi8KPiArfTsKPiArCj4gKy8qIHZv bHRhZ2Ugc3dpbmcsIDAuMnYgYW5kIDEuMHYgYXJlIG5vdCBzdXBwb3J0ICovCj4gK3N0YXRpYyB1 OCBjb25zdCB2bV92b2x0YWdlX3N3aW5nWzRdWzRdID0gewo+ICsJezB4MDcsIDB4MEYsIDB4MTQs IDB4RkZ9LCAvKiBzdzAsIDAuNHYgICovCj4gKwl7MHgxMSwgMHgxRCwgMHgxRiwgMHhGRn0sIC8q IHN3MSwgMC42IHYgKi8KPiArCXsweDE4LCAweDFGLCAweEZGLCAweEZGfSwgLyogc3cxLCAwLjgg diAqLwo+ICsJezB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9ICAvKiBzdzEsIDEuMiB2LCBvcHRpb25h bCAqLwo+ICt9Owo+ICsKPiArc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSB7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgZHBfaW8gKmlvOwo+ICsJc3RydWN0IGRwX2NhdGFsb2cg ZHBfY2F0YWxvZzsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgdTMyIGRwX3JlYWRfYXV4KHN0 cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2csIHUzMiBvZmZzZXQpCgpEb24ndCBtYXJr IHRoaXMgaW5saW5lLCBsZXQgdGhlIGNvbXBpbGVyIGRlY2lkZSwgaGVyZSBhbmQgZm9yIGFsbCB0 aGUgZm9sbG93aW5nCmZ1bmN0aW9ucy4KCj4gK3sKPiArCXJldHVybiByZWFkbF9yZWxheGVkKGNh dGFsb2ctPmlvLT5kcF9hdXguYmFzZSArIG9mZnNldCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCBkcF93cml0ZV9hdXgoc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZywK PiArCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiBkYXRhKQo+ICt7Cj4gKwkvKgo+ICsJICogVG8g bWFrZSBzdXJlIGF1eCByZWcgd3JpdGVzIGhhcHBlbnMgYmVmb3JlIGFueSBvdGhlciBvcGVyYXRp b24sCj4gKwkgKiB0aGlzIGZ1bmN0aW9uIHVzZXMgd3JpdGVsKCkgaW5zdHJlYWQgb2Ygd3JpdGVs X3JlbGF4ZWQoKQo+ICsJICovCj4gKwl3cml0ZWwoZGF0YSwgY2F0YWxvZy0+aW8tPmRwX2F1eC5i YXNlICsgb2Zmc2V0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1MzIgZHBfcmVhZF9haGIo c3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZywgdTMyIG9mZnNldCkKPiArewo+ICsJ cmV0dXJuIHJlYWRsX3JlbGF4ZWQoY2F0YWxvZy0+aW8tPmRwX2FoYi5iYXNlICsgb2Zmc2V0KTsK PiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGRwX3dyaXRlX2FoYihzdHJ1Y3QgZHBfY2F0 YWxvZ19wcml2YXRlICpjYXRhbG9nLAo+ICsJCQkgICAgICAgdTMyIG9mZnNldCwgdTMyIGRhdGEp Cj4gK3sKPiArCS8qCj4gKwkgKiBUbyBtYWtlIHN1cmUgcGh5IHJlZyB3cml0ZXMgaGFwcGVucyBi ZWZvcmUgYW55IG90aGVyIG9wZXJhdGlvbiwKPiArCSAqIHRoaXMgZnVuY3Rpb24gdXNlcyB3cml0 ZWwoKSBpbnN0cmVhZCBvZiB3cml0ZWxfcmVsYXhlZCgpCj4gKwkgKi8KPiArCXdyaXRlbChkYXRh LCBjYXRhbG9nLT5pby0+ZHBfYWhiLmJhc2UgKyBvZmZzZXQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW5saW5lIHUzMiBkcF9yZWFkX2NjKHN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2cs IHUzMiBvZmZzZXQpCj4gK3sKPiArCXJldHVybiByZWFkbF9yZWxheGVkKGNhdGFsb2ctPmlvLT5k cF9jY19pby5iYXNlICsgb2Zmc2V0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGRw X3dyaXRlX3BoeShzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nLAo+ICsJCQkgICAg ICAgdTMyIG9mZnNldCwgdTMyIGRhdGEpCj4gK3sKPiArCS8qCj4gKwkgKiBUbyBtYWtlIHN1cmUg cGh5IHJlZyB3cml0ZXMgaGFwcGVucyBiZWZvcmUgYW55IG90aGVyIG9wZXJhdGlvbiwKPiArCSAq IHRoaXMgZnVuY3Rpb24gdXNlcyB3cml0ZWwoKSBpbnN0cmVhZCBvZiB3cml0ZWxfcmVsYXhlZCgp Cj4gKwkgKi8KPiArCXdyaXRlbChkYXRhLCBjYXRhbG9nLT5pby0+cGh5X2lvLmJhc2UgKyBvZmZz ZXQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHZvaWQgZHBfd3JpdGVfcGxsKHN0cnVjdCBk cF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2csCj4gKwkJCSAgICAgICB1MzIgb2Zmc2V0LCB1MzIg ZGF0YSkKPiArewo+ICsJd3JpdGVsX3JlbGF4ZWQoZGF0YSwgY2F0YWxvZy0+aW8tPmRwX3BsbF9p by5iYXNlICsgb2Zmc2V0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGRwX3dyaXRl X2xuX3R4MChzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nLAo+ICsJCQkgICAgICAg dTMyIG9mZnNldCwgdTMyIGRhdGEpCj4gK3sKPiArCXdyaXRlbF9yZWxheGVkKGRhdGEsIGNhdGFs b2ctPmlvLT5sbl90eDBfaW8uYmFzZSArIG9mZnNldCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCBkcF93cml0ZV9sbl90eDEoc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxv ZywKPiArCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiBkYXRhKQo+ICt7Cj4gKwl3cml0ZWxfcmVs YXhlZChkYXRhLCBjYXRhbG9nLT5pby0+bG5fdHgxX2lvLmJhc2UgKyBvZmZzZXQpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIHZvaWQgZHBfd3JpdGVfdXNiX2NtKHN0cnVjdCBkcF9jYXRhbG9n X3ByaXZhdGUgKmNhdGFsb2csCj4gKwkJCSAgICAgICB1MzIgb2Zmc2V0LCB1MzIgZGF0YSkKPiAr ewo+ICsJLyoKPiArCSAqIFRvIG1ha2Ugc3VyZSB1c2IgcmVnIHdyaXRlcyBoYXBwZW5zIGJlZm9y ZSBhbnkgb3RoZXIgb3BlcmF0aW9uLAo+ICsJICogdGhpcyBmdW5jdGlvbiB1c2VzIHdyaXRlbCgp IGluc3RyZWFkIG9mIHdyaXRlbF9yZWxheGVkKCkKPiArCSAqLwo+ICsJd3JpdGVsKGRhdGEsIGNh dGFsb2ctPmlvLT51c2IzX2RwX2NvbS5iYXNlICsgb2Zmc2V0KTsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSB2b2lkIGRwX3dyaXRlX3AwKHN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFs b2csCj4gKwkJCSAgICAgICB1MzIgb2Zmc2V0LCB1MzIgZGF0YSkKPiArewo+ICsJLyoKPiArCSAq IFRvIG1ha2Ugc3VyZSBpbnRlcmZhY2UgcmVnIHdyaXRlcyBoYXBwZW5zIGJlZm9yZSBhbnkgb3Ro ZXIgb3BlcmF0aW9uLAo+ICsJICogdGhpcyBmdW5jdGlvbiB1c2VzIHdyaXRlbCgpIGluc3RyZWFk IG9mIHdyaXRlbF9yZWxheGVkKCkKPiArCSAqLwo+ICsJd3JpdGVsKGRhdGEsIGNhdGFsb2ctPmlv LT5kcF9wMC5iYXNlICsgb2Zmc2V0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1MzIgZHBf cmVhZF9saW5rKHN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2csIHUzMiBvZmZzZXQp Cj4gK3sKPiArCXJldHVybiByZWFkbF9yZWxheGVkKGNhdGFsb2ctPmlvLT5kcF9saW5rLmJhc2Ug KyBvZmZzZXQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHZvaWQgZHBfd3JpdGVfbGluayhz dHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nLAo+ICsJCQkgICAgICAgdTMyIG9mZnNl dCwgdTMyIGRhdGEpCj4gK3sKPiArCS8qCj4gKwkgKiBUbyBtYWtlIHN1cmUgbGluayByZWcgd3Jp dGVzIGhhcHBlbnMgYmVmb3JlIGFueSBvdGhlciBvcGVyYXRpb24sCj4gKwkgKiB0aGlzIGZ1bmN0 aW9uIHVzZXMgd3JpdGVsKCkgaW5zdHJlYWQgb2Ygd3JpdGVsX3JlbGF4ZWQoKQo+ICsJICovCj4g Kwl3cml0ZWwoZGF0YSwgY2F0YWxvZy0+aW8tPmRwX2xpbmsuYmFzZSArIG9mZnNldCk7Cj4gK30K PiArCj4gKy8qIGF1eCByZWxhdGVkIGNhdGFsb2cgZnVuY3Rpb25zICovCj4gK3UzMiBkcF9jYXRh bG9nX2F1eF9yZWFkX2RhdGEoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgpCj4gK3sKPiArCXN0 cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwo+ICsJaWYgKCFhdXgpIHsKPiAr CQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsK PiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYoYXV4KTsKPiArCj4gKwlyZXR1cm4gZHBfcmVhZF9hdXgo Y2F0YWxvZywgUkVHX0RQX0FVWF9EQVRBKTsKPiArfQo+ICsKPiAraW50IGRwX2NhdGFsb2dfYXV4 X3dyaXRlX2RhdGEoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgpCj4gK3sKPiArCWludCByYyA9 IDA7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ICsKPiArCWlmICgh YXV4KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm4gLUVJ TlZBTDsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGF1eCk7Cj4gKwlkcF93cml0 ZV9hdXgoY2F0YWxvZywgUkVHX0RQX0FVWF9EQVRBLCBhdXgtPmRhdGEpOwo+ICsJcmV0dXJuIHJj OwoKcmMgaXMgb25seSB1c2VkIHRvIHJldHVybiAwIHNvIHlvdSBkb24ndCBuZWVkIGl0LCBhbmQg anVzdCByZXR1cm4gMDsKCj4gK30KPiArCj4gK2ludCBkcF9jYXRhbG9nX2F1eF93cml0ZV90cmFu cyhzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0 cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwo+ICsJaWYgKCFhdXgpIHsKPiAr CQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJ fQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYoYXV4KTsKPiArCWRwX3dyaXRlX2F1eChjYXRh bG9nLCBSRUdfRFBfQVVYX1RSQU5TX0NUUkwsIGF1eC0+ZGF0YSk7Cj4gKwlyZXR1cm4gcmM7CgpT YW1lIGFzIGFib3ZlLiAKPiArfQo+ICsKPiAraW50IGRwX2NhdGFsb2dfYXV4X2NsZWFyX3RyYW5z KHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4LCBib29sIHJlYWQpCj4gK3sKPiArCWludCByYyA9 IDA7Cj4gKwl1MzIgZGF0YSA9IDA7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRh bG9nOwo+ICsKPiArCWlmICghYXV4KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4i KTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2 KGF1eCk7Cj4gKwo+ICsJaWYgKHJlYWQpIHsKPiArCQlkYXRhID0gZHBfcmVhZF9hdXgoY2F0YWxv ZywgUkVHX0RQX0FVWF9UUkFOU19DVFJMKTsKPiArCQlkYXRhICY9IH5EUF9BVVhfVFJBTlNfQ1RS TF9HTzsKPiArCQlkcF93cml0ZV9hdXgoY2F0YWxvZywgUkVHX0RQX0FVWF9UUkFOU19DVFJMLCBk YXRhKTsKPiArCX0gZWxzZSB7Cj4gKwkJZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19EUF9BVVhf VFJBTlNfQ1RSTCwgMCk7Cj4gKwl9Cj4gKwlyZXR1cm4gcmM7CgpTYW1lIGFzIGFib3ZlLgoKPiAr fQo+ICsKPiArdm9pZCBkcF9jYXRhbG9nX2F1eF9yZXNldChzdHJ1Y3QgZHBfY2F0YWxvZ19hdXgg KmF1eCkKPiArewo+ICsJdTMyIGF1eF9jdHJsOwo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0 ZSAqY2F0YWxvZzsKPiArCj4gKwlpZiAoIWF1eCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBp bnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYo YXV4KTsKPiArCj4gKwlhdXhfY3RybCA9IGRwX3JlYWRfYXV4KGNhdGFsb2csIFJFR19EUF9BVVhf Q1RSTCk7Cj4gKwo+ICsJYXV4X2N0cmwgfD0gRFBfQVVYX0NUUkxfUkVTRVQ7Cj4gKwlkcF93cml0 ZV9hdXgoY2F0YWxvZywgUkVHX0RQX0FVWF9DVFJMLCBhdXhfY3RybCk7Cj4gKwl1c2xlZXBfcmFu Z2UoMTAwMCwgMTEwMCk7IC8qIGgvdyByZWNvbW1lbmRlZCBkZWxheSAqLwo+ICsKPiArCWF1eF9j dHJsICY9IH5EUF9BVVhfQ1RSTF9SRVNFVDsKPiArCWRwX3dyaXRlX2F1eChjYXRhbG9nLCBSRUdf RFBfQVVYX0NUUkwsIGF1eF9jdHJsKTsKPiArfQo+ICsKPiArdm9pZCBkcF9jYXRhbG9nX2F1eF9l bmFibGUoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgsIGJvb2wgZW5hYmxlKQo+ICt7Cj4gKwl1 MzIgYXV4X2N0cmw7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ICsK PiArCWlmICghYXV4KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihhdXgpOwo+ICsKPiArCWF1 eF9jdHJsID0gZHBfcmVhZF9hdXgoY2F0YWxvZywgUkVHX0RQX0FVWF9DVFJMKTsKPiArCj4gKwlp ZiAoZW5hYmxlKSB7Cj4gKwkJZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19EUF9USU1FT1VUX0NP VU5ULCAweGZmZmYpOwo+ICsJCWRwX3dyaXRlX2F1eChjYXRhbG9nLCBSRUdfRFBfQVVYX0xJTUlU UywgMHhmZmZmKTsKPiArCQlhdXhfY3RybCB8PSBEUF9BVVhfQ1RSTF9FTkFCTEU7Cj4gKwl9IGVs c2Ugewo+ICsJCWF1eF9jdHJsICY9IH5EUF9BVVhfQ1RSTF9FTkFCTEU7Cj4gKwl9Cj4gKwo+ICsJ ZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19EUF9BVVhfQ1RSTCwgYXV4X2N0cmwpOwo+ICt9Cj4g Kwo+ICt2b2lkIGRwX2NhdGFsb2dfYXV4X3VwZGF0ZV9jZmcoc3RydWN0IGRwX2NhdGFsb2dfYXV4 ICphdXgsCj4gKwkJc3RydWN0IGRwX2F1eF9jZmcgKmNmZywgZW51bSBkcF9waHlfYXV4X2NvbmZp Z190eXBlIHR5cGUpCj4gK3sKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7 Cj4gKwl1MzIgbmV3X2luZGV4ID0gMCwgY3VycmVudF9pbmRleCA9IDA7Cj4gKwo+ICsJaWYgKCFh dXggfHwgIWNmZyB8fCAodHlwZSA+PSBQSFlfQVVYX0NGR19NQVgpKSB7Cj4gKwkJRFJNX0VSUk9S KCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxv Z19nZXRfcHJpdihhdXgpOwo+ICsKPiArCWN1cnJlbnRfaW5kZXggPSBjZmdbdHlwZV0uY3VycmVu dF9pbmRleDsKPiArCW5ld19pbmRleCA9IChjdXJyZW50X2luZGV4ICsgMSkgJSBjZmdbdHlwZV0u Y2ZnX2NudDsKPiArCURSTV9ERUJVR19EUCgiVXBkYXRpbmcgJXMgZnJvbSAweCUwOHggdG8gMHgl MDh4XG4iLAo+ICsJCWRwX3BoeV9hdXhfY29uZmlnX3R5cGVfdG9fc3RyaW5nKHR5cGUpLAo+ICsJ Y2ZnW3R5cGVdLmx1dFtjdXJyZW50X2luZGV4XSwgY2ZnW3R5cGVdLmx1dFtuZXdfaW5kZXhdKTsK PiArCj4gKwlkcF93cml0ZV9waHkoY2F0YWxvZywgY2ZnW3R5cGVdLm9mZnNldCwKPiArCQkJY2Zn W3R5cGVdLmx1dFtuZXdfaW5kZXhdKTsKPiArCWNmZ1t0eXBlXS5jdXJyZW50X2luZGV4ID0gbmV3 X2luZGV4Owo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfYXV4X3NldHVwKHN0cnVjdCBkcF9j YXRhbG9nX2F1eCAqYXV4LAo+ICsJCXN0cnVjdCBkcF9hdXhfY2ZnICpjZmcpCj4gK3sKPiArCXN0 cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwlpbnQgaSA9IDA7Cj4gKwo+ICsJ aWYgKCFhdXggfHwgIWNmZykgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4g KwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYoYXV4KTsKPiArCj4g KwlkcF93cml0ZV9waHkoY2F0YWxvZywgUkVHX0RQX1BIWV9QRF9DVEwsIERQX1BIWV9QRF9DVExf UFdSRE4gfAo+ICsJCURQX1BIWV9QRF9DVExfQVVYX1BXUkROIHwgRFBfUEhZX1BEX0NUTF9QTExf UFdSRE4gfAo+ICsJCURQX1BIWV9QRF9DVExfRFBfQ0xBTVBfRU4pOwo+ICsKPiArCS8qIFR1cm4g b24gQklBUyBjdXJyZW50IGZvciBQSFkvUExMICovCj4gKwlkcF93cml0ZV9wbGwoY2F0YWxvZywK PiArCQlRU0VSREVTX0NPTV9CSUFTX0VOX0NMS0JVRkxSX0VOLCBRU0VSREVTX0NPTV9CSUFTX0VO IHwKPiArCQlRU0VSREVTX0NPTV9CSUFTX0VOX01VWCB8IFFTRVJERVNfQ09NX0NMS0JVRl9MX0VO IHwKPiArCQlRU0VSREVTX0NPTV9FTl9TWVNDTEtfVFhfU0VMKTsKPiArCj4gKwkvKiBEUCBBVVgg Q0ZHIHJlZ2lzdGVyIHByb2dyYW1taW5nICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgUEhZX0FVWF9D RkdfTUFYOyBpKyspIHsKPiArCQlEUk1fREVCVUdfRFAoIiVzOiBvZmZzZXQ9MHglMDh4LCB2YWx1 ZT0weCUwOHhcbiIsCj4gKwkJCWRwX3BoeV9hdXhfY29uZmlnX3R5cGVfdG9fc3RyaW5nKGkpLAo+ ICsJCQljZmdbaV0ub2Zmc2V0LCBjZmdbaV0ubHV0W2NmZ1tpXS5jdXJyZW50X2luZGV4XSk7Cj4g KwkJZHBfd3JpdGVfcGh5KGNhdGFsb2csIGNmZ1tpXS5vZmZzZXQsCj4gKwkJCWNmZ1tpXS5sdXRb Y2ZnW2ldLmN1cnJlbnRfaW5kZXhdKTsKPiArCX0KPiArCj4gKwlkcF93cml0ZV9waHkoY2F0YWxv ZywgUkVHX0RQX1BIWV9BVVhfSU5URVJSVVBUX01BU0ssIFBIWV9BVVhfU1RPUF9FUlJfTUFTSyB8 Cj4gKwkJCVBIWV9BVVhfREVDX0VSUl9NQVNLIHwgUEhZX0FVWF9TWU5DX0VSUl9NQVNLIHwKPiAr CQkJUEhZX0FVWF9BTElHTl9FUlJfTUFTSyB8IFBIWV9BVVhfUkVRX0VSUl9NQVNLKTsKPiArfQo+ ICsKPiArdm9pZCBkcF9jYXRhbG9nX2F1eF9nZXRfaXJxKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAq YXV4LCBib29sIGNtZF9idXN5KQo+ICt7Cj4gKwl1MzIgYWNrOwo+ICsJc3RydWN0IGRwX2NhdGFs b2dfcHJpdmF0ZSAqY2F0YWxvZzsKPiArCj4gKwlpZiAoIWF1eCkgewo+ICsJCURSTV9FUlJPUigi aW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2df Z2V0X3ByaXYoYXV4KTsKPiArCj4gKwlhdXgtPmlzciA9IGRwX3JlYWRfYWhiKGNhdGFsb2csIFJF R19EUF9JTlRSX1NUQVRVUyk7Cj4gKwlhdXgtPmlzciAmPSB+RFBfSU5URVJSVVBUX1NUQVRVUzFf TUFTSzsKPiArCWFjayA9IGF1eC0+aXNyICYgRFBfSU5URVJSVVBUX1NUQVRVUzE7Cj4gKwlhY2sg PDw9IDE7Cj4gKwlhY2sgfD0gRFBfSU5URVJSVVBUX1NUQVRVUzFfTUFTSzsKPiArCWRwX3dyaXRl X2FoYihjYXRhbG9nLCBSRUdfRFBfSU5UUl9TVEFUVVMsIGFjayk7Cj4gK30KPiArCj4gKy8qIGNv bnRyb2xsZXIgcmVsYXRlZCBjYXRhbG9nIGZ1bmN0aW9ucyAqLwo+ICt2b2lkIGRwX2NhdGFsb2df Y3RybF91cGRhdGVfdHJhbnNmZXJfdW5pdChzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKQo+ ICt7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ICsKPiArCWlmICgh Y3RybCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ ICsJfQoKVGhpcyBjaGVjayBpcyBkb25lIHRocm91Z2hvdXQgdGhpcyBmaWxlLiAgSSBoYXZlbid0 IHdvcmtlZCBteSB3YXkgdGhyb3VnaCBhbGwKdGhlIGNvZGUgeWV0IGFuZCBpdCBpcyBoYXJkIHRv IGF1ZGl0IGFsbCB0aGUgY2FsbGVycyBpbiBhIGVtYWlsIGNsaWVudApidXQgdGhpcyBzZWVtcyBs aWtlIG1vc3RseSBhIHNhbml0eSBjaGVjayBvbiB0aGUgZGV2ZWxvcGVyIGFuZCBub3QKYW4gYWN0 dWFsIHRoaW5nIHRoYXQgY2FuIGhhcHBlbiBhdCBydW50aW1lLiBJZiB0aGF0IGlzIHRoZSBjYXNl LCB5b3Ugc2hvdWxkIHNhdmUKeW91cnNlbGYgdGhlIGRvemVucyBhbmQgZG96ZW5zIG9mIGV4dHJh IGxpbmVzIGJ5IGVpdGhlciByZW1vdmluZyB0aGlzIG9yCmNoYW5naW5nIGl0OgoKIGlmICghV0FS Tl9PTihjdHJsKSkKICAgcmV0dXJuOwoKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYoY3RybCk7Cj4g Kwo+ICsJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfVkFMSURfQk9VTkRBUlksIGN0cmwt PnZhbGlkX2JvdW5kYXJ5KTsKPiArCWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX1RVLCBj dHJsLT5kcF90dSk7Cj4gKwlkcF93cml0ZV9saW5rKGNhdGFsb2csIFJFR19EUF9WQUxJRF9CT1VO REFSWV8yLCBjdHJsLT52YWxpZF9ib3VuZGFyeTIpOwo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFs b2dfY3RybF9zdGF0ZV9jdHJsKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIHUzMiBzdGF0 ZSkKPiArewo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKPiArCj4gKwlp ZiAoIWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVy bjsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ICsKPiArCWRwX3dy aXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX1NUQVRFX0NUUkwsIHN0YXRlKTsKPiArfQo+ICsKPiAr dm9pZCBkcF9jYXRhbG9nX2N0cmxfY29uZmlnX2N0cmwoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAq Y3RybCwgdTMyIGNmZykKPiArewo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxv ZzsKPiArCj4gKwlpZiAoIWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIp Owo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ ICsKPiArCURSTV9ERUJVR19EUCgiRFBfQ09ORklHVVJBVElPTl9DVFJMPTB4JXhcbiIsIGNmZyk7 Cj4gKwo+ICsJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfQ09ORklHVVJBVElPTl9DVFJM LCBjZmcpOwo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfY3RybF9sYW5lX21hcHBpbmcoc3Ry dWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCkKPiArewo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJp dmF0ZSAqY2F0YWxvZzsKPiArCXUzMiBsbl8wID0gMCwgbG5fMSA9IDEsIGxuXzIgPSAyLCBsbl8z ID0gMzsgLyogT25lLXRvLU9uZSBtYXBwaW5nICovCgpZb3UgY2FuIHNhZmVseSB1c2UgaW5saW5l IGNvbnN0YW50cyBpbiB0aGUgZm91ciBsaW5lcyBiZWxvdy4gVGhpcyBpcyBtdWNoIG1vcmUKY29u ZnVzaW5nLgoKPiArCXUzMiBsbl9tYXBwaW5nOwo+ICsKPiArCWlmICghY3RybCkgewo+ICsJCURS TV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRw X2NhdGFsb2dfZ2V0X3ByaXYoY3RybCk7Cj4gKwo+ICsJbG5fbWFwcGluZyA9IGxuXzAgPDwgTEFO RTBfTUFQUElOR19TSElGVDsKPiArCWxuX21hcHBpbmcgfD0gbG5fMSA8PCBMQU5FMV9NQVBQSU5H X1NISUZUOwo+ICsJbG5fbWFwcGluZyB8PSBsbl8yIDw8IExBTkUyX01BUFBJTkdfU0hJRlQ7Cj4g Kwlsbl9tYXBwaW5nIHw9IGxuXzMgPDwgTEFORTNfTUFQUElOR19TSElGVDsKPiArCj4gKwlkcF93 cml0ZV9saW5rKGNhdGFsb2csIFJFR19EUF9MT0dJQ0FMMlBIWVNJQ0FMX0xBTkVfTUFQUElORywg bG5fbWFwcGluZyk7Cj4gK30KPiArCj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX21haW5saW5rX2N0 cmwoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwKPiArCQkJCQkJYm9vbCBlbmFibGUpCj4g K3sKPiArCXUzMiBtYWlubGlua19jdHJsOwo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAq Y2F0YWxvZzsKPiArCj4gKwlpZiAoIWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5w dXRcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0 cmwpOwo+ICsKPiArCWlmIChlbmFibGUpIHsKPiArCQkvKgo+ICsJCSogVG8gbWFrZSBzdXJlIGxp bmsgcmVnIHdyaXRlcyBoYXBwZW5zIGJlZm9yZSBhbnkgb3RoZXIgb3BlcmF0aW9uLAo+ICsJCSog ZHBfd3JpdGVfbGluaygpIGZ1bmN0aW9uIHVzZXMgd3JpdGVsKCkgaW5zdHJlYWQgb2Ygd3JpdGVs X3JlbGF4ZWQoKQo+ICsJCSovCj4gKwkJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfTUFJ TkxJTktfQ1RSTCwgRFBfTUFJTkxJTktfRkJfQk9VTkRBUllfU0VMKTsKPiArCQlkcF93cml0ZV9s aW5rKGNhdGFsb2csIFJFR19EUF9NQUlOTElOS19DVFJMLAo+ICsJCQkJCURQX01BSU5MSU5LX0ZC X0JPVU5EQVJZX1NFTCB8IERQX01BSU5MSU5LX0NUUkxfUkVTRVQpOwo+ICsJCWRwX3dyaXRlX2xp bmsoY2F0YWxvZywgUkVHX0RQX01BSU5MSU5LX0NUUkwsIERQX01BSU5MSU5LX0ZCX0JPVU5EQVJZ X1NFTCk7Cj4gKwkJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfTUFJTkxJTktfQ1RSTCwK PiArCQkJCQlEUF9NQUlOTElOS19GQl9CT1VOREFSWV9TRUwgfCBEUF9NQUlOTElOS19DVFJMX0VO QUJMRSk7Cj4gKwl9IGVsc2Ugewo+ICsJCW1haW5saW5rX2N0cmwgPSBkcF9yZWFkX2xpbmsoY2F0 YWxvZywgUkVHX0RQX01BSU5MSU5LX0NUUkwpOwo+ICsJCW1haW5saW5rX2N0cmwgJj0gfkRQX01B SU5MSU5LX0NUUkxfRU5BQkxFOwo+ICsJCWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX01B SU5MSU5LX0NUUkwsIG1haW5saW5rX2N0cmwpOwo+ICsJfQo+ICt9Cj4gKwo+ICt2b2lkIGRwX2Nh dGFsb2dfY3RybF9jb25maWdfbWlzYyhzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLAo+ICsJ CQkJCXUzMiBjb2xvcmltZXRyeV9jZmcsIHUzMiB0ZXN0X2JpdHNfZGVwdGgpCj4gK3sKPiArCXUz MiBtaXNjX3ZhbDsKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwo+ ICsJaWYgKCFjdHJsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKPiArCj4gKwlt aXNjX3ZhbCA9IGRwX3JlYWRfbGluayhjYXRhbG9nLCBSRUdfRFBfTUlTQzFfTUlTQzApOwo+ICsJ bWlzY192YWwgfD0gY29sb3JpbWV0cnlfY2ZnIDw8IERQX01JU0MwX0NPTE9SSU1FVFJZX0NGR19T SElGVDsKPiArCW1pc2NfdmFsIHw9IHRlc3RfYml0c19kZXB0aCA8PCBEUF9NSVNDMF9URVNUX0JJ VFNfREVQVEhfU0hJRlQ7Cj4gKwkvKiBDb25maWd1cmUgY2xvY2sgdG8gc3luY2hyb25vdXMgbW9k ZSAqLwo+ICsJbWlzY192YWwgfD0gRFBfTUlTQzBfU1lOQ0hST05PVVNfQ0xLOwo+ICsKPiArCURS TV9ERUJVR19EUCgibWlzYyBzZXR0aW5ncyA9IDB4JXhcbiIsIG1pc2NfdmFsKTsKPiArCWRwX3dy aXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX01JU0MxX01JU0MwLCBtaXNjX3ZhbCk7Cj4gK30KPiAr Cj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX2NvbmZpZ19tc2Eoc3RydWN0IGRwX2NhdGFsb2dfY3Ry bCAqY3RybCwKPiArCQkJCQl1MzIgcmF0ZSwgdTMyIHN0cmVhbV9yYXRlX2toeiwKPiArCQkJCQli b29sIGZpeGVkX252aWQpCj4gK3sKPiArCXUzMiBwaXhlbF9tLCBwaXhlbF9uOwo+ICsJdTMyIG12 aWQsIG52aWQ7Cj4gKwl1NjQgbXZpZF9jYWxjOwo+ICsJdTMyIGNvbnN0IG52aWRfZml4ZWQgPSAw eDgwMDA7Cj4gKwl1MzIgY29uc3QgbGlua19yYXRlX2hicjIgPSA1NDAwMDA7Cj4gKwl1MzIgY29u c3QgbGlua19yYXRlX2hicjMgPSA4MTAwMDA7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRl ICpjYXRhbG9nOwo+ICsKPiArCWlmICghY3RybCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBp bnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYo Y3RybCk7Cj4gKwlpZiAoZml4ZWRfbnZpZCkgewo+ICsJCURSTV9ERUJVR19EUCgidXNlIGZpeGVk IE5WSUQ9MHgleFxuIiwgbnZpZF9maXhlZCk7Cj4gKwkJbnZpZCA9IG52aWRfZml4ZWQ7Cj4gKwo+ ICsJCURSTV9ERUJVR19EUCgibGluayByYXRlPSVka2Jwcywgc3RyZWFtX3JhdGVfa2h6PSV1S2h6 IiwKPiArCQkJcmF0ZSwgc3RyZWFtX3JhdGVfa2h6KTsKPiArCj4gKwkJLyoKPiArCQkgKiBGb3Ig aW50ZXJtZWRpYXRlIHJlc3VsdHMsIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBhdm9pZAo+ICsJ CSAqIGxvc3Mgb2YgcHJlY2lzaW9uLgo+ICsJCSAqLwo+ICsJCW12aWRfY2FsYyA9ICh1NjQpIHN0 cmVhbV9yYXRlX2toeiAqIG52aWQ7Cj4gKwkJbXZpZF9jYWxjID0gZGl2X3U2NChtdmlkX2NhbGMs IHJhdGUpOwo+ICsKPiArCQkvKgo+ICsJCSAqIHRydW5jYXRlIGJhY2sgdG8gMzIgYml0cyBhcyB0 aGlzIGZpbmFsIGRpdmlkZWQgdmFsdWUgd2lsbAo+ICsJCSAqIGFsd2F5cyBiZSB3aXRoaW4gdGhl IHJhbmdlIG9mIGEgMzIgYml0IHVuc2lnbmVkIGludC4KPiArCQkgKi8KPiArCQltdmlkID0gKHUz MikgbXZpZF9jYWxjOwo+ICsJfSBlbHNlIHsKPiArCQlwaXhlbF9tID0gZHBfcmVhZF9jYyhjYXRh bG9nLCBNTVNTX0RQX1BJWEVMX00pOwo+ICsJCXBpeGVsX24gPSBkcF9yZWFkX2NjKGNhdGFsb2cs IE1NU1NfRFBfUElYRUxfTik7Cj4gKwkJRFJNX0RFQlVHX0RQKCJwaXhlbF9tPTB4JXgsIHBpeGVs X249MHgleFxuIiwgcGl4ZWxfbSwgcGl4ZWxfbik7Cj4gKwo+ICsJCW12aWQgPSAocGl4ZWxfbSAm IDB4RkZGRikgKiA1Owo+ICsJCW52aWQgPSAoMHhGRkZGICYgKH5waXhlbF9uKSkgKyAocGl4ZWxf bSAmIDB4RkZGRik7Cj4gKwo+ICsJCURSTV9ERUJVR19EUCgicmF0ZSA9ICVkXG4iLCByYXRlKTsK PiArCj4gKwkJaWYgKGxpbmtfcmF0ZV9oYnIyID09IHJhdGUpCj4gKwkJCW52aWQgKj0gMjsKPiAr Cj4gKwkJaWYgKGxpbmtfcmF0ZV9oYnIzID09IHJhdGUpCj4gKwkJCW52aWQgKj0gMzsKPiArCX0K PiArCj4gKwlEUk1fREVCVUdfRFAoIm12aWQ9MHgleCwgbnZpZD0weCV4XG4iLCBtdmlkLCBudmlk KTsKPiArCWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX1NPRlRXQVJFX01WSUQsIG12aWQp Owo+ICsJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfU09GVFdBUkVfTlZJRCwgbnZpZCk7 Cj4gK30KPiArCj4gK2ludCBkcF9jYXRhbG9nX2N0cmxfc2V0X3BhdHRlcm4oc3RydWN0IGRwX2Nh dGFsb2dfY3RybCAqY3RybCwKPiArCQkJCQl1MzIgcGF0dGVybikKPiArewo+ICsJaW50IGJpdCwg cmV0Owo+ICsJdTMyIGRhdGE7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9n Owo+ICsKPiArCWlmICghY3RybCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7 Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihj dHJsKTsKPiArCj4gKwliaXQgPSBCSVQocGF0dGVybiAtIDEpOwo+ICsJRFJNX0RFQlVHX0RQKCJo dzogYml0PSVkIHRyYWluPSVkXG4iLCBiaXQsIHBhdHRlcm4pOwo+ICsJZHBfd3JpdGVfbGluayhj YXRhbG9nLCBSRUdfRFBfU1RBVEVfQ1RSTCwgYml0KTsKPiArCj4gKwliaXQgPSBCSVQocGF0dGVy biAtIDEpIDw8IERQX01BSU5MSU5LX1JFQURZX0xJTktfVFJBSU5JTkdfU0hJRlQ7Cj4gKwo+ICsJ LyogUG9sbCBmb3IgbWFpbmxpbmsgcmVhZHkgc3RhdHVzICovCj4gKwlyZXQgPSByZWFkeF9wb2xs X3RpbWVvdXQocmVhZGwsIGNhdGFsb2ctPmlvLT5kcF9saW5rLmJhc2UgKyBSRUdfRFBfTUFJTkxJ TktfUkVBRFksCj4gKwkJCQkgZGF0YSwgZGF0YSAmIGJpdCwKPiArCQkJCSBQT0xMSU5HX1NMRUVQ X1VTLCBQT0xMSU5HX1RJTUVPVVRfVVMpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlEUk1fRVJS T1IoInNldCBwYXR0ZXJuIGZvciBsaW5rX3RyYWluPSVkIGZhaWxlZFxuIiwgcGF0dGVybik7Cj4g KwkJcmV0dXJuIHJldDsKCllvdSBkb24ndCBuZWVkIHJldHVybiByZXQsIGp1c3QgZHJvcCBvdXQg YW5kIHRoZW4gcmV0dXJuIHJldCBhdCB0aGUgYm90dG9tIG9mCnRoZSBmdW5jdGlvbi4KCj4gKwl9 Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArdm9pZCBkcF9jYXRhbG9nX2N0cmxfdXNiX3Jlc2V0 KHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZmxpcCkKPiArewo+ICsJc3RydWN0 IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKPiArCj4gKwlpZiAoIWN0cmwpIHsKPiArCQlE Uk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlk cF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ICsKPiArCWRwX3dyaXRlX3VzYl9jbShjYXRhbG9n LCBSRUdfVVNCM19EUF9DT01fUkVTRVRfT1ZSRF9DVFJMLAo+ICsJCQlVU0IzX0RQX0NPTV9PVlJE X0NUUkxfU1dfRFBQSFlfUkVTRVRfTVVYIHwKPiArCQkJVVNCM19EUF9DT01fT1ZSRF9DVFJMX1NX X1VTQjNQSFlfUkVTRVRfTVVYKTsKPiArCWRwX3dyaXRlX3VzYl9jbShjYXRhbG9nLCBSRUdfVVNC M19EUF9DT01fUEhZX01PREVfQ1RSTCwKPiArCQkJCQkJVVNCM19EUF9DT01fUEhZX01PREVfRFAp Owo+ICsJZHBfd3JpdGVfdXNiX2NtKGNhdGFsb2csIFJFR19VU0IzX0RQX0NPTV9TV19SRVNFVCwK PiArCQkJCQkJVVNCM19EUF9DT01fU1dfUkVTRVRfU0VUKTsKPiArCj4gKwlpZiAoIWZsaXApIC8q IENDMSAqLwo+ICsJCWRwX3dyaXRlX3VzYl9jbShjYXRhbG9nLCBSRUdfVVNCM19EUF9DT01fVFlQ RUNfQ1RSTCwKPiArCQkJCQlVU0IzX0RQX0NPTV9UWVBFQ19DVFJMX1BPUlRTRUxfTVVYKTsKPiAr CWVsc2UgLyogQ0MyICovCj4gKwkJZHBfd3JpdGVfdXNiX2NtKGNhdGFsb2csIFJFR19VU0IzX0RQ X0NPTV9UWVBFQ19DVFJMLAo+ICsJCQkJCVVTQjNfRFBfQ09NX1RZUEVDX0NUUkxfUE9SVFNFTF9N VVggfAo+ICsJCQkJCVVTQjNfRFBfQ09NX1RZUEVDX0NUUkxfUE9SVFNFTCk7Cj4gKwo+ICsJZHBf d3JpdGVfdXNiX2NtKGNhdGFsb2csIFJFR19VU0IzX0RQX0NPTV9TV0lfQ1RSTCwgMHgwMCk7Cj4g KwlkcF93cml0ZV91c2JfY20oY2F0YWxvZywgUkVHX1VTQjNfRFBfQ09NX1NXX1JFU0VULCAweDAw KTsKPiArCj4gKwlkcF93cml0ZV91c2JfY20oY2F0YWxvZywgUkVHX1VTQjNfRFBfQ09NX1BPV0VS X0RPV05fQ1RSTCwKPiArCQkJCQkJVVNCM19EUF9DT01fUE9XRVJfRE9XTl9DVFJMX1NXX1BXUkRO KTsKPiArCWRwX3dyaXRlX3VzYl9jbShjYXRhbG9nLCBSRUdfVVNCM19EUF9DT01fUkVTRVRfT1ZS RF9DVFJMLCAweDAwKTsKPiArCj4gK30KPiArCj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX3Jlc2V0 KHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpCj4gK3sKPiArCXUzMiBzd19yZXNldDsKPiAr CXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwl2b2lkIF9faW9tZW0gKmJh c2U7Cj4gKwo+ICsJaWYgKCFjdHJsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4i KTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsK PiArCWJhc2UgPSBjYXRhbG9nLT5pby0+ZHBfYWhiLmJhc2U7CgpCYXNlIGFwcGVhcnMgdG8gYmUg dW51c2VkIGhlcmUuCgo+ICsKPiArCXN3X3Jlc2V0ID0gZHBfcmVhZF9haGIoY2F0YWxvZywgUkVH X0RQX1NXX1JFU0VUKTsKPiArCj4gKwlzd19yZXNldCB8PSBEUF9TV19SRVNFVDsKPiArCWRwX3dy aXRlX2FoYihjYXRhbG9nLCBSRUdfRFBfU1dfUkVTRVQsIHN3X3Jlc2V0KTsKPiArCXVzbGVlcF9y YW5nZSgxMDAwLCAxMTAwKTsgLyogaC93IHJlY29tbWVuZGVkIGRlbGF5ICovCj4gKwo+ICsJc3df cmVzZXQgJj0gfkRQX1NXX1JFU0VUOwo+ICsJZHBfd3JpdGVfYWhiKGNhdGFsb2csIFJFR19EUF9T V19SRVNFVCwgc3dfcmVzZXQpOwo+ICt9Cj4gKwo+ICtib29sIGRwX2NhdGFsb2dfY3RybF9tYWlu bGlua19yZWFkeShzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKQo+ICt7Cj4gKwl1MzIgZGF0 YTsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ ICsKPiArCWlmICghY3RybCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4g KwkJcmV0dXJuIGZhbHNlOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYoY3RybCk7 Cj4gKwo+ICsJLyogUG9sbCBmb3IgbWFpbmxpbmsgcmVhZHkgc3RhdHVzICovCj4gKwlyZXQgPSBy ZWFkeF9wb2xsX3RpbWVvdXQocmVhZGwsCj4gKwkJCQkgY2F0YWxvZy0+aW8tPmRwX2xpbmsuYmFz ZSArIFJFR19EUF9NQUlOTElOS19SRUFEWSwKPiArCQkJCSBkYXRhLCBkYXRhICYgRFBfTUFJTkxJ TktfUkVBRFlfRk9SX1ZJREVPLAo+ICsJCQkJIFBPTExJTkdfU0xFRVBfVVMsIFBPTExJTkdfVElN RU9VVF9VUyk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9FUlJPUigibWFpbmxpbmsgbm90 IHJlYWR5XG4iKTsKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHRydWU7 Cj4gK30KPiArCj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX2VuYWJsZV9pcnEoc3RydWN0IGRwX2Nh dGFsb2dfY3RybCAqY3RybCwKPiArCQkJCQkJYm9vbCBlbmFibGUpCj4gK3sKPiArCXN0cnVjdCBk cF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwl2b2lkIF9faW9tZW0gKmJhc2U7Cj4gKwo+ ICsJaWYgKCFjdHJsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKPiArCWJhc2Ug PSBjYXRhbG9nLT5pby0+ZHBfYWhiLmJhc2U7CgpiYXNlIGFsc28gYXBwZWFycyB0byBiZSB1bnVz ZWQgaGVyZS4KCj4gKwo+ICsJaWYgKGVuYWJsZSkgewo+ICsJCWRwX3dyaXRlX2FoYihjYXRhbG9n LCBSRUdfRFBfSU5UUl9TVEFUVVMsIERQX0lOVEVSUlVQVF9TVEFUVVMxX01BU0spOwo+ICsJCWRw X3dyaXRlX2FoYihjYXRhbG9nLCBSRUdfRFBfSU5UUl9TVEFUVVMyLCBEUF9JTlRFUlJVUFRfU1RB VFVTMl9NQVNLKTsKPiArCX0gZWxzZSB7Cj4gKwkJZHBfd3JpdGVfYWhiKGNhdGFsb2csIFJFR19E UF9JTlRSX1NUQVRVUywgMHgwMCk7Cj4gKwkJZHBfd3JpdGVfYWhiKGNhdGFsb2csIFJFR19EUF9J TlRSX1NUQVRVUzIsIDB4MDApOwo+ICsJfQo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfY3Ry bF9ocGRfY29uZmlnKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZW4pCj4gK3sK PiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwo+ICsJaWYgKCFjdHJs KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9 Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKPiArCj4gKwlpZiAoZW4pIHsKPiAr CQl1MzIgcmVmdGltZXIgPSBkcF9yZWFkX2F1eChjYXRhbG9nLCBSRUdfRFBfRFBfSFBEX1JFRlRJ TUVSKTsKPiArCj4gKwkJZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19EUF9EUF9IUERfSU5UX0FD SywKPiArCQkJCURQX0RQX0hQRF9QTFVHX0lOVF9BQ0sgfCBEUF9EUF9JUlFfSFBEX0lOVF9BQ0sg fAo+ICsJCQkJRFBfRFBfSFBEX1JFUExVR19JTlRfQUNLIHwgRFBfRFBfSFBEX1VOUExVR19JTlRf QUNLKTsKPiArCQlkcF93cml0ZV9hdXgoY2F0YWxvZywgUkVHX0RQX0RQX0hQRF9JTlRfTUFTSywK PiArCQkJCURQX0RQX0hQRF9QTFVHX0lOVF9NQVNLIHwgRFBfRFBfSVJRX0hQRF9JTlRfTUFTSyB8 Cj4gKwkJCQlEUF9EUF9IUERfUkVQTFVHX0lOVF9NQVNLIHwgRFBfRFBfSFBEX1VOUExVR19JTlRf TUFTSyk7Cj4gKwo+ICsJCS8qIENvbmZpZ3VyZSBSRUZUSU1FUiAqLwo+ICsJCXJlZnRpbWVyIHw9 IFJFRlRJTUVSX0RFRkFVTFRfVkFMVUU7Cj4gKwkJZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19E UF9EUF9IUERfUkVGVElNRVIsIHJlZnRpbWVyKTsKPiArCQkvKiBFbmFibGUgSFBEICovCj4gKwkJ ZHBfd3JpdGVfYXV4KGNhdGFsb2csIFJFR19EUF9EUF9IUERfQ1RSTCwgRFBfRFBfSFBEX0NUUkxf SFBEX0VOKTsKPiArCX0gZWxzZSB7Cj4gKwkJLyogRGlzYWJsZSBIUEQgKi8KPiArCQlkcF93cml0 ZV9hdXgoY2F0YWxvZywgUkVHX0RQX0RQX0hQRF9DVFJMLCAweDApOwo+ICsJfQo+ICt9Cj4gKwo+ ICt2b2lkIGRwX2NhdGFsb2dfY3RybF9nZXRfaW50ZXJydXB0KHN0cnVjdCBkcF9jYXRhbG9nX2N0 cmwgKmN0cmwpCj4gK3sKPiArCXUzMiBhY2sgPSAwOwo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJp dmF0ZSAqY2F0YWxvZzsKPiArCj4gKwlpZiAoIWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFs aWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9w cml2KGN0cmwpOwo+ICsKPiArCWN0cmwtPmlzciA9IGRwX3JlYWRfYWhiKGNhdGFsb2csIFJFR19E UF9JTlRSX1NUQVRVUzIpOwo+ICsJY3RybC0+aXNyICY9IH5EUF9JTlRFUlJVUFRfU1RBVFVTMl9N QVNLOwo+ICsJYWNrID0gY3RybC0+aXNyICYgRFBfSU5URVJSVVBUX1NUQVRVUzI7Cj4gKwlhY2sg PDw9IDE7Cj4gKwlhY2sgfD0gRFBfSU5URVJSVVBUX1NUQVRVUzJfTUFTSzsKPiArCWRwX3dyaXRl X2FoYihjYXRhbG9nLCBSRUdfRFBfSU5UUl9TVEFUVVMyLCBhY2spOwo+ICt9Cj4gKwo+ICt2b2lk IGRwX2NhdGFsb2dfY3RybF9waHlfcmVzZXQoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCkK PiArewo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKPiArCj4gKwlpZiAo IWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybjsK PiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ICsKPiArCWRwX3dyaXRl X2FoYihjYXRhbG9nLCBSRUdfRFBfUEhZX0NUUkwsCj4gKwkJCURQX1BIWV9DVFJMX1NXX1JFU0VU X1BMTCB8IERQX1BIWV9DVFJMX1NXX1JFU0VUKTsKPiArCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAw KTsgLyogaC93IHJlY29tbWVuZGVkIGRlbGF5ICovCj4gKwlkcF93cml0ZV9haGIoY2F0YWxvZywg UkVHX0RQX1BIWV9DVFJMLCAweDApOwo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfY3RybF9w aHlfbGFuZV9jZmcoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwKPiArCQlib29sIGZsaXBw ZWQsIHU4IGxuX2NudCkKPiArewo+ICsJdTMyIGluZm8gPSAweDA7Cj4gKwlzdHJ1Y3QgZHBfY2F0 YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ICsJdTggb3JpZW50YXRpb24gPSBCSVQoISFmbGlwcGVk KTsKPiArCj4gKwlpZiAoIWN0cmwpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIp Owo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ ICsKPiArCWluZm8gPSBsbl9jbnQgJiBEUF9QSFlfU1BBUkUwX01BU0s7Cj4gKwlpbmZvIHw9IChv cmllbnRhdGlvbiAmIERQX1BIWV9TUEFSRTBfTUFTSykgPDwgRFBfUEhZX1NQQVJFMF9PUklFTlRB VElPTl9JTkZPX1NISUZUOwo+ICsJRFJNX0RFQlVHX0RQKCJTaGFyZWQgSW5mbyA9IDB4JXhcbiIs IGluZm8pOwo+ICsKPiArCWRwX3dyaXRlX3BoeShjYXRhbG9nLCBSRUdfRFBfUEhZX1NQQVJFMCwg aW5mbyk7Cj4gK30KPiArCj4gK2ludCBkcF9jYXRhbG9nX2N0cmxfdXBkYXRlX3Z4X3B4KHN0cnVj dCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsCj4gKwkJdTggdl9sZXZlbCwgdTggcF9sZXZlbCkKPiAr ewo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKPiArCXU4IHZhbHVlMCwg dmFsdWUxOwo+ICsKPiArCWlmICghY3RybCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1 dFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxvZ19nZXRf cHJpdihjdHJsKTsKPiArCj4gKwlEUk1fREVCVUdfRFAoImh3OiB2PSVkIHA9JWRcbiIsIHZfbGV2 ZWwsIHBfbGV2ZWwpOwo+ICsKPiArCXZhbHVlMCA9IHZtX3ZvbHRhZ2Vfc3dpbmdbdl9sZXZlbF1b cF9sZXZlbF07Cj4gKwl2YWx1ZTEgPSB2bV9wcmVfZW1waGFzaXNbdl9sZXZlbF1bcF9sZXZlbF07 Cj4gKwo+ICsJaWYgKHZhbHVlMCA9PSAweEZGICYmIHZhbHVlMSA9PSAweEZGKSB7Cj4gKwkJRFJN X0VSUk9SKCJpbnZhbGlkIHZ4ICgweCV4PTB4JXgpLCBweCAoMHgleD0weCV4XG4iLAo+ICsJCQl2 X2xldmVsLCB2YWx1ZTAsIHBfbGV2ZWwsIHZhbHVlMSk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4g Kwl9Cj4gKwkvKiBwcm9ncmFtIGRlZmF1bHQgc2V0dGluZyBmaXJzdCAqLwo+ICsJZHBfd3JpdGVf bG5fdHgwKGNhdGFsb2csIFRYbl9UWF9EUlZfTFZMLCAweDJBKTsKPiArCWRwX3dyaXRlX2xuX3R4 MShjYXRhbG9nLCBUWG5fVFhfRFJWX0xWTCwgMHgyQSk7Cj4gKwlkcF93cml0ZV9sbl90eDAoY2F0 YWxvZywgVFhuX1RYX0VNUF9QT1NUMV9MVkwsIDB4MjApOwo+ICsJZHBfd3JpdGVfbG5fdHgxKGNh dGFsb2csIFRYbl9UWF9FTVBfUE9TVDFfTFZMLCAweDIwKTsKPiArCj4gKwkvKiBFbmFibGUgTVVY IHRvIHVzZSBDdXJzb3IgdmFsdWVzIGZyb20gdGhlc2UgcmVnaXN0ZXJzICovCj4gKwl2YWx1ZTAg fD0gQklUKDUpOwo+ICsJdmFsdWUxIHw9IEJJVCg1KTsKPiArCj4gKwkvKiBDb25maWd1cmUgaG9z dCBhbmQgcGFuZWwgb25seSBpZiBib3RoIHZhbHVlcyBhcmUgYWxsb3dlZCAqLwo+ICsJZHBfd3Jp dGVfbG5fdHgwKGNhdGFsb2csIFRYbl9UWF9EUlZfTFZMLCB2YWx1ZTApOwo+ICsJZHBfd3JpdGVf bG5fdHgxKGNhdGFsb2csIFRYbl9UWF9EUlZfTFZMLCB2YWx1ZTApOwo+ICsJZHBfd3JpdGVfbG5f dHgwKGNhdGFsb2csIFRYbl9UWF9FTVBfUE9TVDFfTFZMLCB2YWx1ZTEpOwo+ICsJZHBfd3JpdGVf bG5fdHgxKGNhdGFsb2csIFRYbl9UWF9FTVBfUE9TVDFfTFZMLCB2YWx1ZTEpOwo+ICsJRFJNX0RF QlVHX0RQKCJodzogdnhfdmFsdWU9MHgleCBweF92YWx1ZT0weCV4XG4iLAo+ICsJCQl2YWx1ZTAs IHZhbHVlMSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3ZvaWQgZHBfY2F0YWxvZ19j dHJsX3NlbmRfcGh5X3BhdHRlcm4oc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwKPiArCQkJ dTMyIHBhdHRlcm4pCj4gK3sKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7 Cj4gKwl1MzIgdmFsdWUgPSAweDA7Cj4gKwo+ICsJaWYgKCFjdHJsKSB7Cj4gKwkJRFJNX0VSUk9S KCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0YWxv Z19nZXRfcHJpdihjdHJsKTsKPiArCj4gKwkvKiBNYWtlIHN1cmUgdG8gY2xlYXIgdGhlIGN1cnJl bnQgcGF0dGVybiBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgb25lICovCj4gKwlkcF93cml0ZV9saW5r KGNhdGFsb2csIFJFR19EUF9TVEFURV9DVFJMLCAweDApOwo+ICsKPiArCXN3aXRjaCAocGF0dGVy bikgewo+ICsJY2FzZSBEUF9MSU5LX1FVQUxfUEFUVEVSTl9EMTBfMjoKPiArCQlkcF93cml0ZV9s aW5rKGNhdGFsb2csIFJFR19EUF9TVEFURV9DVFJMLCBEUF9TVEFURV9DVFJMX0xJTktfVFJBSU5J TkdfUEFUVEVSTjEpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9MSU5LX1FVQUxfUEFUVEVSTl9F UlJPUl9SQVRFOgo+ICsJCXZhbHVlICY9IH5EUF9IQlIyX0VSTV9QQVRURVJOOwo+ICsJCWRwX3dy aXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX0hCUjJfQ09NUExJQU5DRV9TQ1JBTUJMRVJfUkVTRVQs IHZhbHVlKTsKPiArCQl2YWx1ZSB8PSBTQ1JBTUJMRVJfUkVTRVRfQ09VTlRfVkFMVUU7Cj4gKwkJ ZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdfRFBfSEJSMl9DT01QTElBTkNFX1NDUkFNQkxFUl9S RVNFVCwgdmFsdWUpOwo+ICsJCWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX01BSU5MSU5L X0xFVkVMUywgRFBfTUFJTkxJTktfU0FGRV9UT19FWElUX0xFVkVMXzIpOwo+ICsJCWRwX3dyaXRl X2xpbmsoY2F0YWxvZywgUkVHX0RQX1NUQVRFX0NUUkwsIERQX1NUQVRFX0NUUkxfTElOS19TWU1C T0xfRVJSX01FQVNVUkUpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9MSU5LX1FVQUxfUEFUVEVS Tl9QUkJTNzoKPiArCQlkcF93cml0ZV9saW5rKGNhdGFsb2csIFJFR19EUF9TVEFURV9DVFJMLCBE UF9TVEFURV9DVFJMX0xJTktfUFJCUzcpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9MSU5LX1FV QUxfUEFUVEVSTl84MEJJVF9DVVNUT006Cj4gKwkJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdf RFBfU1RBVEVfQ1RSTCwgRFBfU1RBVEVfQ1RSTF9MSU5LX1RFU1RfQ1VTVE9NX1BBVFRFUk4pOwo+ ICsJCS8qIDAwMTExMTEwMDAwMDExMTExMDAwMDAxMTExMTAwMDAwICovCj4gKwkJZHBfd3JpdGVf bGluayhjYXRhbG9nLCBSRUdfRFBfVEVTVF84MEJJVF9DVVNUT01fUEFUVEVSTl9SRUcwLCAweDNF MEY4M0UwKTsKPiArCQkvKiAwMDAwMTExMTEwMDAwMDExMTExMDAwMDAxMTExMTAwMCAqLwo+ICsJ CWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX1RFU1RfODBCSVRfQ1VTVE9NX1BBVFRFUk5f UkVHMSwgMHgwRjgzRTBGOCk7Cj4gKwkJLyogMTExMTEwMDAwMDExMTExMCAqLwo+ICsJCWRwX3dy aXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX1RFU1RfODBCSVRfQ1VTVE9NX1BBVFRFUk5fUkVHMiwg MHgwMDAwRjgzRSk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIERQX0xJTktfUVVBTF9QQVRURVJOX0hC UjJfRVlFOgo+ICsJCXZhbHVlID0gRFBfSEJSMl9FUk1fUEFUVEVSTjsKPiArCQlkcF93cml0ZV9s aW5rKGNhdGFsb2csIFJFR19EUF9IQlIyX0NPTVBMSUFOQ0VfU0NSQU1CTEVSX1JFU0VULCB2YWx1 ZSk7Cj4gKwkJdmFsdWUgfD0gU0NSQU1CTEVSX1JFU0VUX0NPVU5UX1ZBTFVFOwo+ICsJCWRwX3dy aXRlX2xpbmsoY2F0YWxvZywgUkVHX0RQX0hCUjJfQ09NUExJQU5DRV9TQ1JBTUJMRVJfUkVTRVQs IHZhbHVlKTsKPiArCQlkcF93cml0ZV9saW5rKGNhdGFsb2csIFJFR19EUF9NQUlOTElOS19MRVZF TFMsIERQX01BSU5MSU5LX1NBRkVfVE9fRVhJVF9MRVZFTF8yKTsKPiArCQlkcF93cml0ZV9saW5r KGNhdGFsb2csIFJFR19EUF9TVEFURV9DVFJMLCBEUF9TVEFURV9DVFJMX0xJTktfU1lNQk9MX0VS Ul9NRUFTVVJFKTsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJRFJNX0RFQlVHX0RQKCJO byB2YWxpZCB0ZXN0IHBhdHRlcm4gcmVxdWVzdGVkOiAweCV4XG4iLCBwYXR0ZXJuKTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gK30KPiArCj4gK3UzMiBkcF9jYXRhbG9nX2N0cmxfcmVhZF9waHlfcGF0 dGVybihzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfY2F0 YWxvZ19wcml2YXRlICpjYXRhbG9nOwo+ICsKPiArCWlmICghY3RybCkgewo+ICsJCURSTV9FUlJP UigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0 YWxvZ19nZXRfcHJpdihjdHJsKTsKPiArCj4gKwlyZXR1cm4gZHBfcmVhZF9saW5rKGNhdGFsb2cs IFJFR19EUF9NQUlOTElOS19SRUFEWSk7Cj4gK30KPiArCj4gKy8qIHBhbmVsIHJlbGF0ZWQgY2F0 YWxvZyBmdW5jdGlvbnMgKi8KPiAraW50IGRwX2NhdGFsb2dfcGFuZWxfdGltaW5nX2NmZyhzdHJ1 Y3QgZHBfY2F0YWxvZ19wYW5lbCAqcGFuZWwpCj4gK3sKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3By aXZhdGUgKmNhdGFsb2c7Cj4gKwo+ICsJaWYgKCFwYW5lbCkgewo+ICsJCURSTV9FUlJPUigiaW52 YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJZHBfY2F0 YWxvZ19nZXRfcHJpdihwYW5lbCk7Cj4gKwo+ICsJZHBfd3JpdGVfbGluayhjYXRhbG9nLCBSRUdf RFBfVE9UQUxfSE9SX1ZFUiwgcGFuZWwtPnRvdGFsKTsKPiArCWRwX3dyaXRlX2xpbmsoY2F0YWxv ZywgUkVHX0RQX1NUQVJUX0hPUl9WRVJfRlJPTV9TWU5DLCBwYW5lbC0+c3luY19zdGFydCk7Cj4g KwlkcF93cml0ZV9saW5rKGNhdGFsb2csIFJFR19EUF9IU1lOQ19WU1lOQ19XSURUSF9QT0xBUklU WSwgcGFuZWwtPndpZHRoX2JsYW5raW5nKTsKPiArCWRwX3dyaXRlX2xpbmsoY2F0YWxvZywgUkVH X0RQX0FDVElWRV9IT1JfVkVSLCBwYW5lbC0+ZHBfYWN0aXZlKTsKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfcGFuZWxfdHBnX2VuYWJsZShzdHJ1Y3QgZHBfY2F0YWxv Z19wYW5lbCAqcGFuZWwpCj4gK3sKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFs b2c7Cj4gKwo+ICsJaWYgKCFwYW5lbCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxu Iik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYocGFuZWwp Owo+ICsKPiArCWRwX3dyaXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfSU5URl9DT05GSUcsIDB4MCk7 Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lOVEZfSFNZTkNfQ1RMLCBwYW5lbC0+ aHN5bmNfY3RsKTsKPiArCWRwX3dyaXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfSU5URl9WU1lOQ19Q RVJJT0RfRjAsIHBhbmVsLT52c3luY19wZXJpb2QgKgo+ICsJCQlwYW5lbC0+aHN5bmNfcGVyaW9k KTsKPiArCWRwX3dyaXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfSU5URl9WU1lOQ19QVUxTRV9XSURU SF9GMCwgcGFuZWwtPnZfc3luY193aWR0aCAqCj4gKwkJCXBhbmVsLT5oc3luY19wZXJpb2QpOwo+ ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19EUF9JTlRGX1ZTWU5DX1BFUklPRF9GMSwgMCk7 Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lOVEZfVlNZTkNfUFVMU0VfV0lEVEhf RjEsIDApOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19EUF9JTlRGX0RJU1BMQVlfSENU TCwgcGFuZWwtPmRpc3BsYXlfaGN0bCk7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQ X0lOVEZfQUNUSVZFX0hDVEwsIDApOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19JTlRG X0RJU1BMQVlfVl9TVEFSVF9GMCwgcGFuZWwtPmRpc3BsYXlfdl9zdGFydCk7Cj4gKwlkcF93cml0 ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lOVEZfRElTUExBWV9WX0VORF9GMCwgcGFuZWwtPmRpc3Bs YXlfdl9lbmQpOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19JTlRGX0RJU1BMQVlfVl9T VEFSVF9GMSwgMCk7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lOVEZfRElTUExB WV9WX0VORF9GMSwgMCk7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lOVEZfQUNU SVZFX1ZfU1RBUlRfRjAsIDApOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19EUF9JTlRG X0FDVElWRV9WX0VORF9GMCwgMCk7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0lO VEZfQUNUSVZFX1ZfU1RBUlRfRjEsIDApOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19E UF9JTlRGX0FDVElWRV9WX0VORF9GMSwgMCk7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNT X0RQX0lOVEZfUE9MQVJJVFlfQ1RMLCAwKTsKPiArCj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBN TVNTX0RQX1RQR19NQUlOX0NPTlRST0wsIERQX1RQR19DSEVDS0VSRURfUkVDVF9QQVRURVJOKTsK PiArCWRwX3dyaXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfVFBHX1ZJREVPX0NPTkZJRywKPiArCQkJ CQlEUF9UUEdfVklERU9fQ09ORklHX0JQUF84QklUIHwKPiArCQkJCQlEUF9UUEdfVklERU9fQ09O RklHX1JHQik7Cj4gKwlkcF93cml0ZV9wMChjYXRhbG9nLCBNTVNTX0RQX0JJU1RfRU5BQkxFLCBE UF9CSVNUX0VOQUJMRV9EUEJJU1RfRU4pOwo+ICsJZHBfd3JpdGVfcDAoY2F0YWxvZywgTU1TU19E UF9USU1JTkdfRU5HSU5FX0VOLCBEUF9USU1JTkdfRU5HSU5FX0VOX0VOKTsKPiArCURSTV9ERUJV R19EUCgiJXM6IGVuYWJsZWQgdHBnXG4iLCBfX2Z1bmNfXyk7Cj4gK30KPiArCj4gK3ZvaWQgZHBf Y2F0YWxvZ19wYW5lbF90cGdfZGlzYWJsZShzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqcGFuZWwp Cj4gK3sKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7Cj4gKwo+ICsJaWYg KCFwYW5lbCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJu Owo+ICsJfQo+ICsKPiArCWRwX2NhdGFsb2dfZ2V0X3ByaXYocGFuZWwpOwo+ICsKPiArCWRwX3dy aXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfVFBHX01BSU5fQ09OVFJPTCwgMHgwKTsKPiArCWRwX3dy aXRlX3AwKGNhdGFsb2csIE1NU1NfRFBfQklTVF9FTkFCTEUsIDB4MCk7Cj4gKwlkcF93cml0ZV9w MChjYXRhbG9nLCBNTVNTX0RQX1RJTUlOR19FTkdJTkVfRU4sIDB4MCk7Cj4gKwlyZXR1cm47CgpE b24ndCBuZWVkIGEgYmFyZSByZXR1cm4gYXQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24uCgo+ ICt9Cj4gKwo+ICtzdHJ1Y3QgZHBfY2F0YWxvZyAqZHBfY2F0YWxvZ19nZXQoc3RydWN0IGRldmlj ZSAqZGV2LCBzdHJ1Y3QgZHBfaW8gKmlvKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0 IGRwX2NhdGFsb2cgKmRwX2NhdGFsb2c7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpj YXRhbG9nOwo+ICsKPiArCWlmICghaW8pIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRc biIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwoKVGhpcyBjYW4ganVzdCBi ZSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKSBhc3N1bWluZyB0aGF0IGlvIGJlaW5nIE5VTEwgaXMg YW4KYWN0dWFsIHRoaW5nIHRoYXQgY2FuIGhhcHBlbiBhdCBydW4gdGltZSBhbmQgbm90IGp1c3Qg YSBkZXZlbG9wZXIgZ29vZi4KCj4gKwl9Cj4gKwo+ICsJY2F0YWxvZyAgPSBkZXZtX2t6YWxsb2Mo ZGV2LCBzaXplb2YoKmNhdGFsb2cpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghY2F0YWxvZykgewo+ ICsJCXJjID0gLUVOT01FTTsKPiArCQlnb3RvIGVycm9yOwoKcmV0dXJuIEVSUl9QVFIoLUVOT01F TSkKCj4gKwl9Cj4gKwo+ICsJY2F0YWxvZy0+ZGV2ID0gZGV2Owo+ICsJY2F0YWxvZy0+aW8gPSBp bzsKPiArCj4gKwlkcF9jYXRhbG9nID0gJmNhdGFsb2ctPmRwX2NhdGFsb2c7Cj4gKwo+ICsJcmV0 dXJuIGRwX2NhdGFsb2c7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIEVSUl9QVFIocmMpOwoKQW5kIHRo ZW4gdGhlIGxhYmVsIGlzbid0IG5lZWRlZAo+ICt9Cj4gKwo+ICt2b2lkIGRwX2NhdGFsb2dfcHV0 KHN0cnVjdCBkcF9jYXRhbG9nICpkcF9jYXRhbG9nKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxv Z19wcml2YXRlICpjYXRhbG9nOwo+ICsKPiArCWlmICghZHBfY2F0YWxvZykKPiArCQlyZXR1cm47 Cj4gKwo+ICsJY2F0YWxvZyA9IGNvbnRhaW5lcl9vZihkcF9jYXRhbG9nLCBzdHJ1Y3QgZHBfY2F0 YWxvZ19wcml2YXRlLAo+ICsJCQkJZHBfY2F0YWxvZyk7Cj4gKwo+ICsJZGV2bV9rZnJlZShjYXRh bG9nLT5kZXYsIGNhdGFsb2cpOwoKCkFzIGFib3ZlLCBkZXZtX2tmcmVlIHNob3VsZG4ndCBuZWVk IHRvIGJlIGNhbGxlZCBvbiBtZW1vcnkgdGhhdCBpcyBhYm91dCB0byBiZQpjbGVhbmVkIHVwIGJ5 IHRoZSBjb21wb25lbnQgb3IgdGhlIGRldmljZSBzbyBhc3N1bWluZyB0aGlzIGlzIGEgcGVyc2lz dGVudAptZW1vcnkgb2JqZWN0IGZvciB0aGUgbGlmZSBvZiB0aGUgY29tcG9uZW50IHRoaXMgZW50 aXJlIGZ1bmN0aW9uIGNhbiBnbyB3YXkuCgo+ICt9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jYXRh bG9nLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjY1MDkzMTAKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jYXRhbG9nLmgK PiBAQCAtMCwwICsxLDEwOCBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MC1vbmx5ICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDE5LCBUaGUgTGludXgg Rm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICovCj4gKwo+ICsjaWZuZGVmIF9E UF9DQVRBTE9HX0hfCj4gKyNkZWZpbmUgX0RQX0NBVEFMT0dfSF8KPiArCj4gKyNpbmNsdWRlICJk cF9wYXJzZXIuaCIKPiArCj4gKy8qIGludGVycnVwdHMgKi8KPiArI2RlZmluZSBEUF9JTlRSX0hQ RAkJQklUKDApCj4gKyNkZWZpbmUgRFBfSU5UUl9BVVhfSTJDX0RPTkUJQklUKDMpCj4gKyNkZWZp bmUgRFBfSU5UUl9XUk9OR19BRERSCUJJVCg2KQo+ICsjZGVmaW5lIERQX0lOVFJfVElNRU9VVAkJ QklUKDkpCj4gKyNkZWZpbmUgRFBfSU5UUl9OQUNLX0RFRkVSCUJJVCgxMikKPiArI2RlZmluZSBE UF9JTlRSX1dST05HX0RBVEFfQ05UCUJJVCgxNSkKPiArI2RlZmluZSBEUF9JTlRSX0kyQ19OQUNL CUJJVCgxOCkKPiArI2RlZmluZSBEUF9JTlRSX0kyQ19ERUZFUglCSVQoMjEpCj4gKyNkZWZpbmUg RFBfSU5UUl9QTExfVU5MT0NLRUQJQklUKDI0KQo+ICsjZGVmaW5lIERQX0lOVFJfQVVYX0VSUk9S CUJJVCgyNykKPiArCj4gKyNkZWZpbmUgRFBfSU5UUl9SRUFEWV9GT1JfVklERU8JCUJJVCgwKQo+ ICsjZGVmaW5lIERQX0lOVFJfSURMRV9QQVRURVJOX1NFTlQJQklUKDMpCj4gKyNkZWZpbmUgRFBf SU5UUl9GUkFNRV9FTkQJCUJJVCg2KQo+ICsjZGVmaW5lIERQX0lOVFJfQ1JDX1VQREFURUQJCUJJ VCg5KQo+ICsKPiArc3RydWN0IGRwX2NhdGFsb2dfYXV4IHsKPiArCXUzMiBkYXRhOwo+ICsJdTMy IGlzcjsKPiArfTsKPiArCj4gK3N0cnVjdCBkcF9jYXRhbG9nX2N0cmwgewo+ICsJdTMyIGRwX3R1 Owo+ICsJdTMyIHZhbGlkX2JvdW5kYXJ5Owo+ICsJdTMyIHZhbGlkX2JvdW5kYXJ5MjsKPiArCXUz MiBpc3I7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCB7Cj4gKwl1MzIgdG90 YWw7Cj4gKwl1MzIgc3luY19zdGFydDsKPiArCXUzMiB3aWR0aF9ibGFua2luZzsKPiArCXUzMiBk cF9hY3RpdmU7Cj4gKwo+ICsJLyogVFBHICovCj4gKwl1MzIgaHN5bmNfcGVyaW9kOwo+ICsJdTMy IHZzeW5jX3BlcmlvZDsKPiArCXUzMiBkaXNwbGF5X3Zfc3RhcnQ7Cj4gKwl1MzIgZGlzcGxheV92 X2VuZDsKPiArCXUzMiB2X3N5bmNfd2lkdGg7Cj4gKwl1MzIgaHN5bmNfY3RsOwo+ICsJdTMyIGRp c3BsYXlfaGN0bDsKPiArfTsKPiArCj4gK3N0cnVjdCBkcF9jYXRhbG9nIHsKPiArCXN0cnVjdCBk cF9jYXRhbG9nX2F1eCBhdXg7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsIGN0cmw7Cj4gKwlz dHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCBwYW5lbDsKPiArfTsKPiArCj4gKy8qIEFVWCBBUElzICov Cj4gK3UzMiBkcF9jYXRhbG9nX2F1eF9yZWFkX2RhdGEoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICph dXgpOwo+ICtpbnQgZHBfY2F0YWxvZ19hdXhfd3JpdGVfZGF0YShzdHJ1Y3QgZHBfY2F0YWxvZ19h dXggKmF1eCk7Cj4gK2ludCBkcF9jYXRhbG9nX2F1eF93cml0ZV90cmFucyhzdHJ1Y3QgZHBfY2F0 YWxvZ19hdXggKmF1eCk7Cj4gK2ludCBkcF9jYXRhbG9nX2F1eF9jbGVhcl90cmFucyhzdHJ1Y3Qg ZHBfY2F0YWxvZ19hdXggKmF1eCwgYm9vbCByZWFkKTsKPiArdm9pZCBkcF9jYXRhbG9nX2F1eF9y ZXNldChzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCk7Cj4gK3ZvaWQgZHBfY2F0YWxvZ19hdXhf ZW5hYmxlKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4LCBib29sIGVuYWJsZSk7Cj4gK3ZvaWQg ZHBfY2F0YWxvZ19hdXhfdXBkYXRlX2NmZyhzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCwKPiAr CQlzdHJ1Y3QgZHBfYXV4X2NmZyAqY2ZnLCBlbnVtIGRwX3BoeV9hdXhfY29uZmlnX3R5cGUgdHlw ZSk7Cj4gK3ZvaWQgZHBfY2F0YWxvZ19hdXhfc2V0dXAoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICph dXgsCj4gKwkJc3RydWN0IGRwX2F1eF9jZmcgKmF1eF9jZmcpOwo+ICt2b2lkIGRwX2NhdGFsb2df YXV4X2dldF9pcnEoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgsIGJvb2wgY21kX2J1c3kpOwo+ ICsKPiArLyogRFAgQ29udHJvbGxlciBBUElzICovCj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX3N0 YXRlX2N0cmwoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwgdTMyIHN0YXRlKTsKPiArdm9p ZCBkcF9jYXRhbG9nX2N0cmxfY29uZmlnX2N0cmwoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3Ry bCwgdTMyIGNvbmZpZyk7Cj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX2xhbmVfbWFwcGluZyhzdHJ1 Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKTsKPiArdm9pZCBkcF9jYXRhbG9nX2N0cmxfbWFpbmxp bmtfY3RybChzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLCBib29sIGVuYWJsZSk7Cj4gK3Zv aWQgZHBfY2F0YWxvZ19jdHJsX2NvbmZpZ19taXNjKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0 cmwsIHUzMiBjYywgdTMyIHRiKTsKPiArdm9pZCBkcF9jYXRhbG9nX2N0cmxfY29uZmlnX21zYShz dHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLCB1MzIgcmF0ZSwKPiArCQkJCXUzMiBzdHJlYW1f cmF0ZV9raHosIGJvb2wgZml4ZWRfbnZpZCk7Cj4gK2ludCBkcF9jYXRhbG9nX2N0cmxfc2V0X3Bh dHRlcm4oc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwgdTMyIHBhdHRlcm4pOwo+ICt2b2lk IGRwX2NhdGFsb2dfY3RybF9yZXNldChzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKTsKPiAr dm9pZCBkcF9jYXRhbG9nX2N0cmxfdXNiX3Jlc2V0KHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0 cmwsIGJvb2wgZmxpcCk7Cj4gK2Jvb2wgZHBfY2F0YWxvZ19jdHJsX21haW5saW5rX3JlYWR5KHN0 cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpOwo+ICt2b2lkIGRwX2NhdGFsb2dfY3RybF9lbmFi bGVfaXJxKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZW5hYmxlKTsKPiArdm9p ZCBkcF9jYXRhbG9nX2N0cmxfaHBkX2NvbmZpZyhzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJs LCBib29sIGVuYWJsZSk7Cj4gK3ZvaWQgZHBfY2F0YWxvZ19jdHJsX3BoeV9yZXNldChzdHJ1Y3Qg ZHBfY2F0YWxvZ19jdHJsICpjdHJsKTsKPiArdm9pZCBkcF9jYXRhbG9nX2N0cmxfcGh5X2xhbmVf Y2ZnKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZmxpcHBlZCwKPiArCQkJCXU4 IGxhbmVfY250KTsKPiAraW50IGRwX2NhdGFsb2dfY3RybF91cGRhdGVfdnhfcHgoc3RydWN0IGRw X2NhdGFsb2dfY3RybCAqY3RybCwgdTggdl9sZXZlbCwKPiArCQkJCXU4IHBfbGV2ZWwpOwo+ICt2 b2lkIGRwX2NhdGFsb2dfY3RybF9nZXRfaW50ZXJydXB0KHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwg KmN0cmwpOwo+ICt2b2lkIGRwX2NhdGFsb2dfY3RybF91cGRhdGVfdHJhbnNmZXJfdW5pdChzdHJ1 Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKTsKPiArdm9pZCBkcF9jYXRhbG9nX2N0cmxfc2VuZF9w aHlfcGF0dGVybihzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLAo+ICsJCQl1MzIgcGF0dGVy bik7Cj4gK3UzMiBkcF9jYXRhbG9nX2N0cmxfcmVhZF9waHlfcGF0dGVybihzdHJ1Y3QgZHBfY2F0 YWxvZ19jdHJsICpjdHJsKTsKPiArCj4gKy8qIERQIFBhbmVsIEFQSXMgKi8KPiAraW50IGRwX2Nh dGFsb2dfcGFuZWxfdGltaW5nX2NmZyhzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqcGFuZWwpOwo+ ICt2b2lkIGRwX2NhdGFsb2dfcGFuZWxfdHBnX2VuYWJsZShzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5l bCAqcGFuZWwpOwo+ICt2b2lkIGRwX2NhdGFsb2dfcGFuZWxfdHBnX2Rpc2FibGUoc3RydWN0IGRw X2NhdGFsb2dfcGFuZWwgKnBhbmVsKTsKPiArCj4gK3N0cnVjdCBkcF9jYXRhbG9nICpkcF9jYXRh bG9nX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9pbyAqaW8pOwo+ICt2b2lkIGRw X2NhdGFsb2dfcHV0KHN0cnVjdCBkcF9jYXRhbG9nICpjYXRhbG9nKTsKPiArCj4gKyNlbmRpZiAv KiBfRFBfQ0FUQUxPR19IXyAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rw L2RwX2N0cmwuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5jCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5hMTNhYjI0Cj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5jCj4gQEAgLTAsMCArMSwxNjExIEBA Cj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiArLyoKPiArICog Q29weXJpZ2h0IChjKSAyMDEyLTIwMTksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRz IHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNkZWZpbmUgcHJfZm10KGZtdCkJIltkcm0tZHBdICVz OiAiIGZtdCwgX19mdW5jX18KPiArCj4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ICsjaW5j bHVkZSA8bGludXgvY29tcGxldGlvbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiAr I2luY2x1ZGUgPGRybS9kcm1fZml4ZWQuaD4KPiArCj4gKyNpbmNsdWRlICJkcF9yZWcuaCIKPiAr I2luY2x1ZGUgImRwX2N0cmwuaCIKPiArCj4gKyNkZWZpbmUgRFBfS0haX1RPX0haIDEwMDAKPiAr I2RlZmluZSBJRExFX1BBVFRFUk5fQ09NUExFVElPTl9USU1FT1VUX0pJRkZJRVMJKDMwICogSFog LyAxMDAwKSAvKiAzMCBtcyAqLwoKVGhpcyBsb29rcyBsaWtlIGl0IHNob3VsZCBiZSBtc2Vjc190 b19qaWZmaWVzKCkKCj4gKyNkZWZpbmUgV0FJVF9GT1JfVklERU9fUkVBRFlfVElNRU9VVF9KSUZG SUVTIChIWiAvIDIpCgpNYXliZSB0aGlzIG9uZSB0b28sIHNpbmNlIEknbSBndWVzc2luZyB0aGUg aW50ZW5kZWQgdGltZW91dCBpcyA1MDBtcwo+ICsKPiArI2RlZmluZSBEUF9DVFJMX0lOVFJfUkVB RFlfRk9SX1ZJREVPICAgICBCSVQoMCkKPiArI2RlZmluZSBEUF9DVFJMX0lOVFJfSURMRV9QQVRU RVJOX1NFTlQgIEJJVCgzKQo+ICsKPiArI2RlZmluZSBNUl9MSU5LX1RSQUlOSU5HMSAgMHg4Cj4g KyNkZWZpbmUgTVJfTElOS19TWU1CT0xfRVJNIDB4ODAKPiArI2RlZmluZSBNUl9MSU5LX1BSQlM3 IDB4MTAwCj4gKyNkZWZpbmUgTVJfTElOS19DVVNUT004MCAweDIwMAo+ICsKPiArc3RydWN0IGRw X3R1X2NhbGNfaW5wdXQgewo+ICsJdTY0IGxjbGs7ICAgICAgICAvKiAxNjIsIDI3MCwgNTQwIGFu ZCA4MTAgKi8KPiArCXU2NCBwY2xrX2toejsgICAgLyogaW4gS0h6ICovCj4gKwl1NjQgaGFjdGl2 ZTsgICAgIC8qIGFjdGl2ZSBoLXdpZHRoICovCj4gKwl1NjQgaHBvcmNoOyAgICAgIC8qIGJwICsg ZnAgKyBwdWxzZSAqLwo+ICsJaW50IG5sYW5lczsgICAgICAvKiBuby5vZi5sYW5lcyAqLwo+ICsJ aW50IGJwcDsgICAgICAgICAvKiBiaXRzICovCj4gKwlpbnQgcGl4ZWxfZW5jOyAgIC8qIDQ0NCwg NDIwLCA0MjIgKi8KPiArCWludCBkc2NfZW47ICAgICAvKiBkc2Mgb24vb2ZmICovCj4gKwlpbnQg YXN5bmNfZW47ICAgLyogYXN5bmMgbW9kZSAqLwo+ICt9Owo+ICsKPiArc3RydWN0IGRwX3ZjX3R1 X21hcHBpbmdfdGFibGUgewo+ICsJdTggdmFsaWRfYm91bmRhcnlfbGluazsKPiArCXUxNiBkZWxh eV9zdGFydF9saW5rOwo+ICsJYm9vbCBib3VuZGFyeV9tb2RlcmF0aW9uX2VuOwo+ICsJdTggdmFs aWRfbG93ZXJfYm91bmRhcnlfbGluazsKPiArCXU4IHVwcGVyX2JvdW5kYXJ5X2NvdW50Owo+ICsJ dTggbG93ZXJfYm91bmRhcnlfY291bnQ7Cj4gKwl1OCB0dV9zaXplX21pbnVzMTsKPiArfTsKPiAr Cj4gK3N0cnVjdCBkcF9jdHJsX3ByaXZhdGUgewo+ICsJc3RydWN0IGRwX2N0cmwgZHBfY3RybDsK PiArCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgZHBfYXV4ICphdXg7Cj4gKwlz dHJ1Y3QgZHBfcGFuZWwgKnBhbmVsOwo+ICsJc3RydWN0IGRwX2xpbmsgKmxpbms7Cj4gKwlzdHJ1 Y3QgZHBfcG93ZXIgKnBvd2VyOwo+ICsJc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyOwo+ICsJc3Ry dWN0IGRwX2NhdGFsb2dfY3RybCAqY2F0YWxvZzsKPiArCj4gKwlzdHJ1Y3QgY29tcGxldGlvbiBp ZGxlX2NvbXA7Cj4gKwlzdHJ1Y3QgbXV0ZXggcHVzaF9pZGxlX211dGV4Owo+ICsJc3RydWN0IGNv bXBsZXRpb24gdmlkZW9fY29tcDsKPiArfTsKPiArCj4gK3ZvaWQgZHBfY3RybF9hYm9ydChzdHJ1 Y3QgZHBfY3RybCAqZHBfY3RybCkKPiArewo+ICsJc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3Ry bDsKPiArCj4gKwljdHJsID0gY29udGFpbmVyX29mKGRwX2N0cmwsIHN0cnVjdCBkcF9jdHJsX3By aXZhdGUsIGRwX2N0cmwpOwo+ICsKPiArCWF0b21pY19zZXQoJmN0cmwtPmRwX2N0cmwuYWJvcnRl ZCwgMSk7Cj4gK30KPiArCj4gK3ZvaWQgZHBfY3RybF9wdXNoX2lkbGUoc3RydWN0IGRwX2N0cmwg KmRwX2N0cmwpCj4gK3sKPiArCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7Cj4gKwo+ICsJ Y3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9j dHJsKTsKPiArCj4gKwltdXRleF9sb2NrKCZjdHJsLT5wdXNoX2lkbGVfbXV0ZXgpOwo+ICsKPiAr CXJlaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5pZGxlX2NvbXApOwo+ICsJZHBfY2F0YWxvZ19jdHJs X3N0YXRlX2N0cmwoY3RybC0+Y2F0YWxvZywgRFBfU1RBVEVfQ1RSTF9QVVNIX0lETEUpOwo+ICsK PiArCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjdHJsLT5pZGxlX2NvbXAsCj4g KwkJCUlETEVfUEFUVEVSTl9DT01QTEVUSU9OX1RJTUVPVVRfSklGRklFUykpCj4gKwkJcHJfd2Fy bigiUFVTSF9JRExFIHBhdHRlcm4gdGltZWRvdXRcbiIpOwo+ICsKPiArCW11dGV4X3VubG9jaygm Y3RybC0+cHVzaF9pZGxlX211dGV4KTsKPiArCXByX2RlYnVnKCJtYWlubGluayBvZmYgZG9uZVxu Iik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2N0cmxfY29uZmlnX2N0cmwoc3RydWN0IGRw X2N0cmxfcHJpdmF0ZSAqY3RybCkKPiArewo+ICsJdTMyIGNvbmZpZyA9IDAsIHRiZDsKPiArCXU4 ICpkcGNkID0gY3RybC0+cGFuZWwtPmRwY2Q7Cj4gKwo+ICsJLyogRGVmYXVsdC0+IExTQ0xLIERJ VjogMS80IExDTEsgICovCj4gKwljb25maWcgfD0gKDIgPDwgRFBfQ09ORklHVVJBVElPTl9DVFJM X0xTQ0xLX0RJVl9TSElGVCk7Cj4gKwo+ICsJLyogU2NyYW1ibGVyIHJlc2V0IGVuYWJsZSAqLwo+ ICsJaWYgKGRwY2RbRFBfRURQX0NPTkZJR1VSQVRJT05fQ0FQXSAmIERQX0FMVEVSTkFURV9TQ1JB TUJMRVJfUkVTRVRfQ0FQKQo+ICsJCWNvbmZpZyB8PSBEUF9DT05GSUdVUkFUSU9OX0NUUkxfQVNT UjsKPiArCj4gKwl0YmQgPSBkcF9saW5rX2dldF90ZXN0X2JpdHNfZGVwdGgoY3RybC0+bGluaywK PiArCQkJY3RybC0+cGFuZWwtPmRwX21vZGUuYnBwKTsKPiArCj4gKwlpZiAodGJkID09IERQX1RF U1RfQklUX0RFUFRIX1VOS05PV04pIHsKPiArCQlwcl9kZWJ1ZygiQklUX0RFUFRIIG5vdCBzZXQu IENvbmZpZ3VyZSBkZWZhdWx0XG4iKTsKPiArCQl0YmQgPSBEUF9URVNUX0JJVF9ERVBUSF84Owo+ ICsJfQo+ICsKPiArCWNvbmZpZyB8PSB0YmQgPDwgRFBfQ09ORklHVVJBVElPTl9DVFJMX0JQQ19T SElGVDsKPiArCj4gKwkvKiBOdW0gb2YgTGFuZXMgKi8KPiArCWNvbmZpZyB8PSAoKGN0cmwtPmxp bmstPmxpbmtfcGFyYW1zLm51bV9sYW5lcyAtIDEpCj4gKwkJCTw8IERQX0NPTkZJR1VSQVRJT05f Q1RSTF9OVU1fT0ZfTEFORVNfU0hJRlQpOwo+ICsKPiArCWlmIChkcm1fZHBfZW5oYW5jZWRfZnJh bWVfY2FwKGRwY2QpKQo+ICsJCWNvbmZpZyB8PSBEUF9DT05GSUdVUkFUSU9OX0NUUkxfRU5IQU5D RURfRlJBTUlORzsKPiArCj4gKwljb25maWcgfD0gRFBfQ09ORklHVVJBVElPTl9DVFJMX1BfSU5U RVJMQUNFRDsgLyogcHJvZ3Jlc3NpdmUgdmlkZW8gKi8KPiArCj4gKwkvKiBzeW5jIGNsb2NrICYg c3RhdGljIE12aWQgKi8KPiArCWNvbmZpZyB8PSBEUF9DT05GSUdVUkFUSU9OX0NUUkxfU1RBVElD X0RZTkFNSUNfQ047Cj4gKwljb25maWcgfD0gRFBfQ09ORklHVVJBVElPTl9DVFJMX1NZTkNfQVNZ TkNfQ0xLOwo+ICsKPiArCWRwX2NhdGFsb2dfY3RybF9jb25maWdfY3RybChjdHJsLT5jYXRhbG9n LCBjb25maWcpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogZHBfY3RybF9jb25maWd1cmVfc291cmNl X3BhcmFtcygpIC0gY29uZmlndXJlcyBEUCB0cmFuc21pdHRlciBzb3VyY2UgcGFyYW1zCj4gKyAq IEBjdHJsOiBEaXNwbGF5IFBvcnQgRHJpdmVyIGRhdGEKPiArICoKPiArICogQ29uZmlndXJlcyB0 aGUgRFAgdHJhbnNtaXR0ZXIgc291cmNlIHBhcmFtcyBpbmNsdWRpbmcgZGV0YWlscyBzdWNoIGFz IGxhbmUKPiArICogY29uZmlndXJhdGlvbiwgb3V0cHV0IGZvcm1hdCBhbmQgc2luay9wYW5lbCB0 aW1pbmcgaW5mb3JtYXRpb24uCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBkcF9jdHJsX2NvbmZpZ3Vy ZV9zb3VyY2VfcGFyYW1zKHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwpCj4gK3sKPiArCXUz MiBjYywgdGI7Cj4gKwo+ICsJZHBfY2F0YWxvZ19jdHJsX2xhbmVfbWFwcGluZyhjdHJsLT5jYXRh bG9nKTsKPiArCWRwX2NhdGFsb2dfY3RybF9tYWlubGlua19jdHJsKGN0cmwtPmNhdGFsb2csIHRy dWUpOwo+ICsKPiArCWRwX2N0cmxfY29uZmlnX2N0cmwoY3RybCk7Cj4gKwo+ICsJdGIgPSBkcF9s aW5rX2dldF90ZXN0X2JpdHNfZGVwdGgoY3RybC0+bGluaywKPiArCQljdHJsLT5wYW5lbC0+ZHBf bW9kZS5icHApOwo+ICsJY2MgPSBkcF9saW5rX2dldF9jb2xvcmltZXRyeV9jb25maWcoY3RybC0+ bGluayk7Cj4gKwlkcF9jYXRhbG9nX2N0cmxfY29uZmlnX21pc2MoY3RybC0+Y2F0YWxvZywgY2Ms IHRiKTsKPiArCWRwX3BhbmVsX3RpbWluZ19jZmcoY3RybC0+cGFuZWwpOwo+ICt9Cj4gKwo+ICsv Kgo+ICsgKiBUaGUgc3RydWN0dXJlIGFuZCBmZXcgZnVuY3Rpb25zIHByZXNlbnQgYmVsb3cgYXJl IElQL0hhcmR3YXJlCj4gKyAqIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBNb3N0IG9mIHRoZSBp bXBsZW1lbnRhdGlvbiB3aWxsIG5vdAo+ICsgKiBoYXZlIGNvZGluZyBjb21tZW50cwo+ICsgKi8K PiArc3RydWN0IHR1X2FsZ29fZGF0YSB7Cj4gKwlzNjQgbGNsa19mcDsKPiArCXM2NCBwY2xrX2Zw Owo+ICsJczY0IGx3aWR0aDsKPiArCXM2NCBoYnBfcmVsYXRpdmVfdG9fcGNsazsKPiArCWludCBu bGFuZXM7Cj4gKwlpbnQgYnBwOwo+ICsJaW50IHBpeGVsRW5jOwo+ICsJaW50IGRzY19lbjsKPiAr CWludCBhc3luY19lbjsKPiArCWludCBicGM7Cj4gKwo+ICsJdWludCBkZWxheV9zdGFydF9saW5r X2V4dHJhX3BpeGNsazsKPiArCWludCBleHRyYV9idWZmZXJfbWFyZ2luOwo+ICsJczY0IHJhdGlv X2ZwOwo+ICsJczY0IG9yaWdpbmFsX3JhdGlvX2ZwOwo+ICsKPiArCXM2NCBlcnJfZnA7Cj4gKwlz NjQgbl9lcnJfZnA7Cj4gKwlzNjQgbl9uX2Vycl9mcDsKPiArCWludCB0dV9zaXplOwo+ICsJaW50 IHR1X3NpemVfZGVzaXJlZDsKPiArCWludCB0dV9zaXplX21pbnVzMTsKPiArCj4gKwlpbnQgdmFs aWRfYm91bmRhcnlfbGluazsKPiArCXM2NCByZXN1bHRpbmdfdmFsaWRfZnA7Cj4gKwlzNjQgdG90 YWxfdmFsaWRfZnA7Cj4gKwlzNjQgZWZmZWN0aXZlX3ZhbGlkX2ZwOwo+ICsJczY0IGVmZmVjdGl2 ZV92YWxpZF9yZWNvcmRlZF9mcDsKPiArCWludCBuX3R1czsKPiArCWludCBuX3R1c19wZXJfbGFu ZTsKPiArCWludCBwYWlyZWRfdHVzOwo+ICsJaW50IHJlbWFpbmRlcl90dXM7Cj4gKwlpbnQgcmVt YWluZGVyX3R1c191cHBlcjsKPiArCWludCByZW1haW5kZXJfdHVzX2xvd2VyOwo+ICsJaW50IGV4 dHJhX2J5dGVzOwo+ICsJaW50IGZpbGxlcl9zaXplOwo+ICsJaW50IGRlbGF5X3N0YXJ0X2xpbms7 Cj4gKwo+ICsJaW50IGV4dHJhX3BjbGtfY3ljbGVzOwo+ICsJaW50IGV4dHJhX3BjbGtfY3ljbGVz X2luX2xpbmtfY2xrOwo+ICsJczY0IHJhdGlvX2J5X3R1X2ZwOwo+ICsJczY0IGF2ZXJhZ2VfdmFs aWQyX2ZwOwo+ICsJaW50IG5ld192YWxpZF9ib3VuZGFyeV9saW5rOwo+ICsJaW50IHJlbWFpbmRl cl9zeW1ib2xzX2V4aXN0Owo+ICsJaW50IG5fc3ltYm9sczsKPiArCXM2NCBuX3JlbWFpbmRlcl9z eW1ib2xzX3Blcl9sYW5lX2ZwOwo+ICsJczY0IGxhc3RfcGFydGlhbF90dV9mcDsKPiArCXM2NCBU VV9yYXRpb19lcnJfZnA7Cj4gKwo+ICsJaW50IG5fdHVzX2luY2xfbGFzdF9pbmNvbXBsZXRlX3R1 Owo+ICsJaW50IGV4dHJhX3BjbGtfY3ljbGVzX3RtcDsKPiArCWludCBleHRyYV9wY2xrX2N5Y2xl c19pbl9saW5rX2Nsa190bXA7Cj4gKwlpbnQgZXh0cmFfcmVxdWlyZWRfYnl0ZXNfbmV3X3RtcDsK PiArCWludCBmaWxsZXJfc2l6ZV90bXA7Cj4gKwlpbnQgbG93ZXJfZmlsbGVyX3NpemVfdG1wOwo+ ICsJaW50IGRlbGF5X3N0YXJ0X2xpbmtfdG1wOwo+ICsKPiArCWJvb2wgYm91bmRhcnlfbW9kZXJh dGlvbl9lbjsKPiArCWludCBib3VuZGFyeV9tb2RfbG93ZXJfZXJyOwo+ICsJaW50IHVwcGVyX2Jv dW5kYXJ5X2NvdW50Owo+ICsJaW50IGxvd2VyX2JvdW5kYXJ5X2NvdW50Owo+ICsJaW50IGlfdXBw ZXJfYm91bmRhcnlfY291bnQ7Cj4gKwlpbnQgaV9sb3dlcl9ib3VuZGFyeV9jb3VudDsKPiArCWlu dCB2YWxpZF9sb3dlcl9ib3VuZGFyeV9saW5rOwo+ICsJaW50IGV2ZW5fZGlzdHJpYnV0aW9uX0JG Owo+ICsJaW50IGV2ZW5fZGlzdHJpYnV0aW9uX2xlZ2FjeTsKPiArCWludCBldmVuX2Rpc3RyaWJ1 dGlvbjsKPiArCWludCBtaW5faGJsYW5rX3Zpb2xhdGVkOwo+ICsJczY0IGRlbGF5X3N0YXJ0X3Rp bWVfZnA7Cj4gKwlzNjQgaGJwX3RpbWVfZnA7Cj4gKwlzNjQgaGFjdGl2ZV90aW1lX2ZwOwo+ICsJ czY0IGRpZmZfYWJzX2ZwOwo+ICsKPiArCXM2NCByYXRpbzsKPiArfTsKPiArCj4gK3N0YXRpYyBp bnQgX3R1X3BhcmFtX2NvbXBhcmUoczY0IGEsIHM2NCBiKQo+ICt7Cj4gKwl1MzIgYV9pbnQsIGFf ZnJhYzsKPiArCXUzMiBiX2ludCwgYl9mcmFjOwo+ICsKPiArCWlmIChhID09IGIpCj4gKwkJcmV0 dXJuIDA7Cj4gKwo+ICsJYV9pbnQgPSAoYSA+PiAzMikgJiAweDdGRkZGRkZGOwo+ICsJYV9mcmFj ID0gYSAmIDB4RkZGRkZGRkY7Cj4gKwo+ICsJYl9pbnQgPSAoYiA+PiAzMikgJiAweDdGRkZGRkZG Owo+ICsJYl9mcmFjID0gYiAmIDB4RkZGRkZGRkY7Cj4gKwo+ICsJaWYgKGFfaW50ID4gYl9pbnQp Cj4gKwkJcmV0dXJuIDE7Cj4gKwllbHNlIGlmIChhX2ludCA8IGJfaW50KQo+ICsJCXJldHVybiAy Owo+ICsJZWxzZSBpZiAoYV9mcmFjID4gYl9mcmFjKQo+ICsJCXJldHVybiAxOwo+ICsJZWxzZQo+ ICsJCXJldHVybiAyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfdHVfdmFsaWRfYm91bmRhcnlf Y2FsYyhzdHJ1Y3QgdHVfYWxnb19kYXRhICp0dSkKPiArewo+ICsJczY0IHRlbXAxX2ZwLCB0ZW1w Ml9mcCwgdGVtcCwgdGVtcDEsIHRlbXAyOwo+ICsJaW50IGNvbXBhcmVfcmVzdWx0XzEsIGNvbXBh cmVfcmVzdWx0XzIsIGNvbXBhcmVfcmVzdWx0XzM7Cj4gKwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4 cF9mcm9tX2ZyYWN0aW9uKHR1LT50dV9zaXplLCAxKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBf bXVsKHR1LT5yYXRpb19mcCwgdGVtcDFfZnApOwo+ICsKPiArCXR1LT5uZXdfdmFsaWRfYm91bmRh cnlfbGluayA9IGRybV9maXhwMmludF9jZWlsKHRlbXAyX2ZwKTsKPiArCj4gKwl0ZW1wID0gKHR1 LT5pX3VwcGVyX2JvdW5kYXJ5X2NvdW50ICoKPiArCQkJCXR1LT5uZXdfdmFsaWRfYm91bmRhcnlf bGluayArCj4gKwkJCQl0dS0+aV9sb3dlcl9ib3VuZGFyeV9jb3VudCAqCj4gKwkJCQkodHUtPm5l d192YWxpZF9ib3VuZGFyeV9saW5rLTEpKTsKPiArCXR1LT5hdmVyYWdlX3ZhbGlkMl9mcCA9IGRy bV9maXhwX2Zyb21fZnJhY3Rpb24odGVtcCwKPiArCQkJCQkodHUtPmlfdXBwZXJfYm91bmRhcnlf Y291bnQgKwo+ICsJCQkJCXR1LT5pX2xvd2VyX2JvdW5kYXJ5X2NvdW50KSk7Cj4gKwo+ICsJdGVt cDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LT5icHAsIDgpOwo+ICsJdGVtcDJfZnAg PSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LT5sd2lkdGgsIDEpOwo+ICsJdGVtcDFfZnAgPSBk cm1fZml4cF9tdWwodGVtcDJfZnAsIHRlbXAxX2ZwKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBf ZGl2KHRlbXAxX2ZwLCB0dS0+YXZlcmFnZV92YWxpZDJfZnApOwo+ICsJdHUtPm5fdHVzID0gZHJt X2ZpeHAyaW50KHRlbXAyX2ZwKTsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJh Y3Rpb24odHUtPm5fdHVzLCAxKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAxX2Zw LCB0dS0+YXZlcmFnZV92YWxpZDJfZnApOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2Zy YWN0aW9uKHR1LT5uX3N5bWJvbHMsIDEpOwo+ICsJdGVtcDJfZnAgPSB0ZW1wMV9mcCAtIHRlbXAy X2ZwOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LT5ubGFuZXMsIDEp Owo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9kaXYodGVtcDJfZnAsIHRlbXAxX2ZwKTsKPiArCXR1 LT5uX3JlbWFpbmRlcl9zeW1ib2xzX3Blcl9sYW5lX2ZwID0gdGVtcDJfZnA7Cj4gKwo+ICsJdGVt cDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LT50dV9zaXplLCAxKTsKPiArCXR1LT5s YXN0X3BhcnRpYWxfdHVfZnAgPQo+ICsJCQlkcm1fZml4cF9kaXYodHUtPm5fcmVtYWluZGVyX3N5 bWJvbHNfcGVyX2xhbmVfZnAsCj4gKwkJCQkJdGVtcDFfZnApOwo+ICsKPiArCWlmICh0dS0+bl9y ZW1haW5kZXJfc3ltYm9sc19wZXJfbGFuZV9mcCAhPSAwKQo+ICsJCXR1LT5yZW1haW5kZXJfc3lt Ym9sc19leGlzdCA9IDE7Cj4gKwllbHNlCj4gKwkJdHUtPnJlbWFpbmRlcl9zeW1ib2xzX2V4aXN0 ID0gMDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUtPm5fdHVz LCB0dS0+bmxhbmVzKTsKPiArCXR1LT5uX3R1c19wZXJfbGFuZSA9IGRybV9maXhwMmludCh0ZW1w MV9mcCk7Cj4gKwo+ICsJdHUtPnBhaXJlZF90dXMgPSAoaW50KSgodHUtPm5fdHVzX3Blcl9sYW5l KSAvCj4gKwkJCQkJKHR1LT5pX3VwcGVyX2JvdW5kYXJ5X2NvdW50ICsKPiArCQkJCQkgdHUtPmlf bG93ZXJfYm91bmRhcnlfY291bnQpKTsKPiArCj4gKwl0dS0+cmVtYWluZGVyX3R1cyA9IHR1LT5u X3R1c19wZXJfbGFuZSAtIHR1LT5wYWlyZWRfdHVzICoKPiArCQkJCQkJKHR1LT5pX3VwcGVyX2Jv dW5kYXJ5X2NvdW50ICsKPiArCQkJCQkJdHUtPmlfbG93ZXJfYm91bmRhcnlfY291bnQpOwo+ICsK PiArCWlmICgodHUtPnJlbWFpbmRlcl90dXMgLSB0dS0+aV91cHBlcl9ib3VuZGFyeV9jb3VudCkg PiAwKSB7Cj4gKwkJdHUtPnJlbWFpbmRlcl90dXNfdXBwZXIgPSB0dS0+aV91cHBlcl9ib3VuZGFy eV9jb3VudDsKPiArCQl0dS0+cmVtYWluZGVyX3R1c19sb3dlciA9IHR1LT5yZW1haW5kZXJfdHVz IC0KPiArCQkJCQkJdHUtPmlfdXBwZXJfYm91bmRhcnlfY291bnQ7Cj4gKwl9IGVsc2Ugewo+ICsJ CXR1LT5yZW1haW5kZXJfdHVzX3VwcGVyID0gdHUtPnJlbWFpbmRlcl90dXM7Cj4gKwkJdHUtPnJl bWFpbmRlcl90dXNfbG93ZXIgPSAwOwo+ICsJfQo+ICsKPiArCXRlbXAgPSB0dS0+cGFpcmVkX3R1 cyAqICh0dS0+aV91cHBlcl9ib3VuZGFyeV9jb3VudCAqCj4gKwkJCQl0dS0+bmV3X3ZhbGlkX2Jv dW5kYXJ5X2xpbmsgKwo+ICsJCQkJdHUtPmlfbG93ZXJfYm91bmRhcnlfY291bnQgKgo+ICsJCQkJ KHR1LT5uZXdfdmFsaWRfYm91bmRhcnlfbGluayAtIDEpKSArCj4gKwkJCQkodHUtPnJlbWFpbmRl cl90dXNfdXBwZXIgKgo+ICsJCQkJIHR1LT5uZXdfdmFsaWRfYm91bmRhcnlfbGluaykgKwo+ICsJ CQkJKHR1LT5yZW1haW5kZXJfdHVzX2xvd2VyICoKPiArCQkJCSh0dS0+bmV3X3ZhbGlkX2JvdW5k YXJ5X2xpbmsgLSAxKSk7Cj4gKwl0dS0+dG90YWxfdmFsaWRfZnAgPSBkcm1fZml4cF9mcm9tX2Zy YWN0aW9uKHRlbXAsIDEpOwo+ICsKPiArCWlmICh0dS0+cmVtYWluZGVyX3N5bWJvbHNfZXhpc3Qp IHsKPiArCQl0ZW1wMV9mcCA9IHR1LT50b3RhbF92YWxpZF9mcCArCj4gKwkJCQl0dS0+bl9yZW1h aW5kZXJfc3ltYm9sc19wZXJfbGFuZV9mcDsKPiArCQl0ZW1wMl9mcCA9IGRybV9maXhwX2Zyb21f ZnJhY3Rpb24odHUtPm5fdHVzX3Blcl9sYW5lLCAxKTsKPiArCQl0ZW1wMl9mcCA9IHRlbXAyX2Zw ICsgdHUtPmxhc3RfcGFydGlhbF90dV9mcDsKPiArCQl0ZW1wMV9mcCA9IGRybV9maXhwX2Rpdih0 ZW1wMV9mcCwgdGVtcDJfZnApOwo+ICsJfSBlbHNlIHsKPiArCQl0ZW1wMl9mcCA9IGRybV9maXhw X2Zyb21fZnJhY3Rpb24odHUtPm5fdHVzX3Blcl9sYW5lLCAxKTsKPiArCQl0ZW1wMV9mcCA9IGRy bV9maXhwX2Rpdih0dS0+dG90YWxfdmFsaWRfZnAsIHRlbXAyX2ZwKTsKPiArCX0KPiArCXR1LT5l ZmZlY3RpdmVfdmFsaWRfZnAgPSB0ZW1wMV9mcDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhw X2Zyb21fZnJhY3Rpb24odHUtPnR1X3NpemUsIDEpOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9t dWwodHUtPnJhdGlvX2ZwLCB0ZW1wMV9mcCk7Cj4gKwl0dS0+bl9uX2Vycl9mcCA9IHR1LT5lZmZl Y3RpdmVfdmFsaWRfZnAgLSB0ZW1wMl9mcDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zy b21fZnJhY3Rpb24odHUtPnR1X3NpemUsIDEpOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9tdWwo dHUtPnJhdGlvX2ZwLCB0ZW1wMV9mcCk7Cj4gKwl0dS0+bl9lcnJfZnAgPSB0dS0+YXZlcmFnZV92 YWxpZDJfZnAgLSB0ZW1wMl9mcDsKPiArCj4gKwl0dS0+ZXZlbl9kaXN0cmlidXRpb24gPSB0dS0+ bl90dXMgJSB0dS0+bmxhbmVzID09IDAgPyAxIDogMDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9m aXhwX2Zyb21fZnJhY3Rpb24odHUtPmJwcCwgOCk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX2Zy b21fZnJhY3Rpb24odHUtPmx3aWR0aCwgMSk7Cj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX211bCh0 ZW1wMl9mcCwgdGVtcDFfZnApOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9kaXYodGVtcDFfZnAs IHR1LT5hdmVyYWdlX3ZhbGlkMl9mcCk7Cj4gKwo+ICsJaWYgKHRlbXAyX2ZwKQo+ICsJCXR1LT5u X3R1c19pbmNsX2xhc3RfaW5jb21wbGV0ZV90dSA9IGRybV9maXhwMmludF9jZWlsKHRlbXAyX2Zw KTsKPiArCWVsc2UKPiArCQl0dS0+bl90dXNfaW5jbF9sYXN0X2luY29tcGxldGVfdHUgPSAwOwo+ ICsKPiArCXRlbXAxID0gMDsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0 dS0+dHVfc2l6ZSwgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX211bCh0dS0+b3JpZ2luYWxf cmF0aW9fZnAsIHRlbXAxX2ZwKTsKPiArCXRlbXAxX2ZwID0gdHUtPmF2ZXJhZ2VfdmFsaWQyX2Zw IC0gdGVtcDJfZnA7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUtPm5f dHVzX2luY2xfbGFzdF9pbmNvbXBsZXRlX3R1LCAxKTsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBf bXVsKHRlbXAyX2ZwLCB0ZW1wMV9mcCk7Cj4gKwo+ICsJaWYgKHRlbXAxX2ZwKQo+ICsJCXRlbXAx ID0gZHJtX2ZpeHAyaW50X2NlaWwodGVtcDFfZnApOwo+ICsKPiArCXRlbXAgPSB0dS0+aV91cHBl cl9ib3VuZGFyeV9jb3VudCAqIHR1LT5ubGFuZXM7Cj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zy b21fZnJhY3Rpb24odHUtPnR1X3NpemUsIDEpOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9tdWwo dHUtPm9yaWdpbmFsX3JhdGlvX2ZwLCB0ZW1wMV9mcCk7Cj4gKwl0ZW1wMV9mcCA9IGRybV9maXhw X2Zyb21fZnJhY3Rpb24odHUtPm5ld192YWxpZF9ib3VuZGFyeV9saW5rLCAxKTsKPiArCXRlbXAy X2ZwID0gdGVtcDFfZnAgLSB0ZW1wMl9mcDsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9m cmFjdGlvbih0ZW1wLCAxKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAxX2ZwLCB0 ZW1wMl9mcCk7Cj4gKwo+ICsJaWYgKHRlbXAyX2ZwKQo+ICsJCXRlbXAyID0gZHJtX2ZpeHAyaW50 X2NlaWwodGVtcDJfZnApOwo+ICsJZWxzZQo+ICsJCXRlbXAyID0gMDsKPiArCXR1LT5leHRyYV9y ZXF1aXJlZF9ieXRlc19uZXdfdG1wID0gKGludCkodGVtcDEgKyB0ZW1wMik7Cj4gKwo+ICsJdGVt cDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKDgsIHR1LT5icHApOwo+ICsJdGVtcDJfZnAg PSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKAo+ICsJdHUtPmV4dHJhX3JlcXVpcmVkX2J5dGVzX25l d190bXAsIDEpOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9tdWwodGVtcDJfZnAsIHRlbXAxX2Zw KTsKPiArCj4gKwlpZiAodGVtcDFfZnApCj4gKwkJdHUtPmV4dHJhX3BjbGtfY3ljbGVzX3RtcCA9 IGRybV9maXhwMmludF9jZWlsKHRlbXAxX2ZwKTsKPiArCWVsc2UKPiArCQl0dS0+ZXh0cmFfcGNs a19jeWNsZXNfdG1wID0gMDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rp b24odHUtPmV4dHJhX3BjbGtfY3ljbGVzX3RtcCwgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhw X2Rpdih0dS0+bGNsa19mcCwgdHUtPnBjbGtfZnApOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9t dWwodGVtcDFfZnAsIHRlbXAyX2ZwKTsKPiArCj4gKwlpZiAodGVtcDFfZnApCj4gKwkJdHUtPmV4 dHJhX3BjbGtfY3ljbGVzX2luX2xpbmtfY2xrX3RtcCA9Cj4gKwkJCQkJCWRybV9maXhwMmludF9j ZWlsKHRlbXAxX2ZwKTsKPiArCWVsc2UKPiArCQl0dS0+ZXh0cmFfcGNsa19jeWNsZXNfaW5fbGlu a19jbGtfdG1wID0gMDsKPiArCj4gKwl0dS0+ZmlsbGVyX3NpemVfdG1wID0gdHUtPnR1X3NpemUg LSB0dS0+bmV3X3ZhbGlkX2JvdW5kYXJ5X2xpbms7Cj4gKwo+ICsJdHUtPmxvd2VyX2ZpbGxlcl9z aXplX3RtcCA9IHR1LT5maWxsZXJfc2l6ZV90bXAgKyAxOwo+ICsKPiArCXR1LT5kZWxheV9zdGFy dF9saW5rX3RtcCA9IHR1LT5leHRyYV9wY2xrX2N5Y2xlc19pbl9saW5rX2Nsa190bXAgKwo+ICsJ CQkJCXR1LT5sb3dlcl9maWxsZXJfc2l6ZV90bXAgKwo+ICsJCQkJCXR1LT5leHRyYV9idWZmZXJf bWFyZ2luOwo+ICsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS0+ZGVs YXlfc3RhcnRfbGlua190bXAsIDEpOwo+ICsJdHUtPmRlbGF5X3N0YXJ0X3RpbWVfZnAgPSBkcm1f Zml4cF9kaXYodGVtcDFfZnAsIHR1LT5sY2xrX2ZwKTsKPiArCj4gKwljb21wYXJlX3Jlc3VsdF8x ID0gX3R1X3BhcmFtX2NvbXBhcmUodHUtPm5fbl9lcnJfZnAsIHR1LT5kaWZmX2Fic19mcCk7Cj4g KwlpZiAoY29tcGFyZV9yZXN1bHRfMSA9PSAyKQo+ICsJCWNvbXBhcmVfcmVzdWx0XzEgPSAxOwo+ ICsJZWxzZQo+ICsJCWNvbXBhcmVfcmVzdWx0XzEgPSAwOwo+ICsKPiArCWNvbXBhcmVfcmVzdWx0 XzIgPSBfdHVfcGFyYW1fY29tcGFyZSh0dS0+bl9uX2Vycl9mcCwgdHUtPmVycl9mcCk7Cj4gKwlp ZiAoY29tcGFyZV9yZXN1bHRfMiA9PSAyKQo+ICsJCWNvbXBhcmVfcmVzdWx0XzIgPSAxOwo+ICsJ ZWxzZQo+ICsJCWNvbXBhcmVfcmVzdWx0XzIgPSAwOwo+ICsKPiArCWNvbXBhcmVfcmVzdWx0XzMg PSBfdHVfcGFyYW1fY29tcGFyZSh0dS0+aGJwX3RpbWVfZnAsCj4gKwkJCQkJdHUtPmRlbGF5X3N0 YXJ0X3RpbWVfZnApOwo+ICsJaWYgKGNvbXBhcmVfcmVzdWx0XzMgPT0gMikKPiArCQljb21wYXJl X3Jlc3VsdF8zID0gMDsKPiArCWVsc2UKPiArCQljb21wYXJlX3Jlc3VsdF8zID0gMTsKPiArCj4g KwlpZiAoKCh0dS0+ZXZlbl9kaXN0cmlidXRpb24gPT0gMSkgfHwKPiArCQkJKCh0dS0+ZXZlbl9k aXN0cmlidXRpb25fQkYgPT0gMCkgJiYKPiArCQkJKHR1LT5ldmVuX2Rpc3RyaWJ1dGlvbl9sZWdh Y3kgPT0gMCkpKSAmJgo+ICsJCQl0dS0+bl9lcnJfZnAgPj0gMCAmJiB0dS0+bl9uX2Vycl9mcCA+ PSAwICYmCj4gKwkJCWNvbXBhcmVfcmVzdWx0XzIgJiYKPiArCQkJKGNvbXBhcmVfcmVzdWx0XzEg fHwgKHR1LT5taW5faGJsYW5rX3Zpb2xhdGVkID09IDEpKSAmJgo+ICsJCQkodHUtPm5ld192YWxp ZF9ib3VuZGFyeV9saW5rIC0gMSkgPiAwICYmCj4gKwkJCWNvbXBhcmVfcmVzdWx0XzMgJiYKPiAr CQkJKHR1LT5kZWxheV9zdGFydF9saW5rX3RtcCA8PSAxMDIzKSkgewo+ICsJCXR1LT51cHBlcl9i b3VuZGFyeV9jb3VudCA9IHR1LT5pX3VwcGVyX2JvdW5kYXJ5X2NvdW50Owo+ICsJCXR1LT5sb3dl cl9ib3VuZGFyeV9jb3VudCA9IHR1LT5pX2xvd2VyX2JvdW5kYXJ5X2NvdW50Owo+ICsJCXR1LT5l cnJfZnAgPSB0dS0+bl9uX2Vycl9mcDsKPiArCQl0dS0+Ym91bmRhcnlfbW9kZXJhdGlvbl9lbiA9 IHRydWU7Cj4gKwkJdHUtPnR1X3NpemVfZGVzaXJlZCA9IHR1LT50dV9zaXplOwo+ICsJCXR1LT52 YWxpZF9ib3VuZGFyeV9saW5rID0gdHUtPm5ld192YWxpZF9ib3VuZGFyeV9saW5rOwo+ICsJCXR1 LT5lZmZlY3RpdmVfdmFsaWRfcmVjb3JkZWRfZnAgPSB0dS0+ZWZmZWN0aXZlX3ZhbGlkX2ZwOwo+ ICsJCXR1LT5ldmVuX2Rpc3RyaWJ1dGlvbl9CRiA9IDE7Cj4gKwkJdHUtPmRlbGF5X3N0YXJ0X2xp bmsgPSB0dS0+ZGVsYXlfc3RhcnRfbGlua190bXA7Cj4gKwl9IGVsc2UgaWYgKHR1LT5ib3VuZGFy eV9tb2RfbG93ZXJfZXJyID09IDApIHsKPiArCQljb21wYXJlX3Jlc3VsdF8xID0gX3R1X3BhcmFt X2NvbXBhcmUodHUtPm5fbl9lcnJfZnAsCj4gKwkJCQkJCQl0dS0+ZGlmZl9hYnNfZnApOwo+ICsJ CWlmIChjb21wYXJlX3Jlc3VsdF8xID09IDIpCj4gKwkJCXR1LT5ib3VuZGFyeV9tb2RfbG93ZXJf ZXJyID0gMTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX2RwX2N0cmxfY2FsY190dShz dHJ1Y3QgZHBfdHVfY2FsY19pbnB1dCAqaW4sCj4gKwkJCQkgICBzdHJ1Y3QgZHBfdmNfdHVfbWFw cGluZ190YWJsZSAqdHVfdGFibGUpCj4gK3sKPiArCXN0cnVjdCB0dV9hbGdvX2RhdGEgdHU7Cj4g KwlpbnQgY29tcGFyZV9yZXN1bHRfMSwgY29tcGFyZV9yZXN1bHRfMjsKPiArCXU2NCB0ZW1wID0g MDsKPiArCXM2NCB0ZW1wX2ZwID0gMCwgdGVtcDFfZnAgPSAwLCB0ZW1wMl9mcCA9IDA7Cj4gKwo+ ICsJczY0IExDTEtfRkFTVF9TS0VXX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbig2LCAxMDAw MCk7IC8qIDAuMDAwNiAqLwo+ICsJczY0IGNvbnN0X3A0OV9mcCA9IGRybV9maXhwX2Zyb21fZnJh Y3Rpb24oNDksIDEwMCk7IC8qIDAuNDkgKi8KPiArCXM2NCBjb25zdF9wNTZfZnAgPSBkcm1fZml4 cF9mcm9tX2ZyYWN0aW9uKDU2LCAxMDApOyAvKiAwLjU2ICovCj4gKwlzNjQgUkFUSU9fU0NBTEVf ZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKDEwMDEsIDEwMDApOwo+ICsKPiArCXU4IERQX0JS VVRFX0ZPUkNFID0gMTsKPiArCXM2NCBCUlVURV9GT1JDRV9USFJFU0hPTERfZnAgPSBkcm1fZml4 cF9mcm9tX2ZyYWN0aW9uKDEsIDEwKTsgLyogMC4xICovCj4gKwl1aW50IEVYVFJBX1BJWENMS19D WUNMRV9ERUxBWSA9IDQ7Cj4gKwl1aW50IEhCTEFOS19NQVJHSU4gPSA0OwoKSSB3b3VsZCBwcmVm ZXIgaWYgeW91IHVzZWQgbG93ZXIgY2FzZSBuYW1lcyBmb3IgYWxsIHZhcmlhYmxlcyB1bmxlc3Mg dGhlc2UgYXJlCmNvbnN0YW50cyBpbiBkaXNndWlzZSBhbmQgdGhlbiBpZiBzbyBtb3ZlIHRoZW0g dG8gI2RlZmluZS4KCj4gKwo+ICsJbWVtc2V0KCZ0dSwgMCwgc2l6ZW9mKHR1KSk7Cj4gKwo+ICsJ dHUubGNsa19mcCAgICAgICAgICAgICAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKGluLT5sY2xr LCAxKTsKPiArCXR1LnBjbGtfZnAgICAgICAgICAgICAgID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlv bihpbi0+cGNsa19raHosIDEwMDApOwo+ICsJdHUubHdpZHRoICAgICAgICAgICAgICAgPSBpbi0+ aGFjdGl2ZTsKPiArCXR1LmhicF9yZWxhdGl2ZV90b19wY2xrID0gaW4tPmhwb3JjaDsKPiArCXR1 Lm5sYW5lcyAgICAgICAgICAgICAgID0gaW4tPm5sYW5lczsKPiArCXR1LmJwcCAgICAgICAgICAg ICAgICAgID0gaW4tPmJwcDsKPiArCXR1LnBpeGVsRW5jICAgICAgICAgICAgID0gaW4tPnBpeGVs X2VuYzsKPiArCXR1LmRzY19lbiAgICAgICAgICAgICAgID0gaW4tPmRzY19lbjsKPiArCXR1LmFz eW5jX2VuICAgICAgICAgICAgID0gaW4tPmFzeW5jX2VuOwo+ICsKPiArCXR1LmVycl9mcCA9IGRy bV9maXhwX2Zyb21fZnJhY3Rpb24oMTAwMCwgMSk7IC8qIDEwMDAgKi8KPiArCj4gKwlpZiAodHUu cGl4ZWxFbmMgPT0gNDIwKSB7Cj4gKwkJdGVtcF9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24o MiwgMSk7Cj4gKwkJdHUucGNsa19mcCA9IGRybV9maXhwX2Rpdih0dS5wY2xrX2ZwLCB0ZW1wX2Zw KTsKPiArCQl0dS5sd2lkdGggLz0gMjsKPiArCQl0dS5oYnBfcmVsYXRpdmVfdG9fcGNsayAvPSAy Owo+ICsJfQo+ICsKPiArCWlmICh0dS5waXhlbEVuYyA9PSA0MjIpIHsKPiArCQlzd2l0Y2ggKHR1 LmJwcCkgewo+ICsJCWNhc2UgMjQ6Cj4gKwkJCXR1LmJwcCA9IDE2Owo+ICsJCQl0dS5icGMgPSA4 Owo+ICsJCQlicmVhazsKPiArCQljYXNlIDMwOgo+ICsJCQl0dS5icHAgPSAyMDsKPiArCQkJdHUu YnBjID0gMTA7Cj4gKwkJCWJyZWFrOwo+ICsJCWRlZmF1bHQ6Cj4gKwkJCXR1LmJwcCA9IDE2Owo+ ICsJCQl0dS5icGMgPSA4Owo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCXR1 LmJwYyA9IHR1LmJwcC8zOwo+ICsJfQo+ICsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9m cmFjdGlvbig0LCAxKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAxX2ZwLCB0dS5s Y2xrX2ZwKTsKPiArCXRlbXBfZnAgPSBkcm1fZml4cF9kaXYodGVtcDJfZnAsIHR1LnBjbGtfZnAp Owo+ICsJdHUuZXh0cmFfYnVmZmVyX21hcmdpbiA9IGRybV9maXhwMmludF9jZWlsKHRlbXBfZnAp Owo+ICsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS5icHAsIDgpOwo+ ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9tdWwodHUucGNsa19mcCwgdGVtcDFfZnApOwo+ICsJdGVt cDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1Lm5sYW5lcywgMSk7Cj4gKwl0ZW1wMl9m cCA9IGRybV9maXhwX2Rpdih0ZW1wMl9mcCwgdGVtcDFfZnApOwo+ICsJdHUucmF0aW9fZnAgPSBk cm1fZml4cF9kaXYodGVtcDJfZnAsIHR1LmxjbGtfZnApOwo+ICsKPiArCXR1Lm9yaWdpbmFsX3Jh dGlvX2ZwID0gdHUucmF0aW9fZnA7Cj4gKwl0dS5ib3VuZGFyeV9tb2RlcmF0aW9uX2VuID0gZmFs c2U7Cj4gKwl0dS51cHBlcl9ib3VuZGFyeV9jb3VudCA9IDA7Cj4gKwl0dS5sb3dlcl9ib3VuZGFy eV9jb3VudCA9IDA7Cj4gKwl0dS5pX3VwcGVyX2JvdW5kYXJ5X2NvdW50ID0gMDsKPiArCXR1Lmlf bG93ZXJfYm91bmRhcnlfY291bnQgPSAwOwo+ICsJdHUudmFsaWRfbG93ZXJfYm91bmRhcnlfbGlu ayA9IDA7Cj4gKwl0dS5ldmVuX2Rpc3RyaWJ1dGlvbl9CRiA9IDA7Cj4gKwl0dS5ldmVuX2Rpc3Ry aWJ1dGlvbl9sZWdhY3kgPSAwOwo+ICsJdHUuZXZlbl9kaXN0cmlidXRpb24gPSAwOwo+ICsJdHUu ZGVsYXlfc3RhcnRfdGltZV9mcCA9IDA7Cj4gKwo+ICsJdHUuZXJyX2ZwID0gZHJtX2ZpeHBfZnJv bV9mcmFjdGlvbigxMDAwLCAxKTsKPiArCXR1Lm5fZXJyX2ZwID0gMDsKPiArCXR1Lm5fbl9lcnJf ZnAgPSAwOwo+ICsKPiArCXR1LnJhdGlvID0gZHJtX2ZpeHAyaW50KHR1LnJhdGlvX2ZwKTsKPiAr CWlmICgoKCh1MzIpdHUubHdpZHRoICUgdHUubmxhbmVzKSAhPSAwKSAmJgo+ICsJCQkhdHUucmF0 aW8gJiYgdHUuZHNjX2VuID09IDApIHsKPiArCQl0dS5yYXRpb19mcCA9IGRybV9maXhwX211bCh0 dS5yYXRpb19mcCwgUkFUSU9fU0NBTEVfZnApOwo+ICsJCXR1LnJhdGlvID0gZHJtX2ZpeHAyaW50 KHR1LnJhdGlvX2ZwKTsKPiArCQlpZiAodHUucmF0aW8pCj4gKwkJCXR1LnJhdGlvX2ZwID0gZHJt X2ZpeHBfZnJvbV9mcmFjdGlvbigxLCAxKTsKPiArCX0KPiArCj4gKwlpZiAodHUucmF0aW8gPiAx KQo+ICsJCXR1LnJhdGlvID0gMTsKPiArCj4gKwlpZiAodHUucmF0aW8gPT0gMSkKPiArCQlnb3Rv IHR1X3NpemVfY2FsYzsKPiArCj4gKwljb21wYXJlX3Jlc3VsdF8xID0gX3R1X3BhcmFtX2NvbXBh cmUodHUucmF0aW9fZnAsIGNvbnN0X3A0OV9mcCk7Cj4gKwlpZiAoIWNvbXBhcmVfcmVzdWx0XzEg fHwgY29tcGFyZV9yZXN1bHRfMSA9PSAxKQo+ICsJCWNvbXBhcmVfcmVzdWx0XzEgPSAxOwo+ICsJ ZWxzZQo+ICsJCWNvbXBhcmVfcmVzdWx0XzEgPSAwOwo+ICsKPiArCWNvbXBhcmVfcmVzdWx0XzIg PSBfdHVfcGFyYW1fY29tcGFyZSh0dS5yYXRpb19mcCwgY29uc3RfcDU2X2ZwKTsKPiArCWlmICgh Y29tcGFyZV9yZXN1bHRfMiB8fCBjb21wYXJlX3Jlc3VsdF8yID09IDIpCj4gKwkJY29tcGFyZV9y ZXN1bHRfMiA9IDE7Cj4gKwllbHNlCj4gKwkJY29tcGFyZV9yZXN1bHRfMiA9IDA7Cj4gKwo+ICsJ aWYgKHR1LmRzY19lbiAmJiBjb21wYXJlX3Jlc3VsdF8xICYmIGNvbXBhcmVfcmVzdWx0XzIpIHsK PiArCQlIQkxBTktfTUFSR0lOICs9IDQ7Cj4gKwkJRFJNX0RFQlVHX0RQKCJJbmZvOiBpbmNyZWFz ZSBIQkxBTktfTUFSR0lOIHRvICVkXG4iLCBIQkxBTktfTUFSR0lOKTsKCllvdSBzZWVtIHRvIG1p eCBhbmQgbWF0Y2ggRFJNXyBsb2dnaW5nIG1hY3JvcyBhbmQgcHJfbG9nZ2luZyBtYWNyb3MgaW4g dGhpcwpmaWxlLgoKPiArCX0KPiArCj4gK3R1X3NpemVfY2FsYzoKPiArCWZvciAodHUudHVfc2l6 ZSA9IDMyOyB0dS50dV9zaXplIDw9IDY0OyB0dS50dV9zaXplKyspIHsKPiArCQl0ZW1wMV9mcCA9 IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUudHVfc2l6ZSwgMSk7Cj4gKwkJdGVtcDJfZnAgPSBk cm1fZml4cF9tdWwodHUucmF0aW9fZnAsIHRlbXAxX2ZwKTsKPiArCQl0ZW1wID0gZHJtX2ZpeHAy aW50X2NlaWwodGVtcDJfZnApOwo+ICsJCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlv bih0ZW1wLCAxKTsKPiArCQl0dS5uX2Vycl9mcCA9IHRlbXAxX2ZwIC0gdGVtcDJfZnA7Cj4gKwo+ ICsJCWlmICh0dS5uX2Vycl9mcCA8IHR1LmVycl9mcCkgewo+ICsJCQl0dS5lcnJfZnAgPSB0dS5u X2Vycl9mcDsKPiArCQkJdHUudHVfc2l6ZV9kZXNpcmVkID0gdHUudHVfc2l6ZTsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJdHUudHVfc2l6ZV9taW51czEgPSB0dS50dV9zaXplX2Rlc2lyZWQgLSAxOwo+ ICsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS50dV9zaXplX2Rlc2ly ZWQsIDEpOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9tdWwodHUucmF0aW9fZnAsIHRlbXAxX2Zw KTsKPiArCXR1LnZhbGlkX2JvdW5kYXJ5X2xpbmsgPSBkcm1fZml4cDJpbnRfY2VpbCh0ZW1wMl9m cCk7Cj4gKwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LmJwcCwgOCk7 Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUubHdpZHRoLCAxKTsKPiAr CXRlbXAyX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAyX2ZwLCB0ZW1wMV9mcCk7Cj4gKwo+ICsJdGVt cDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LnZhbGlkX2JvdW5kYXJ5X2xpbmssIDEp Owo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9kaXYodGVtcDJfZnAsIHRlbXAxX2ZwKTsKPiArCXR1 Lm5fdHVzID0gZHJtX2ZpeHAyaW50KHRlbXAyX2ZwKTsKPiArCj4gKwl0dS5ldmVuX2Rpc3RyaWJ1 dGlvbl9sZWdhY3kgPSB0dS5uX3R1cyAlIHR1Lm5sYW5lcyA9PSAwID8gMSA6IDA7Cj4gKwlEUk1f REVCVUdfRFAoIkluZm86IG5fc3ltID0gJWQsIG51bV9vZl90dXMgPSAlZFxuIiwKPiArCQl0dS52 YWxpZF9ib3VuZGFyeV9saW5rLCB0dS5uX3R1cyk7Cj4gKwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4 cF9mcm9tX2ZyYWN0aW9uKHR1LnR1X3NpemVfZGVzaXJlZCwgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRy bV9maXhwX211bCh0dS5vcmlnaW5hbF9yYXRpb19mcCwgdGVtcDFfZnApOwo+ICsJdGVtcDFfZnAg PSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LnZhbGlkX2JvdW5kYXJ5X2xpbmssIDEpOwo+ICsJ dGVtcDJfZnAgPSB0ZW1wMV9mcCAtIHRlbXAyX2ZwOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9m cm9tX2ZyYWN0aW9uKHR1Lm5fdHVzICsgMSwgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX211 bCh0ZW1wMV9mcCwgdGVtcDJfZnApOwo+ICsKPiArCXRlbXAgPSBkcm1fZml4cDJpbnQodGVtcDJf ZnApOwo+ICsJaWYgKHRlbXAgJiYgdGVtcDJfZnApCj4gKwkJdHUuZXh0cmFfYnl0ZXMgPSBkcm1f Zml4cDJpbnRfY2VpbCh0ZW1wMl9mcCk7Cj4gKwllbHNlCj4gKwkJdHUuZXh0cmFfYnl0ZXMgPSAw Owo+ICsKPiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS5leHRyYV9ieXRl cywgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24oOCwgdHUuYnBwKTsK PiArCXRlbXAxX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAxX2ZwLCB0ZW1wMl9mcCk7Cj4gKwo+ICsJ dGVtcCA9IGRybV9maXhwMmludCh0ZW1wMV9mcCk7Cj4gKwlpZiAodGVtcCAmJiB0ZW1wMV9mcCkK PiArCQl0dS5leHRyYV9wY2xrX2N5Y2xlcyA9IGRybV9maXhwMmludF9jZWlsKHRlbXAxX2ZwKTsK PiArCWVsc2UKPiArCQl0dS5leHRyYV9wY2xrX2N5Y2xlcyA9IDA7Cj4gKwo+ICsJdGVtcDFfZnAg PSBkcm1fZml4cF9kaXYodHUubGNsa19mcCwgdHUucGNsa19mcCk7Cj4gKwl0ZW1wMl9mcCA9IGRy bV9maXhwX2Zyb21fZnJhY3Rpb24odHUuZXh0cmFfcGNsa19jeWNsZXMsIDEpOwo+ICsJdGVtcDFf ZnAgPSBkcm1fZml4cF9tdWwodGVtcDJfZnAsIHRlbXAxX2ZwKTsKPiArCj4gKwl0ZW1wID0gZHJt X2ZpeHAyaW50KHRlbXAxX2ZwKTsKPiArCWlmICh0ZW1wICYmIHRlbXAxX2ZwKQo+ICsJCXR1LmV4 dHJhX3BjbGtfY3ljbGVzX2luX2xpbmtfY2xrID0gZHJtX2ZpeHAyaW50X2NlaWwodGVtcDFfZnAp Owo+ICsJZWxzZQo+ICsJCXR1LmV4dHJhX3BjbGtfY3ljbGVzX2luX2xpbmtfY2xrID0gMDsKPiAr Cj4gKwl0dS5maWxsZXJfc2l6ZSA9IHR1LnR1X3NpemVfZGVzaXJlZCAtIHR1LnZhbGlkX2JvdW5k YXJ5X2xpbms7Cj4gKwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LnR1 X3NpemVfZGVzaXJlZCwgMSk7Cj4gKwl0dS5yYXRpb19ieV90dV9mcCA9IGRybV9maXhwX211bCh0 dS5yYXRpb19mcCwgdGVtcDFfZnApOwo+ICsKPiArCXR1LmRlbGF5X3N0YXJ0X2xpbmsgPSB0dS5l eHRyYV9wY2xrX2N5Y2xlc19pbl9saW5rX2NsayArCj4gKwkJCQl0dS5maWxsZXJfc2l6ZSArIHR1 LmV4dHJhX2J1ZmZlcl9tYXJnaW47Cj4gKwo+ICsJdHUucmVzdWx0aW5nX3ZhbGlkX2ZwID0KPiAr CQkJZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS52YWxpZF9ib3VuZGFyeV9saW5rLCAxKTsKPiAr Cj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUudHVfc2l6ZV9kZXNpcmVk LCAxKTsKPiArCXRlbXAyX2ZwID0gZHJtX2ZpeHBfZGl2KHR1LnJlc3VsdGluZ192YWxpZF9mcCwg dGVtcDFfZnApOwo+ICsJdHUuVFVfcmF0aW9fZXJyX2ZwID0gdGVtcDJfZnAgLSB0dS5vcmlnaW5h bF9yYXRpb19mcDsKPiArCj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24oCj4g KwkJCSh0dS5oYnBfcmVsYXRpdmVfdG9fcGNsayAtIEhCTEFOS19NQVJHSU4pLCAxKTsKPiArCXR1 LmhicF90aW1lX2ZwID0gZHJtX2ZpeHBfZGl2KHRlbXAxX2ZwLCB0dS5wY2xrX2ZwKTsKPiArCj4g Kwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUuZGVsYXlfc3RhcnRfbGluaywg MSk7Cj4gKwl0dS5kZWxheV9zdGFydF90aW1lX2ZwID0gZHJtX2ZpeHBfZGl2KHRlbXAxX2ZwLCB0 dS5sY2xrX2ZwKTsKPiArCj4gKwljb21wYXJlX3Jlc3VsdF8xID0gX3R1X3BhcmFtX2NvbXBhcmUo dHUuaGJwX3RpbWVfZnAsCj4gKwkJCQkJdHUuZGVsYXlfc3RhcnRfdGltZV9mcCk7Cj4gKwlpZiAo Y29tcGFyZV9yZXN1bHRfMSA9PSAyKSAvKiBpZiAoaGJwX3RpbWVfZnAgPCBkZWxheV9zdGFydF90 aW1lX2ZwKSAqLwo+ICsJCXR1Lm1pbl9oYmxhbmtfdmlvbGF0ZWQgPSAxOwo+ICsKPiArCXRlbXAx X2ZwID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbih0dS5sd2lkdGgsIDEpOwo+ICsJdHUuaGFjdGl2 ZV90aW1lX2ZwID0gZHJtX2ZpeHBfZGl2KHRlbXAxX2ZwLCB0dS5wY2xrX2ZwKTsKPiArCj4gKwlj b21wYXJlX3Jlc3VsdF8yID0gX3R1X3BhcmFtX2NvbXBhcmUodHUuaGFjdGl2ZV90aW1lX2ZwLAo+ ICsJCQkJCQl0dS5kZWxheV9zdGFydF90aW1lX2ZwKTsKPiArCWlmIChjb21wYXJlX3Jlc3VsdF8y ID09IDIpCj4gKwkJdHUubWluX2hibGFua192aW9sYXRlZCA9IDE7Cj4gKwo+ICsJdHUuZGVsYXlf c3RhcnRfdGltZV9mcCA9IDA7Cj4gKwo+ICsJLyogYnJ1dGUgZm9yY2UgKi8KPiArCj4gKwl0dS5k ZWxheV9zdGFydF9saW5rX2V4dHJhX3BpeGNsayA9IEVYVFJBX1BJWENMS19DWUNMRV9ERUxBWTsK PiArCXR1LmRpZmZfYWJzX2ZwID0gdHUucmVzdWx0aW5nX3ZhbGlkX2ZwIC0gdHUucmF0aW9fYnlf dHVfZnA7Cj4gKwo+ICsJdGVtcCA9IGRybV9maXhwMmludCh0dS5kaWZmX2Fic19mcCk7Cj4gKwlp ZiAoIXRlbXAgJiYgdHUuZGlmZl9hYnNfZnAgPD0gMHhmZmZmKQo+ICsJCXR1LmRpZmZfYWJzX2Zw ID0gMDsKPiArCj4gKwkvKiBpZihkaWZmX2FicyA8IDApIGRpZmZfYWJzICo9IC0xICovCj4gKwlp ZiAodHUuZGlmZl9hYnNfZnAgPCAwKQo+ICsJCXR1LmRpZmZfYWJzX2ZwID0gZHJtX2ZpeHBfbXVs KHR1LmRpZmZfYWJzX2ZwLCAtMSk7Cj4gKwo+ICsJdHUuYm91bmRhcnlfbW9kX2xvd2VyX2VyciA9 IDA7Cj4gKwlpZiAoKHR1LmRpZmZfYWJzX2ZwICE9IDAgJiYKPiArCQkJKCh0dS5kaWZmX2Fic19m cCA+IEJSVVRFX0ZPUkNFX1RIUkVTSE9MRF9mcCkgfHwKPiArCQkJICh0dS5ldmVuX2Rpc3RyaWJ1 dGlvbl9sZWdhY3kgPT0gMCkgfHwKPiArCQkJIChEUF9CUlVURV9GT1JDRSA9PSAxKSkpIHx8Cj4g KwkJCSh0dS5taW5faGJsYW5rX3Zpb2xhdGVkID09IDEpKSB7Cj4gKwkJZG8gewo+ICsJCQl0dS5l cnJfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKDEwMDAsIDEpOwo+ICsKPiArCQkJdGVtcDFf ZnAgPSBkcm1fZml4cF9kaXYodHUubGNsa19mcCwgdHUucGNsa19mcCk7Cj4gKwkJCXRlbXAyX2Zw ID0gZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbigKPiArCQkJCQl0dS5kZWxheV9zdGFydF9saW5rX2V4 dHJhX3BpeGNsaywgMSk7Cj4gKwkJCXRlbXAxX2ZwID0gZHJtX2ZpeHBfbXVsKHRlbXAyX2ZwLCB0 ZW1wMV9mcCk7Cj4gKwo+ICsJCQlpZiAodGVtcDFfZnApCj4gKwkJCQl0dS5leHRyYV9idWZmZXJf bWFyZ2luID0KPiArCQkJCQlkcm1fZml4cDJpbnRfY2VpbCh0ZW1wMV9mcCk7Cj4gKwkJCWVsc2UK PiArCQkJCXR1LmV4dHJhX2J1ZmZlcl9tYXJnaW4gPSAwOwo+ICsKPiArCQkJdGVtcDFfZnAgPSBk cm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1LmJwcCwgOCk7Cj4gKwkJCXRlbXAyX2ZwID0gZHJtX2Zp eHBfZnJvbV9mcmFjdGlvbih0dS5sd2lkdGgsIDEpOwo+ICsJCQl0ZW1wMV9mcCA9IGRybV9maXhw X211bCh0ZW1wMl9mcCwgdGVtcDFfZnApOwo+ICsKPiArCQkJaWYgKHRlbXAxX2ZwKQo+ICsJCQkJ dHUubl9zeW1ib2xzID0gZHJtX2ZpeHAyaW50X2NlaWwodGVtcDFfZnApOwo+ICsJCQllbHNlCj4g KwkJCQl0dS5uX3N5bWJvbHMgPSAwOwo+ICsKPiArCQkJZm9yICh0dS50dV9zaXplID0gMzI7IHR1 LnR1X3NpemUgPD0gNjQ7IHR1LnR1X3NpemUrKykgewo+ICsJCQkJZm9yICh0dS5pX3VwcGVyX2Jv dW5kYXJ5X2NvdW50ID0gMTsKPiArCQkJCQl0dS5pX3VwcGVyX2JvdW5kYXJ5X2NvdW50IDw9IDE1 Owo+ICsJCQkJCXR1LmlfdXBwZXJfYm91bmRhcnlfY291bnQrKykgewo+ICsJCQkJCWZvciAodHUu aV9sb3dlcl9ib3VuZGFyeV9jb3VudCA9IDE7Cj4gKwkJCQkJCXR1LmlfbG93ZXJfYm91bmRhcnlf Y291bnQgPD0gMTU7Cj4gKwkJCQkJCXR1LmlfbG93ZXJfYm91bmRhcnlfY291bnQrKykgewo+ICsJ CQkJCQlfdHVfdmFsaWRfYm91bmRhcnlfY2FsYygmdHUpOwo+ICsJCQkJCX0KPiArCQkJCX0KPiAr CQkJfQo+ICsJCQl0dS5kZWxheV9zdGFydF9saW5rX2V4dHJhX3BpeGNsay0tOwo+ICsJCX0gd2hp bGUgKHR1LmJvdW5kYXJ5X21vZGVyYXRpb25fZW4gIT0gdHJ1ZSAmJgo+ICsJCQl0dS5ib3VuZGFy eV9tb2RfbG93ZXJfZXJyID09IDEgJiYKPiArCQkJdHUuZGVsYXlfc3RhcnRfbGlua19leHRyYV9w aXhjbGsgIT0gMCk7Cj4gKwo+ICsJCWlmICh0dS5ib3VuZGFyeV9tb2RlcmF0aW9uX2VuID09IHRy dWUpIHsKPiArCQkJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKAo+ICsJCQkJCSh0 dS51cHBlcl9ib3VuZGFyeV9jb3VudCAqCj4gKwkJCQkJdHUudmFsaWRfYm91bmRhcnlfbGluayAr Cj4gKwkJCQkJdHUubG93ZXJfYm91bmRhcnlfY291bnQgKgo+ICsJCQkJCSh0dS52YWxpZF9ib3Vu ZGFyeV9saW5rIC0gMSkpLCAxKTsKPiArCQkJdGVtcDJfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0 aW9uKAo+ICsJCQkJCSh0dS51cHBlcl9ib3VuZGFyeV9jb3VudCArCj4gKwkJCQkJdHUubG93ZXJf Ym91bmRhcnlfY291bnQpLCAxKTsKPiArCQkJdHUucmVzdWx0aW5nX3ZhbGlkX2ZwID0KPiArCQkJ CQlkcm1fZml4cF9kaXYodGVtcDFfZnAsIHRlbXAyX2ZwKTsKPiArCj4gKwkJCXRlbXAxX2ZwID0g ZHJtX2ZpeHBfZnJvbV9mcmFjdGlvbigKPiArCQkJCQl0dS50dV9zaXplX2Rlc2lyZWQsIDEpOwo+ ICsJCQl0dS5yYXRpb19ieV90dV9mcCA9Cj4gKwkJCQlkcm1fZml4cF9tdWwodHUub3JpZ2luYWxf cmF0aW9fZnAsIHRlbXAxX2ZwKTsKPiArCj4gKwkJCXR1LnZhbGlkX2xvd2VyX2JvdW5kYXJ5X2xp bmsgPQo+ICsJCQkJdHUudmFsaWRfYm91bmRhcnlfbGluayAtIDE7Cj4gKwo+ICsJCQl0ZW1wMV9m cCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUuYnBwLCA4KTsKPiArCQkJdGVtcDJfZnAgPSBk cm1fZml4cF9mcm9tX2ZyYWN0aW9uKHR1Lmx3aWR0aCwgMSk7Cj4gKwkJCXRlbXAxX2ZwID0gZHJt X2ZpeHBfbXVsKHRlbXAyX2ZwLCB0ZW1wMV9mcCk7Cj4gKwkJCXRlbXAyX2ZwID0gZHJtX2ZpeHBf ZGl2KHRlbXAxX2ZwLAo+ICsJCQkJCQl0dS5yZXN1bHRpbmdfdmFsaWRfZnApOwo+ICsJCQl0dS5u X3R1cyA9IGRybV9maXhwMmludCh0ZW1wMl9mcCk7Cj4gKwo+ICsJCQl0dS50dV9zaXplX21pbnVz MSA9IHR1LnR1X3NpemVfZGVzaXJlZCAtIDE7Cj4gKwkJCXR1LmV2ZW5fZGlzdHJpYnV0aW9uX0JG ID0gMTsKPiArCj4gKwkJCXRlbXAxX2ZwID0KPiArCQkJCWRybV9maXhwX2Zyb21fZnJhY3Rpb24o dHUudHVfc2l6ZV9kZXNpcmVkLCAxKTsKPiArCQkJdGVtcDJfZnAgPQo+ICsJCQkJZHJtX2ZpeHBf ZGl2KHR1LnJlc3VsdGluZ192YWxpZF9mcCwgdGVtcDFfZnApOwo+ICsJCQl0dS5UVV9yYXRpb19l cnJfZnAgPSB0ZW1wMl9mcCAtIHR1Lm9yaWdpbmFsX3JhdGlvX2ZwOwo+ICsJCX0KPiArCX0KPiAr Cj4gKwl0ZW1wMV9mcCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUubHdpZHRoLCAxKTsKPiAr CXRlbXAyX2ZwID0gZHJtX2ZpeHBfbXVsKExDTEtfRkFTVF9TS0VXX2ZwLCB0ZW1wMV9mcCk7Cj4g Kwo+ICsJaWYgKHRlbXAyX2ZwKQo+ICsJCXRlbXAgPSBkcm1fZml4cDJpbnRfY2VpbCh0ZW1wMl9m cCk7Cj4gKwllbHNlCj4gKwkJdGVtcCA9IDA7Cj4gKwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9m cm9tX2ZyYWN0aW9uKHR1Lm5sYW5lcywgMSk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX211bCh0 dS5vcmlnaW5hbF9yYXRpb19mcCwgdGVtcDFfZnApOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9m cm9tX2ZyYWN0aW9uKHR1LmJwcCwgOCk7Cj4gKwl0ZW1wMl9mcCA9IGRybV9maXhwX2Rpdih0ZW1w MV9mcCwgdGVtcDJfZnApOwo+ICsJdGVtcDFfZnAgPSBkcm1fZml4cF9mcm9tX2ZyYWN0aW9uKHRl bXAsIDEpOwo+ICsJdGVtcDJfZnAgPSBkcm1fZml4cF9tdWwodGVtcDFfZnAsIHRlbXAyX2ZwKTsK PiArCXRlbXAgPSBkcm1fZml4cDJpbnQodGVtcDJfZnApOwo+ICsKPiArCWlmICh0dS5hc3luY19l bikKPiArCQl0dS5kZWxheV9zdGFydF9saW5rICs9IChpbnQpdGVtcDsKPiArCj4gKwl0ZW1wMV9m cCA9IGRybV9maXhwX2Zyb21fZnJhY3Rpb24odHUuZGVsYXlfc3RhcnRfbGluaywgMSk7Cj4gKwl0 dS5kZWxheV9zdGFydF90aW1lX2ZwID0gZHJtX2ZpeHBfZGl2KHRlbXAxX2ZwLCB0dS5sY2xrX2Zw KTsKPiArCj4gKwkvKiBPVVRQVVRTICovCj4gKwl0dV90YWJsZS0+dmFsaWRfYm91bmRhcnlfbGlu ayAgICAgICA9IHR1LnZhbGlkX2JvdW5kYXJ5X2xpbms7Cj4gKwl0dV90YWJsZS0+ZGVsYXlfc3Rh cnRfbGluayAgICAgICAgICA9IHR1LmRlbGF5X3N0YXJ0X2xpbms7Cj4gKwl0dV90YWJsZS0+Ym91 bmRhcnlfbW9kZXJhdGlvbl9lbiAgICA9IHR1LmJvdW5kYXJ5X21vZGVyYXRpb25fZW47Cj4gKwl0 dV90YWJsZS0+dmFsaWRfbG93ZXJfYm91bmRhcnlfbGluayA9IHR1LnZhbGlkX2xvd2VyX2JvdW5k YXJ5X2xpbms7Cj4gKwl0dV90YWJsZS0+dXBwZXJfYm91bmRhcnlfY291bnQgICAgICA9IHR1LnVw cGVyX2JvdW5kYXJ5X2NvdW50Owo+ICsJdHVfdGFibGUtPmxvd2VyX2JvdW5kYXJ5X2NvdW50ICAg ICAgPSB0dS5sb3dlcl9ib3VuZGFyeV9jb3VudDsKPiArCXR1X3RhYmxlLT50dV9zaXplX21pbnVz MSAgICAgICAgICAgID0gdHUudHVfc2l6ZV9taW51czE7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJU VTogdmFsaWRfYm91bmRhcnlfbGluazogJWRcbiIsIHR1X3RhYmxlLT52YWxpZF9ib3VuZGFyeV9s aW5rKTsKPiArCURSTV9ERUJVR19EUCgiVFU6IGRlbGF5X3N0YXJ0X2xpbms6ICVkXG4iLCB0dV90 YWJsZS0+ZGVsYXlfc3RhcnRfbGluayk7Cj4gKwlEUk1fREVCVUdfRFAoIlRVOiBib3VuZGFyeV9t b2RlcmF0aW9uX2VuOiAlZFxuIiwKPiArCQkJdHVfdGFibGUtPmJvdW5kYXJ5X21vZGVyYXRpb25f ZW4pOwo+ICsJRFJNX0RFQlVHX0RQKCJUVTogdmFsaWRfbG93ZXJfYm91bmRhcnlfbGluazogJWRc biIsCj4gKwkJCXR1X3RhYmxlLT52YWxpZF9sb3dlcl9ib3VuZGFyeV9saW5rKTsKPiArCURSTV9E RUJVR19EUCgiVFU6IHVwcGVyX2JvdW5kYXJ5X2NvdW50OiAlZFxuIiwKPiArCQkJdHVfdGFibGUt PnVwcGVyX2JvdW5kYXJ5X2NvdW50KTsKPiArCURSTV9ERUJVR19EUCgiVFU6IGxvd2VyX2JvdW5k YXJ5X2NvdW50OiAlZFxuIiwKPiArCQkJdHVfdGFibGUtPmxvd2VyX2JvdW5kYXJ5X2NvdW50KTsK PiArCURSTV9ERUJVR19EUCgiVFU6IHR1X3NpemVfbWludXMxOiAlZFxuIiwgdHVfdGFibGUtPnR1 X3NpemVfbWludXMxKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHBfY3RybF9jYWxjX3R1X3Bh cmFtZXRlcnMoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCwKPiArCQlzdHJ1Y3QgZHBfdmNf dHVfbWFwcGluZ190YWJsZSAqdHVfdGFibGUpCj4gK3sKPiArCXN0cnVjdCBkcF90dV9jYWxjX2lu cHV0IGluOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlOwo+ICsKPiArCWRy bV9tb2RlID0gJmN0cmwtPnBhbmVsLT5kcF9tb2RlLmRybV9tb2RlOwo+ICsKPiArCWluLmxjbGsg PSBjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5yYXRlIC8gMTAwMDsKPiArCWluLnBjbGtfa2h6ID0g ZHJtX21vZGUtPmNsb2NrOwo+ICsJaW4uaGFjdGl2ZSA9IGRybV9tb2RlLT5oZGlzcGxheTsKPiAr CWluLmhwb3JjaCA9IGRybV9tb2RlLT5odG90YWwgLSBkcm1fbW9kZS0+aGRpc3BsYXk7Cj4gKwlp bi5ubGFuZXMgPSBjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5udW1fbGFuZXM7Cj4gKwlpbi5icHAg PSBjdHJsLT5wYW5lbC0+ZHBfbW9kZS5icHA7Cj4gKwlpbi5waXhlbF9lbmMgPSA0NDQ7Cj4gKwlp bi5kc2NfZW4gPSAwOwo+ICsJaW4uYXN5bmNfZW4gPSAwOwo+ICsKPiArCV9kcF9jdHJsX2NhbGNf dHUoJmluLCB0dV90YWJsZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2N0cmxfc2V0dXBf dHJfdW5pdChzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwl1MzIgZHBfdHUg PSAweDA7Cj4gKwl1MzIgdmFsaWRfYm91bmRhcnkgPSAweDA7Cj4gKwl1MzIgdmFsaWRfYm91bmRh cnkyID0gMHgwOwo+ICsJc3RydWN0IGRwX3ZjX3R1X21hcHBpbmdfdGFibGUgdHVfY2FsY190YWJs ZTsKPiArCj4gKwlkcF9jdHJsX2NhbGNfdHVfcGFyYW1ldGVycyhjdHJsLCAmdHVfY2FsY190YWJs ZSk7Cj4gKwo+ICsJZHBfdHUgfD0gdHVfY2FsY190YWJsZS50dV9zaXplX21pbnVzMTsKPiArCXZh bGlkX2JvdW5kYXJ5IHw9IHR1X2NhbGNfdGFibGUudmFsaWRfYm91bmRhcnlfbGluazsKPiArCXZh bGlkX2JvdW5kYXJ5IHw9ICh0dV9jYWxjX3RhYmxlLmRlbGF5X3N0YXJ0X2xpbmsgPDwgMTYpOwo+ ICsKPiArCXZhbGlkX2JvdW5kYXJ5MiB8PSAodHVfY2FsY190YWJsZS52YWxpZF9sb3dlcl9ib3Vu ZGFyeV9saW5rIDw8IDEpOwo+ICsJdmFsaWRfYm91bmRhcnkyIHw9ICh0dV9jYWxjX3RhYmxlLnVw cGVyX2JvdW5kYXJ5X2NvdW50IDw8IDE2KTsKPiArCXZhbGlkX2JvdW5kYXJ5MiB8PSAodHVfY2Fs Y190YWJsZS5sb3dlcl9ib3VuZGFyeV9jb3VudCA8PCAyMCk7Cj4gKwo+ICsJaWYgKHR1X2NhbGNf dGFibGUuYm91bmRhcnlfbW9kZXJhdGlvbl9lbikKPiArCQl2YWxpZF9ib3VuZGFyeTIgfD0gQklU KDApOwo+ICsKPiArCXByX2RlYnVnKCJkcF90dT0weCV4LCB2YWxpZF9ib3VuZGFyeT0weCV4LCB2 YWxpZF9ib3VuZGFyeTI9MHgleFxuIiwKPiArCQkJZHBfdHUsIHZhbGlkX2JvdW5kYXJ5LCB2YWxp ZF9ib3VuZGFyeTIpOwoKTGlrZSBoZXJlIC0gdGhpcyBzaG91bGQgYmUgRFJNX0RFQlVHX0RQPwoK PiArCj4gKwljdHJsLT5jYXRhbG9nLT5kcF90dSA9IGRwX3R1Owo+ICsJY3RybC0+Y2F0YWxvZy0+ dmFsaWRfYm91bmRhcnkgPSB2YWxpZF9ib3VuZGFyeTsKPiArCWN0cmwtPmNhdGFsb2ctPnZhbGlk X2JvdW5kYXJ5MiA9IHZhbGlkX2JvdW5kYXJ5MjsKPiArCj4gKwlkcF9jYXRhbG9nX2N0cmxfdXBk YXRlX3RyYW5zZmVyX3VuaXQoY3RybC0+Y2F0YWxvZyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg ZHBfY3RybF93YWl0NHZpZGVvX3JlYWR5KHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwpCj4g K3sKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1l b3V0KCZjdHJsLT52aWRlb19jb21wLAo+ICsJCQkJV0FJVF9GT1JfVklERU9fUkVBRFlfVElNRU9V VF9KSUZGSUVTKSkgewo+ICsJCURSTV9FUlJPUigiTGluayBUcmFpbiB0aW1lZG91dFxuIik7Cj4g KwkJcmV0ID0gLUVUSU1FRE9VVDsKPiArCX0KPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgZHBfY3RybF91cGRhdGVfdnhfcHgoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3Ry bCkKPiArewo+ICsJc3RydWN0IGRwX2xpbmsgKmxpbmsgPSBjdHJsLT5saW5rOwo+ICsJaW50IHJl dCA9IDAsIGxhbmU7Cj4gKwl1OCBidWZbNF07Cj4gKwl1MzIgbWF4X2xldmVsX3JlYWNoZWQgPSAw Owo+ICsJdTMyIHZvbHRhZ2Vfc3dpbmdfbGV2ZWwgPSBsaW5rLT5waHlfcGFyYW1zLnZfbGV2ZWw7 Cj4gKwl1MzIgcHJlX2VtcGhhc2lzX2xldmVsID0gbGluay0+cGh5X3BhcmFtcy5wX2xldmVsOwo+ ICsKPiArCXJldCA9IGRwX2NhdGFsb2dfY3RybF91cGRhdGVfdnhfcHgoY3RybC0+Y2F0YWxvZywK PiArCQl2b2x0YWdlX3N3aW5nX2xldmVsLCBwcmVfZW1waGFzaXNfbGV2ZWwpOwo+ICsJaWYgKHJl dCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWlmICh2b2x0YWdlX3N3aW5nX2xldmVsID09IERQ X1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFYKSB7Cj4gKwkJcHJfZGVidWcoIm1heC4gdm9sdGFnZSBz d2luZyBsZXZlbCByZWFjaGVkICVkXG4iLAo+ICsJCQkJdm9sdGFnZV9zd2luZ19sZXZlbCk7Cj4g KwkJbWF4X2xldmVsX3JlYWNoZWQgfD0gRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7Cj4gKwl9 Cj4gKwo+ICsJaWYgKHByZV9lbXBoYXNpc19sZXZlbCA9PSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNf TUFYKSB7Cj4gKwkJcHJfZGVidWcoIm1heC4gcHJlLWVtcGhhc2lzIGxldmVsIHJlYWNoZWQgJWRc biIsCj4gKwkJCQlwcmVfZW1waGFzaXNfbGV2ZWwpOwo+ICsJCW1heF9sZXZlbF9yZWFjaGVkICB8 PSBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQ7Cj4gKwl9Cj4gKwo+ICsJcHJlX2Vt cGhhc2lzX2xldmVsIDw8PSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7Cj4gKwo+ICsJZm9y IChsYW5lID0gMDsgbGFuZSA8IDQ7IGxhbmUrKykKPiArCQlidWZbbGFuZV0gPSB2b2x0YWdlX3N3 aW5nX2xldmVsIHwgcHJlX2VtcGhhc2lzX2xldmVsIHwgbWF4X2xldmVsX3JlYWNoZWQ7Cj4gKwo+ ICsJcHJfZGVidWcoInNpbms6IHB8dj0weCV4XG4iLCB2b2x0YWdlX3N3aW5nX2xldmVsIHwgcHJl X2VtcGhhc2lzX2xldmVsKTsKPiArCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKGN0cmwtPmF1eC0+ ZHJtX2F1eCwgRFBfVFJBSU5JTkdfTEFORTBfU0VULCBidWYsIDQpOwo+ICsJaWYgKHJldCA9PSA0 KQo+ICsJCXJldCA9IDA7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGJv b2wgZHBfY3RybF90cmFpbl9wYXR0ZXJuX3NldChzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJs LAo+ICsJCXU4IHBhdHRlcm4pCj4gK3sKPiArCXU4IGJ1Zls0XTsKPiArCWludCByZXQgPSAwOwo+ ICsKPiArCXByX2RlYnVnKCJzaW5rOiBwYXR0ZXJuPSV4XG4iLCBwYXR0ZXJuKTsKPiArCj4gKwli dWZbMF0gPSBwYXR0ZXJuOwo+ICsJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGN0cmwtPmF1eC0+ ZHJtX2F1eCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsIGJ1ZlswXSk7Cj4gKwlyZXR1cm4gcmV0 ID09IDE7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfY3RybF9yZWFkX2xpbmtfc3RhdHVzKHN0 cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwsCj4gKwkJCQkgICAgdTggKmxpbmtfc3RhdHVzKQo+ ICt7Cj4gKwlpbnQgbGVuID0gMDsKPiArCXUzMiBjb25zdCBvZmZzZXQgPSBEUF9MQU5FX0FMSUdO X1NUQVRVU19VUERBVEVEIC0gRFBfTEFORTBfMV9TVEFUVVM7Cj4gKwl1MzIgbGlua19zdGF0dXNf cmVhZF9tYXhfcmV0cmllcyA9IDEwMDsKPiArCj4gKwl3aGlsZSAoLS1saW5rX3N0YXR1c19yZWFk X21heF9yZXRyaWVzKSB7Cj4gKwkJbGVuID0gZHJtX2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cyhj dHJsLT5hdXgtPmRybV9hdXgsCj4gKwkJCWxpbmtfc3RhdHVzKTsKPiArCQlpZiAobGVuICE9IERQ X0xJTktfU1RBVFVTX1NJWkUpIHsKPiArCQkJRFJNX0VSUk9SKCJEUCBsaW5rIHN0YXR1cyByZWFk IGZhaWxlZCwgZXJyOiAlZFxuIiwgbGVuKTsKPiArCQkJcmV0dXJuIGxlbjsKPiArCQl9Cj4gKwo+ ICsJCWlmICghKGxpbmtfc3RhdHVzW29mZnNldF0gJiBEUF9MSU5LX1NUQVRVU19VUERBVEVEKSkK PiArCQkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIC1FVElNRURPVVQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgZHBfY3RybF9saW5rX3RyYWluXzEoc3RydWN0IGRwX2N0cmxfcHJpdmF0 ZSAqY3RybCkKPiArewo+ICsJaW50IHRyaWVzLCBvbGRfdl9sZXZlbCwgcmV0ID0gMDsKPiArCXU4 IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdOwo+ICsJaW50IGNvbnN0IG1heGltdW1f cmV0cmllcyA9IDU7Cj4gKwo+ICsJZHBfY2F0YWxvZ19jdHJsX3N0YXRlX2N0cmwoY3RybC0+Y2F0 YWxvZywgMCk7Cj4gKwo+ICsJcmV0ID0gZHBfY2F0YWxvZ19jdHJsX3NldF9wYXR0ZXJuKGN0cmwt PmNhdGFsb2csIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVy biByZXQ7Cj4gKwlkcF9jdHJsX3RyYWluX3BhdHRlcm5fc2V0KGN0cmwsIERQX1RSQUlOSU5HX1BB VFRFUk5fMSB8Cj4gKwkJRFBfTElOS19TQ1JBTUJMSU5HX0RJU0FCTEUpOwo+ICsJcmV0ID0gZHBf Y3RybF91cGRhdGVfdnhfcHgoY3RybCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4g Kwo+ICsJdHJpZXMgPSAwOwo+ICsJb2xkX3ZfbGV2ZWwgPSBjdHJsLT5saW5rLT5waHlfcGFyYW1z LnZfbGV2ZWw7Cj4gKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCBtYXhpbXVtX3JldHJpZXM7IHRy aWVzKyspIHsKPiArCQlkcm1fZHBfbGlua190cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShjdHJs LT5wYW5lbC0+ZHBjZCk7Cj4gKwo+ICsJCXJldCA9IGRwX2N0cmxfcmVhZF9saW5rX3N0YXR1cyhj dHJsLCBsaW5rX3N0YXR1cyk7Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiArCj4g KwkJaWYgKGRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rX3N0YXR1cywKPiArCQkJY3RybC0+ bGluay0+bGlua19wYXJhbXMubnVtX2xhbmVzKSkgewo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0K PiArCj4gKwkJaWYgKGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCA9PSBEUF9UUkFJTl9W T0xUQUdFX1NXSU5HX01BWCkgewo+ICsJCQlEUk1fRVJST1JfUkFURUxJTUlURUQoIm1heCB2X2xl dmVsIHJlYWNoZWRcbiIpOwo+ICsJCQlyZXR1cm4gLUVBR0FJTjsKPiArCQl9Cj4gKwo+ICsJCWlm IChvbGRfdl9sZXZlbCAhPSBjdHJsLT5saW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwpIHsKPiArCQkJ dHJpZXMgPSAwOwo+ICsJCQlvbGRfdl9sZXZlbCA9IGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9s ZXZlbDsKPiArCQl9Cj4gKwo+ICsJCXByX2RlYnVnKCJjbG9jayByZWNvdmVyeSBub3QgZG9uZSwg YWRqdXN0aW5nIHZ4IHB4XG4iKTsKPiArCj4gKwkJZHBfbGlua19hZGp1c3RfbGV2ZWxzKGN0cmwt PmxpbmssIGxpbmtfc3RhdHVzKTsKPiArCQlyZXQgPSBkcF9jdHJsX3VwZGF0ZV92eF9weChjdHJs KTsKPiArCQlpZiAocmV0KQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCURSTV9FUlJP UigibWF4IHRyaWVzIHJlYWNoZWRcbiIpOwo+ICsJcmV0dXJuIC1FVElNRURPVVQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgZHBfY3RybF9saW5rX3JhdGVfZG93bl9zaGlmdChzdHJ1Y3QgZHBfY3Ry bF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlzd2l0Y2ggKGN0 cmwtPmxpbmstPmxpbmtfcGFyYW1zLnJhdGUpIHsKPiArCWNhc2UgODEwMDAwOgo+ICsJCWN0cmwt PmxpbmstPmxpbmtfcGFyYW1zLnJhdGUgPSA1NDAwMDA7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDU0 MDAwMDoKPiArCQljdHJsLT5saW5rLT5saW5rX3BhcmFtcy5yYXRlID0gMjcwMDAwOwo+ICsJCWJy ZWFrOwo+ICsJY2FzZSAyNzAwMDA6Cj4gKwljYXNlIDE2MjAwMDoKPiArCWRlZmF1bHQ6Cj4gKwkJ Y3RybC0+bGluay0+bGlua19wYXJhbXMucmF0ZSA9IDE2MjAwMDsKPiArCQlicmVhazsKPiArCX07 Cj4gKwo+ICsJcHJfZGVidWcoIm5ldyByYXRlPTB4JXhcbiIsIGN0cmwtPmxpbmstPmxpbmtfcGFy YW1zLnJhdGUpOwo+ICsKPiArCXJldHVybiByZXQ7CgpyZXQgaXMgdW51c2VkIGluIHRoaXMgZnVu Y3Rpb24gLSByZXR1cm4gMDsKCj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2N0cmxfY2xlYXJf dHJhaW5pbmdfcGF0dGVybihzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlk cF9jdHJsX3RyYWluX3BhdHRlcm5fc2V0KGN0cmwsIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJM RSk7Cj4gKwlkcm1fZHBfbGlua190cmFpbl9jaGFubmVsX2VxX2RlbGF5KGN0cmwtPnBhbmVsLT5k cGNkKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9jdHJsX2xpbmtfdHJhaW5pbmdfMihzdHJ1 Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlpbnQgdHJpZXMgPSAwLCByZXQgPSAw Owo+ICsJY2hhciBwYXR0ZXJuOwo+ICsJaW50IGNvbnN0IG1heGltdW1fcmV0cmllcyA9IDU7Cj4g Kwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXTsKPiArCj4gKwlkcF9jYXRhbG9n X2N0cmxfc3RhdGVfY3RybChjdHJsLT5jYXRhbG9nLCAwKTsKPiArCj4gKwlpZiAoZHJtX2RwX3Rw czNfc3VwcG9ydGVkKGN0cmwtPnBhbmVsLT5kcGNkKSkKPiArCQlwYXR0ZXJuID0gRFBfVFJBSU5J TkdfUEFUVEVSTl8zOwo+ICsJZWxzZQo+ICsJCXBhdHRlcm4gPSBEUF9UUkFJTklOR19QQVRURVJO XzI7Cj4gKwo+ICsJcmV0ID0gZHBfY3RybF91cGRhdGVfdnhfcHgoY3RybCk7Cj4gKwlpZiAocmV0 KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0ID0gZHBfY2F0YWxvZ19jdHJsX3NldF9wYXR0 ZXJuKGN0cmwtPmNhdGFsb2csIHBhdHRlcm4pOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0 Owo+ICsKPiArCWRwX2N0cmxfdHJhaW5fcGF0dGVybl9zZXQoY3RybCwgcGF0dGVybiB8IERQX1JF Q09WRVJFRF9DTE9DS19PVVRfRU4pOwo+ICsKPiArCWZvciAodHJpZXMgPSAwOyB0cmllcyA8PSBt YXhpbXVtX3JldHJpZXM7IHRyaWVzKyspIHsKPiArCQlkcm1fZHBfbGlua190cmFpbl9jaGFubmVs X2VxX2RlbGF5KGN0cmwtPnBhbmVsLT5kcGNkKTsKPiArCj4gKwkJcmV0ID0gZHBfY3RybF9yZWFk X2xpbmtfc3RhdHVzKGN0cmwsIGxpbmtfc3RhdHVzKTsKPiArCQlpZiAocmV0KQo+ICsJCQlyZXR1 cm4gcmV0Owo+ICsKPiArCQlpZiAoZHJtX2RwX2NoYW5uZWxfZXFfb2sobGlua19zdGF0dXMsCj4g KwkJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLm51bV9sYW5lcykpCj4gKwkJCXJldHVybiByZXQ7 Cj4gKwo+ICsJCWRwX2xpbmtfYWRqdXN0X2xldmVscyhjdHJsLT5saW5rLCBsaW5rX3N0YXR1cyk7 Cj4gKwkJcmV0ID0gZHBfY3RybF91cGRhdGVfdnhfcHgoY3RybCk7Cj4gKwkJaWYgKHJldCkKPiAr CQkJcmV0dXJuIHJldDsKPiArCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIC1FVElNRURPVVQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgZHBfY3RybF9saW5rX3RyYWluKHN0cnVjdCBkcF9jdHJsX3ByaXZh dGUgKmN0cmwpCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJdTggZW5jb2RpbmcgPSBEUF9TRVRf QU5TSV84QjEwQjsKPiArCXN0cnVjdCBkcm1fZHBfbGluayBsaW5rX2luZm8gPSB7MH07Cj4gKwo+ ICsJY3RybC0+bGluay0+cGh5X3BhcmFtcy5wX2xldmVsID0gMDsKPiArCWN0cmwtPmxpbmstPnBo eV9wYXJhbXMudl9sZXZlbCA9IDA7Cj4gKwo+ICsJZHBfY3RybF9jb25maWdfY3RybChjdHJsKTsK PiArCj4gKwlyZXQgPSBkcm1fZHBfbGlua19wcm9iZShjdHJsLT5hdXgtPmRybV9hdXgsICZsaW5r X2luZm8pOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXRy aWV2ZSBsaW5rIGNhcGFiaWxpdGllcy4gcmV0PSVkXG4iLCByZXQpOwo+ICsJCWRwX2NhdGFsb2df Y3RybF9zdGF0ZV9jdHJsKGN0cmwtPmNhdGFsb2csIDApOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9 Cj4gKwo+ICsJZHJtX2RwX2xpbmtfY29uZmlndXJlKGN0cmwtPmF1eC0+ZHJtX2F1eCwgJmxpbmtf aW5mbyk7Cj4gKwlkcm1fZHBfZHBjZF93cml0ZShjdHJsLT5hdXgtPmRybV9hdXgsIERQX01BSU5f TElOS19DSEFOTkVMX0NPRElOR19TRVQsCj4gKwkJCQkmZW5jb2RpbmcsIDEpOwo+ICsKPiArCXJl dCA9IGRwX2N0cmxfbGlua190cmFpbl8xKGN0cmwpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9F UlJPUigibGluayB0cmFpbmluZyAjMSBmYWlsZWQuIHJldD0lZFxuIiwgcmV0KTsKPiArCQlnb3Rv IGVuZDsKPiArCX0KPiArCj4gKwkvKiBwcmludCBzdWNjZXNzIGluZm8gYXMgdGhpcyBpcyBhIHJl c3VsdCBvZiB1c2VyIGluaXRpYXRlZCBhY3Rpb24gKi8KPiArCURSTV9ERUJVR19EUCgibGluayB0 cmFpbmluZyAjMSBzdWNjZXNzZnVsXG4iKTsKPiArCj4gKwlyZXQgPSBkcF9jdHJsX2xpbmtfdHJh aW5pbmdfMihjdHJsKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoImxpbmsgdHJhaW5p bmcgIzIgZmFpbGVkLiByZXQ9JWRcbiIsIHJldCk7Cj4gKwkJZ290byBlbmQ7Cj4gKwl9Cj4gKwo+ ICsJLyogcHJpbnQgc3VjY2VzcyBpbmZvIGFzIHRoaXMgaXMgYSByZXN1bHQgb2YgdXNlciBpbml0 aWF0ZWQgYWN0aW9uICovCj4gKwlEUk1fREVCVUdfRFAoImxpbmsgdHJhaW5pbmcgIzIgc3VjY2Vz c2Z1bFxuIik7Cj4gKwo+ICtlbmQ6Cj4gKwlkcF9jYXRhbG9nX2N0cmxfc3RhdGVfY3RybChjdHJs LT5jYXRhbG9nLCAwKTsKPiArCj4gKwlkcF9jdHJsX2NsZWFyX3RyYWluaW5nX3BhdHRlcm4oY3Ry bCk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2N0cmxfc2V0dXBf bWFpbl9saW5rKHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwsIGJvb2wgdHJhaW4pCj4gK3sK PiArCWJvb2wgbWFpbmxpbmtfcmVhZHkgPSBmYWxzZTsKPiArCWludCByZXQgPSAwOwo+ICsKPiAr CWRwX2NhdGFsb2dfY3RybF9tYWlubGlua19jdHJsKGN0cmwtPmNhdGFsb2csIHRydWUpOwo+ICsK PiArCXJldCA9IGRwX2xpbmtfcHNtX2NvbmZpZyhjdHJsLT5saW5rLCAmY3RybC0+cGFuZWwtPmxp bmtfaW5mbywgZmFsc2UpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWlm IChjdHJsLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVS TikKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWlmICghdHJhaW4pCj4gKwkJZ290byBzZW5kX3Zp ZGVvOwo+ICsKPiArCS8qCj4gKwkgKiBBcyBwYXJ0IG9mIHByZXZpb3VzIGNhbGxzLCBEUCBjb250 cm9sbGVyIHN0YXRlIG1pZ2h0IGhhdmUKPiArCSAqIHRyYW5zaXRpb25lZCB0byBQVVNIX0lETEUu IEluIG9yZGVyIHRvIHN0YXJ0IHRyYW5zbWl0dGluZyBhIGxpbmsKPiArCSAqIHRyYWluaW5nIHBh dHRlcm4sIHdlIGhhdmUgdG8gZmlyc3QgZG8gYSBEUCBzb2Z0d2FyZSByZXNldC4KPiArCSAqLwo+ ICsJZHBfY2F0YWxvZ19jdHJsX3Jlc2V0KGN0cmwtPmNhdGFsb2cpOwo+ICsKPiArCXJldCA9IGRw X2N0cmxfbGlua190cmFpbihjdHJsKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiAr Cj4gK3NlbmRfdmlkZW86Cj4gKwkvKgo+ICsJICogU2V0IHVwIHRyYW5zZmVyIHVuaXQgdmFsdWVz IGFuZCBzZXQgY29udHJvbGxlciBzdGF0ZSB0byBzZW5kCj4gKwkgKiB2aWRlby4KPiArCSAqLwo+ ICsJZHBfY3RybF9zZXR1cF90cl91bml0KGN0cmwpOwo+ICsJZHBfY2F0YWxvZ19jdHJsX3N0YXRl X2N0cmwoY3RybC0+Y2F0YWxvZywgRFBfU1RBVEVfQ1RSTF9TRU5EX1ZJREVPKTsKPiArCj4gKwly ZXQgPSBkcF9jdHJsX3dhaXQ0dmlkZW9fcmVhZHkoY3RybCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJl dHVybiByZXQ7Cj4gKwo+ICsJbWFpbmxpbmtfcmVhZHkgPSBkcF9jYXRhbG9nX2N0cmxfbWFpbmxp bmtfcmVhZHkoY3RybC0+Y2F0YWxvZyk7Cj4gKwlEUk1fREVCVUdfRFAoIm1haW5saW5rICVzXG4i LCBtYWlubGlua19yZWFkeSA/ICJSRUFEWSIgOiAiTk9UIFJFQURZIik7Cj4gKwlyZXR1cm4gcmV0 Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9jdHJsX3NldF9jbG9ja19yYXRlKHN0cnVjdCBk cF9jdHJsX3ByaXZhdGUgKmN0cmwsCj4gKwkJCQkgICBjaGFyICpuYW1lLCB1MzIgcmF0ZSkKPiAr ewo+ICsJdTMyIG51bSA9IGN0cmwtPnBhcnNlci0+bXBbRFBfQ1RSTF9QTV0ubnVtX2NsazsKPiAr CXN0cnVjdCBkc3NfY2xrICpjZmcgPSBjdHJsLT5wYXJzZXItPm1wW0RQX0NUUkxfUE1dLmNsa19j b25maWc7Cj4gKwo+ICsJd2hpbGUgKG51bSAmJiBzdHJjbXAoY2ZnLT5jbGtfbmFtZSwgbmFtZSkp IHsKPiArCQludW0tLTsKPiArCQljZmcrKzsKPiArCX0KCldoeSBhcmUgeW91IHdhbGtpbmcgYmFj a3dhcmRzIGluIHRoaXMgbGlzdD8gIFNlZW1zIHRoYXQgZ29pbmcgZm9yd2FyZCBpcwpjbGVhcmVy LgoKICAgZm9yKG51bSA9IDA7IG51bSA8IGN0cmwtPnBhcnNlci0+bXBbRFBfQ1RSTF9QTV0ubnVt X2NsazsgbnVtKyssIGNmZysrKSB7CiAgICAgIGlmIChzdHJjbXAoY2ZnLT5jbGtfbmFtZSwgbmFt ZSkpIHsKICAgICAgICAgIGNmZy0+cmF0ZSA9IHJhdGU7CgkgIHJldHVybjsKICAgICAgfQogICB9 CgogICAvKiBlcnJvciBtZXNzYWdlICovCgo+ICsKPiArCURSTV9ERUJVR19EUCgic2V0dGluZyBy YXRlPSVkIG9uIGNsaz0lc1xuIiwgcmF0ZSwgbmFtZSk7Cj4gKwo+ICsJaWYgKG51bSkKPiArCQlj ZmctPnJhdGUgPSByYXRlOwo+ICsJZWxzZQo+ICsJCURSTV9FUlJPUigiJXMgY2xvY2sgY291bGQg bm90IGJlIHNldCB3aXRoIHJhdGUgJWRcbiIsIG5hbWUsIHJhdGUpOwoKVGhpcyBpc24ndCBleGFj dGx5IGFjY3VyYXRlIC0geW91IGFyZW4ndCBzZXR0aW5nIGFueXRoaW5nIGluIHRoZSBoYXJkd2Fy ZSBidXQKdGhlIGNsb2NrIGRvZXNuJ3QgZXhpc3QgaW4geW91ciBsaXN0LiBZb3Ugc2hvdWxkIHNh eSB0aGF0IGl0IGRvZXNuJ3QuCgo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2N0cmxfZW5hYmxl X21haW5saW5rX2Nsb2NrcyhzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlp bnQgcmV0ID0gMDsKPiArCj4gKwlkcF9wb3dlcl9zZXRfbGlua19jbGtfcGFyZW50KGN0cmwtPnBv d2VyKTsKPiArCWRwX3Bvd2VyX3NldF9waXhlbF9jbGtfcGFyZW50KGN0cmwtPnBvd2VyKTsKPiAr Cj4gKwlkcF9jdHJsX3NldF9jbG9ja19yYXRlKGN0cmwsICJjdHJsX2xpbmtfY2xrIiwgY3RybC0+ bGluay0+bGlua19wYXJhbXMucmF0ZSk7CgpJdCB3aWxsIHByb2JhYmx5IGNvbWUgdXAgZWxzZXdo ZXJlIHRvbywgYnV0IHRoZSBjbG9jayBuYW1lcyBzaG91bGRuJ3QgaGF2ZSB0aGUKX2NsayBleHRl bnNpb24gLSB0aGV5IGFyZSBvbmx5IG5hbWVkIGluIG9uZSBzcG90IGFuZCB3ZSBrbm93IHRoZXkg YXJlIGNsb2Nrcy4KWW91IHNob3VsZCBqdXN0IG5hbWUgaXQgImN0cmxfbGluayIgKGFuZCB1cGRh dGUgdGhlIERUIGFuZCBiaW5kaW5ncyBvZiBjb3Vyc2UpLgoKPiArCj4gKwlkcF9jdHJsX3NldF9j bG9ja19yYXRlKGN0cmwsICJjdHJsX3BpeGVsX2NsayIsIGN0cmwtPmRwX2N0cmwucGl4ZWxfcmF0 ZSk7CgpTYW1lLgoKPiArCj4gKwlyZXQgPSBkcF9wb3dlcl9jbGtfZW5hYmxlKGN0cmwtPnBvd2Vy LCBEUF9DVFJMX1BNLCB0cnVlKTsKPiArCWlmIChyZXQpCj4gKwkJRFJNX0VSUk9SKCJVbmFibGVk IHRvIHN0YXJ0IGxpbmsgY2xvY2tzLiByZXQ9JWRcbiIsIHJldCk7Cj4gKwo+ICsJcmV0dXJuIHJl dDsKPiArfQo+ICsKPiAraW50IGRwX2N0cmxfaG9zdF9pbml0KHN0cnVjdCBkcF9jdHJsICpkcF9j dHJsLCBib29sIGZsaXApCj4gK3sKPiArCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7Cj4g Kwo+ICsJaWYgKCFkcF9jdHJsKSB7Cj4gKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGlucHV0IGRhdGFc biIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWN0cmwgPSBjb250YWluZXJf b2YoZHBfY3RybCwgc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSwgZHBfY3RybCk7Cj4gKwo+ICsJY3Ry bC0+ZHBfY3RybC5vcmllbnRhdGlvbiA9IGZsaXA7Cj4gKwo+ICsJZHBfY2F0YWxvZ19jdHJsX3Vz Yl9yZXNldChjdHJsLT5jYXRhbG9nLCBmbGlwKTsKPiArCWRwX2NhdGFsb2dfY3RybF9waHlfcmVz ZXQoY3RybC0+Y2F0YWxvZyk7Cj4gKwlkcF9jYXRhbG9nX2N0cmxfZW5hYmxlX2lycShjdHJsLT5j YXRhbG9nLCB0cnVlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRw X2N0cmxfaG9zdF9kZWluaXQoKSAtIFVuaW5pdGlhbGl6ZSBEUCBjb250cm9sbGVyCj4gKyAqIEBj dHJsOiBEaXNwbGF5IFBvcnQgRHJpdmVyIGRhdGEKPiArICoKPiArICogUGVyZm9ybSByZXF1aXJl ZCBzdGVwcyB0byB1bmluaXRpYWxpemUgRFAgY29udHJvbGxlcgo+ICsgKiBhbmQgaXRzIHJlc291 cmNlcy4KPiArICovCj4gK3ZvaWQgZHBfY3RybF9ob3N0X2RlaW5pdChzdHJ1Y3QgZHBfY3RybCAq ZHBfY3RybCkKPiArewo+ICsJc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybDsKPiArCj4gKwlp ZiAoIWRwX2N0cmwpIHsKPiArCQlEUk1fRVJST1IoIkludmFsaWQgaW5wdXQgZGF0YVxuIik7CgpJ ZiB5b3UgYXJlIGRlLWluaXRpbmcsIGEgZXJyb3IgbWVzc2FnZSBpc24ndCBuZWVkZWQgaGVyZS4K Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWN0cmwgPSBjb250YWluZXJfb2YoZHBfY3RybCwg c3RydWN0IGRwX2N0cmxfcHJpdmF0ZSwgZHBfY3RybCk7Cj4gKwo+ICsJZHBfY2F0YWxvZ19jdHJs X2VuYWJsZV9pcnEoY3RybC0+Y2F0YWxvZywgZmFsc2UpOwo+ICsKPiArCURSTV9ERUJVR19EUCgi SG9zdCBkZWluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7Cj4gK30KPiArCj4gK3N0YXRpYyBi b29sIGRwX2N0cmxfdXNlX2ZpeGVkX252aWQoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCkK PiArewo+ICsJdTggKmRwY2QgPSBjdHJsLT5wYW5lbC0+ZHBjZDsKPiArCj4gKwkvKgo+ICsJICog Rm9yIGJldHRlciBpbnRlcm9wIGV4cGVyaWVuY2UsIHVzZWQgYSBmaXhlZCBOVklEPTB4ODAwMAo+ ICsJICogd2hlbmV2ZXIgY29ubmVjdGVkIHRvIGEgVkdBIGRvbmdsZSBkb3duc3RyZWFtLgo+ICsJ ICovCj4gKwlpZiAoZHBjZFtEUF9ET1dOU1RSRUFNUE9SVF9QUkVTRU5UXSAmIERQX0RXTl9TVFJN X1BPUlRfUFJFU0VOVCkgewo+ICsJCXU4IHR5cGUgPSBkcGNkW0RQX0RPV05TVFJFQU1QT1JUX1BS RVNFTlRdICYKPiArCQkJRFBfRFdOX1NUUk1fUE9SVF9UWVBFX01BU0s7Cj4gKwkJaWYgKHR5cGUg PT0gRFBfRFdOX1NUUk1fUE9SVF9UWVBFX0FOQUxPRykKPiArCQkJcmV0dXJuIHRydWU7Cj4gKwl9 Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2N0cmxfbGlu a19tYWludGVuYW5jZShzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlpbnQg cmV0ID0gMDsKPiArCj4gKwlkcF9jdHJsX3B1c2hfaWRsZSgmY3RybC0+ZHBfY3RybCk7Cj4gKwlk cF9jdHJsX3Jlc2V0KCZjdHJsLT5kcF9jdHJsKTsKPiArCj4gKwljdHJsLT5kcF9jdHJsLnBpeGVs X3JhdGUgPSBjdHJsLT5wYW5lbC0+ZHBfbW9kZS5kcm1fbW9kZS5jbG9jazsKPiArCj4gKwlkbyB7 Cj4gKwkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Cj4gKwkJCS8qIHRyeSB3aXRoIGxvd2VyIGxpbmsg cmF0ZSAqLwo+ICsJCQlkcF9jdHJsX2xpbmtfcmF0ZV9kb3duX3NoaWZ0KGN0cmwpOwo+ICsKPiAr CQkJZHBfY2F0YWxvZ19jdHJsX21haW5saW5rX2N0cmwoY3RybC0+Y2F0YWxvZywgZmFsc2UpOwo+ ICsJCX0KPiArCj4gKwkJZHBfY2F0YWxvZ19jdHJsX3BoeV9sYW5lX2NmZyhjdHJsLT5jYXRhbG9n LAo+ICsJCQljdHJsLT5kcF9jdHJsLm9yaWVudGF0aW9uLCBjdHJsLT5saW5rLT5saW5rX3BhcmFt cy5udW1fbGFuZXMpOwo+ICsKPiArCQkvKgo+ICsJCSAqIERpc2FibGUgYW5kIHJlLWVuYWJsZSB0 aGUgbWFpbmxpbmsgY2xvY2sgc2luY2UgdGhlCj4gKwkJICogbGluayBjbG9jayBtaWdodCBoYXZl IGJlZW4gYWRqdXN0ZWQgYXMgcGFydCBvZiB0aGUKPiArCQkgKiBsaW5rIG1haW50ZW5hbmNlLgo+ ICsJCSAqLwo+ICsJCXJldCA9IGRwX3Bvd2VyX2Nsa19lbmFibGUoY3RybC0+cG93ZXIsIERQX0NU UkxfUE0sIGZhbHNlKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCURSTV9FUlJPUigiRmFpbGVkIHRv IGRpc2FibGUgY2xvY2tzLiByZXQ9JWRcbiIsIHJldCk7Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiAr Cj4gKwkJcmV0ID0gZHBfY3RybF9lbmFibGVfbWFpbmxpbmtfY2xvY2tzKGN0cmwpOwo+ICsJCWlm IChyZXQpIHsKPiArCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZW5hYmxlIG1haW5saW5rIGNsa3Mu IHJldD0lZFxuIiwgcmV0KTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsKPiArCQlkcF9jdHJsX2Nv bmZpZ3VyZV9zb3VyY2VfcGFyYW1zKGN0cmwpOwo+ICsKPiArCQlkcF9jYXRhbG9nX2N0cmxfY29u ZmlnX21zYShjdHJsLT5jYXRhbG9nLAo+ICsJCQljdHJsLT5saW5rLT5saW5rX3BhcmFtcy5yYXRl LAo+ICsJCQljdHJsLT5kcF9jdHJsLnBpeGVsX3JhdGUsIGRwX2N0cmxfdXNlX2ZpeGVkX252aWQo Y3RybCkpOwo+ICsKPiArCQlyZWluaXRfY29tcGxldGlvbigmY3RybC0+aWRsZV9jb21wKTsKPiAr Cj4gKwkJcmV0ID0gZHBfY3RybF9zZXR1cF9tYWluX2xpbmsoY3RybCwgdHJ1ZSk7Cj4gKwl9IHdo aWxlIChyZXQgPT0gLUVBR0FJTik7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHBfY3RybF9wcm9jZXNzX3BoeV90ZXN0X3JlcXVlc3Qoc3RydWN0IGRwX2N0cmxf cHJpdmF0ZSAqY3RybCkKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJaWYgKCFjdHJsLT5s aW5rLT5waHlfcGFyYW1zLnBoeV90ZXN0X3BhdHRlcm5fc2VsKSB7Cj4gKwkJRFJNX0RFQlVHX0RQ KCJubyB0ZXN0IHBhdHRlcm4gc2VsZWN0ZWQgYnkgc2lua1xuIik7Cj4gKwkJcmV0dXJuOwo+ICsJ fQo+ICsKPiArCWRwX2N0cmxfcHVzaF9pZGxlKCZjdHJsLT5kcF9jdHJsKTsKPiArCS8qCj4gKwkg KiBUaGUgZ2xvYmFsIHJlc2V0IHdpbGwgbmVlZCBEUCBsaW5rIHJlbGF0ZWQgY2xvY2tzIHRvIGJl Cj4gKwkgKiBydW5uaW5nLiBBZGQgdGhlIGdsb2JhbCByZXNldCBqdXN0IGJlZm9yZSBkaXNhYmxp bmcgdGhlCj4gKwkgKiBsaW5rIGNsb2NrcyBhbmQgY29yZSBjbG9ja3MuCj4gKwkgKi8KPiArCWRw X2N0cmxfcmVzZXQoJmN0cmwtPmRwX2N0cmwpOwo+ICsJZHBfY3RybF9vZmYoJmN0cmwtPmRwX2N0 cmwpOwo+ICsKPiArCXJldCA9IGRwX2N0cmxfb24oJmN0cmwtPmRwX2N0cmwpOwo+ICsJaWYgKHJl dCkKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgRFAgY29udHJvbGxlclxuIik7Cj4g Kwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBkcF9jdHJsX3NlbmRfcGh5X3Rlc3RfcGF0dGVybihz dHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQo+ICt7Cj4gKwlib29sIHN1Y2Nlc3MgPSBmYWxz ZTsKPiArCXUzMiBwYXR0ZXJuX3NlbnQgPSAweDA7Cj4gKwl1MzIgcGF0dGVybl9yZXF1ZXN0ZWQg PSBjdHJsLT5saW5rLT5waHlfcGFyYW1zLnBoeV90ZXN0X3BhdHRlcm5fc2VsOwo+ICsKPiArCURS TV9ERUJVR19EUCgicmVxdWVzdDogMHgleFxuIiwgcGF0dGVybl9yZXF1ZXN0ZWQpOwo+ICsKPiAr CWlmIChkcF9jYXRhbG9nX2N0cmxfdXBkYXRlX3Z4X3B4KGN0cmwtPmNhdGFsb2csCj4gKwkJCWN0 cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCwKPiArCQkJY3RybC0+bGluay0+cGh5X3BhcmFt cy5wX2xldmVsKSkgewo+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvIHNldCB2L3AgbGV2ZWxzXG4i KTsKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwlkcF9jYXRhbG9nX2N0cmxfc2VuZF9waHlf cGF0dGVybihjdHJsLT5jYXRhbG9nLCBwYXR0ZXJuX3JlcXVlc3RlZCk7Cj4gKwlkcF9saW5rX3Nl bmRfdGVzdF9yZXNwb25zZShjdHJsLT5saW5rKTsKPiArCj4gKwlwYXR0ZXJuX3NlbnQgPSBkcF9j YXRhbG9nX2N0cmxfcmVhZF9waHlfcGF0dGVybihjdHJsLT5jYXRhbG9nKTsKPiArCj4gKwlzd2l0 Y2ggKHBhdHRlcm5fc2VudCkgewo+ICsJY2FzZSBNUl9MSU5LX1RSQUlOSU5HMToKPiArCQlzdWNj ZXNzID0gcGF0dGVybl9yZXF1ZXN0ZWQgPT0KPiArCQkJCURQX0xJTktfUVVBTF9QQVRURVJOX0Qx MF8yOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBNUl9MSU5LX1NZTUJPTF9FUk06Cj4gKwkJc3VjY2Vz cyA9IChwYXR0ZXJuX3JlcXVlc3RlZCA9PQo+ICsJCQkJRFBfTElOS19RVUFMX1BBVFRFUk5fRVJS T1JfUkFURSkKPiArCQkJfHwgKHBhdHRlcm5fcmVxdWVzdGVkID09Cj4gKwkJCQlEUF9MSU5LX1FV QUxfUEFUVEVSTl9IQlIyX0VZRSk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIE1SX0xJTktfUFJCUzc6 Cj4gKwkJc3VjY2VzcyA9IHBhdHRlcm5fcmVxdWVzdGVkID09IERQX0xJTktfUVVBTF9QQVRURVJO X1BSQlM3Owo+ICsJCWJyZWFrOwo+ICsJY2FzZSBNUl9MSU5LX0NVU1RPTTgwOgo+ICsJCXN1Y2Nl c3MgPSBwYXR0ZXJuX3JlcXVlc3RlZCA9PQo+ICsJCQkJRFBfTElOS19RVUFMX1BBVFRFUk5fODBC SVRfQ1VTVE9NOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlzdWNjZXNzID0gZmFsc2U7 Cj4gKwl9Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCIlczogdGVzdC0+MHgleFxuIiwgc3VjY2VzcyA/ ICJzdWNjZXNzIiA6ICJmYWlsZWQiLAo+ICsJCQkJCQlwYXR0ZXJuX3JlcXVlc3RlZCk7Cj4gKwly ZXR1cm4gc3VjY2VzczsKPiArfQo+ICsKPiArdm9pZCBkcF9jdHJsX2hhbmRsZV9zaW5rX3JlcXVl c3Qoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpCj4gK3sKPiArCXN0cnVjdCBkcF9jdHJsX3ByaXZh dGUgKmN0cmw7Cj4gKwl1MzIgc2lua19yZXF1ZXN0ID0gMHgwOwo+ICsKPiArCWlmICghZHBfY3Ry bCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJ fQo+ICsKPiArCWN0cmwgPSBjb250YWluZXJfb2YoZHBfY3RybCwgc3RydWN0IGRwX2N0cmxfcHJp dmF0ZSwgZHBfY3RybCk7Cj4gKwlzaW5rX3JlcXVlc3QgPSBjdHJsLT5saW5rLT5zaW5rX3JlcXVl c3Q7Cj4gKwo+ICsJaWYgKHNpbmtfcmVxdWVzdCAmIERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRU RVJOKSB7Cj4gKwkJRFJNX0RFQlVHX0RQKCJQSFlfVEVTVF9QQVRURVJOIHJlcXVlc3RcbiIpOwo+ ICsJCWRwX2N0cmxfcHJvY2Vzc19waHlfdGVzdF9yZXF1ZXN0KGN0cmwpOwo+ICsJfQo+ICsKPiAr CWlmIChzaW5rX3JlcXVlc3QgJiBEUF9MSU5LX1NUQVRVU19VUERBVEVEKQo+ICsJCWRwX2N0cmxf bGlua19tYWludGVuYW5jZShjdHJsKTsKPiArCj4gKwlpZiAoc2lua19yZXF1ZXN0ICYgRFBfVEVT VF9MSU5LX1RSQUlOSU5HKSB7Cj4gKwkJZHBfbGlua19zZW5kX3Rlc3RfcmVzcG9uc2UoY3RybC0+ bGluayk7Cj4gKwkJZHBfY3RybF9saW5rX21haW50ZW5hbmNlKGN0cmwpOwo+ICsJfQo+ICt9Cj4g Kwo+ICt2b2lkIGRwX2N0cmxfcmVzZXQoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpCj4gK3sKPiAr CXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7Cj4gKwo+ICsJaWYgKCFkcF9jdHJsKSB7Cj4g KwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsK PiArCWN0cmwgPSBjb250YWluZXJfb2YoZHBfY3RybCwgc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSwg ZHBfY3RybCk7Cj4gKwlkcF9jYXRhbG9nX2N0cmxfcmVzZXQoY3RybC0+Y2F0YWxvZyk7Cj4gK30K PiArCj4gK2ludCBkcF9jdHJsX29uKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKQo+ICt7Cj4gKwlp bnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybDsKPiArCXUzMiByYXRl ID0gMDsKPiArCXUzMiBsaW5rX3RyYWluX21heF9yZXRyaWVzID0gMTAwOwo+ICsJdTMyIGNvbnN0 IHBoeV9jdHNfcGl4ZWxfY2xrX2toeiA9IDE0ODUwMDsKPiArCj4gKwlpZiAoIWRwX2N0cmwpIHsK PiArCQlyYyA9IC1FSU5WQUw7ClRoaXMgY2FuIGp1c3QgcmV0dXJuIC1FSU5WQUw7Cj4gKwkJZ290 byBlbmQ7Cj4gKwl9Cj4gKwo+ICsJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3Qg ZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKPiArCj4gKwlhdG9taWNfc2V0KCZjdHJsLT5kcF9j dHJsLmFib3J0ZWQsIDApOwo+ICsJcmF0ZSA9IGN0cmwtPnBhbmVsLT5saW5rX2luZm8ucmF0ZTsK PiArCj4gKwlkcF9wb3dlcl9jbGtfZW5hYmxlKGN0cmwtPnBvd2VyLCBEUF9DT1JFX1BNLCB0cnVl KTsKPiArCWRwX2NhdGFsb2dfY3RybF9ocGRfY29uZmlnKGN0cmwtPmNhdGFsb2csIHRydWUpOwo+ ICsKPiArCWlmIChjdHJsLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfUEhZX1RF U1RfUEFUVEVSTikgewo+ICsJCURSTV9ERUJVR19EUCgidXNpbmcgcGh5IHRlc3QgbGluayBwYXJh bWV0ZXJzXG4iKTsKPiArCQlpZiAoIWN0cmwtPnBhbmVsLT5kcF9tb2RlLmRybV9tb2RlLmNsb2Nr KQo+ICsJCQljdHJsLT5kcF9jdHJsLnBpeGVsX3JhdGUgPSBwaHlfY3RzX3BpeGVsX2Nsa19raHo7 Cj4gKwl9IGVsc2Ugewo+ICsJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLnJhdGUgPSByYXRlOwo+ ICsJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLm51bV9sYW5lcyA9Cj4gKwkJCWN0cmwtPnBhbmVs LT5saW5rX2luZm8ubnVtX2xhbmVzOwo+ICsJCWN0cmwtPmRwX2N0cmwucGl4ZWxfcmF0ZSA9IGN0 cmwtPnBhbmVsLT5kcF9tb2RlLmRybV9tb2RlLmNsb2NrOwo+ICsJfQo+ICsKPiArCURSTV9ERUJV R19EUCgicmF0ZT0lZCwgbnVtX2xhbmVzPSVkLCBwaXhlbF9yYXRlPSVkXG4iLAo+ICsJCWN0cmwt PmxpbmstPmxpbmtfcGFyYW1zLnJhdGUsCj4gKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMubnVt X2xhbmVzLCBjdHJsLT5kcF9jdHJsLnBpeGVsX3JhdGUpOwo+ICsKPiArCWRwX2NhdGFsb2dfY3Ry bF9waHlfbGFuZV9jZmcoY3RybC0+Y2F0YWxvZywKPiArCQkJY3RybC0+ZHBfY3RybC5vcmllbnRh dGlvbiwgY3RybC0+bGluay0+bGlua19wYXJhbXMubnVtX2xhbmVzKTsKPiArCj4gKwlyYyA9IGRw X2N0cmxfZW5hYmxlX21haW5saW5rX2Nsb2NrcyhjdHJsKTsKPiArCWlmIChyYykKClJldHVybiBy YzsKCj4gKwkJZ290byBlbmQ7Cj4gKwo+ICsJcmVpbml0X2NvbXBsZXRpb24oJmN0cmwtPmlkbGVf Y29tcCk7Cj4gKwo+ICsJZHBfY3RybF9jb25maWd1cmVfc291cmNlX3BhcmFtcyhjdHJsKTsKPiAr Cj4gKwl3aGlsZSAoLS1saW5rX3RyYWluX21heF9yZXRyaWVzICYmICFhdG9taWNfcmVhZCgmY3Ry bC0+ZHBfY3RybC5hYm9ydGVkKSkgewo+ICsJCWRwX2NhdGFsb2dfY3RybF9jb25maWdfbXNhKGN0 cmwtPmNhdGFsb2csCj4gKwkJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLnJhdGUsCj4gKwkJCWN0 cmwtPmRwX2N0cmwucGl4ZWxfcmF0ZSwgZHBfY3RybF91c2VfZml4ZWRfbnZpZChjdHJsKSk7Cj4g Kwo+ICsJCXJjID0gZHBfY3RybF9zZXR1cF9tYWluX2xpbmsoY3RybCwgdHJ1ZSk7Cj4gKwkJaWYg KCFyYykKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCS8qIHRyeSB3aXRoIGxvd2VyIGxpbmsgcmF0ZSAq Lwo+ICsJCWRwX2N0cmxfbGlua19yYXRlX2Rvd25fc2hpZnQoY3RybCk7Cj4gKwo+ICsJCWRwX2Nh dGFsb2dfY3RybF9tYWlubGlua19jdHJsKGN0cmwtPmNhdGFsb2csIGZhbHNlKTsKPiArCj4gKwkJ cmMgPSBkcF9wb3dlcl9jbGtfZW5hYmxlKGN0cmwtPnBvd2VyLCBEUF9DVFJMX1BNLCBmYWxzZSk7 Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGRpc2FibGUgY2xvY2tz LiByZXQ9JWRcbiIsIHJjKTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJCS8qIGh3IHJlY29tbWVu ZGVkIGRlbGF5IGJlZm9yZSByZS1lbmFibGluZyBjbG9ja3MgKi8KPiArCQltc2xlZXAoMjApOwo+ ICsKPiArCQlkcF9jdHJsX2VuYWJsZV9tYWlubGlua19jbG9ja3MoY3RybCk7Cj4gKwl9Cj4gKwo+ ICsJaWYgKGN0cmwtPmxpbmstPnNpbmtfcmVxdWVzdCAmIERQX1RFU1RfTElOS19QSFlfVEVTVF9Q QVRURVJOKQo+ICsJCWRwX2N0cmxfc2VuZF9waHlfdGVzdF9wYXR0ZXJuKGN0cmwpOwo+ICsKPiAr CURSTV9ERUJVR19EUCgiRW5kLVxuIik7Cj4gKwo+ICtlbmQ6CgpMYWJlbCBpc24ndCBuZWVkZWQu Cgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICt2b2lkIGRwX2N0cmxfb2ZmKHN0cnVjdCBkcF9j dHJsICpkcF9jdHJsKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsOwo+ICsK PiArCWlmICghZHBfY3RybCkKPiArCQlyZXR1cm47Cj4gKwo+ICsJY3RybCA9IGNvbnRhaW5lcl9v ZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKPiArCj4gKwlkcF9j YXRhbG9nX2N0cmxfbWFpbmxpbmtfY3RybChjdHJsLT5jYXRhbG9nLCBmYWxzZSk7Cj4gKwlkcF9j YXRhbG9nX2N0cmxfcmVzZXQoY3RybC0+Y2F0YWxvZyk7Cj4gKwlkcF9wb3dlcl9jbGtfZW5hYmxl KGN0cmwtPnBvd2VyLCBEUF9DVFJMX1BNLCBmYWxzZSk7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJE UCBvZmYgZG9uZVxuIik7Cj4gK30KPiArCj4gK3ZvaWQgZHBfY3RybF9pc3Ioc3RydWN0IGRwX2N0 cmwgKmRwX2N0cmwpCj4gK3sKPiArCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7Cj4gKwo+ ICsJaWYgKCFkcF9jdHJsKQo+ICsJCXJldHVybjsKPiArCj4gKwljdHJsID0gY29udGFpbmVyX29m KGRwX2N0cmwsIHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUsIGRwX2N0cmwpOwo+ICsKPiArCWRwX2Nh dGFsb2dfY3RybF9nZXRfaW50ZXJydXB0KGN0cmwtPmNhdGFsb2cpOwo+ICsKPiArCWlmIChjdHJs LT5jYXRhbG9nLT5pc3IgJiBEUF9DVFJMX0lOVFJfUkVBRFlfRk9SX1ZJREVPKSB7Cj4gKwkJRFJN X0RFQlVHX0RQKCJkcF92aWRlb19yZWFkeVxuIik7Cj4gKwkJY29tcGxldGUoJmN0cmwtPnZpZGVv X2NvbXApOwo+ICsJfQo+ICsKPiArCWlmIChjdHJsLT5jYXRhbG9nLT5pc3IgJiBEUF9DVFJMX0lO VFJfSURMRV9QQVRURVJOX1NFTlQpIHsKPiArCQlEUk1fREVCVUdfRFAoImlkbGVfcGF0dGVybnNf c2VudFxuIik7Cj4gKwkJY29tcGxldGUoJmN0cmwtPmlkbGVfY29tcCk7Cj4gKwl9Cj4gK30KPiAr Cj4gK3N0cnVjdCBkcF9jdHJsICpkcF9jdHJsX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkcF9saW5rICpsaW5rLCBzdHJ1Y3QgZHBfcGFuZWwgKnBhbmVsLAo+ICsJCQlzdHJ1Y3QgZHBf YXV4ICphdXgsIHN0cnVjdCBkcF9wb3dlciAqcG93ZXIsIHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwg KmNhdGFsb2csCj4gKwkJCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcikKPiArewo+ICsJaW50IHJj ID0gMDsKPiArCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7Cj4gKwlzdHJ1Y3QgZHBfY3Ry bCAqZHBfY3RybDsKPiArCj4gKwlpZiAoIWRldiB8fCAhcGFuZWwgfHwgIWF1eCB8fAo+ICsJICAg ICFsaW5rIHx8ICFjYXRhbG9nKSB7CgpSZXR1cm4gRVJSX1BUUigtRUlOVkFMKSBidXQgdGhpcyBm ZWVscyBsaWtlIG9uZSBvZiB0aG9zZSBzaXR1YXRpb25zIHdoZXJlIHlvdQpjYW4gZmVlbCBwcmV0 dHkgc3VyZSB0aGF0IHRoZSBjYWxsZXIgd2lsbCBwb3B1bGF0ZSBldmVyeXRoaW5nIGNvcnJlY3Rs eS4KCj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7 Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPiArCj4gKwljdHJsID0gZGV2bV9remFsbG9jKGRldiwg c2l6ZW9mKCpjdHJsKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWN0cmwpIHsKPiArCQlyYyA9IC1F Tk9NRU07CnJldHVybiBFUlJfUFRSKC1FTk9NRU0pCgo+ICsJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4g Kwo+ICsJaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5pZGxlX2NvbXApOwo+ICsJaW5pdF9jb21wbGV0 aW9uKCZjdHJsLT52aWRlb19jb21wKTsKPiArCW11dGV4X2luaXQoJmN0cmwtPnB1c2hfaWRsZV9t dXRleCk7Cj4gKwo+ICsJLyogaW4gcGFyYW1ldGVycyAqLwo+ICsJY3RybC0+cGFyc2VyICAgPSBw YXJzZXI7Cj4gKwljdHJsLT5wYW5lbCAgICA9IHBhbmVsOwo+ICsJY3RybC0+cG93ZXIgICAgPSBw b3dlcjsKPiArCWN0cmwtPmF1eCAgICAgID0gYXV4Owo+ICsJY3RybC0+bGluayAgICAgPSBsaW5r Owo+ICsJY3RybC0+Y2F0YWxvZyAgPSBjYXRhbG9nOwo+ICsJY3RybC0+ZGV2ICAgICAgPSBkZXY7 Cj4gKwo+ICsJZHBfY3RybCA9ICZjdHJsLT5kcF9jdHJsOwo+ICsKPiArCXJldHVybiBkcF9jdHJs Owo+ICtlcnJvcjoKPiArCXJldHVybiBFUlJfUFRSKHJjKTsKCk5vdCBuZWVkZWQuCgo+ICt9Cj4g Kwo+ICt2b2lkIGRwX2N0cmxfcHV0KHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKQo+ICt7Cj4gKwlz dHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsOwo+ICsKPiArCWlmICghZHBfY3RybCkKPiArCQly ZXR1cm47Cj4gKwo+ICsJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3Ry bF9wcml2YXRlLCBkcF9jdHJsKTsKPiArCj4gKwltdXRleF9kZXN0cm95KCZjdHJsLT5wdXNoX2lk bGVfbXV0ZXgpOwoKWW91IGRvbid0IG5lZWQgdG8gZGVzdHJveSB0aGUgbXV0ZXggaWYgdGhlIG1l bW9yeSBpcyBnZXR0aW5nIGNsZWFyZWQgaW4gdGhlIG5leHQKc3RlcC4KCj4gKwo+ICsJZGV2bV9r ZnJlZShjdHJsLT5kZXYsIGN0cmwpOwoKQXMgd2l0aCB0aGUgb3RoZXIgdXNhZ2VzIG9mIGRldm1f a2ZyZWUoKQoKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0 cmwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwLi5kMTRjODA3Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oCj4gQEAgLTAsMCArMSwzNiBAQAo+ICsvKiBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCj4gKy8qCj4gKyAqIENvcHly aWdodCAoYykgMjAxMi0yMDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNl cnZlZC4KPiArICovCj4gKwo+ICsjaWZuZGVmIF9EUF9DVFJMX0hfCj4gKyNkZWZpbmUgX0RQX0NU UkxfSF8KPiArCj4gKyNpbmNsdWRlICJkcF9hdXguaCIKPiArI2luY2x1ZGUgImRwX3BhbmVsLmgi Cj4gKyNpbmNsdWRlICJkcF9saW5rLmgiCj4gKyNpbmNsdWRlICJkcF9wYXJzZXIuaCIKPiArI2lu Y2x1ZGUgImRwX3Bvd2VyLmgiCj4gKyNpbmNsdWRlICJkcF9jYXRhbG9nLmgiCj4gKwo+ICtzdHJ1 Y3QgZHBfY3RybCB7Cj4gKwlib29sIG9yaWVudGF0aW9uOwo+ICsJYXRvbWljX3QgYWJvcnRlZDsK PiArCXUzMiBwaXhlbF9yYXRlOwo+ICt9Owo+ICsKPiAraW50IGRwX2N0cmxfaG9zdF9pbml0KHN0 cnVjdCBkcF9jdHJsICpkcF9jdHJsLCBib29sIGZsaXApOwo+ICt2b2lkIGRwX2N0cmxfaG9zdF9k ZWluaXQoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpOwo+ICtpbnQgZHBfY3RybF9vbihzdHJ1Y3Qg ZHBfY3RybCAqZHBfY3RybCk7Cj4gK3ZvaWQgZHBfY3RybF9vZmYoc3RydWN0IGRwX2N0cmwgKmRw X2N0cmwpOwo+ICt2b2lkIGRwX2N0cmxfcHVzaF9pZGxlKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJs KTsKPiArdm9pZCBkcF9jdHJsX2Fib3J0KHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKTsKPiArdm9p ZCBkcF9jdHJsX2lzcihzdHJ1Y3QgZHBfY3RybCAqZHBfY3RybCk7Cj4gK3ZvaWQgZHBfY3RybF9y ZXNldChzdHJ1Y3QgZHBfY3RybCAqZHBfY3RybCk7Cj4gK3ZvaWQgZHBfY3RybF9oYW5kbGVfc2lu a19yZXF1ZXN0KHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKTsKPiArc3RydWN0IGRwX2N0cmwgKmRw X2N0cmxfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX2xpbmsgKmxpbmssIHN0cnVj dCBkcF9wYW5lbCAqcGFuZWwsCj4gKwkJCXN0cnVjdCBkcF9hdXggKmF1eCwgc3RydWN0IGRwX3Bv d2VyICpwb3dlciwgc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY2F0YWxvZywKPiArCQkJc3RydWN0 IGRwX3BhcnNlciAqcGFyc2VyKTsKPiArdm9pZCBkcF9jdHJsX3B1dChzdHJ1Y3QgZHBfY3RybCAq ZHBfY3RybCk7Cj4gKwo+ICsjZW5kaWYgLyogX0RQX0NUUkxfSF8gKi8KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNt L2RwL2RwX2Rpc3BsYXkuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4u MWIwNjgyYQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2Rw X2Rpc3BsYXkuYwo+IEBAIC0wLDAgKzEsOTQxIEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wLW9ubHkKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTksIFRo ZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNk ZWZpbmUgcHJfZm10KGZtdCkJIltkcm0tZHBdICVzOiAiIGZtdCwgX19mdW5jX18KPiArCj4gKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+ Cj4gKwo+ICsjaW5jbHVkZSAibXNtX2Rydi5oIgo+ICsjaW5jbHVkZSAiZHBfZXh0Y29uLmgiCj4g KyNpbmNsdWRlICJkcF9wYXJzZXIuaCIKPiArI2luY2x1ZGUgImRwX3Bvd2VyLmgiCj4gKyNpbmNs dWRlICJkcF9jYXRhbG9nLmgiCj4gKyNpbmNsdWRlICJkcF9hdXguaCIKPiArI2luY2x1ZGUgImRw X2xpbmsuaCIKPiArI2luY2x1ZGUgImRwX3BhbmVsLmgiCj4gKyNpbmNsdWRlICJkcF9jdHJsLmgi Cj4gKyNpbmNsdWRlICJkcF9kaXNwbGF5LmgiCj4gKyNpbmNsdWRlICJkcF9kcm0uaCIKPiArCj4g K3N0YXRpYyBzdHJ1Y3QgbXNtX2RwICpnX2RwX2Rpc3BsYXk7Cj4gKyNkZWZpbmUgSFBEX1NUUklO R19TSVpFIDMwCj4gKwo+ICtzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlIHsKPiArCWNoYXIgKm5h bWU7Cj4gKwlpbnQgaXJxOwo+ICsKPiArCS8qIHN0YXRlIHZhcmlhYmxlcyAqLwo+ICsJYm9vbCBj b3JlX2luaXRpYWxpemVkOwo+ICsJYm9vbCBwb3dlcl9vbjsKPiArCWJvb2wgaHBkX2lycV9vbjsK PiArCWJvb2wgYXVkaW9fc3VwcG9ydGVkOwo+ICsKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXY7Cj4gKwlzdHJ1Y3QgZGVudHJ5ICpyb290Owo+ICsJc3RydWN0IGNvbXBsZXRpb24gbm90 aWZpY2F0aW9uX2NvbXA7Cj4gKwo+ICsJc3RydWN0IGRwX3VzYnBkICAgKnVzYnBkOwo+ICsJc3Ry dWN0IGRwX3BhcnNlciAgKnBhcnNlcjsKPiArCXN0cnVjdCBkcF9wb3dlciAgICpwb3dlcjsKPiAr CXN0cnVjdCBkcF9jYXRhbG9nICpjYXRhbG9nOwo+ICsJc3RydWN0IGRwX2F1eCAgICAgKmF1eDsK PiArCXN0cnVjdCBkcF9saW5rICAgICpsaW5rOwo+ICsJc3RydWN0IGRwX3BhbmVsICAgKnBhbmVs Owo+ICsJc3RydWN0IGRwX2N0cmwgICAgKmN0cmw7Cj4gKwo+ICsJc3RydWN0IGRwX3VzYnBkX2Ni IHVzYnBkX2NiOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSBkcF9tb2RlOwo+ICsJc3RydWN0 IG1zbV9kcCBkcF9kaXNwbGF5Owo+ICsKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIGRwX2R0X21hdGNoW10gPSB7Cj4gKwl7LmNvbXBhdGlibGUgPSAicWNvbSxk cC1kaXNwbGF5In0sCj4gKwl7fQoKVGhpcyBsaW5lIHNob3VsZCBoYXZlIGEgY29tbWEgYWZ0ZXIg aXQuCgo+ICt9Owo+ICsKPiArc3RhdGljIGlycXJldHVybl90IGRwX2Rpc3BsYXlfaXJxKGludCBp cnEsIHZvaWQgKmRldl9pZCkKPiArewo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHAg PSBkZXZfaWQ7Cj4gKwo+ICsJaWYgKCFkcCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBkYXRh XG4iKTsKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwl9CgpJdCBpcyBub3QgcG9zc2libGUgZm9y ICdkcCcgdG8gYmUgTlVMTC4KCj4gKwo+ICsJLyogRFAgY29udHJvbGxlciBpc3IgKi8KPiArCWRw X2N0cmxfaXNyKGRwLT5jdHJsKTsKPiArCj4gKwkvKiBEUCBhdXggaXNyICovCj4gKwlkcF9hdXhf aXNyKGRwLT5hdXgpOwo+ICsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBkcF9kaXNwbGF5X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNl ICptYXN0ZXIsCj4gKwkJCSAgIHZvaWQgKmRhdGEpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlz dHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07 Cj4gKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2Owo+ICsJc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwo+ICsKPiArCWlmICghZGV2IHx8 ICFwZGV2IHx8ICFtYXN0ZXIpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgcGFyYW0ocyksIGRl diAlcEssIHBkZXYgJXBLLCBtYXN0ZXIgJXBLXG4iLAo+ICsJCQkJZGV2LCBwZGV2LCBtYXN0ZXIp Owo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVuZDsKPiArCX0KCkl0IGlzIG5vdCBwb3Nz aWJsZSBmb3IgYW55IG9mIHRoZXNlIHRvIGJlIE5VTEwKCj4gKwo+ICsJZHJtID0gZGV2X2dldF9k cnZkYXRhKG1hc3Rlcik7Cj4gKwlkcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsJ aWYgKCFkcm0gfHwgIWRwKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBhcmFtKHMpLCBkcm0g JXBLLCBkcCAlcEtcbiIsCj4gKwkJCQlkcm0sIGRwKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJ Z290byBlbmQ7Cj4gKwl9CgpJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBhbnkgb2YgdGhl c2UgdG8gYmUgTlVMTCBlaXRoZXIuCgo+ICsKPiArCWRwLT5kcF9kaXNwbGF5LmRybV9kZXYgPSBk cm07Cj4gKwlwcml2ID0gZHJtLT5kZXZfcHJpdmF0ZTsKPiArCXByaXYtPmRwID0gJihkcC0+ZHBf ZGlzcGxheSk7Cj4gKwo+ICsJcmMgPSBkcC0+cGFyc2VyLT5wYXJzZShkcC0+cGFyc2VyKTsKPiAr CWlmIChyYykgewo+ICsJCURSTV9FUlJPUigiZGV2aWNlIHRyZWUgcGFyc2luZyBmYWlsZWRcbiIp Owo+ICsJCWdvdG8gZW5kOwoKcmV0dXJuIHJjOwoKPiArCX0KPiArCj4gKwlyYyA9IGRwX2F1eF9y ZWdpc3RlcihkcC0+YXV4KTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigiRFJNIERQIEFV WCByZWdpc3RlciBmYWlsZWRcbiIpOwo+ICsJCWdvdG8gZW5kOwoKcmV0dXJuIHJjOwoKPiArCX0K PiArCj4gKwlyYyA9IGRwX3Bvd2VyX2NsaWVudF9pbml0KGRwLT5wb3dlcik7Cj4gKwlpZiAocmMp IHsKPiArCQlEUk1fRVJST1IoIlBvd2VyIGNsaWVudCBjcmVhdGUgZmFpbGVkXG4iKTsKPiArCQln b3RvIGVuZDsKCnJldHVybiByYzsKPiArCX0KPiArCj4gK2VuZDoKPiArCXJldHVybiByYzsKCkxh YmVsIGlzbid0IG5lZWRlZCBhbmQgeW91IGNhbiBqdXN0IHJldHVybiAwOwoKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZHBfZGlzcGxheV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qg ZGV2aWNlICptYXN0ZXIsCj4gKwkJCSAgICAgIHZvaWQgKmRhdGEpCj4gK3sKPiArCXN0cnVjdCBk cF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9 IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRl dl9nZXRfZHJ2ZGF0YShtYXN0ZXIpOwo+ICsJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9 IGRybS0+ZGV2X3ByaXZhdGU7Cj4gKwo+ICsJaWYgKCFkZXYgfHwgIXBkZXYpIHsKPiArCQlEUk1f RVJST1IoImludmFsaWQgcGFyYW0ocylcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KClRoZXNlIGNh biBuZXZlciBiZSBOVUxMLgoKPiArCj4gKwlkcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYp Owo+ICsJaWYgKCFkcCkgewo+ICsJCURSTV9FUlJPUigiSW52YWxpZCBwYXJhbXNcbiIpOwo+ICsJ CXJldHVybjsKPiArCX0KCk5laXRoZXIgY2FuIHRoaXMsIEkgZG9uJ3QgYmVsaWV2ZS4KCj4gKwo+ ICsJKHZvaWQpZHBfcG93ZXJfY2xpZW50X2RlaW5pdChkcC0+cG93ZXIpOwoKZHBfcG93ZXJfY2xp ZW50X2RlaW5pdCBpcyBhbHJlYWR5IHJldHVybmluZyB2b2lkLgoKCj4gKwkodm9pZClkcF9hdXhf dW5yZWdpc3RlcihkcC0+YXV4KTsKClNhbWUuCgo+ICsJcHJpdi0+ZHAgPSBOVUxMOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgZHBfZGlzcGxheV9jb21wX29w cyA9IHsKPiArCS5iaW5kID0gZHBfZGlzcGxheV9iaW5kLAo+ICsJLnVuYmluZCA9IGRwX2Rpc3Bs YXlfdW5iaW5kLAo+ICt9Owo+ICsKPiArc3RhdGljIGJvb2wgZHBfZGlzcGxheV9pc19kc19icmlk Z2Uoc3RydWN0IGRwX3BhbmVsICpwYW5lbCkKPiArewo+ICsJcmV0dXJuIChwYW5lbC0+ZHBjZFtE UF9ET1dOU1RSRUFNUE9SVF9QUkVTRU5UXSAmCj4gKwkJRFBfRFdOX1NUUk1fUE9SVF9QUkVTRU5U KTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgZHBfZGlzcGxheV9pc19zaW5rX2NvdW50X3plcm8o c3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCj4gK3sKPiArCXJldHVybiBkcF9kaXNwbGF5 X2lzX2RzX2JyaWRnZShkcC0+cGFuZWwpICYmCj4gKwkJKGRwLT5saW5rLT5zaW5rX2NvdW50ID09 IDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9kaXNwbGF5X3NlbmRfaHBkX2V2ZW50KHN0 cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpCj4gK3sKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUgKmRwOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKPiArCj4gKwlkcCA9 IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9k aXNwbGF5KTsKPiArCWlmICghZHApIHsKClRoZSByZXN1bHQgZnJvbSBjb250YWluZXJfb2YoKSBj YW4gbmV2ZXIgYmUgTlVMTC4KCj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4g KwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWNvbm5lY3RvciA9IGRwLT5kcF9kaXNwbGF5LmNvbm5l Y3RvcjsKPiArCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChjb25uZWN0b3ItPmRldik7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV9zZW5kX2hwZF9ub3RpZmljYXRpb24oc3RydWN0 IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHAsCj4gKwkJCQkJICAgIGJvb2wgaHBkKQo+ICt7Cj4gKwlp ZiAoKGhwZCAmJiBkcC0+ZHBfZGlzcGxheS5pc19jb25uZWN0ZWQpIHx8Cj4gKwkJCSghaHBkICYm ICFkcC0+ZHBfZGlzcGxheS5pc19jb25uZWN0ZWQpKSB7Cj4gKwkJRFJNX0RFQlVHX0RQKCJIUEQg YWxyZWFkeSAlc1xuIiwgKGhwZCA/ICJvbiIgOiAib2ZmIikpOwo+ICsJCXJldHVybiAwOwo+ICsJ fQo+ICsKPiArCS8qIHJlc2V0IHZpZGVvIHBhdHRlcm4gZmxhZyBvbiBkaXNjb25uZWN0ICovCj4g KwlpZiAoIWhwZCkKPiArCQlkcC0+cGFuZWwtPnZpZGVvX3Rlc3QgPSBmYWxzZTsKPiArCj4gKwlk cC0+ZHBfZGlzcGxheS5pc19jb25uZWN0ZWQgPSBocGQ7Cj4gKwlyZWluaXRfY29tcGxldGlvbigm ZHAtPm5vdGlmaWNhdGlvbl9jb21wKTsKPiArCWRwX2Rpc3BsYXlfc2VuZF9ocGRfZXZlbnQoJmRw LT5kcF9kaXNwbGF5KTsKPiArCj4gKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgm ZHAtPm5vdGlmaWNhdGlvbl9jb21wLCBIWiAqIDIpKSB7Cj4gKwkJcHJfd2FybigiJXMgdGltZW91 dFxuIiwgaHBkID8gImNvbm5lY3QiIDogImRpc2Nvbm5lY3QiKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9kaXNw bGF5X3Byb2Nlc3NfaHBkX2hpZ2goc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCj4gK3sK PiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZWRpZCAqZWRpZDsKPiArCj4gKwlkcF9hdXhfaW5p dChkcC0+YXV4LCBkcC0+cGFyc2VyLT5hdXhfY2ZnKTsKPiArCj4gKwlpZiAoZHAtPmxpbmstPnBz bV9lbmFibGVkKQo+ICsJCWdvdG8gbm90aWZ5Owo+ICsKPiArCXJjID0gZHBfcGFuZWxfcmVhZF9z aW5rX2NhcHMoZHAtPnBhbmVsLCBkcC0+ZHBfZGlzcGxheS5jb25uZWN0b3IpOwo+ICsJaWYgKHJj KQo+ICsJCWdvdG8gbm90aWZ5Owo+ICsKPiArCWRwX2xpbmtfcHJvY2Vzc19yZXF1ZXN0KGRwLT5s aW5rKTsKPiArCj4gKwlpZiAoZHBfZGlzcGxheV9pc19zaW5rX2NvdW50X3plcm8oZHApKSB7Cj4g KwkJRFJNX0RFQlVHX0RQKCJubyBkb3duc3RyZWFtIGRldmljZXMgY29ubmVjdGVkXG4iKTsKPiAr CQlyYyA9IC1FSU5WQUw7CgpZb3UgY2FuIGNhbiBqdXN0IHJldHVybiAtRUlOVkFMOwoKPiArCQln b3RvIGVuZDsKPiArCX0KPiArCj4gKwllZGlkID0gZHAtPnBhbmVsLT5lZGlkOwo+ICsKPiArCWRw LT5hdWRpb19zdXBwb3J0ZWQgPSBkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8oZWRpZCk7Cj4gKwo+ ICsJZHBfcGFuZWxfaGFuZGxlX3NpbmtfcmVxdWVzdChkcC0+cGFuZWwpOwo+ICsKPiArCWRwLT5k cF9kaXNwbGF5Lm1heF9wY2xrX2toeiA9IGRwLT5wYXJzZXItPm1heF9wY2xrX2toejsKPiArbm90 aWZ5Ogo+ICsJZHBfZGlzcGxheV9zZW5kX2hwZF9ub3RpZmljYXRpb24oZHAsIHRydWUpOwo+ICsK PiArZW5kOgo+ICsJcmV0dXJuIHJjOwoKUmV0dXJuIDAgYW5kIHRoZSBsYWJlbCBpc24ndCBuZWVk ZWQuCj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfaG9zdF9pbml0KHN0cnVjdCBk cF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlib29sIGZsaXAgPSBmYWxzZTsKPiArCj4g KwlpZiAoZHAtPmNvcmVfaW5pdGlhbGl6ZWQpIHsKPiArCQlEUk1fREVCVUdfRFAoIkRQIGNvcmUg YWxyZWFkeSBpbml0aWFsaXplZFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlmIChk cC0+dXNicGQtPm9yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0NDMikKPiArCQlmbGlwID0gdHJ1 ZTsKPiArCj4gKwlkcF9wb3dlcl9pbml0KGRwLT5wb3dlciwgZmxpcCk7Cj4gKwlkcF9jdHJsX2hv c3RfaW5pdChkcC0+Y3RybCwgZmxpcCk7Cj4gKwllbmFibGVfaXJxKGRwLT5pcnEpOwo+ICsJZHAt PmNvcmVfaW5pdGlhbGl6ZWQgPSB0cnVlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9kaXNw bGF5X2hvc3RfZGVpbml0KHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlp ZiAoIWRwLT5jb3JlX2luaXRpYWxpemVkKSB7Cj4gKwkJRFJNX0RFQlVHX0RQKCJEUCBjb3JlIGFs cmVhZHkgb2ZmXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHBfY3RybF9ob3N0X2Rl aW5pdChkcC0+Y3RybCk7Cj4gKwlkcF9hdXhfZGVpbml0KGRwLT5hdXgpOwo+ICsJZHBfcG93ZXJf ZGVpbml0KGRwLT5wb3dlcik7Cj4gKwlkaXNhYmxlX2lycShkcC0+aXJxKTsKPiArCWRwLT5jb3Jl X2luaXRpYWxpemVkID0gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlf cHJvY2Vzc19ocGRfbG93KHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwkv KiBjYW5jZWwgYW55IHBlbmRpbmcgcmVxdWVzdCAqLwo+ICsJZHBfY3RybF9hYm9ydChkcC0+Y3Ry bCk7Cj4gKwo+ICsJZHBfZGlzcGxheV9zZW5kX2hwZF9ub3RpZmljYXRpb24oZHAsIGZhbHNlKTsK PiArCj4gKwlkcF9hdXhfZGVpbml0KGRwLT5hdXgpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRw X2Rpc3BsYXlfdXNicGRfY29uZmlndXJlX2NiKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJ aW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsKPiArCWlm ICghZGV2KSB7CgpJdCBkb2Vzbid0IGFwcGVhciB0byBtZSB0aGF0IHRoaXMgd2lsbCBldmVyIGJl IHRydWUgLSB0aGVyZSBpcyBvbmx5IG9uZSBjYWxsZXIuCgo+ICsJCURSTV9FUlJPUigiaW52YWxp ZCBkZXZcbiIpOwoKUmV0dXJuIC1FSU5WQUw7Cgo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3Rv IGVuZDsKPiArCX0KPiArCj4gKwlkcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJaWYgKCFk cCkgewo+ICsJCURSTV9FUlJPUigibm8gZHJpdmVyIGRhdGEgZm91bmRcbiIpOwoKcmV0dXJuIC1F Tk9ERVY7Cgo+ICsJCXJjID0gLUVOT0RFVjsKPiArCQlnb3RvIGVuZDsKPiArCX0KPiArCj4gKwlk cF9kaXNwbGF5X2hvc3RfaW5pdChkcCk7Cj4gKwo+ICsJaWYgKGRwLT51c2JwZC0+aHBkX2hpZ2gp Cj4gKwkJZHBfZGlzcGxheV9wcm9jZXNzX2hwZF9oaWdoKGRwKTsKPiArZW5kOgo+ICsJcmV0dXJu IHJjOwoKcmV0dXJuIDAgYW5kIHRoZSBsYWJlbCBpc24ndCBuZWVkZWQKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHBfZGlzcGxheV9jbGVhbihzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcCkK PiArewo+ICsJZHBfY3RybF9wdXNoX2lkbGUoZHAtPmN0cmwpOwo+ICsJZHBfY3RybF9vZmYoZHAt PmN0cmwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfdXNicGRfZGlzY29ubmVj dF9jYihzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3Qg ZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCj4gKwlpZiAoIWRldikgewoKQXMgYWJvdmUsIEkg ZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIGV2ZXIgYmUgTlVMTAoKPiArCQlEUk1fRVJST1IoImludmFs aWQgZGV2XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7CgpidXQgaWYgaXQgaXMsIGp1c3QgcmV0dXJu IC1FSU5WQUw7Cgo+ICsJCWdvdG8gZW5kOwo+ICsJfQo+ICsKPiArCWRwID0gZGV2X2dldF9kcnZk YXRhKGRldik7Cj4gKwlpZiAoIWRwKSB7Cj4gKwkJRFJNX0VSUk9SKCJubyBkcml2ZXIgZGF0YSBm b3VuZFxuIik7Cj4gKwkJcmMgPSAtRU5PREVWOwoKUmV0dXJuIC1FTk9ERVY7Cgo+ICsJCWdvdG8g ZW5kOwo+ICsJfQo+ICsKPiArCS8qIGNhbmNlbCBhbnkgcGVuZGluZyByZXF1ZXN0ICovCj4gKwlk cF9jdHJsX2Fib3J0KGRwLT5jdHJsKTsKPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlfc2VuZF9ocGRf bm90aWZpY2F0aW9uKGRwLCBmYWxzZSk7Cj4gKwo+ICsJLyogaWYgY2FibGUgaXMgZGlzY29ubmVj dGVkLCByZXNldCBwc21fZW5hYmxlZCBmbGFnICovCj4gKwlpZiAoIWRwLT51c2JwZC0+YWx0X21v ZGVfY2ZnX2RvbmUpCj4gKwkJZHAtPmxpbmstPnBzbV9lbmFibGVkID0gZmFsc2U7Cj4gKwo+ICsJ aWYgKChyYyA8IDApICYmIGRwLT5wb3dlcl9vbikKPiArCQlkcF9kaXNwbGF5X2NsZWFuKGRwKTsK PiArCj4gKwlkcF9kaXNwbGF5X2hvc3RfZGVpbml0KGRwKTsKPiArZW5kOgo+ICsJcmV0dXJuIHJj OwoKUmVtb3ZlIHRoZSBsYWJlbCBhbmQgcmV0dXJuIDA7Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBkcF9kaXNwbGF5X2hhbmRsZV92aWRlb19yZXF1ZXN0KHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUgKmRwKQo+ICt7Cj4gKwlpZiAoZHAtPmxpbmstPnNpbmtfcmVxdWVzdCAmIERQX1RFU1RfTElO S19WSURFT19QQVRURVJOKSB7Cj4gKwkJLyogZm9yY2UgZGlzY29ubmVjdCBmb2xsb3dlZCBieSBj b25uZWN0ICovCj4gKwkJZHAtPnVzYnBkLT5jb25uZWN0KGRwLT51c2JwZCwgZmFsc2UpOwo+ICsJ CWRwLT5wYW5lbC0+dmlkZW9fdGVzdCA9IHRydWU7Cj4gKwkJZHAtPnVzYnBkLT5jb25uZWN0KGRw LT51c2JwZCwgdHJ1ZSk7Cj4gKwkJZHBfbGlua19zZW5kX3Rlc3RfcmVzcG9uc2UoZHAtPmxpbmsp Owo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfaGFuZGxlX2hwZF9pcnEo c3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCj4gK3sKPiArCWlmIChkcC0+bGluay0+c2lu a19yZXF1ZXN0ICYgRFNfUE9SVF9TVEFUVVNfQ0hBTkdFRCkgewo+ICsJCWRwX2Rpc3BsYXlfc2Vu ZF9ocGRfbm90aWZpY2F0aW9uKGRwLCBmYWxzZSk7Cj4gKwo+ICsJCWlmIChkcF9kaXNwbGF5X2lz X3NpbmtfY291bnRfemVybyhkcCkpIHsKPiArCQkJRFJNX0RFQlVHX0RQKCJzaW5rIGNvdW50IGlz IHplcm8sIG5vdGhpbmcgdG8gZG9cbiIpOwo+ICsJCQlyZXR1cm4gMDsKPiArCQl9Cj4gKwo+ICsJ CXJldHVybiBkcF9kaXNwbGF5X3Byb2Nlc3NfaHBkX2hpZ2goZHApOwo+ICsJfQo+ICsKPiArCWRw X2N0cmxfaGFuZGxlX3NpbmtfcmVxdWVzdChkcC0+Y3RybCk7Cj4gKwo+ICsJZHBfZGlzcGxheV9o YW5kbGVfdmlkZW9fcmVxdWVzdChkcCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgZHBfZGlzcGxheV91c2JwZF9hdHRlbnRpb25fY2Ioc3RydWN0IGRldmljZSAqZGV2 KQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7 Cj4gKwo+ICsJaWYgKCFkZXYpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgZGV2XG4iKTsKPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp Owo+ICsJaWYgKCFkcCkgewo+ICsJCURSTV9FUlJPUigibm8gZHJpdmVyIGRhdGEgZm91bmRcbiIp Owo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiArCWlmIChkcC0+dXNicGQtPmhwZF9p cnEpIHsKPiArCQlkcC0+aHBkX2lycV9vbiA9IHRydWU7Cj4gKwo+ICsJCXJjID0gZHBfbGlua19w cm9jZXNzX3JlcXVlc3QoZHAtPmxpbmspOwo+ICsJCS8qIGNoZWNrIGZvciBhbnkgdGVzdCByZXF1 ZXN0IGlzc3VlZCBieSBzaW5rICovCj4gKwkJaWYgKCFyYykKPiArCQkJZHBfZGlzcGxheV9oYW5k bGVfaHBkX2lycShkcCk7Cj4gKwo+ICsJCWRwLT5ocGRfaXJxX29uID0gZmFsc2U7Cj4gKwkJZ290 byBlbmQ7Cj4gKwl9Cj4gKwo+ICsJaWYgKCFkcC0+dXNicGQtPmhwZF9oaWdoKSB7Cj4gKwkJZHBf ZGlzcGxheV9wcm9jZXNzX2hwZF9sb3coZHApOwo+ICsJCWdvdG8gZW5kOwo+ICsJfQo+ICsKPiAr CWlmIChkcC0+dXNicGQtPmFsdF9tb2RlX2NmZ19kb25lKQo+ICsJCWRwX2Rpc3BsYXlfcHJvY2Vz c19ocGRfaGlnaChkcCk7Cj4gK2VuZDoKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZHBfZGlzcGxheV9kZWluaXRfc3ViX21vZHVsZXMoc3RydWN0IGRwX2Rpc3BsYXlfcHJp dmF0ZSAqZHApCj4gK3sKPiArCWRwX2N0cmxfcHV0KGRwLT5jdHJsKTsKPiArCWRwX2xpbmtfcHV0 KGRwLT5saW5rKTsKPiArCWRwX3BhbmVsX3B1dChkcC0+cGFuZWwpOwo+ICsJZHBfYXV4X3B1dChk cC0+YXV4KTsKPiArCWRwX3Bvd2VyX3B1dChkcC0+cG93ZXIpOwo+ICsJZHBfY2F0YWxvZ19wdXQo ZHAtPmNhdGFsb2cpOwo+ICsJZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBkcF9pbml0X3N1Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUg KmRwKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmRwLT5w ZGV2LT5kZXY7Cj4gKwlzdHJ1Y3QgZHBfdXNicGRfY2IgKmNiID0gJmRwLT51c2JwZF9jYjsKPiAr CXN0cnVjdCBkcF9wYW5lbF9pbiBwYW5lbF9pbiA9IHsKPiArCQkuZGV2ID0gZGV2LAo+ICsJfTsK PiArCj4gKwkvKiBDYWxsYmFjayBBUElzIHVzZWQgZm9yIGNhYmxlIHN0YXR1cyBjaGFuZ2UgZXZl bnQgKi8KPiArCWNiLT5jb25maWd1cmUgID0gZHBfZGlzcGxheV91c2JwZF9jb25maWd1cmVfY2I7 Cj4gKwljYi0+ZGlzY29ubmVjdCA9IGRwX2Rpc3BsYXlfdXNicGRfZGlzY29ubmVjdF9jYjsKPiAr CWNiLT5hdHRlbnRpb24gID0gZHBfZGlzcGxheV91c2JwZF9hdHRlbnRpb25fY2I7Cj4gKwo+ICsJ ZHAtPnBhcnNlciA9IGRwX3BhcnNlcl9nZXQoZHAtPnBkZXYpOwo+ICsJaWYgKElTX0VSUihkcC0+ cGFyc2VyKSkgewo+ICsJCXJjID0gUFRSX0VSUihkcC0+cGFyc2VyKTsKPiArCQlEUk1fRVJST1Io ImZhaWxlZCB0byBpbml0aWFsaXplIHBhcnNlciwgcmMgPSAlZFxuIiwgcmMpOwo+ICsJCWRwLT5w YXJzZXIgPSBOVUxMOwo+ICsJCWdvdG8gZXJyb3JfcGFyc2VyOwo+ICsJfQo+ICsKPiArCWRwLT5j YXRhbG9nID0gZHBfY2F0YWxvZ19nZXQoZGV2LCAmZHAtPnBhcnNlci0+aW8pOwo+ICsJaWYgKElT X0VSUihkcC0+Y2F0YWxvZykpIHsKPiArCQlyYyA9IFBUUl9FUlIoZHAtPmNhdGFsb2cpOwo+ICsJ CURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgY2F0YWxvZywgcmMgPSAlZFxuIiwgcmMp Owo+ICsJCWRwLT5jYXRhbG9nID0gTlVMTDsKPiArCQlnb3RvIGVycm9yX2NhdGFsb2c7Cj4gKwl9 Cj4gKwo+ICsJZHAtPnBvd2VyID0gZHBfcG93ZXJfZ2V0KGRwLT5wYXJzZXIpOwo+ICsJaWYgKElT X0VSUihkcC0+cG93ZXIpKSB7Cj4gKwkJcmMgPSBQVFJfRVJSKGRwLT5wb3dlcik7Cj4gKwkJRFJN X0VSUk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3dlciwgcmMgPSAlZFxuIiwgcmMpOwo+ICsJ CWRwLT5wb3dlciA9IE5VTEw7Cj4gKwkJZ290byBlcnJvcl9wb3dlcjsKPiArCX0KPiArCj4gKwlk cC0+YXV4ID0gZHBfYXV4X2dldChkZXYsICZkcC0+Y2F0YWxvZy0+YXV4LCBkcC0+cGFyc2VyLT5h dXhfY2ZnKTsKPiArCWlmIChJU19FUlIoZHAtPmF1eCkpIHsKPiArCQlyYyA9IFBUUl9FUlIoZHAt PmF1eCk7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdXgsIHJjID0gJWRc biIsIHJjKTsKPiArCQlkcC0+YXV4ID0gTlVMTDsKPiArCQlnb3RvIGVycm9yX2F1eDsKPiArCX0K PiArCj4gKwlkcC0+bGluayA9IGRwX2xpbmtfZ2V0KGRldiwgZHAtPmF1eCk7Cj4gKwlpZiAoSVNf RVJSKGRwLT5saW5rKSkgewo+ICsJCXJjID0gUFRSX0VSUihkcC0+bGluayk7Cj4gKwkJRFJNX0VS Uk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBsaW5rLCByYyA9ICVkXG4iLCByYyk7Cj4gKwkJZHAt PmxpbmsgPSBOVUxMOwo+ICsJCWdvdG8gZXJyb3JfbGluazsKPiArCX0KPiArCj4gKwlwYW5lbF9p bi5hdXggPSBkcC0+YXV4Owo+ICsJcGFuZWxfaW4uY2F0YWxvZyA9ICZkcC0+Y2F0YWxvZy0+cGFu ZWw7Cj4gKwlwYW5lbF9pbi5saW5rID0gZHAtPmxpbms7Cj4gKwo+ICsJZHAtPnBhbmVsID0gZHBf cGFuZWxfZ2V0KCZwYW5lbF9pbik7Cj4gKwlpZiAoSVNfRVJSKGRwLT5wYW5lbCkpIHsKPiArCQly YyA9IFBUUl9FUlIoZHAtPnBhbmVsKTsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0aWFs aXplIHBhbmVsLCByYyA9ICVkXG4iLCByYyk7Cj4gKwkJZHAtPnBhbmVsID0gTlVMTDsKPiArCQln b3RvIGVycm9yX3BhbmVsOwo+ICsJfQo+ICsKPiArCWRwLT5jdHJsID0gZHBfY3RybF9nZXQoZGV2 LCBkcC0+bGluaywgZHAtPnBhbmVsLCBkcC0+YXV4LAo+ICsJCQkgICAgICAgZHAtPnBvd2VyLCAm ZHAtPmNhdGFsb2ctPmN0cmwsIGRwLT5wYXJzZXIpOwo+ICsJaWYgKElTX0VSUihkcC0+Y3RybCkp IHsKPiArCQlyYyA9IFBUUl9FUlIoZHAtPmN0cmwpOwo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRv IGluaXRpYWxpemUgY3RybCwgcmMgPSAlZFxuIiwgcmMpOwo+ICsJCWRwLT5jdHJsID0gTlVMTDsK PiArCQlnb3RvIGVycm9yX2N0cmw7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICtlcnJvcl9j dHJsOgo+ICsJZHBfcGFuZWxfcHV0KGRwLT5wYW5lbCk7Cj4gK2Vycm9yX3BhbmVsOgo+ICsJZHBf bGlua19wdXQoZHAtPmxpbmspOwo+ICtlcnJvcl9saW5rOgo+ICsJZHBfYXV4X3B1dChkcC0+YXV4 KTsKPiArZXJyb3JfYXV4Ogo+ICsJZHBfcG93ZXJfcHV0KGRwLT5wb3dlcik7Cj4gK2Vycm9yX3Bv d2VyOgo+ICsJZHBfY2F0YWxvZ19wdXQoZHAtPmNhdGFsb2cpOwo+ICtlcnJvcl9jYXRhbG9nOgo+ ICsJZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKPiArZXJyb3JfcGFyc2VyOgo+ICsJcmV0dXJu IHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfc2V0X21vZGUoc3RydWN0IG1z bV9kcCAqZHBfZGlzcGxheSwKPiArCQkJICAgICAgIHN0cnVjdCBkcF9kaXNwbGF5X21vZGUgKm1v ZGUpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpk cDsKPiArCj4gKwlkcCA9IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxh eV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCj4gKwlkcC0+cGFuZWwtPmRwX21vZGUuZHJtX21v ZGUgPSBtb2RlLT5kcm1fbW9kZTsKPiArCWRwLT5wYW5lbC0+ZHBfbW9kZS5icHAgPSBtb2RlLT5i cHA7Cj4gKwlkcC0+cGFuZWwtPmRwX21vZGUuY2FwYWJpbGl0aWVzID0gbW9kZS0+Y2FwYWJpbGl0 aWVzOwo+ICsJZHBfcGFuZWxfaW5pdF9wYW5lbF9pbmZvKGRwLT5wYW5lbCk7Cj4gKwlyZXR1cm4g cmM7CgpyYyBpcyBvbmx5IGV2ZXIgMC4KCj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxh eV9wcmVwYXJlKHN0cnVjdCBtc21fZHAgKmRwKQo+ICt7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBkcF9kaXNwbGF5X2VuYWJsZShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5 KQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7 Cj4gKwo+ICsJZHAgPSBjb250YWluZXJfb2YoZHBfZGlzcGxheSwgc3RydWN0IGRwX2Rpc3BsYXlf cHJpdmF0ZSwgZHBfZGlzcGxheSk7Cj4gKwo+ICsJaWYgKGRwLT5wb3dlcl9vbikgewo+ICsJCURS TV9ERUJVR19EUCgiTGluayBhbHJlYWR5IHNldHVwLCByZXR1cm5cbiIpOwo+ICsJCXJldHVybiAw Owo+ICsJfQo+ICsKPiArCWRwX2F1eF9pbml0KGRwLT5hdXgsIGRwLT5wYXJzZXItPmF1eF9jZmcp Owo+ICsKPiArCXJjID0gZHBfY3RybF9vbihkcC0+Y3RybCk7Cj4gKwlpZiAoIXJjKQo+ICsJCWRw LT5wb3dlcl9vbiA9IHRydWU7Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGRwX2Rpc3BsYXlfcG9zdF9lbmFibGUoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSkKPiAr ewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsK PiArCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3BsYXksIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUsIGRwX2Rpc3BsYXkpOwo+ICsKPiArCWNvbXBsZXRlX2FsbCgmZHAtPm5vdGlmaWNhdGlvbl9j b21wKTsKPiArCXJldHVybiByYzsKCnJjIGlzIG9ubHkgZXZlciAwLgoKPiArfQo+ICsKPiArc3Rh dGljIGludCBkcF9kaXNwbGF5X3ByZV9kaXNhYmxlKHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkp Cj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsK PiArCj4gKwlkcCA9IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9w cml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCj4gKwlpZiAoZHAtPnVzYnBkLT5hbHRfbW9kZV9jZmdf ZG9uZSAmJiAoZHAtPnVzYnBkLT5ocGRfaGlnaCB8fAo+ICsJCWRwLT51c2JwZC0+Zm9yY2VkX2Rp c2Nvbm5lY3QpKQo+ICsJCWRwX2xpbmtfcHNtX2NvbmZpZyhkcC0+bGluaywgJmRwLT5wYW5lbC0+ bGlua19pbmZvLCB0cnVlKTsKPiArCj4gKwlkcF9jdHJsX3B1c2hfaWRsZShkcC0+Y3RybCk7Cj4g KwlyZXR1cm4gcmM7CgpyYyBpcyBvbmx5IGV2ZXIgMC4KCj4gK30KPiArCj4gK3N0YXRpYyBpbnQg ZHBfZGlzcGxheV9kaXNhYmxlKHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpCj4gK3sKPiArCWlu dCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCj4gKwlkcCA9 IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9k aXNwbGF5KTsKPiArCj4gKwlpZiAoIWRwLT5wb3dlcl9vbiB8fCAhZHAtPmNvcmVfaW5pdGlhbGl6 ZWQpCj4gKwkJZ290byBlcnJvcjsKCnJldHVybiAwOwoKPiArCj4gKwlkcF9jdHJsX29mZihkcC0+ Y3RybCk7Cj4gKwo+ICsJZHAtPnBvd2VyX29uID0gZmFsc2U7Cj4gKwo+ICsJY29tcGxldGVfYWxs KCZkcC0+bm90aWZpY2F0aW9uX2NvbXApOwo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKCnJjIGlz IG9ubHkgZXZlciAwIGFuZCB5b3UgZG9uJ3QgbmVlZCB0aGUgbGFiZWwuCgo+ICt9Cj4gKwo+ICtp bnQgZHBfZGlzcGxheV9yZXF1ZXN0X2lycShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KQo+ICt7 Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4gKwo+ ICsJaWYgKCFkcF9kaXNwbGF5KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsK PiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkcCA9IGNvbnRhaW5lcl9vZihkcF9k aXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCj4gKwlk cC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZHAtPnBkZXYtPmRldi5vZl9ub2RlLCAwKTsK PiArCWlmIChkcC0+aXJxIDwgMCkgewo+ICsJCXJjID0gZHAtPmlycTsKPiArCQlEUk1fRVJST1Io ImZhaWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgcmMpOwo+ICsJCXJldHVybiByYzsKPiArCX0KPiAr Cj4gKwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoJmRwLT5wZGV2LT5kZXYsIGRwLT5pcnEsIGRwX2Rp c3BsYXlfaXJxLAo+ICsJCUlSUUZfVFJJR0dFUl9ISUdILCAiZHBfZGlzcGxheV9pc3IiLCBkcCk7 Cj4gKwlpZiAocmMgPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVxdWVzdCBJUlEl dTogJWRcbiIsCj4gKwkJCQlkcC0+aXJxLCByYyk7Cj4gKwkJcmV0dXJuIHJjOwo+ICsJfQo+ICsJ ZGlzYWJsZV9pcnEoZHAtPmlycSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgZHBfZGlzcGxheV91bnByZXBhcmUoc3RydWN0IG1zbV9kcCAqZHApCj4gK3sKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtpbnQgZHBfZGlzcGxheV92YWxpZGF0ZV9tb2RlKHN0cnVjdCBt c21fZHAgKmRwLCB1MzIgbW9kZV9wY2xrX2toeikKPiArewo+ICsJY29uc3QgdTMyIG51bV9jb21w b25lbnRzID0gMywgZGVmYXVsdF9icHAgPSAyNDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUgKmRwX2Rpc3BsYXk7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2xpbmsgKmxpbmtfaW5mbzsKPiArCXUz MiBtb2RlX3JhdGVfa2h6ID0gMCwgc3VwcG9ydGVkX3JhdGVfa2h6ID0gMCwgbW9kZV9icHAgPSAw Owo+ICsKPiArCWlmICghZHAgfHwgIW1vZGVfcGNsa19raHogfHwgIWRwLT5jb25uZWN0b3IpIHsK PiArCQlEUk1fRVJST1IoImludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsK PiArCX0KPiArCj4gKwlkcF9kaXNwbGF5ID0gY29udGFpbmVyX29mKGRwLCBzdHJ1Y3QgZHBfZGlz cGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCWxpbmtfaW5mbyA9ICZkcF9kaXNwbGF5LT5w YW5lbC0+bGlua19pbmZvOwo+ICsKPiArCW1vZGVfYnBwID0gZHAtPmNvbm5lY3Rvci0+ZGlzcGxh eV9pbmZvLmJwYyAqIG51bV9jb21wb25lbnRzOwo+ICsJaWYgKCFtb2RlX2JwcCkKPiArCQltb2Rl X2JwcCA9IGRlZmF1bHRfYnBwOwo+ICsKPiArCW1vZGVfYnBwID0gZHBfcGFuZWxfZ2V0X21vZGVf YnBwKGRwX2Rpc3BsYXktPnBhbmVsLAo+ICsJCQltb2RlX2JwcCwgbW9kZV9wY2xrX2toeik7Cj4g Kwo+ICsJbW9kZV9yYXRlX2toeiA9IG1vZGVfcGNsa19raHogKiBtb2RlX2JwcDsKPiArCXN1cHBv cnRlZF9yYXRlX2toeiA9IGxpbmtfaW5mby0+bnVtX2xhbmVzICogbGlua19pbmZvLT5yYXRlICog ODsKPiArCj4gKwlpZiAobW9kZV9yYXRlX2toeiA+IHN1cHBvcnRlZF9yYXRlX2toeikKPiArCQly ZXR1cm4gTU9ERV9CQUQ7Cj4gKwo+ICsJcmV0dXJuIE1PREVfT0s7Cj4gK30KPiArCj4gK2ludCBk cF9kaXNwbGF5X2dldF9tb2RlcyhzdHJ1Y3QgbXNtX2RwICpkcCwKPiArCQkJCXN0cnVjdCBkcF9k aXNwbGF5X21vZGUgKmRwX21vZGUpCj4gK3sKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUg KmRwX2Rpc3BsYXk7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlpZiAoIWRwKSB7Cj4gKwkJRFJN X0VSUk9SKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJ ZHBfZGlzcGxheSA9IGNvbnRhaW5lcl9vZihkcCwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwg ZHBfZGlzcGxheSk7Cj4gKwo+ICsJcmV0ID0gZHBfcGFuZWxfZ2V0X21vZGVzKGRwX2Rpc3BsYXkt PnBhbmVsLAo+ICsJCWRwLT5jb25uZWN0b3IsIGRwX21vZGUpOwo+ICsJaWYgKGRwX21vZGUtPmRy bV9tb2RlLmNsb2NrKQo+ICsJCWRwLT5tYXhfcGNsa19raHogPSBkcF9tb2RlLT5kcm1fbW9kZS5j bG9jazsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK2Jvb2wgZHBfZGlzcGxheV9jaGVja192 aWRlb190ZXN0KHN0cnVjdCBtc21fZHAgKmRwKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9w cml2YXRlICpkcF9kaXNwbGF5Owo+ICsKPiArCWlmICghZHApIHsKPiArCQlEUk1fRVJST1IoImlu dmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJZHBfZGlz cGxheSA9IGNvbnRhaW5lcl9vZihkcCwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlz cGxheSk7Cj4gKwo+ICsJaWYgKGRwX2Rpc3BsYXktPnBhbmVsLT52aWRlb190ZXN0KQo+ICsJCXJl dHVybiB0cnVlOwo+ICsKPiArCXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiAraW50IGRwX2Rpc3Bs YXlfZ2V0X3Rlc3RfYnBwKHN0cnVjdCBtc21fZHAgKmRwKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlz cGxheV9wcml2YXRlICpkcF9kaXNwbGF5Owo+ICsKPiArCWlmICghZHApIHsKPiArCQlEUk1fRVJS T1IoImludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlkcF9k aXNwbGF5ID0gY29udGFpbmVyX29mKGRwLCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9k aXNwbGF5KTsKPiArCj4gKwlyZXR1cm4gZHBfbGlua19iaXRfZGVwdGhfdG9fYnBwKAo+ICsJCWRw X2Rpc3BsYXktPmxpbmstPnRlc3RfdmlkZW8udGVzdF9iaXRfZGVwdGgpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGRwX2Rpc3BsYXlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK PiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ ICsKPiArCWlmICghcGRldiB8fCAhcGRldi0+ZGV2Lm9mX25vZGUpIHsKPiArCQlEUk1fRVJST1Io InBkZXYgbm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KCk5laXRoZXIg cGRldiBvciBwZGV2LT5kZXYub2Zfbm9kZSBjYW4gYmUgTlVMTC4KCj4gKwo+ICsJZHAgPSBkZXZt X2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFk cCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlpbml0X2NvbXBsZXRpb24oJmRwLT5ub3Rp ZmljYXRpb25fY29tcCk7Cj4gKwo+ICsJZHAtPnBkZXYgPSBwZGV2Owo+ICsJZHAtPm5hbWUgPSAi ZHJtX2RwIjsKPiArCj4gKwlyYyA9IGRwX2luaXRfc3ViX21vZHVsZXMoZHApOwo+ICsJaWYgKHJj KSB7Cj4gKwkJRFJNX0VSUk9SKCJpbml0IHN1YiBtb2R1bGUgZmFpbGVkXG4iKTsKPiArCQlkZXZt X2tmcmVlKCZwZGV2LT5kZXYsIGRwKTsKCllvdSBkb24ndCBuZWVkIHRvIGRldm1fa2ZyZWUsIGl0 IHdpbGwgYmUgZG9uZSBmb3IgeW91IHdoZW4gdGhlIHByb2JlIGZhaWxzLgoKPiArCQlyZXR1cm4g LUVQUk9CRV9ERUZFUjsKPiArCX0KPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBk cCk7Cj4gKwo+ICsJZ19kcF9kaXNwbGF5ID0gJmRwLT5kcF9kaXNwbGF5Owo+ICsKPiArCXJjID0g Y29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmZHBfZGlzcGxheV9jb21wX29wcyk7Cj4gKwlpZiAo cmMpIHsKPiArCQlEUk1fRVJST1IoImNvbXBvbmVudCBhZGQgZmFpbGVkLCByYz0lZFxuIiwgcmMp Owo+ICsJCWRwX2Rpc3BsYXlfZGVpbml0X3N1Yl9tb2R1bGVzKGRwKTsKPiArCQlkZXZtX2tmcmVl KCZwZGV2LT5kZXYsIGRwKTsKClNhbWUuCgo+ICsJfQo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ ICsKPiArc3RhdGljIGludCBkcF9kaXNwbGF5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCj4gKwlp ZiAoIXBkZXYpCj4gKwkJcmV0dXJuIC1FSU5WQUw7CgpOb3QgcG9zc2libGUuCgo+ICsKPiArCWRw ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJZHBfZGlzcGxheV9kZWluaXRf c3ViX21vZHVsZXMoZHApOwo+ICsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwp OwoKVGhpcyBpcyB1bm5lZWRlZCBzaW5jZSB0aGUgZGV2aWNlIGlzIGFib3V0IHRvIGdvIHBvb2Yu Cgo+ICsJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBkcCk7CgpZb3UgZG9uJ3QgbmVlZCB0byBkZXZt X2tmcmVlLCBpdCB3aWxsIGJlIGRvbmUgd2hlbiB0aGUgZGV2aWNlIGlzIGRlc3Ryb3llZC4KCj4g Kwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy IGRwX2Rpc3BsYXlfZHJpdmVyID0gewo+ICsJLnByb2JlICA9IGRwX2Rpc3BsYXlfcHJvYmUsCj4g KwkucmVtb3ZlID0gZHBfZGlzcGxheV9yZW1vdmUsCj4gKwkuZHJpdmVyID0gewo+ICsJCS5uYW1l ID0gIm1zbS1kcC1kaXNwbGF5IiwKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBkcF9kdF9tYXRjaCwK PiArCX0sCj4gK307Cj4gKwo+ICtpbnQgX19pbml0IG1zbV9kcF9yZWdpc3Rlcih2b2lkKQo+ICt7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHBf ZGlzcGxheV9kcml2ZXIpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9FUlJPUigiZHJpdmVyIHJl Z2lzdGVyIGZhaWxlZCIpOwo+ICsJCXJldHVybiByZXQ7CgpZb3UgZG9uJ3QgbmVlZCB0aGlzLCBq dXN0IGRyb3AgdGhyb3VnaC4KCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr dm9pZCBfX2V4aXQgbXNtX2RwX3VucmVnaXN0ZXIodm9pZCkKPiArewo+ICsJcGxhdGZvcm1fZHJp dmVyX3VucmVnaXN0ZXIoJmRwX2Rpc3BsYXlfZHJpdmVyKTsKPiArfQo+ICsKPiAraW50IG1zbV9k cF9tb2Rlc2V0X2luaXQoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSwgc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKPiArCQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ICt7Cj4gKwlzdHJ1 Y3QgbXNtX2RybV9wcml2YXRlICpwcml2Owo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoV0FSTl9P TighZW5jb2RlcikgfHwgV0FSTl9PTighZHBfZGlzcGxheSkgfHwgV0FSTl9PTighZGV2KSkKPiAr CQlyZXR1cm4gLUVJTlZBTDsKClRoaXMgY291bGQgYWxzbyBiZSBXQVJOX09OKCFlbmNvZGVyIHx8 ICFkcF9kaXNwbGF5IHx8ICFkZXYpCgo+ICsKPiArCXByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ ICsJZHBfZGlzcGxheS0+ZHJtX2RldiA9IGRldjsKPiArCj4gKwlyZXQgPSBkcF9kaXNwbGF5X3Jl cXVlc3RfaXJxKGRwX2Rpc3BsYXkpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9FUlJPUigicmVx dWVzdF9pcnEgZmFpbGVkLCByZXQ9JWRcbiIsIHJldCk7CgpkcF9kaXNwbGF5X3JlcXVlc3RfaXJx IGFscmVhZHkgcHJpbnRzIGVycm9yIG1lc3NhZ2VzIGZvciB5b3UuCgo+ICsJCXJldHVybiByZXQ7 Cj4gKwl9Cj4gKwo+ICsJZHBfZGlzcGxheS0+ZW5jb2RlciA9IGVuY29kZXI7Cj4gKwo+ICsJZHBf ZGlzcGxheS0+Y29ubmVjdG9yID0gZHBfZHJtX2Nvbm5lY3Rvcl9pbml0KGRwX2Rpc3BsYXkpOwo+ ICsJaWYgKElTX0VSUihkcF9kaXNwbGF5LT5jb25uZWN0b3IpKSB7Cj4gKwkJcmV0ID0gUFRSX0VS UihkcF9kaXNwbGF5LT5jb25uZWN0b3IpOwo+ICsJCURSTV9ERVZfRVJST1IoZGV2LT5kZXYsCj4g KwkJCSJmYWlsZWQgdG8gY3JlYXRlIGRwIGNvbm5lY3RvcjogJWRcbiIsIHJldCk7Cj4gKwkJZHBf ZGlzcGxheS0+Y29ubmVjdG9yID0gTlVMTDsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiAr CXByaXYtPmNvbm5lY3RvcnNbcHJpdi0+bnVtX2Nvbm5lY3RvcnMrK10gPSBkcF9kaXNwbGF5LT5j b25uZWN0b3I7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAraW50IG1zbV9kcF9kaXNwbGF5X2Vu YWJsZShzdHJ1Y3QgbXNtX2RwICpkcCwgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ICt7 Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHBfZGlzcGxh eTsKPiArCj4gKwlkcF9kaXNwbGF5ID0gY29udGFpbmVyX29mKGRwLCBzdHJ1Y3QgZHBfZGlzcGxh eV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCWlmICghZHBfZGlzcGxheS0+ZHBfbW9kZS5kcm1f bW9kZS5jbG9jaykgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBwYXJhbXNcbiIpOwo+ICsJCXJl dHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJjID0gZHBfZGlzcGxheV9zZXRfbW9kZShkcCwg JmRwX2Rpc3BsYXktPmRwX21vZGUpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJGYWls ZWQgdG8gcGVyZm9ybSBhIG1vZGUgc2V0LCByYz0lZFxuIiwgcmMpOwo+ICsJCXJldHVybiByYzsK PiArCX0KPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlfcHJlcGFyZShkcCk7Cj4gKwlpZiAocmMpIHsK PiArCQlEUk1fRVJST1IoIkRQIGRpc3BsYXkgcHJlcGFyZSBmYWlsZWQsIHJjPSVkXG4iLCByYyk7 Cj4gKwkJcmV0dXJuIHJjOwo+ICsJfQo+ICsKPiArCXJjID0gZHBfZGlzcGxheV9lbmFibGUoZHAp Owo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJEUCBkaXNwbGF5IGVuYWJsZSBmYWlsZWQs IHJjPSVkXG4iLCByYyk7Cj4gKwkJZHBfZGlzcGxheV91bnByZXBhcmUoZHApOwo+ICsJCXJldHVy biByYzsKPiArCX0KPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlfcG9zdF9lbmFibGUoZHApOwo+ICsJ aWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJEUCBkaXNwbGF5IHBvc3QgZW5hYmxlIGZhaWxlZCwg cmM9JWRcbiIsIHJjKTsKPiArCQlkcF9kaXNwbGF5X2Rpc2FibGUoZHApOwo+ICsJCWRwX2Rpc3Bs YXlfdW5wcmVwYXJlKGRwKTsKPiArCX0KPiArCXJldHVybiByYzsKPiArfQo+ICsKPiAraW50IG1z bV9kcF9kaXNwbGF5X2Rpc2FibGUoc3RydWN0IG1zbV9kcCAqZHAsIHN0cnVjdCBkcm1fZW5jb2Rl ciAqZW5jb2RlcikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlf cHJlX2Rpc2FibGUoZHApOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJEUCBkaXNwbGF5 IHByZSBkaXNhYmxlIGZhaWxlZCwgcmM9JWRcbiIsIHJjKTsKPiArCQlyZXR1cm4gcmM7Cj4gKwl9 Cj4gKwo+ICsJcmMgPSBkcF9kaXNwbGF5X2Rpc2FibGUoZHApOwo+ICsJaWYgKHJjKSB7Cj4gKwkJ RFJNX0VSUk9SKCJEUCBkaXNwbGF5IGRpc2FibGUgZmFpbGVkLCByYz0lZFxuIiwgcmMpOwo+ICsJ CXJldHVybiByYzsKPiArCX0KPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlfdW5wcmVwYXJlKGRwKTsK PiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigiRFAgZGlzcGxheSB1bnByZXBhcmUgZmFpbGVk LCByYz0lZFxuIiwgcmMpOwo+ICsJfQo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICt2b2lkIG1z bV9kcF9kaXNwbGF5X21vZGVfc2V0KHN0cnVjdCBtc21fZHAgKmRwLCBzdHJ1Y3QgZHJtX2VuY29k ZXIgKmVuY29kZXIsCj4gKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiArCQkJ CXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQo+ICt7Cj4gKwlzdHJ1Y3Qg ZHBfZGlzcGxheV9wcml2YXRlICpkcF9kaXNwbGF5Owo+ICsKPiArCWRwX2Rpc3BsYXkgPSBjb250 YWluZXJfb2YoZHAsIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwo+ICsK PiArCW1lbXNldCgmZHBfZGlzcGxheS0+ZHBfbW9kZSwgMHgwLCBzaXplb2Yoc3RydWN0IGRwX2Rp c3BsYXlfbW9kZSkpOwo+ICsKPiArCWlmIChkcF9kaXNwbGF5X2NoZWNrX3ZpZGVvX3Rlc3QoZHAp KQo+ICsJCWRwX2Rpc3BsYXktPmRwX21vZGUuYnBwID0gZHBfZGlzcGxheV9nZXRfdGVzdF9icHAo ZHApOwo+ICsJZWxzZSAvKiBEZWZhdWx0IG51bV9jb21wb25lbnRzIHBlciBwaXhlbCA9IDMgKi8K PiArCQlkcF9kaXNwbGF5LT5kcF9tb2RlLmJwcCA9IGRwLT5jb25uZWN0b3ItPmRpc3BsYXlfaW5m by5icGMgKiAzOwo+ICsKPiArCWlmICghZHBfZGlzcGxheS0+ZHBfbW9kZS5icHApCj4gKwkJZHBf ZGlzcGxheS0+ZHBfbW9kZS5icHAgPSAyNDsgLyogRGVmYXVsdCBicHAgKi8KPiArCj4gKwlkcm1f bW9kZV9jb3B5KCZkcF9kaXNwbGF5LT5kcF9tb2RlLmRybV9tb2RlLCBhZGp1c3RlZF9tb2RlKTsK PiArCj4gKwlkcF9kaXNwbGF5LT5kcF9tb2RlLnZfYWN0aXZlX2xvdyA9Cj4gKwkJISEoZHBfZGlz cGxheS0+ZHBfbW9kZS5kcm1fbW9kZS5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTlZTWU5DKTsKPiAr Cj4gKwlkcF9kaXNwbGF5LT5kcF9tb2RlLmhfYWN0aXZlX2xvdyA9Cj4gKwkJISEoZHBfZGlzcGxh eS0+ZHBfbW9kZS5kcm1fbW9kZS5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKTsKPiArfQo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuaCBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfZGlzcGxheS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBp bmRleCAwMDAwMDAwLi5jZTA5YmI2Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vZHAvZHBfZGlzcGxheS5oCj4gQEAgLTAsMCArMSwyOCBAQAo+ICsvKiBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAo YykgMjAxNy0yMDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K PiArICovCj4gKwo+ICsjaWZuZGVmIF9EUF9ESVNQTEFZX0hfCj4gKyNkZWZpbmUgX0RQX0RJU1BM QVlfSF8KPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsKPiArI2luY2x1ZGUgImRwX3Bh bmVsLmgiCj4gKwo+ICtzdHJ1Y3QgbXNtX2RwIHsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1f ZGV2Owo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKPiArCXN0cnVjdCBkcm1f ZW5jb2RlciAqZW5jb2RlcjsKPiArCWJvb2wgaXNfY29ubmVjdGVkOwo+ICsJdTMyIG1heF9wY2xr X2toejsKPiArfTsKPiArCj4gK2ludCBkcF9kaXNwbGF5X3ZhbGlkYXRlX21vZGUoc3RydWN0IG1z bV9kcCAqZHBfZGlzcGxheSwgdTMyIG1vZGVfcGNsa19raHopOwo+ICtpbnQgZHBfZGlzcGxheV9n ZXRfbW9kZXMoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSwKPiArCQlzdHJ1Y3QgZHBfZGlzcGxh eV9tb2RlICpkcF9tb2RlKTsKPiAraW50IGRwX2Rpc3BsYXlfcmVxdWVzdF9pcnEoc3RydWN0IG1z bV9kcCAqZHBfZGlzcGxheSk7Cj4gK2Jvb2wgZHBfZGlzcGxheV9jaGVja192aWRlb190ZXN0KHN0 cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpOwo+ICtpbnQgZHBfZGlzcGxheV9nZXRfdGVzdF9icHAo c3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7Cj4gKwo+ICsjZW5kaWYgLyogX0RQX0RJU1BMQVlf SF8gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGlu ZGV4IDAwMDAwMDAuLjUzMTZlYzU3Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vZHAvZHBfZHJtLmMKPiBAQCAtMCwwICsxLDE4OSBAQAo+ICsvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAx Ny0yMDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICov Cj4gKwo+ICsjZGVmaW5lIHByX2ZtdChmbXQpCSJbZHJtLWRwXTogJXM6ICIgZm10LCBfX2Z1bmNf Xwo+ICsKPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8 ZHJtL2RybV9hdG9taWMuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgo+ICsKPiArI2lu Y2x1ZGUgIm1zbV9kcnYuaCIKPiArI2luY2x1ZGUgIm1zbV9rbXMuaCIKPiArI2luY2x1ZGUgImRw X2RybS5oIgo+ICsKPiArc3RydWN0IGRwX2Nvbm5lY3RvciB7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciBiYXNlOwo+ICsJc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheTsKPiArfTsKCj4gKyNkZWZp bmUgdG9fZHBfY29ubmVjdG9yKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHBfY29ubmVjdG9y LCBiYXNlKQoKUHJlZmVyIGlmIHlvdSB1c2UgYSBmdW5jdGlvbiBmb3IgdGhpcyBmb3IgdHlwZWNo ZWNraW5nIHB1cnBvc2VzLgoKPiArCj4gKy8qKgo+ICsgKiBkcF9jb25uZWN0b3JfZGV0ZWN0IC0g Y2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGNvbm5lY3RvciBpcyBjb25uZWN0ZWQKPiArICogQGNv bm5lY3RvcjogUG9pbnRlciB0byBkcm0gY29ubmVjdG9yIHN0cnVjdHVyZQo+ICsgKiBAZm9yY2U6 IEZvcmNlIGRldGVjdCBzZXR0aW5nIGZyb20gZHJtIGZyYW1ld29yawo+ICsgKiBSZXR1cm5zOiBD b25uZWN0b3IgJ2lzIGNvbm5lY3RlZCcgc3RhdHVzCj4gKyAqLwo+ICtzdGF0aWMgZW51bSBkcm1f Y29ubmVjdG9yX3N0YXR1cyBkcF9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uLAo+ICsJCWJvb2wgZm9yY2UpCj4gK3sKPiArCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0 dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwo+ICsJc3RhdGljIGVudW0gZHJt X2Nvbm5lY3Rvcl9zdGF0dXMgY3VycmVudF9zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX3Vua25v d247Cj4gKwlzdHJ1Y3QgbXNtX2RwICpkcDsKPiArCXN0cnVjdCBkcF9jb25uZWN0b3IgKmRwX2Nv bm47Cj4gKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gY29ubi0+ZGV2LT5kZXZfcHJp dmF0ZTsKPiArCXN0cnVjdCBtc21fa21zICprbXMgPSBwcml2LT5rbXM7Cj4gKwo+ICsJZHBfY29u biA9IHRvX2RwX2Nvbm5lY3Rvcihjb25uKTsKPiArCWRwID0gZHBfY29ubi0+ZHBfZGlzcGxheTsK PiArCj4gKwlEUk1fREVCVUdfRFAoImlzX2Nvbm5lY3RlZCA9ICVzXG4iLAo+ICsJCShkcC0+aXNf Y29ubmVjdGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwo+ICsKPiArCXN0YXR1cyA9IChkcC0+aXNf Y29ubmVjdGVkKSA/IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoKPiArCQkJCQljb25uZWN0 b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiArCj4gKwlpZiAoZHAtPmlzX2Nvbm5lY3RlZCAmJiAo Y3VycmVudF9zdGF0dXMgIT0gc3RhdHVzKQo+ICsJCQkJJiYga21zLT5mdW5jcy0+c2V0X2VuY29k ZXJfbW9kZSkgewo+ICsJCWttcy0+ZnVuY3MtPnNldF9lbmNvZGVyX21vZGUoa21zLAo+ICsJCQkJ ZHAtPmVuY29kZXIsIGZhbHNlKTsKPiArCQlEUk1fREVCVUdfRFAoImNhbGwgc2V0X2VuY29kZXJf bW9kZVxuIik7Cj4gKwl9Cj4gKwljdXJyZW50X3N0YXR1cyA9IHN0YXR1czsKPiArCXJldHVybiBz dGF0dXM7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkcF9jb25uZWN0b3JfZ2V0X21vZGVzIC0gY2Fs bGJhY2sgdG8gYWRkIGRybSBtb2RlcyB2aWEgZHJtX21vZGVfcHJvYmVkX2FkZCgpCj4gKyAqIEBj b25uZWN0b3I6IFBvaW50ZXIgdG8gZHJtIGNvbm5lY3RvciBzdHJ1Y3R1cmUKPiArICogUmV0dXJu czogTnVtYmVyIG9mIG1vZGVzIGFkZGVkCj4gKyAqLwo+ICtzdGF0aWMgaW50IGRwX2Nvbm5lY3Rv cl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJaW50 IHJjID0gMDsKPiArCXN0cnVjdCBtc21fZHAgKmRwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfbW9k ZSAqZHBfbW9kZSA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbSwgZHJtX21v ZGU7Cj4gKwlzdHJ1Y3QgZHBfY29ubmVjdG9yICpkcF9jb25uOwo+ICsKPiArCWlmICghY29ubmVj dG9yKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCWRwX2Nvbm4gPSB0b19kcF9jb25uZWN0b3IoY29u bmVjdG9yKTsKPiArCWRwID0gZHBfY29ubi0+ZHBfZGlzcGxheTsKPiArCj4gKwlkcF9tb2RlID0g a3phbGxvYyhzaXplb2YoKmRwX21vZGUpLCAgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWRwX21vZGUp Cj4gKwkJcmV0dXJuIDA7CgpIb3cgYmlnIGlzIGRwX21vZGU/ICBXaHkgZG8geW91IG5lZWQgdG8g a3phbGxvYyBpdCBhbmQgbm90IGhhdmUgaXQgaXQgb24gdGhlCnN0YWNrPwoKPiArCj4gKwkvKiBw bHVnZ2FibGUgY2FzZSBhc3N1bWVzIEVESUQgaXMgcmVhZCB3aGVuIEhQRCAqLwo+ICsJaWYgKGRw LT5pc19jb25uZWN0ZWQpIHsKPiArCQkvKgo+ICsJCSAqVGhlIGdldF9tb2RlcygpIGZ1bmN0aW9u IG1pZ2h0IHJldHVybiBvbmUgbW9kZSB0aGF0IGlzIHN0b3JlZAo+ICsJCSAqIGluIGRwX21vZGUg d2hlbiBjb21wbGlhbmNlIHRlc3QgaXMgaW4gcHJvZ3Jlc3MuIElmIG5vdCwgdGhlCj4gKwkJICog cmV0dXJuIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbW9kZXMgc3VwcG9y dGVkCj4gKwkJICogYnkgdGhlIHNpbmsKPiArCQkgKi8KPiArCQlyYyA9IGRwX2Rpc3BsYXlfZ2V0 X21vZGVzKGRwLCBkcF9tb2RlKTsKPiArCQlpZiAocmMgPD0gMCkgewo+ICsJCQlEUk1fRVJST1Io ImZhaWxlZCB0byBnZXQgRFAgc2luayBtb2RlcywgcmM9JWRcbiIsIHJjKTsKCkFSZSB5b3UgbWlz c2luZyBhIGtmcmVlIGhlcmU/Cgo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ICsJCWlmIChkcF9t b2RlLT5kcm1fbW9kZS5jbG9jaykgeyAvKiB2YWxpZCBEUCBtb2RlICovCj4gKwkJCW1lbXNldCgm ZHJtX21vZGUsIDB4MCwgc2l6ZW9mKGRybV9tb2RlKSk7Cj4gKwkJCWRybV9tb2RlX2NvcHkoJmRy bV9tb2RlLCAmZHBfbW9kZS0+ZHJtX21vZGUpOwo+ICsJCQltID0gZHJtX21vZGVfZHVwbGljYXRl KGNvbm5lY3Rvci0+ZGV2LCAmZHJtX21vZGUpOwo+ICsJCQlpZiAoIW0pIHsKPiArCQkJCURSTV9F UlJPUigiZmFpbGVkIHRvIGFkZCBtb2RlICV1eCV1XG4iLAo+ICsJCQkJICAgICAgIGRybV9tb2Rl LmhkaXNwbGF5LAo+ICsJCQkJICAgICAgIGRybV9tb2RlLnZkaXNwbGF5KTsKPiArCQkJCWtmcmVl KGRwX21vZGUpOwo+ICsJCQkJcmV0dXJuIDA7Cj4gKwkJCX0KPiArCQkJZHJtX21vZGVfcHJvYmVk X2FkZChjb25uZWN0b3IsIG0pOwo+ICsJCX0KPiArCX0gZWxzZSB7Cj4gKwkJRFJNX0RFQlVHX0RQ KCJObyBzaW5rIGNvbm5lY3RlZFxuIik7Cj4gKwl9Cj4gKwlrZnJlZShkcF9tb2RlKTsKPiArCj4g KwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkcF9jb25uZWN0b3JfbW9kZV92YWxp ZCAtIGNhbGxiYWNrIHRvIGRldGVybWluZSBpZiBzcGVjaWZpZWQgbW9kZSBpcyB2YWxpZAo+ICsg KiBAY29ubmVjdG9yOiBQb2ludGVyIHRvIGRybSBjb25uZWN0b3Igc3RydWN0dXJlCj4gKyAqIEBt b2RlOiBQb2ludGVyIHRvIGRybSBtb2RlIHN0cnVjdHVyZQo+ICsgKiBSZXR1cm5zOiBWYWxpZGl0 eSBzdGF0dXMgZm9yIHNwZWNpZmllZCBtb2RlCj4gKyAqLwo+ICtzdGF0aWMgZW51bSBkcm1fbW9k ZV9zdGF0dXMgZHBfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvciwKPiArCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJc3Ry dWN0IG1zbV9kcCAqZHBfZGlzcDsKPiArCXN0cnVjdCBkcF9jb25uZWN0b3IgKmRwX2Nvbm47Cj4g Kwo+ICsJaWYgKCFtb2RlIHx8ICFjb25uZWN0b3IpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQg cGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gTU9ERV9FUlJPUjsKPiArCX0KCkkgZG9uJ3QgdGhpbmsg dGhlc2UgY2FuIGJlIE5VTEwgaWYgdGhleSBhcmUgY2FsbGVkIGZyb20gdGhlIGRybV9jb25uZWN0 b3IgaGVscGVyCmZ1bmN0aW9ucy4KCj4gKwo+ICsJZHBfY29ubiA9IHRvX2RwX2Nvbm5lY3Rvcihj b25uZWN0b3IpOwo+ICsJZHBfZGlzcCA9IGRwX2Nvbm4tPmRwX2Rpc3BsYXk7Cj4gKwo+ICsJbW9k ZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKPiArCj4gKwlpZiAoKGRwX2Rp c3AtPm1heF9wY2xrX2toeiA8PSAwKSB8fAo+ICsJCQkoZHBfZGlzcC0+bWF4X3BjbGtfa2h6ID4g RFBfTUFYX1BJWEVMX0NMS19LSFopIHx8Cj4gKwkJCShtb2RlLT5jbG9jayA+IGRwX2Rpc3AtPm1h eF9wY2xrX2toeikpCj4gKwkJcmV0dXJuIE1PREVfQkFEOwo+ICsKPiArCXJldHVybiBkcF9kaXNw bGF5X3ZhbGlkYXRlX21vZGUoZHBfZGlzcCwgbW9kZS0+Y2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgZHBfY29ubmVjdG9yX2Z1bmNzID0g ewo+ICsJLmRldGVjdCA9IGRwX2Nvbm5lY3Rvcl9kZXRlY3QsCj4gKwkuZmlsbF9tb2RlcyA9IGRy bV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKPiArCS5kZXN0cm95ID0gZHJt X2Nvbm5lY3Rvcl9jbGVhbnVwLAo+ICsJLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVj dG9yX3Jlc2V0LAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBl cl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmF0b21pY19kZXN0cm95X3N0YXRlID0g ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGRwX2Nvbm5lY3Rv cl9oZWxwZXJfZnVuY3MgPSB7Cj4gKwkuZ2V0X21vZGVzID0gZHBfY29ubmVjdG9yX2dldF9tb2Rl cywKPiArCS5tb2RlX3ZhbGlkID0gZHBfY29ubmVjdG9yX21vZGVfdmFsaWQsCj4gK307Cj4gKwo+ ICsvKiBjb25uZWN0b3IgaW5pdGlhbGl6YXRpb24gKi8KPiArc3RydWN0IGRybV9jb25uZWN0b3Ig KmRwX2RybV9jb25uZWN0b3JfaW5pdChzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KQo+ICt7Cj4g KwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gTlVMTDsKPiArCXN0cnVjdCBkcF9j b25uZWN0b3IgKmRwX2Nvbm5lY3RvcjsKPiArCWludCByZXQ7Cj4gKwo+ICsJZHBfY29ubmVjdG9y ID0gZGV2bV9remFsbG9jKGRwX2Rpc3BsYXktPmRybV9kZXYtPmRldiwgc2l6ZW9mKCpkcF9jb25u ZWN0b3IpLAo+ICsJCQkJICAgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFkcF9jb25uZWN0b3IpCj4g KwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gKwo+ICsJZHBfY29ubmVjdG9yLT5kcF9kaXNw bGF5ID0gZHBfZGlzcGxheTsKPiArCj4gKwljb25uZWN0b3IgPSAmZHBfY29ubmVjdG9yLT5iYXNl Owo+ICsKPiArCXJldCA9IGRybV9jb25uZWN0b3JfaW5pdChkcF9kaXNwbGF5LT5kcm1fZGV2LCBj b25uZWN0b3IsICZkcF9jb25uZWN0b3JfZnVuY3MsCj4gKwkJCURSTV9NT0RFX0NPTk5FQ1RPUl9E aXNwbGF5UG9ydCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiBFUlJfUFRSKHJldCk7Cj4gKwo+ ICsJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmRwX2Nvbm5lY3Rvcl9oZWxw ZXJfZnVuY3MpOwo+ICsKPiArCS8qCj4gKwkgKiBFbmFibGUgSFBEIHRvIGxldCBocGQgZXZlbnQg aXMgaGFuZGxlZCB3aGVuIGNhYmxlIGlzIGF0dGFjaGVkIHRvIHRoZSBob3N0Lgo+ICsJICovCj4g Kwljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7Cj4gKwo+ICsJZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGRwX2Rpc3BsYXktPmVuY29kZXIp Owo+ICsKPiArCXJldHVybiBjb25uZWN0b3I7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL21zbS9kcC9kcF9kcm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmgK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmNmNDcyYzUKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uaAo+IEBAIC0wLDAg KzEsMjAgQEAKPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwo+ ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOSwgVGhlIExpbnV4IEZvdW5kYXRpb24u IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfRFBfRFJNX0hfCj4g KyNkZWZpbmUgX0RQX0RSTV9IXwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gKyNp bmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4gKyNpbmNs dWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Cj4gKwo+ICsjaW5jbHVkZSAibXNtX2Rydi5oIgo+ ICsjaW5jbHVkZSAiZHBfZGlzcGxheS5oIgoKV2hhdCBhcmUgYWxsIHRoZXNlIGhlYWRlcnMgdXNl ZCBmb3I/ICBJdCBsb29rcyBsaWtlIHRoaXMgcHJvdG90eXBlIG9ubHkgbmVlZHMKc3RydWN0IGRy bV9jb25uZWN0b3IgYW5kIHN0cnVjdCBtc21fZHAuCgo+ICsKPiArc3RydWN0IGRybV9jb25uZWN0 b3IgKmRwX2RybV9jb25uZWN0b3JfaW5pdChzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KTsKPiAr Cj4gKyNlbmRpZiAvKiBfRFBfRFJNX0hfICovCj4gKwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9leHRj b24uYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYzVhZDVhYwo+IC0t LSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5jCj4g QEAgLTAsMCArMSwyMjggQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAt b25seQo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOSwgVGhlIExpbnV4IEZvdW5k YXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAqLwo+ICsKPiArI2RlZmluZSBwcl9mbXQo Zm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4 L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv ZXh0Y29uLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsKPiArI2luY2x1ZGUgImRwX2V4 dGNvbi5oIgo+ICsKPiArLyogRFAgc3BlY2lmaWMgVkRNIGNvbW1hbmRzICovCj4gKyNkZWZpbmUg RFBfVVNCUERfVkRNX1NUQVRVUwkweDEwCj4gKyNkZWZpbmUgRFBfVVNCUERfVkRNX0NPTkZJR1VS RQkweDExCj4gKwo+ICsvKiBVU0JQRC1UeXBlQyBzcGVjaWZpYyBNYWNyb3MgKi8KPiArI2RlZmlu ZSBWRE1fVkVSU0lPTgkJMHgwCj4gKyNkZWZpbmUgVVNCX0NfRFBfU0lECQkweEZGMDEKPiArCj4g K3N0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSB7Cj4gKwl1MzIgdmRvOwo+ICsJc3RydWN0IGRldmlj ZSAqZGV2Owo+ICsJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGV4dGNvbl9uYjsKPiArCXN0cnVjdCBl eHRjb25fZGV2ICpleHRjb247Cj4gKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZXh0Y29uX3dx Owo+ICsJc3RydWN0IHdvcmtfc3RydWN0IGV2ZW50X3dvcms7Cj4gKwlzdHJ1Y3QgdXNicGQgKnBk Owo+ICsJc3RydWN0IGRwX3VzYnBkX2NiICpkcF9jYjsKPiArCXN0cnVjdCBkcF91c2JwZCBkcF91 c2JwZDsKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgZHBfZXh0Y29uX2Nvbm5lY3Qoc3RydWN0IGRw X3VzYnBkICpkcF91c2JwZCwgYm9vbCBocGQpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1 Y3QgZHBfZXh0Y29uX3ByaXZhdGUgKmV4dGNvbjsKPiArCj4gKwlleHRjb24gPSBjb250YWluZXJf b2YoZHBfdXNicGQsIHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSwgZHBfdXNicGQpOwo+ICsKPiAr CWRwX3VzYnBkLT5ocGRfaGlnaCA9IGhwZDsKPiArCWRwX3VzYnBkLT5mb3JjZWRfZGlzY29ubmVj dCA9ICFocGQ7Cj4gKwo+ICsJaWYgKGhwZCkKPiArCQlleHRjb24tPmRwX2NiLT5jb25maWd1cmUo ZXh0Y29uLT5kZXYpOwo+ICsJZWxzZQo+ICsJCWV4dGNvbi0+ZHBfY2ItPmRpc2Nvbm5lY3QoZXh0 Y29uLT5kZXYpOwo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9l eHRjb25fZ2V0X2xhbmVzKHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqZXh0Y29uX3ByaXYpCj4g K3sKPiArCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wZXJ0eTsKPiArCj4gKwlleHRj b25fZ2V0X3Byb3BlcnR5KGV4dGNvbl9wcml2LT5leHRjb24sCj4gKwkJCQkJRVhUQ09OX0RJU1Bf RFAsCj4gKwkJCQkJRVhUQ09OX1BST1BfVVNCX1NTLAo+ICsJCQkJCSZwcm9wZXJ0eSk7Cj4gKwly ZXR1cm4gKChwcm9wZXJ0eS5pbnR2YWwpID8gMiA6IDQpOwo+ICt9Cj4gKwo+ICsKPiArc3RhdGlj IHZvaWQgZHBfZXh0Y29uX2V2ZW50X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7 Cj4gKwlzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUgKmV4dGNvbl9wcml2Owo+ICsJaW50IGRwX3N0 YXRlLCByZXQ7Cj4gKwlpbnQgbGFuZXM7Cj4gKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUg cHJvcGVydHk7Cj4gKwo+ICsJZXh0Y29uX3ByaXYgPSBjb250YWluZXJfb2Yod29yaywKPiArCQkJ c3RydWN0IGRwX2V4dGNvbl9wcml2YXRlLCBldmVudF93b3JrKTsKPiArCj4gKwlpZiAoIWV4dGNv bl9wcml2IHx8ICFleHRjb25fcHJpdi0+ZXh0Y29uKSB7Cj4gKwkJRFJNX0VSUk9SKCJJbnZhbGlk IGV4dGNvbiBkZXZpY2UgaGFuZGxlclxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWRw X3N0YXRlID0gZXh0Y29uX2dldF9zdGF0ZShleHRjb25fcHJpdi0+ZXh0Y29uLCBFWFRDT05fRElT UF9EUCk7Cj4gKwo+ICsJaWYgKGRwX3N0YXRlID4gMCkgewo+ICsJCXJldCA9IGV4dGNvbl9nZXRf cHJvcGVydHkoZXh0Y29uX3ByaXYtPmV4dGNvbiwKPiArCQkJCQlFWFRDT05fRElTUF9EUCwKPiAr CQkJCQlFWFRDT05fUFJPUF9VU0JfVFlQRUNfUE9MQVJJVFksCj4gKwkJCQkJJnByb3BlcnR5KTsK PiArCQlpZiAocmV0KSB7Cj4gKwkJCURSTV9FUlJPUigiR2V0IFBvbGFyaXR5IHByb3BlcnR5IGZh aWxlZFxuIik7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwkJZXh0Y29uX3ByaXYtPmRwX3VzYnBk Lm9yaWVudGF0aW9uID0KPiArCQkJKHByb3BlcnR5LmludHZhbCkgPyBPUklFTlRBVElPTl9DQzIg OiBPUklFTlRBVElPTl9DQzE7Cj4gKwo+ICsJCWxhbmVzID0gZHBfZXh0Y29uX2dldF9sYW5lcyhl eHRjb25fcHJpdik7Cj4gKwkJaWYgKCFsYW5lcykKPiArCQkJcmV0dXJuOwo+ICsJCWV4dGNvbl9w cml2LT5kcF91c2JwZC5tdWx0aV9mdW5jID0KPiArCQkJCQkoKGxhbmVzID09IDIpID8gZmFsc2Ug OiB0cnVlKTsKPiArCj4gKwkJaWYgKGV4dGNvbl9wcml2LT5kcF9jYiAmJiBleHRjb25fcHJpdi0+ ZHBfY2ItPmNvbmZpZ3VyZSkgewo+ICsJCQlyZXQgPSBkcF9leHRjb25fY29ubmVjdCgmZXh0Y29u X3ByaXYtPmRwX3VzYnBkLCB0cnVlKTsKPiArCQkJaWYgKHJldCkgewo+ICsJCQkJRFJNX0VSUk9S KCJleHRjb25fY29ubmVjdC0+dHJ1ZSBmYWlsZWRcbiIpOwo+ICsJCQkJcmV0dXJuOwo+ICsJCQl9 Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlpZiAoZXh0Y29uX3ByaXYtPmRwX2NiICYmIGV4dGNv bl9wcml2LT5kcF9jYi0+ZGlzY29ubmVjdCkgewo+ICsJCQlyZXQgPSBkcF9leHRjb25fY29ubmVj dCgmZXh0Y29uX3ByaXYtPmRwX3VzYnBkLCBmYWxzZSk7Cj4gKwkJCWlmIChyZXQpIHsKPiArCQkJ CURSTV9FUlJPUigiZXh0Y29uX2Nvbm5lY3QtPmZhbHNlIGZhaWxlZFxuIik7Cj4gKwkJCQlyZXR1 cm47Cj4gKwkJCX0KPiArCQl9Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZXh0Y29u X2V2ZW50X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAo+ICsJCQkJICB1bnNpZ25l ZCBsb25nIGV2ZW50LCB2b2lkICpwcml2KQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZh dGUgKmV4dGNvbl9wcml2Owo+ICsKPiArCWV4dGNvbl9wcml2ID0gY29udGFpbmVyX29mKG5iLCBz dHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUsCj4gKwkJCQkJCWV4dGNvbl9uYik7Cj4gKwo+ICsJcXVl dWVfd29yayhleHRjb25fcHJpdi0+ZXh0Y29uX3dxLCAmZXh0Y29uX3ByaXYtPmV2ZW50X3dvcmsp Owo+ICsJcmV0dXJuIE5PVElGWV9ET05FOwo+ICt9Cj4gKwo+ICtpbnQgZHBfZXh0Y29uX3JlZ2lz dGVyKHN0cnVjdCBkcF91c2JwZCAqZHBfdXNicGQpCj4gK3sKPiArCXN0cnVjdCBkcF9leHRjb25f cHJpdmF0ZSAqZXh0Y29uX3ByaXY7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlpZiAoIWRwX3Vz YnBkKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWV4dGNvbl9wcml2ID0gY29udGFpbmVy X29mKGRwX3VzYnBkLCBzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUsIGRwX3VzYnBkKTsKPiArCj4g KwlleHRjb25fcHJpdi0+ZXh0Y29uX25iLm5vdGlmaWVyX2NhbGwgPSBkcF9leHRjb25fZXZlbnRf bm90aWZ5Owo+ICsJcmV0ID0gZGV2bV9leHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoZXh0Y29uX3By aXYtPmRldiwgZXh0Y29uX3ByaXYtPmV4dGNvbiwKPiArCQkJCQkgICAgRVhUQ09OX0RJU1BfRFAs Cj4gKwkJCQkJICAgICZleHRjb25fcHJpdi0+ZXh0Y29uX25iKTsKPiArCWlmIChyZXQpIHsKPiAr CQlEUk1fREVWX0VSUk9SKGV4dGNvbl9wcml2LT5kZXYsCj4gKwkJCSJyZWdpc3RlciBFWFRDT05f RElTUF9EUCBub3RpZmllciBlcnJcbiIpOwo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJcmV0dXJu IHJldDsKPiArCX0KPiArCj4gKwlleHRjb25fcHJpdi0+ZXh0Y29uX3dxID0gY3JlYXRlX3Npbmds ZXRocmVhZF93b3JrcXVldWUoImRybV9kcF9leHRjb24iKTsKPiArCWlmIChJU19FUlJfT1JfTlVM TChleHRjb25fcHJpdi0+ZXh0Y29uX3dxKSkgewo+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNy ZWF0ZSB3b3JrcXVldWVcbiIpOwo+ICsJCWRwX2V4dGNvbl91bnJlZ2lzdGVyKGRwX3VzYnBkKTsK PiArCQlyZXR1cm4gLUVQRVJNOwo+ICsJfQo+ICsKPiArCUlOSVRfV09SSygmZXh0Y29uX3ByaXYt PmV2ZW50X3dvcmssIGRwX2V4dGNvbl9ldmVudF93b3JrKTsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3ZvaWQgZHBfZXh0Y29uX3VucmVnaXN0ZXIoc3RydWN0IGRwX3VzYnBkICpkcF91c2Jw ZCkKPiArewo+ICsJc3RydWN0IGRwX2V4dGNvbl9wcml2YXRlICpleHRjb25fcHJpdjsKPiArCj4g KwlpZiAoIWRwX3VzYnBkKSB7Cj4gKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGlucHV0XG4iKTsKCklm IHlvdSBhcmUgdW5yZWdpc3RlcmluZyB0aGlzIGxvZyBtZXNzYWdlIGlzbid0IHVzZWZ1bC4KCj4g KwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWV4dGNvbl9wcml2ID0gY29udGFpbmVyX29mKGRwX3Vz YnBkLCBzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUsIGRwX3VzYnBkKTsKPiArCj4gKwlkZXZtX2V4 dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGV4dGNvbl9wcml2LT5kZXYsIGV4dGNvbl9wcml2LT5l eHRjb24sCj4gKwkJCQkJICAgIEVYVENPTl9ESVNQX0RQLAo+ICsJCQkJCSAgICAmZXh0Y29uX3By aXYtPmV4dGNvbl9uYik7Cj4gKwo+ICsJaWYgKGV4dGNvbl9wcml2LT5leHRjb25fd3EpCj4gKwkJ ZGVzdHJveV93b3JrcXVldWUoZXh0Y29uX3ByaXYtPmV4dGNvbl93cSk7Cj4gKwo+ICsJcmV0dXJu OwoKRG9uJ3QgZG8gYSBiYXJlIHJldHVybiBhdCB0aGUgYm90dG9tIG9mIGEgdm9pZCBmdW5jdGlv bi4KPiArfQo+ICsKPiArc3RydWN0IGRwX3VzYnBkICpkcF9leHRjb25fZ2V0KHN0cnVjdCBkZXZp Y2UgKmRldiwgc3RydWN0IGRwX3VzYnBkX2NiICpjYikKPiArewo+ICsJaW50IHJjID0gMDsKPiAr CXN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqZHBfZXh0Y29uOwo+ICsJc3RydWN0IGRwX3VzYnBk ICpkcF91c2JwZDsKPiArCj4gKwlpZiAoIWNiKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGNi IGRhdGFcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlyZXR1cm4gRVJSX1BUUihyYyk7CgpU aGlzIGNvdWxkIGp1c3QgYmUgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCkKCj4gKwl9Cj4gKwo+ICsJ ZHBfZXh0Y29uID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcF9leHRjb24pLCBHRlBfS0VS TkVMKTsKPiArCWlmICghZHBfZXh0Y29uKSB7Cj4gKwkJcmMgPSAtRU5PTUVNOwo+ICsJCXJldHVy biBFUlJfUFRSKHJjKTsKCnJldHVybiBFUlJfUFRSKC1FTk9NRU0pCgo+ICsJfQo+ICsKPiArCWRw X2V4dGNvbi0+ZXh0Y29uID0gZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoZGV2LCAwKTsKPiAr CWlmICghZHBfZXh0Y29uLT5leHRjb24pIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgZXh0Y29u IGRhdGFcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlkZXZtX2tmcmVlKGRldiwgZHBfZXh0 Y29uKTsKCklmIHRoaXMgaXMgcmVhbGx5IHBlcmlzdGVudCBtZW1vcnkgYWNyb3NzIHRoZSBsaXZl IG9mIHRoZSBkcml2ZXIgeW91IGRvbid0IG5lZWQKdG8gZGV2bV9rZnJlZSgpIGhlcmUgYmVjYXVz ZSBwcmVzdW1hYmx5IHRoaXMgZnVuY3Rpb24gZmFpbGluZyB3aWxsIGVuZCB1cApkZXN0cm95aW5n IHRoZSBjb21wb25lbnQuICBJZiB0aGF0IGlzbid0IHRoZSBjYXNlIChmb3IgZXhhbXBsZSwgaWYg dGhpcyBzdHJ1Y3QKaXMgcnVudGltZSkgeW91IHNob3VsZCBqdXN0IHVzZSBremFsbG9jKCkgYW5k IG1hbmFnZSB0aGUgbWVtb3J5IHlvdXJzZWxmLgoKPiArCQlyZXR1cm4gRVJSX1BUUihyYyk7CgpU aGlzIGNhbiBqdXN0IGJlIHJldHVybiBFUlJfUFRSKC1FSU5WQUwpCj4gKyAgICAgICAgfQo+ICsK PiArCWRwX2V4dGNvbi0+ZGV2ID0gZGV2Owo+ICsJZHBfZXh0Y29uLT5kcF9jYiA9IGNiOwo+ICsK PiArCWRwX2V4dGNvbi0+ZHBfdXNicGQuY29ubmVjdCA9IGRwX2V4dGNvbl9jb25uZWN0Owo+ICsJ ZHBfdXNicGQgPSAmZHBfZXh0Y29uLT5kcF91c2JwZDsKPiArCj4gKwlyZXR1cm4gZHBfdXNicGQ7 Cj4gK30KPiArCj4gK3ZvaWQgZHBfZXh0Y29uX3B1dChzdHJ1Y3QgZHBfdXNicGQgKmRwX3VzYnBk KQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUgKmV4dGNvbjsKPiArCj4gKwlpZiAo IWRwX3VzYnBkKQo+ICsJCXJldHVybjsKPiArCj4gKwlleHRjb24gPSBjb250YWluZXJfb2YoZHBf dXNicGQsIHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSwgZHBfdXNicGQpOwo+ICsKPiArCWRldm1f a2ZyZWUoZXh0Y29uLT5kZXYsIGV4dGNvbik7CgpBcyB3aXRoIHRoZSBvdGhlciBkZXZtX2tmcmVl KCkgY2FsbHMuCgo+ICt9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf ZXh0Y29uLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5oCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi4yOGM3ZjA5Cj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZXh0Y29uLmgKPiBAQCAtMCwwICsxLDg1IEBA Cj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KPiArLyoKPiAr ICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmln aHRzIHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNpZm5kZWYgX0RQX0VYVENPTl9IXwo+ICsjZGVm aW5lIF9EUF9FWFRDT05fSF8KPiArCj4gKy8vI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JwZC5oPgo+ ICsKPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2Uu aD4KPiArCj4gK2VudW0gcGx1Z19vcmllbnRhdGlvbiB7Cj4gKwlPUklFTlRBVElPTl9OT05FLAo+ ICsJT1JJRU5UQVRJT05fQ0MxLAo+ICsJT1JJRU5UQVRJT05fQ0MyLAo+ICt9Owo+ICsKPiArLyoq Cj4gKyAqIHN0cnVjdCBkcF91c2JwZCAtIERpc3BsYXlQb3J0IHN0YXR1cwo+ICsgKgo+ICsgKiBA b3JpZW50YXRpb246IHBsdWcgb3JpZW50YXRpb24gY29uZmlndXJhdGlvbgo+ICsgKiBAbG93X3Bv d19zdDogbG93IHBvd2VyIHN0YXRlCj4gKyAqIEBhZGFwdG9yX2RwX2VuOiBhZGFwdG9yIGZ1bmN0 aW9uYWxpdHkgZW5hYmxlZAo+ICsgKiBAbXVsdGlfZnVuYzogbXVsdGktZnVuY3Rpb24gcHJlZmVy cmVkCj4gKyAqIEB1c2JfY29uZmlnX3JlcTogcmVxdWVzdCB0byBzd2l0Y2ggdG8gdXNiCj4gKyAq IEBleGl0X2RwX21vZGU6IHJlcXVlc3QgZXhpdCBmcm9tIGRpc3BsYXlwb3J0IG1vZGUKPiArICog QGhwZF9oaWdoOiBIb3QgUGx1ZyBEZXRlY3Qgc2lnbmFsIGlzIGhpZ2guCj4gKyAqIEBocGRfaXJx OiBDaGFuZ2UgaW4gdGhlIHN0YXR1cyBzaW5jZSBsYXN0IG1lc3NhZ2UKPiArICogQGFsdF9tb2Rl X2NmZ19kb25lOiBib29sIHRvIHNwZWNpZnkgYWx0IG1vZGUgc3RhdHVzCj4gKyAqIEBkZWJ1Z19l bjogYm9vbCB0byBzcGVjaWZ5IGRlYnVnIG1vZGUKPiArICogQGNvbm5lY3Q6IHNpbXVsYXRlIGRp c2Nvbm5lY3Qgb3IgY29ubmVjdCBmb3IgZGVidWcgbW9kZQo+ICsgKi8KPiArc3RydWN0IGRwX3Vz YnBkIHsKPiArCWVudW0gcGx1Z19vcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKPiArCWJvb2wgbG93 X3Bvd19zdDsKPiArCWJvb2wgYWRhcHRvcl9kcF9lbjsKPiArCWJvb2wgbXVsdGlfZnVuYzsKPiAr CWJvb2wgdXNiX2NvbmZpZ19yZXE7Cj4gKwlib29sIGV4aXRfZHBfbW9kZTsKPiArCWJvb2wgaHBk X2hpZ2g7Cj4gKwlib29sIGhwZF9pcnE7Cj4gKwlib29sIGFsdF9tb2RlX2NmZ19kb25lOwo+ICsJ Ym9vbCBkZWJ1Z19lbjsKPiArCWJvb2wgZm9yY2VkX2Rpc2Nvbm5lY3Q7Cj4gKwo+ICsJaW50ICgq Y29ubmVjdCkoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCwgYm9vbCBocGQpOwo+ICt9Owo+ICsK PiArLyoqCj4gKyAqIHN0cnVjdCBkcF91c2JwZF9jYiAtIGNhbGxiYWNrIGZ1bmN0aW9ucyBwcm92 aWRlZCBieSB0aGUgY2xpZW50Cj4gKyAqCj4gKyAqIEBjb25maWd1cmU6IGNhbGxlZCBieSB1c2Jw ZCBtb2R1bGUgd2hlbiBQRCBjb21tdW5pY2F0aW9uIGhhcwo+ICsgKiBiZWVuIGNvbXBsZXRlZCBh bmQgdGhlIHVzYiBwZXJpcGhlcmFsIGhhcyBiZWVuIGNvbmZpZ3VyZWQgb24KPiArICogZHAgbW9k ZS4KPiArICogQGRpc2Nvbm5lY3Q6IG5vdGlmeSB0aGUgY2FibGUgZGlzY29ubmVjdCBpc3N1ZWQg YnkgdXNiLgo+ICsgKiBAYXR0ZW50aW9uOiBub3RpZnkgYW55IGF0dGVudGlvbiBtZXNzYWdlIGlz c3VlZCBieSB1c2IuCj4gKyAqLwo+ICtzdHJ1Y3QgZHBfdXNicGRfY2Igewo+ICsJaW50ICgqY29u ZmlndXJlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwo+ICsJaW50ICgqZGlzY29ubmVjdCkoc3RydWN0 IGRldmljZSAqZGV2KTsKPiArCWludCAoKmF0dGVudGlvbikoc3RydWN0IGRldmljZSAqZGV2KTsK PiArfTsKPiArCj4gKy8qKgo+ICsgKiBkcF9leHRjb25fZ2V0KCkgLSBzZXR1cCB1c2JwZCBtb2R1 bGUKPiArICoKPiArICogQGRldjogZGV2aWNlIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIKPiArICog QGNiOiBzdHJ1Y3QgY29udGFpbmluZyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVycy4KPiArICoK PiArICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGNsaWVudCB0byBpbml0aWFsaXplIHRoZSB1 c2JwZAo+ICsgKiBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBjb21tdW5pY2F0ZSB3aXRoIHVzYiBk cml2ZXIgYW5kCj4gKyAqIGhhbmRsZXMgdGhlIHBvd2VyIGRlbGl2ZXJ5IChQRCkgY29tbXVuaWNh dGlvbiB3aXRoIHRoZQo+ICsgKiBzaW5rL3VzYiBkZXZpY2UuIFRoaXMgbW9kdWxlIHdpbGwgbm90 aWZ5IHRoZSBjbGllbnQgdXNpbmcKPiArICogdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhYm91dCB0 aGUgY29ubmVjdGlvbiBhbmQgc3RhdHVzLgo+ICsgKi8KPiArc3RydWN0IGRwX3VzYnBkICpkcF9l eHRjb25fZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX3VzYnBkX2NiICpjYik7Cj4g Kwo+ICt2b2lkIGRwX2V4dGNvbl9wdXQoc3RydWN0IGRwX3VzYnBkICpwZCk7Cj4gKwo+ICtpbnQg ZHBfZXh0Y29uX3JlZ2lzdGVyKHN0cnVjdCBkcF91c2JwZCAqZHBfdXNicGQpOwo+ICt2b2lkIGRw X2V4dGNvbl91bnJlZ2lzdGVyKHN0cnVjdCBkcF91c2JwZCAqZHBfdXNicGQpOwo+ICsKPiArI2Vu ZGlmIC8qIF9EUF9FWFRDT05fSF8gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9saW5rLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuYwo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNDk3NDViYwo+IC0tLSAvZGV2L251bGwK PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuYwo+IEBAIC0wLDAgKzEsMTIx NiBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4g KyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJp Z2h0cyByZXNlcnZlZC4KPiArICovCj4gKwo+ICsjZGVmaW5lIHByX2ZtdChmbXQpCSJbZHJtLWRw XSAlczogIiBmbXQsIF9fZnVuY19fCj4gKwo+ICsjaW5jbHVkZSAiZHBfbGluay5oIgo+ICsjaW5j bHVkZSAiZHBfcGFuZWwuaCIKPiArCj4gKyNkZWZpbmUgRFBfVEVTVF9SRVFVRVNUX01BU0sJCTB4 N0YKPiArCj4gK2VudW0gYXVkaW9fc2FtcGxlX3JhdGUgewo+ICsJQVVESU9fU0FNUExFX1JBVEVf MzJfS0haCT0gMHgwMCwKPiArCUFVRElPX1NBTVBMRV9SQVRFXzQ0XzFfS0haCT0gMHgwMSwKPiAr CUFVRElPX1NBTVBMRV9SQVRFXzQ4X0tIWgk9IDB4MDIsCj4gKwlBVURJT19TQU1QTEVfUkFURV84 OF8yX0tIWgk9IDB4MDMsCj4gKwlBVURJT19TQU1QTEVfUkFURV85Nl9LSFoJPSAweDA0LAo+ICsJ QVVESU9fU0FNUExFX1JBVEVfMTc2XzRfS0haCT0gMHgwNSwKPiArCUFVRElPX1NBTVBMRV9SQVRF XzE5Ml9LSFoJPSAweDA2LAo+ICt9Owo+ICsKPiArZW51bSBhdWRpb19wYXR0ZXJuX3R5cGUgewo+ ICsJQVVESU9fVEVTVF9QQVRURVJOX09QRVJBVE9SX0RFRklORUQJPSAweDAwLAo+ICsJQVVESU9f VEVTVF9QQVRURVJOX1NBV1RPT1RICQk9IDB4MDEsCj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlu a19yZXF1ZXN0IHsKPiArCXUzMiB0ZXN0X3JlcXVlc3RlZDsKPiArCXUzMiB0ZXN0X2xpbmtfcmF0 ZTsKPiArCXUzMiB0ZXN0X2xhbmVfY291bnQ7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlua19w cml2YXRlIHsKPiArCXUzMiBwcmV2X3NpbmtfY291bnQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7 Cj4gKwlzdHJ1Y3QgZHBfYXV4ICphdXg7Cj4gKwlzdHJ1Y3QgZHBfbGluayBkcF9saW5rOwo+ICsK PiArCXN0cnVjdCBkcF9saW5rX3JlcXVlc3QgcmVxdWVzdDsKPiArCXU4IGxpbmtfc3RhdHVzW0RQ X0xJTktfU1RBVFVTX1NJWkVdOwo+ICt9Owo+ICsKPiArc3RhdGljIGludCBkcF9saW5rX2dldF9w ZXJpb2Qoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaywgaW50IGNvbnN0IGFkZHIpCj4gK3sK PiArCWludCByZXQgPSAwOwo+ICsJdTggZGF0YTsKPiArCXUzMiBjb25zdCBtYXhfYXVkaW9fcGVy aW9kID0gMHhBOwo+ICsKPiArCS8qIFRFU1RfQVVESU9fUEVSSU9EX0NIX1hYICovCj4gKwlpZiAo ZHJtX2RwX2RwY2RfcmVhZGIobGluay0+YXV4LT5kcm1fYXV4LCBhZGRyLCAmZGF0YSkgPCAwKSB7 Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVhZCB0ZXN0X2F1ZGlvX3BlcmlvZCAoMHgleClc biIsIGFkZHIpOwo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0Owo+ICsJfQo+ICsK PiArCS8qIFBlcmlvZCAtIEJpdHMgMzowICovCj4gKwlkYXRhID0gZGF0YSAmIDB4RjsKPiArCWlm ICgoaW50KWRhdGEgPiBtYXhfYXVkaW9fcGVyaW9kKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlk IHRlc3RfYXVkaW9fcGVyaW9kX2NoXzEgPSAweCV4XG4iLCBkYXRhKTsKPiArCQlyZXQgPSAtRUlO VkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwlyZXQgPSBkYXRhOwo+ICtleGl0Ogo+ ICsJcmV0dXJuIHJldDsKCkluc3RlYWQgb2YgYSBnb3RvIHRoYXQgcmV0dXJucyBhIHZhbHVlLCBq dXN0IHJldHVybiB0aGUgdmFsdWUgZGlyZWN0bHkuCgo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRw X2xpbmtfcGFyc2VfYXVkaW9fY2hhbm5lbF9wZXJpb2Qoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAq bGluaykKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwlzdHJ1Y3QgZHBfbGlua190ZXN0X2F1ZGlv ICpyZXEgPSAmbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvOwo+ICsKPiArCXJldCA9IGRwX2xpbmtf Z2V0X3BlcmlvZChsaW5rLCBEUF9URVNUX0FVRElPX1BFUklPRF9DSDEpOwo+ICsJaWYgKHJldCA9 PSAtRUlOVkFMKQo+ICsJCWdvdG8gZXhpdDsKPiArCj4gKwlyZXEtPnRlc3RfYXVkaW9fcGVyaW9k X2NoXzEgPSByZXQ7Cj4gKwlEUk1fREVCVUdfRFAoInRlc3RfYXVkaW9fcGVyaW9kX2NoXzEgPSAw eCV4XG4iLCByZXQpOwo+ICsKPiArCXJldCA9IGRwX2xpbmtfZ2V0X3BlcmlvZChsaW5rLCBEUF9U RVNUX0FVRElPX1BFUklPRF9DSDIpOwo+ICsJaWYgKHJldCA9PSAtRUlOVkFMKQo+ICsJCWdvdG8g ZXhpdDsKPiArCj4gKwlyZXEtPnRlc3RfYXVkaW9fcGVyaW9kX2NoXzIgPSByZXQ7Cj4gKwlEUk1f REVCVUdfRFAoInRlc3RfYXVkaW9fcGVyaW9kX2NoXzIgPSAweCV4XG4iLCByZXQpOwo+ICsKPiAr CS8qIFRFU1RfQVVESU9fUEVSSU9EX0NIXzMgKEJ5dGUgMHgyNzUpICovCj4gKwlyZXQgPSBkcF9s aW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJT0RfQ0gzKTsKPiArCWlmIChy ZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0X2F1ZGlvX3Bl cmlvZF9jaF8zID0gcmV0Owo+ICsJRFJNX0RFQlVHX0RQKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF8z ID0gMHgleFxuIiwgcmV0KTsKPiArCj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywg RFBfVEVTVF9BVURJT19QRVJJT0RfQ0g0KTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQln b3RvIGV4aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF80ID0gcmV0Owo+ICsJ RFJNX0RFQlVHX0RQKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF80ID0gMHgleFxuIiwgcmV0KTsKPiAr Cj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJT0Rf Q0g1KTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJcmVx LT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF81ID0gcmV0Owo+ICsJRFJNX0RFQlVHX0RQKCJ0ZXN0X2F1 ZGlvX3BlcmlvZF9jaF81ID0gMHgleFxuIiwgcmV0KTsKPiArCj4gKwlyZXQgPSBkcF9saW5rX2dl dF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJT0RfQ0g2KTsKPiArCWlmIChyZXQgPT0g LUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0X2F1ZGlvX3BlcmlvZF9j aF82ID0gcmV0Owo+ICsJRFJNX0RFQlVHX0RQKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF82ID0gMHgl eFxuIiwgcmV0KTsKPiArCj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVT VF9BVURJT19QRVJJT0RfQ0g3KTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4 aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF83ID0gcmV0Owo+ICsJRFJNX0RF QlVHX0RQKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF83ID0gMHgleFxuIiwgcmV0KTsKPiArCj4gKwly ZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJT0RfQ0g4KTsK PiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0 X2F1ZGlvX3BlcmlvZF9jaF84ID0gcmV0Owo+ICsJRFJNX0RFQlVHX0RQKCJ0ZXN0X2F1ZGlvX3Bl cmlvZF9jaF84ID0gMHgleFxuIiwgcmV0KTsKPiArZXhpdDoKPiArCXJldHVybiByZXQ7CgpTYW1l Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2xpbmtfcGFyc2VfYXVkaW9fcGF0dGVybl90eXBl KHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJ dTggZGF0YTsKPiArCXNzaXplX3QgcmxlbjsKPiArCWludCBjb25zdCBtYXhfYXVkaW9fcGF0dGVy bl90eXBlID0gMHgxOwo+ICsKPiArCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkYihsaW5rLT5hdXgt PmRybV9hdXgsCj4gKwkJCQlEUF9URVNUX0FVRElPX1BBVFRFUk5fVFlQRSwgJmRhdGEpOwo+ICsJ aWYgKHJsZW4gPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVhZCBsaW5rIGF1ZGlv IG1vZGUuIHJsZW49JXpkXG4iLCBybGVuKTsKPiArCQlyZXR1cm4gcmxlbjsKPiArCX0KPiArCj4g KwkvKiBBdWRpbyBQYXR0ZXJuIFR5cGUgLSBCaXRzIDc6MCAqLwo+ICsJaWYgKChpbnQpZGF0YSA+ IG1heF9hdWRpb19wYXR0ZXJuX3R5cGUpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgYXVkaW8g cGF0dGVybiB0eXBlID0gMHgleFxuIiwgZGF0YSk7Cj4gKwkJcmV0ID0gLUVJTlZBTDsKClRoaXMg Y2FuIGJlIHJldHVybiAtRUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwlsaW5r LT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19wYXR0ZXJuX3R5cGUgPSBkYXRhOwo+ICsJ RFJNX0RFQlVHX0RQKCJhdWRpbyBwYXR0ZXJuIHR5cGUgPSAweCV4XG4iLCBkYXRhKTsKPiArZXhp dDoKCkxhYmVsIGlzbid0IG5lZWRlZCwgeW91IGNhbiBqdXN0IHJldHVybiAwIGFuZCB0aGVuIEkg ZG9uJ3QgdGhpbmsgcmV0IGlzIG5lZWRlZAplaXRoZXIuCgo+ICsJcmV0dXJuIHJldDsKPiArfQo+ ICsKPiArc3RhdGljIGludCBkcF9saW5rX3BhcnNlX2F1ZGlvX21vZGUoc3RydWN0IGRwX2xpbmtf cHJpdmF0ZSAqbGluaykKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwl1OCBkYXRhOwo+ICsJc3Np emVfdCBybGVuOwo+ICsJaW50IGNvbnN0IG1heF9hdWRpb19zYW1wbGluZ19yYXRlID0gMHg2Owo+ ICsJaW50IGNvbnN0IG1heF9hdWRpb19jaGFubmVsX2NvdW50ID0gMHg4Owo+ICsJaW50IHNhbXBs aW5nX3JhdGUgPSAweDA7Cj4gKwlpbnQgY2hhbm5lbF9jb3VudCA9IDB4MDsKPiArCj4gKwlybGVu ID0gZHJtX2RwX2RwY2RfcmVhZGIobGluay0+YXV4LT5kcm1fYXV4LCBEUF9URVNUX0FVRElPX01P REUsICZkYXRhKTsKPiArCWlmIChybGVuIDwgMCkgewo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRv IHJlYWQgbGluayBhdWRpbyBtb2RlLiBybGVuPSV6ZFxuIiwgcmxlbik7Cj4gKwkJcmV0dXJuIHJs ZW47Cj4gKwl9Cj4gKwo+ICsJLyogU2FtcGxpbmcgUmF0ZSAtIEJpdHMgMzowICovCj4gKwlzYW1w bGluZ19yYXRlID0gZGF0YSAmIDB4RjsKPiArCWlmIChzYW1wbGluZ19yYXRlID4gbWF4X2F1ZGlv X3NhbXBsaW5nX3JhdGUpIHsKPiArCQlEUk1fRVJST1IoInNhbXBsaW5nIHJhdGUgKDB4JXgpIGdy ZWF0ZXIgdGhhbiBtYXggKDB4JXgpXG4iLAo+ICsJCQkJc2FtcGxpbmdfcmF0ZSwgbWF4X2F1ZGlv X3NhbXBsaW5nX3JhdGUpOwo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0Owo+ICsJ fQo+ICsKPiArCS8qIENoYW5uZWwgQ291bnQgLSBCaXRzIDc6NCAqLwo+ICsJY2hhbm5lbF9jb3Vu dCA9ICgoZGF0YSAmIDB4RjApID4+IDQpICsgMTsKPiArCWlmIChjaGFubmVsX2NvdW50ID4gbWF4 X2F1ZGlvX2NoYW5uZWxfY291bnQpIHsKPiArCQlEUk1fRVJST1IoImNoYW5uZWxfY291bnQgKDB4 JXgpIGdyZWF0ZXIgdGhhbiBtYXggKDB4JXgpXG4iLAo+ICsJCQkJY2hhbm5lbF9jb3VudCwgbWF4 X2F1ZGlvX2NoYW5uZWxfY291bnQpOwo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0 Owo+ICsJfQo+ICsKPiArCWxpbmstPmRwX2xpbmsudGVzdF9hdWRpby50ZXN0X2F1ZGlvX3NhbXBs aW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOwo+ICsJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRl c3RfYXVkaW9fY2hhbm5lbF9jb3VudCA9IGNoYW5uZWxfY291bnQ7Cj4gKwlEUk1fREVCVUdfRFAo InNhbXBsaW5nX3JhdGUgPSAweCV4LCBjaGFubmVsX2NvdW50ID0gMHgleFxuIiwKPiArCQkJCQlz YW1wbGluZ19yYXRlLCBjaGFubmVsX2NvdW50KTsKPiArZXhpdDoKPiArCXJldHVybiByZXQ7CgpB cyBhYm92ZSAtIHJldHVybiBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBnb3RvIGFuZCBJ IHRoaW5rIHJldCBpcwpvdGhlcndpc2UgdW51c2VkIGFnYWluLgoKPiArfQo+ICsKPiArLyoqCj4g KyAqIGRwX3BhcnNlX2F1ZGlvX3BhdHRlcm5fcGFyYW1zKCkgLSBwYXJzZXMgYXVkaW8gcGF0dGVy biBwYXJhbWV0ZXJzIGZyb20gRFBDRAo+ICsgKiBAbGluazogRGlzcGxheSBQb3J0IERyaXZlciBk YXRhCj4gKyAqCj4gKyAqIFJldHVybnMgMCBpZiBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzIHRoZSBh dWRpbyBsaW5rIHBhdHRlcm4gcGFyYW1ldGVycy4KPiArICovCj4gK3N0YXRpYyBpbnQgZHBfbGlu a19wYXJzZV9hdWRpb19wYXR0ZXJuX3BhcmFtcyhzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5r KQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlyZXQgPSBkcF9saW5rX3BhcnNlX2F1ZGlv X21vZGUobGluayk7Cj4gKwlpZiAocmV0KQoKcmV0dXJuIHJldDsKCj4gKwkJZ290byBleGl0Owo+ ICsKPiArCXJldCA9IGRwX2xpbmtfcGFyc2VfYXVkaW9fcGF0dGVybl90eXBlKGxpbmspOwo+ICsJ aWYgKHJldCkKCnJldHVybiByZXQ7Cgo+ICsJCWdvdG8gZXhpdDsKPiArCj4gKwlyZXQgPSBkcF9s aW5rX3BhcnNlX2F1ZGlvX2NoYW5uZWxfcGVyaW9kKGxpbmspOwo+ICsKPiArZXhpdDoKCkxhYmVs IGlzbid0IG5lZWRlZC4KCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKioKPiArICogZHBf bGlua19pc192aWRlb19wYXR0ZXJuX3ZhbGlkKCkgLSB2YWxpZGF0ZXMgdGhlIHZpZGVvIHBhdHRl cm4KPiArICogQHBhdHRlcm46IHZpZGVvIHBhdHRlcm4gcmVxdWVzdGVkIGJ5IHRoZSBzaW5rCj4g KyAqCj4gKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWVzdGVkIHZpZGVvIHBhdHRlcm4gaXMg c3VwcG9ydGVkLgo+ICsgKi8KPiArc3RhdGljIGJvb2wgZHBfbGlua19pc192aWRlb19wYXR0ZXJu X3ZhbGlkKHUzMiBwYXR0ZXJuKQo+ICt7Cj4gKwlzd2l0Y2ggKHBhdHRlcm4pIHsKPiArCWNhc2Ug RFBfTk9fVEVTVF9QQVRURVJOOgo+ICsJY2FzZSBEUF9DT0xPUl9SQU1QOgo+ICsJY2FzZSBEUF9C TEFDS19BTkRfV0hJVEVfVkVSVElDQUxfTElORVM6Cj4gKwljYXNlIERQX0NPTE9SX1NRVUFSRToK PiArCQlyZXR1cm4gdHJ1ZTsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJfQo+ ICt9Cj4gKwo+ICsvKioKPiArICogZHBfbGlua19pc19iaXRfZGVwdGhfdmFsaWQoKSAtIHZhbGlk YXRlcyB0aGUgYml0IGRlcHRoIHJlcXVlc3RlZAo+ICsgKiBAYml0X2RlcHRoOiBiaXQgZGVwdGgg cmVxdWVzdGVkIGJ5IHRoZSBzaW5rCj4gKyAqCj4gKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVx dWVzdGVkIGJpdCBkZXB0aCBpcyBzdXBwb3J0ZWQuCj4gKyAqLwo+ICtzdGF0aWMgYm9vbCBkcF9s aW5rX2lzX2JpdF9kZXB0aF92YWxpZCh1MzIgdGJkKQo+ICt7Cj4gKwkvKiBEUF9URVNUX1ZJREVP X1BBVFRFUk5fTk9ORSBpcyB0cmVhdGVkIGFzIGludmFsaWQgKi8KPiArCXN3aXRjaCAodGJkKSB7 Cj4gKwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzY6Cj4gKwljYXNlIERQX1RFU1RfQklUX0RFUFRI Xzg6Cj4gKwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzEwOgo+ICsJCXJldHVybiB0cnVlOwo+ICsJ ZGVmYXVsdDoKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg ZHBfbGlua19wYXJzZV90aW1pbmdfcGFyYW1zMShzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5r LAo+ICsJCQkJCWludCBhZGRyLCBpbnQgbGVuLCB1MzIgKnZhbCkKPiArewo+ICsJdTggYnBbMl07 Cj4gKwlpbnQgcmxlbjsKPiArCj4gKwlpZiAobGVuICE9IDIpCj4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gKwo+ICsJLyogUmVhZCB0aGUgcmVxdWVzdGVkIHZpZGVvIGxpbmsgcGF0dGVybiAoQnl0ZSAw eDIyMSkuICovCj4gKwlybGVuID0gZHJtX2RwX2RwY2RfcmVhZChsaW5rLT5hdXgtPmRybV9hdXgs IGFkZHIsIGJwLCBsZW4pOwo+ICsJaWYgKHJsZW4gPCBsZW4pIHsKPiArCQlEUk1fRVJST1IoImZh aWxlZCB0byByZWFkIDB4JXhcbiIsIGFkZHIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ ICsKPiArCSp2YWwgPSBicFsxXSB8IChicFswXSA8PCA4KTsKPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMyKHN0cnVjdCBk cF9saW5rX3ByaXZhdGUgKmxpbmssCj4gKwkJCQkJaW50IGFkZHIsIGludCBsZW4sCj4gKwkJCQkJ dTMyICp2YWwxLCB1MzIgKnZhbDIpCj4gK3sKPiArCXU4IGJwWzJdOwo+ICsJaW50IHJsZW47Cj4g Kwo+ICsJaWYgKGxlbiAhPSAyKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCS8qIFJlYWQg dGhlIHJlcXVlc3RlZCB2aWRlbyBsaW5rIHBhdHRlcm4gKEJ5dGUgMHgyMjEpLiAqLwo+ICsJcmxl biA9IGRybV9kcF9kcGNkX3JlYWQobGluay0+YXV4LT5kcm1fYXV4LCBhZGRyLCBicCwgbGVuKTsK PiArCWlmIChybGVuIDwgbGVuKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVhZCAweCV4 XG4iLCBhZGRyKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwkqdmFsMSA9IChi cFswXSAmIEJJVCg3KSkgPj4gNzsKPiArCSp2YWwyID0gYnBbMV0gfCAoKGJwWzBdICYgMHg3Rikg PDwgOCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMyhzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rLAo+ICsJCQkJ CWludCBhZGRyLCB1MzIgKnZhbCkKPiArewo+ICsJdTggYnA7Cj4gKwl1MzIgbGVuID0gMTsKPiAr CWludCBybGVuOwo+ICsKPiArCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkKGxpbmstPmF1eC0+ZHJt X2F1eCwgYWRkciwgJmJwLCBsZW4pOwo+ICsJaWYgKHJsZW4gPCAxKSB7Cj4gKwkJRFJNX0VSUk9S KCJmYWlsZWQgdG8gcmVhZCAweCV4XG4iLCBhZGRyKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiAr CX0KPiArCSp2YWwgPSBicDsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoqCj4gKyAq IGRwX3BhcnNlX3ZpZGVvX3BhdHRlcm5fcGFyYW1zKCkgLSBwYXJzZXMgdmlkZW8gcGF0dGVybiBw YXJhbWV0ZXJzIGZyb20gRFBDRAo+ICsgKiBAbGluazogRGlzcGxheSBQb3J0IERyaXZlciBkYXRh Cj4gKyAqCj4gKyAqIFJldHVybnMgMCBpZiBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzIHRoZSB2aWRl byBsaW5rIHBhdHRlcm4gYW5kIHRoZSBsaW5rCj4gKyAqIGJpdCBkZXB0aCByZXF1ZXN0ZWQgYnkg dGhlIHNpbmsgYW5kLCBhbmQgaWYgdGhlIHZhbHVlcyBwYXJzZWQgYXJlIHZhbGlkLgo+ICsgKi8K PiArc3RhdGljIGludCBkcF9saW5rX3BhcnNlX3ZpZGVvX3BhdHRlcm5fcGFyYW1zKHN0cnVjdCBk cF9saW5rX3ByaXZhdGUgKmxpbmspCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJc3NpemVfdCBy bGVuOwo+ICsJdTggYnA7Cj4gKwo+ICsJcmxlbiA9IGRybV9kcF9kcGNkX3JlYWRiKGxpbmstPmF1 eC0+ZHJtX2F1eCwgRFBfVEVTVF9QQVRURVJOLCAmYnApOwo+ICsJaWYgKHJsZW4gPCAwKSB7Cj4g KwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVhZCBsaW5rIHZpZGVvIHBhdHRlcm4uIHJsZW49JXpk XG4iLCBybGVuKTsKPiArCQlyZXR1cm4gcmxlbjsKPiArCX0KPiArCj4gKwlpZiAoIWRwX2xpbmtf aXNfdmlkZW9fcGF0dGVybl92YWxpZChicCkpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgbGlu ayB2aWRlbyBwYXR0ZXJuID0gMHgleFxuIiwgYnApOwoKUmV0dXJuIC1FSU5WQUw7Cgo+ICsJCXJl dCA9IC1FSU5WQUw7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlsaW5rLT5kcF9saW5r LnRlc3RfdmlkZW8udGVzdF92aWRlb19wYXR0ZXJuID0gYnA7Cj4gKwo+ICsJLyogUmVhZCB0aGUg cmVxdWVzdGVkIGNvbG9yIGJpdCBkZXB0aCBhbmQgZHluYW1pYyByYW5nZSAoQnl0ZSAweDIzMikg Ki8KPiArCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkYihsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RF U1RfTUlTQzAsICZicCk7Cj4gKwlpZiAocmxlbiA8IDApIHsKPiArCQlEUk1fRVJST1IoImZhaWxl ZCB0byByZWFkIGxpbmsgYml0IGRlcHRoLiBybGVuPSV6ZFxuIiwgcmxlbik7Cj4gKwkJcmV0dXJu IHJsZW47Cj4gKwl9Cj4gKwo+ICsJLyogRHluYW1pYyBSYW5nZSAqLwo+ICsJbGluay0+ZHBfbGlu ay50ZXN0X3ZpZGVvLnRlc3RfZHluX3JhbmdlID0gKGJwICYgRFBfVEVTVF9EWU5BTUlDX1JBTkdF X0NFQSk7Cj4gKwo+ICsJLyogQ29sb3IgYml0IGRlcHRoICovCj4gKwlicCAmPSBEUF9URVNUX0JJ VF9ERVBUSF9NQVNLOwo+ICsJaWYgKCFkcF9saW5rX2lzX2JpdF9kZXB0aF92YWxpZChicCkpIHsK PiArCQlEUk1fRVJST1IoImludmFsaWQgbGluayBiaXQgZGVwdGggPSAweCV4XG4iLCBicCk7Cj4g KwkJcmV0ID0gLUVJTlZBTDsKPiArCQlyZXR1cm4gcmV0OwoKUmV0dXJuIC1FSU5WQUw7Cgo+ICsJ fQo+ICsKPiArCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCA9IGJwOwo+ ICsKPiArCS8qIHJlc29sdXRpb24gdGltaW5nIHBhcmFtcyAqLwo+ICsJcmV0ID0gZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMShsaW5rLCBEUF9URVNUX0hfVE9UQUxfSEksIDIsCj4gKwkJCSZs aW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3RvdGFsKTsKPiArCWlmIChyZXQpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBwYXJzZSB0ZXN0X2hfdG90YWwgKERQX1RFU1RfSF9UT1RB TF9ISSlcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMShsaW5rLCBEUF9URVNUX1ZfVE9UQUxfSEksIDIsCj4gKwkJCSZs aW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3RvdGFsKTsKPiArCWlmIChyZXQpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBwYXJzZSB0ZXN0X3ZfdG90YWwgKERQX1RFU1RfVl9UT1RB TF9ISSlcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMShsaW5rLCBEUF9URVNUX0hfU1RBUlRfSEksIDIsCj4gKwkJCSZs aW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3N0YXJ0KTsKPiArCWlmIChyZXQpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBwYXJzZSB0ZXN0X2hfc3RhcnQgKERQX1RFU1RfSF9TVEFS VF9ISSlcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMShsaW5rLCBEUF9URVNUX1ZfU1RBUlRfSEksIDIsCj4gKwkJCSZs aW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3N0YXJ0KTsKPiArCWlmIChyZXQpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBwYXJzZSB0ZXN0X3Zfc3RhcnQgKERQX1RFU1RfVl9TVEFS VF9ISSlcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19w YXJzZV90aW1pbmdfcGFyYW1zMihsaW5rLCBEUF9URVNUX0hTWU5DX0hJLCAyLAo+ICsJCQkmbGlu ay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaHN5bmNfcG9sLAo+ICsJCQkmbGluay0+ZHBfbGlu ay50ZXN0X3ZpZGVvLnRlc3RfaHN5bmNfd2lkdGgpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9F UlJPUigiZmFpbGVkIHRvIHBhcnNlIChEUF9URVNUX0hTWU5DX0hJKVxuIik7Cj4gKwkJcmV0dXJu IHJldDsKPiArCX0KPiArCj4gKwlyZXQgPSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMyKGxp bmssIERQX1RFU1RfVlNZTkNfSEksIDIsCj4gKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8u dGVzdF92c3luY19wb2wsCj4gKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92c3lu Y193aWR0aCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGFyc2Ug KERQX1RFU1RfVlNZTkNfSEkpXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJl dCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9IX1dJRFRIX0hJ LCAyLAo+ICsJCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaF93aWR0aCk7Cj4gKwlp ZiAocmV0KSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGFyc2UgdGVzdF9oX3dpZHRoIChE UF9URVNUX0hfV0lEVEhfSEkpXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJl dCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9WX0hFSUdIVF9I SSwgMiwKPiArCQkJJmxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3ZfaGVpZ2h0KTsKPiAr CWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBwYXJzZSB0ZXN0X3ZfaGVpZ2h0 IChEUF9URVNUX1ZfSEVJR0hUX0hJKVxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwlyZXQgPSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMzKGxpbmssIERQX1RFU1RfTUlTQzEs Cj4gKwkJJmxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3JyX2QpOwo+ICsJbGluay0+ZHBf bGluay50ZXN0X3ZpZGVvLnRlc3RfcnJfZCAmPSBEUF9URVNUX1JFRlJFU0hfREVOT01JTkFUT1I7 Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGFyc2UgdGVzdF9ycl9k IChEUF9URVNUX01JU0MxKVxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXQg PSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMzKGxpbmssIERQX1RFU1RfUkVGUkVTSF9SQVRF X05VTUVSQVRPUiwKPiArCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfcnJfbik7Cj4g KwlpZiAocmV0KSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGFyc2UgdGVzdF9ycl9uIChE UF9URVNUX1JFRlJFU0hfUkFURV9OVU1FUkFUT1IpXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJ fQo+ICsKPiArCURSTV9ERUJVR19EUCgibGluayB2aWRlbyBwYXR0ZXJuID0gMHgleFxuIiBcCj4g KwkJImxpbmsgZHluYW1pYyByYW5nZSA9IDB4JXhcbiIgXAo+ICsJCSJsaW5rIGJpdCBkZXB0aCA9 IDB4JXhcbiIgXAo+ICsJCSJURVNUX0hfVE9UQUwgPSAlZCwgVEVTVF9WX1RPVEFMID0gJWRcbiIg XAo+ICsJCSJURVNUX0hfU1RBUlQgPSAlZCwgVEVTVF9WX1NUQVJUID0gJWRcbiIgXAo+ICsJCSJU RVNUX0hTWU5DX1BPTCA9ICVkXG4iIFwKPiArCQkiVEVTVF9IU1lOQ19XSURUSCA9ICVkXG4iIFwK PiArCQkiVEVTVF9WU1lOQ19QT0wgPSAlZFxuIiBcCj4gKwkJIlRFU1RfVlNZTkNfV0lEVEggPSAl ZFxuIiBcCj4gKwkJIlRFU1RfSF9XSURUSCA9ICVkXG4iIFwKPiArCQkiVEVTVF9WX0hFSUdIVCA9 ICVkXG4iIFwKPiArCQkiVEVTVF9SRUZSRVNIX0RFTk9NSU5BVE9SID0gJWRcbiIgXAo+ICsJCSAi VEVTVF9SRUZSRVNIX05VTUVSQVRPUiA9ICVkXG4iLAo+ICsJCWxpbmstPmRwX2xpbmsudGVzdF92 aWRlby50ZXN0X3ZpZGVvX3BhdHRlcm4sCj4gKwkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRl c3RfZHluX3JhbmdlLAo+ICsJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2JpdF9kZXB0 aCwKPiArCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3RvdGFsLAo+ICsJCWxpbmst PmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3ZfdG90YWwsCj4gKwkJbGluay0+ZHBfbGluay50ZXN0 X3ZpZGVvLnRlc3RfaF9zdGFydCwKPiArCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92 X3N0YXJ0LAo+ICsJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2hzeW5jX3BvbCwKPiAr CQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oc3luY193aWR0aCwKPiArCQlsaW5rLT5k cF9saW5rLnRlc3RfdmlkZW8udGVzdF92c3luY19wb2wsCj4gKwkJbGluay0+ZHBfbGluay50ZXN0 X3ZpZGVvLnRlc3RfdnN5bmNfd2lkdGgsCj4gKwkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRl c3RfaF93aWR0aCwKPiArCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X2hlaWdodCwK PiArCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9ycl9kLAo+ICsJCWxpbmstPmRwX2xp bmsudGVzdF92aWRlby50ZXN0X3JyX24pOwo+ICsKPiArCXJldHVybiByZXQ7CgpUaGlzIGNhbiBq dXN0IGJlIHJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKioKPiArICogZHBfbGlua19wYXJzZV9saW5r X3RyYWluaW5nX3BhcmFtcygpIC0gcGFyc2VzIGxpbmsgdHJhaW5pbmcgcGFyYW1ldGVycyBmcm9t Cj4gKyAqIERQQ0QKPiArICogQGxpbms6IERpc3BsYXkgUG9ydCBEcml2ZXIgZGF0YQo+ICsgKgo+ ICsgKiBSZXR1cm5zIDAgaWYgaXQgc3VjY2Vzc2Z1bGx5IHBhcnNlcyB0aGUgbGluayByYXRlIChC eXRlIDB4MjE5KSBhbmQgbGFuZQo+ICsgKiBjb3VudCAoQnl0ZSAweDIyMCksIGFuZCBpZiB0aGVz ZSB2YWx1ZXMgcGFyc2UgYXJlIHZhbGlkLgo+ICsgKi8KPiArc3RhdGljIGludCBkcF9saW5rX3Bh cnNlX2xpbmtfdHJhaW5pbmdfcGFyYW1zKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCj4g K3sKPiArCXU4IGJwOwo+ICsJc3NpemVfdCBybGVuOwo+ICsKPiArCXJsZW4gPSBkcm1fZHBfZHBj ZF9yZWFkYihsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1RfTElOS19SQVRFLAkmYnApOwo+ICsJ aWYgKHJsZW4gPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVhZCBsaW5rIHJhdGUu IHJsZW49JXpkXG4iLCBybGVuKTsKPiArCQlyZXR1cm4gcmxlbjsKPiArCX0KPiArCj4gKwlpZiAo IWlzX2xpbmtfcmF0ZV92YWxpZChicCkpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgbGluayBy YXRlID0gMHgleFxuIiwgYnApOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWxp bmstPnJlcXVlc3QudGVzdF9saW5rX3JhdGUgPSBicDsKPiArCURSTV9ERUJVR19EUCgibGluayBy YXRlID0gMHgleFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X2xpbmtfcmF0ZSk7Cj4gKwo+ICsJcmxl biA9IGRybV9kcF9kcGNkX3JlYWRiKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfVEVTVF9MQU5FX0NP VU5ULCAmYnApOwo+ICsJaWYgKHJsZW4gPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8g cmVhZCBsYW5lIGNvdW50LiBybGVuPSV6ZFxuIiwgcmxlbik7Cj4gKwkJcmV0dXJuIHJsZW47Cj4g Kwl9Cj4gKwlicCAmPSBEUF9NQVhfTEFORV9DT1VOVF9NQVNLOwo+ICsKPiArCWlmICghaXNfbGFu ZV9jb3VudF92YWxpZChicCkpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgbGFuZSBjb3VudCA9 IDB4JXhcbiIsIGJwKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlsaW5rLT5y ZXF1ZXN0LnRlc3RfbGFuZV9jb3VudCA9IGJwOwo+ICsJRFJNX0RFQlVHX0RQKCJsYW5lIGNvdW50 ID0gMHgleFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQpOwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGRwX2xpbmtfaXNfcGh5X3Rlc3RfcGF0dGVybl9zdXBw b3J0ZWQodTMyIHBoeV90ZXN0X3BhdHRlcm5fc2VsKQo+ICt7Cj4gKwlzd2l0Y2ggKHBoeV90ZXN0 X3BhdHRlcm5fc2VsKSB7Cj4gKwljYXNlIERQX0xJTktfUVVBTF9QQVRURVJOX0RJU0FCTEU6Cj4g KwljYXNlIERQX0xJTktfUVVBTF9QQVRURVJOX0QxMF8yOgo+ICsJY2FzZSBEUF9MSU5LX1FVQUxf UEFUVEVSTl9FUlJPUl9SQVRFOgo+ICsJY2FzZSBEUF9MSU5LX1FVQUxfUEFUVEVSTl9QUkJTNzoK PiArCWNhc2UgRFBfTElOS19RVUFMX1BBVFRFUk5fODBCSVRfQ1VTVE9NOgo+ICsJY2FzZSBEUF9M SU5LX1FVQUxfUEFUVEVSTl9IQlIyX0VZRToKPiArCQlyZXR1cm4gdHJ1ZTsKPiArCWRlZmF1bHQ6 Cj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKioKPiArICogZHBfcGFyc2Vf cGh5X3Rlc3RfcGFyYW1zKCkgLSBwYXJzZXMgdGhlIHBoeSBsaW5rIHBhcmFtZXRlcnMKPiArICog QGxpbms6IERpc3BsYXkgUG9ydCBEcml2ZXIgZGF0YQo+ICsgKgo+ICsgKiBQYXJzZXMgdGhlIERQ Q0QgKEJ5dGUgMHgyNDgpIGZvciB0aGUgRFAgUEhZIGxpbmsgcGF0dGVybiB0aGF0IGlzIGJlaW5n Cj4gKyAqIHJlcXVlc3RlZC4KPiArICovCj4gK3N0YXRpYyBpbnQgZHBfbGlua19wYXJzZV9waHlf dGVzdF9wYXJhbXMoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJdTggZGF0 YTsKPiArCXNzaXplX3QgcmxlbjsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCXJsZW4gPSBkcm1f ZHBfZHBjZF9yZWFkYihsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1RfUEhZX1BBVFRFUk4sICZk YXRhKTsKPiArCWlmIChybGVuIDwgMCkgewo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlYWQg cGh5IGxpbmsgcGF0dGVybi4gcmxlbj0lemRcbiIsIHJsZW4pOwo+ICsJCXJldHVybiBybGVuOwo+ ICsJfQo+ICsKPiArCWxpbmstPmRwX2xpbmsucGh5X3BhcmFtcy5waHlfdGVzdF9wYXR0ZXJuX3Nl bCA9IGRhdGE7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJwaHlfdGVzdF9wYXR0ZXJuX3NlbCA9IDB4 JXhcbiIsIGRhdGEpOwo+ICsKPiArCWlmICghZHBfbGlua19pc19waHlfdGVzdF9wYXR0ZXJuX3N1 cHBvcnRlZChkYXRhKSkKPiArCQlyZXQgPSAtRUlOVkFMOwo+ICsKPiArCXJldHVybiByZXQ7Cj4g K30KPiArCj4gKy8qKgo+ICsgKiBkcF9saW5rX2lzX3ZpZGVvX2F1ZGlvX3Rlc3RfcmVxdWVzdGVk KCkgLSBjaGVja3MgZm9yIGF1ZGlvL3ZpZGVvIGxpbmsgcmVxdWVzdAo+ICsgKiBAbGluazogbGlu ayByZXF1ZXN0ZWQgYnkgdGhlIHNpbmsKPiArICoKPiArICogUmV0dXJucyB0cnVlIGlmIHRoZSBy ZXF1ZXN0ZWQgbGluayBpcyBhIHBlcm1pdHRlZCBhdWRpby92aWRlbyBsaW5rLgo+ICsgKi8KPiAr c3RhdGljIGJvb2wgZHBfbGlua19pc192aWRlb19hdWRpb190ZXN0X3JlcXVlc3RlZCh1MzIgbGlu aykKPiArewo+ICsJdTggdmlkZW9fYXVkaW9fdGVzdCA9IChEUF9URVNUX0xJTktfVklERU9fUEFU VEVSTiB8Cj4gKwkJCQlEUF9URVNUX0xJTktfQVVESU9fUEFUVEVSTiB8Cj4gKwkJCQlEUF9URVNU X0xJTktfQVVESU9fRElTQUJMRURfVklERU8pOwo+ICsKPiArCXJldHVybiAoKGxpbmsgJiB2aWRl b19hdWRpb190ZXN0KSAmJgo+ICsJCSEobGluayAmIH52aWRlb19hdWRpb190ZXN0KSk7Cj4gK30K PiArCj4gKy8qKgo+ICsgKiBkcF9saW5rX3BhcnNlX3JlcXVlc3QoKSAtIHBhcnNlcyBsaW5rIHJl cXVlc3QgcGFyYW1ldGVycyBmcm9tIHNpbmsKPiArICogQGxpbms6IERpc3BsYXkgUG9ydCBEcml2 ZXIgZGF0YQo+ICsgKgo+ICsgKiBQYXJzZXMgdGhlIERQQ0QgdG8gY2hlY2sgaWYgYW4gYXV0b21h dGVkIGxpbmsgaXMgcmVxdWVzdGVkIChCeXRlIDB4MjAxKSwKPiArICogYW5kIHdoYXQgdHlwZSBv ZiBsaW5rIGF1dG9tYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkIChCeXRlIDB4MjE4KS4KPiArICov Cj4gK3N0YXRpYyBpbnQgZHBfbGlua19wYXJzZV9yZXF1ZXN0KHN0cnVjdCBkcF9saW5rX3ByaXZh dGUgKmxpbmspCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJdTggZGF0YTsKPiArCXNzaXplX3Qg cmxlbjsKPiArCj4gKwkvKioKPiArCSAqIFJlYWQgdGhlIGRldmljZSBzZXJ2aWNlIElSUSB2ZWN0 b3IgKEJ5dGUgMHgyMDEpIHRvIGRldGVybWluZQo+ICsJICogd2hldGhlciBhbiBhdXRvbWF0ZWQg bGluayBoYXMgYmVlbiByZXF1ZXN0ZWQgYnkgdGhlIHNpbmsuCj4gKwkgKi8KPiArCXJsZW4gPSBk cm1fZHBfZHBjZF9yZWFkYihsaW5rLT5hdXgtPmRybV9hdXgsCj4gKwkJCQlEUF9ERVZJQ0VfU0VS VklDRV9JUlFfVkVDVE9SLCAmZGF0YSk7Cj4gKwlpZiAocmxlbiA8IDApIHsKPiArCQlEUk1fRVJS T1IoImF1eCByZWFkIGZhaWxlZC4gcmxlbj0lemRcbiIsIHJsZW4pOwo+ICsJCXJldHVybiBybGVu Owo+ICsJfQo+ICsKPiArCURSTV9ERUJVR19EUCgiZGV2aWNlIHNlcnZpY2UgaXJxIHZlY3RvciA9 IDB4JXhcbiIsIGRhdGEpOwo+ICsKPiArCWlmICghKGRhdGEgJiBEUF9BVVRPTUFURURfVEVTVF9S RVFVRVNUKSkgewo+ICsJCURSTV9ERUJVR19EUCgibm8gdGVzdCByZXF1ZXN0ZWRcbiIpOwo+ICsJ CXJldHVybiAwOwo+ICsJfQo+ICsKPiArCS8qKgo+ICsJICogUmVhZCB0aGUgbGluayByZXF1ZXN0 IGJ5dGUgKEJ5dGUgMHgyMTgpIHRvIGRldGVybWluZSB3aGF0IHR5cGUKPiArCSAqIG9mIGF1dG9t YXRlZCBsaW5rIGhhcyBiZWVuIHJlcXVlc3RlZCBieSB0aGUgc2luay4KPiArCSAqLwo+ICsJcmxl biA9IGRybV9kcF9kcGNkX3JlYWRiKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfVEVTVF9SRVFVRVNU LCAmZGF0YSk7Cj4gKwlpZiAocmxlbiA8IDApIHsKPiArCQlEUk1fRVJST1IoImF1eCByZWFkIGZh aWxlZC4gcmxlbj0lemRcbiIsIHJsZW4pOwo+ICsJCXJldHVybiBybGVuOwo+ICsJfQo+ICsKPiAr CWlmICghZGF0YSB8fCAoZGF0YSA9PSBEUF9URVNUX0xJTktfRkFVWF9QQVRURVJOKSkgewo+ICsJ CURSTV9ERUJVR19EUCgibGluayAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsIGRhdGEpOwo+ICsJCWdv dG8gZW5kOwo+ICsJfQo+ICsKPiArCURSTV9ERUJVR19EUCgiVGVzdDooMHgleCkgcmVxdWVzdGVk XG4iLCBkYXRhKTsKPiArCWxpbmstPnJlcXVlc3QudGVzdF9yZXF1ZXN0ZWQgPSBkYXRhOwo+ICsK PiArCWlmIChsaW5rLT5yZXF1ZXN0LnRlc3RfcmVxdWVzdGVkID09IERQX1RFU1RfTElOS19QSFlf VEVTVF9QQVRURVJOKSB7Cj4gKwkJcmV0ID0gZHBfbGlua19wYXJzZV9waHlfdGVzdF9wYXJhbXMo bGluayk7Cj4gKwkJaWYgKHJldCkKPiArCQkJZ290byBlbmQ7Cj4gKwkJcmV0ID0gZHBfbGlua19w YXJzZV9saW5rX3RyYWluaW5nX3BhcmFtcyhsaW5rKTsKPiArCQlpZiAocmV0KQo+ICsJCQlnb3Rv IGVuZDsKPiArCX0KPiArCj4gKwlpZiAobGluay0+cmVxdWVzdC50ZXN0X3JlcXVlc3RlZCA9PSBE UF9URVNUX0xJTktfVFJBSU5JTkcpIHsKPiArCQlyZXQgPSBkcF9saW5rX3BhcnNlX2xpbmtfdHJh aW5pbmdfcGFyYW1zKGxpbmspOwo+ICsJCWlmIChyZXQpCj4gKwkJCWdvdG8gZW5kOwo+ICsJfQo+ ICsKPiArCWlmIChkcF9saW5rX2lzX3ZpZGVvX2F1ZGlvX3Rlc3RfcmVxdWVzdGVkKAo+ICsJCQls aW5rLT5yZXF1ZXN0LnRlc3RfcmVxdWVzdGVkKSkgewo+ICsJCXJldCA9IGRwX2xpbmtfcGFyc2Vf dmlkZW9fcGF0dGVybl9wYXJhbXMobGluayk7Cj4gKwkJaWYgKHJldCkKPiArCQkJZ290byBlbmQ7 Cj4gKwo+ICsJCXJldCA9IGRwX2xpbmtfcGFyc2VfYXVkaW9fcGF0dGVybl9wYXJhbXMobGluayk7 Cj4gKwl9Cj4gK2VuZDoKPiArCS8qKgo+ICsJICogU2VuZCBhIERQX1RFU1RfQUNLIGlmIGFsbCBs aW5rIHBhcmFtZXRlcnMgYXJlIHZhbGlkLCBvdGhlcndpc2Ugc2VuZAo+ICsJICogYSBEUF9URVNU X05BSy4KPiArCSAqLwo+ICsJaWYgKHJldCkgewo+ICsJCWxpbmstPmRwX2xpbmsudGVzdF9yZXNw b25zZSA9IERQX1RFU1RfTkFLOwo+ICsJfSBlbHNlIHsKPiArCQlpZiAobGluay0+cmVxdWVzdC50 ZXN0X3JlcXVlc3RlZCAhPSBEUF9URVNUX0xJTktfRURJRF9SRUFEKQo+ICsJCQlsaW5rLT5kcF9s aW5rLnRlc3RfcmVzcG9uc2UgPSBEUF9URVNUX0FDSzsKPiArCQllbHNlCj4gKwkJCWxpbmstPmRw X2xpbmsudGVzdF9yZXNwb25zZSA9Cj4gKwkJCQlEUF9URVNUX0VESURfQ0hFQ0tTVU1fV1JJVEU7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRwX2xpbmtf cGFyc2Vfc2lua19jb3VudCgpIC0gcGFyc2VzIHRoZSBzaW5rIGNvdW50Cj4gKyAqCj4gKyAqIFBh cnNlcyB0aGUgRFBDRCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbiB1cGRhdGUgdG8gdGhlIHNpbmsg Y291bnQKPiArICogKEJ5dGUgMHgyMDApLCBhbmQgd2hldGhlciBhbGwgdGhlIHNpbmsgZGV2aWNl cyBjb25uZWN0ZWQgaGF2ZSBDb250ZW50Cj4gKyAqIFByb3RlY3Rpb24gZW5hYmxlZC4KPiArICov Cj4gK3N0YXRpYyBpbnQgZHBfbGlua19wYXJzZV9zaW5rX2NvdW50KHN0cnVjdCBkcF9saW5rICpk cF9saW5rKQo+ICt7Cj4gKwlzc2l6ZV90IHJsZW47Cj4gKwlib29sIGNwX3JlYWR5Owo+ICsKPiAr CXN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmsgPSBjb250YWluZXJfb2YoZHBfbGluaywKPiAr CQkJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSwgZHBfbGluayk7Cj4gKwo+ICsJcmxlbiA9IGRybV9k cF9kcGNkX3JlYWRiKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfU0lOS19DT1VOVCwKPiArCQkJCSAm bGluay0+ZHBfbGluay5zaW5rX2NvdW50KTsKPiArCWlmIChybGVuIDwgMCkgewo+ICsJCURSTV9F UlJPUigic2luayBjb3VudCByZWFkIGZhaWxlZC4gcmxlbj0lemRcbiIsIHJsZW4pOwo+ICsJCXJl dHVybiBybGVuOwo+ICsJfQo+ICsKPiArCWNwX3JlYWR5ID0gbGluay0+ZHBfbGluay5zaW5rX2Nv dW50ICYgRFBfU0lOS19DUF9SRUFEWTsKPiArCj4gKwlsaW5rLT5kcF9saW5rLnNpbmtfY291bnQg PQo+ICsJCURQX0dFVF9TSU5LX0NPVU5UKGxpbmstPmRwX2xpbmsuc2lua19jb3VudCk7Cj4gKwo+ ICsJRFJNX0RFQlVHX0RQKCJzaW5rX2NvdW50ID0gMHgleCwgY3BfcmVhZHkgPSAweCV4XG4iLAo+ ICsJCWxpbmstPmRwX2xpbmsuc2lua19jb3VudCwgY3BfcmVhZHkpOwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2xpbmtfcGFyc2Vfc2lua19zdGF0dXNfZmllbGQoc3Ry dWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJaW50IGxlbiA9IDA7Cj4gKwo+ICsJ bGluay0+cHJldl9zaW5rX2NvdW50ID0gbGluay0+ZHBfbGluay5zaW5rX2NvdW50Owo+ICsJZHBf bGlua19wYXJzZV9zaW5rX2NvdW50KCZsaW5rLT5kcF9saW5rKTsKPiArCj4gKwlsZW4gPSBkcm1f ZHBfZHBjZF9yZWFkX2xpbmtfc3RhdHVzKGxpbmstPmF1eC0+ZHJtX2F1eCwKPiArCQlsaW5rLT5s aW5rX3N0YXR1cyk7Cj4gKwlpZiAobGVuIDwgRFBfTElOS19TVEFUVVNfU0laRSkKPiArCQlEUk1f RVJST1IoIkRQIGxpbmsgc3RhdHVzIHJlYWQgZmFpbGVkXG4iKTsKPiArCWRwX2xpbmtfcGFyc2Vf cmVxdWVzdChsaW5rKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRwX2xpbmtfcHJvY2Vzc19saW5r X3RyYWluaW5nX3JlcXVlc3QoKSAtIHByb2Nlc3NlcyBuZXcgdHJhaW5pbmcgcmVxdWVzdHMKPiAr ICogQGxpbms6IERpc3BsYXkgUG9ydCBsaW5rIGRhdGEKPiArICoKPiArICogVGhpcyBmdW5jdGlv biB3aWxsIGhhbmRsZSBuZXcgbGluayB0cmFpbmluZyByZXF1ZXN0cyB0aGF0IGFyZSBpbml0aWF0 ZWQgYnkKPiArICogdGhlIHNpbmsuIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgdXBkYXRlIHRoZSBy ZXF1ZXN0ZWQgbGFuZSBjb3VudCBhbmQgbGluawo+ICsgKiBsaW5rIHJhdGUsIGFuZCB0aGVuIHRy aWdnZXIgdGhlIGxpbmsgcmV0cmFpbmluZyBwcm9jZWR1cmUuCj4gKyAqCj4gKyAqIFRoZSBmdW5j dGlvbiB3aWxsIHJldHVybiAwIGlmIGEgbGluayB0cmFpbmluZyByZXF1ZXN0IGhhcyBiZWVuIHBy b2Nlc3NlZCwKPiArICogb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIC1FSU5WQUwuCj4gKyAqLwo+ ICtzdGF0aWMgaW50IGRwX2xpbmtfcHJvY2Vzc19saW5rX3RyYWluaW5nX3JlcXVlc3Qoc3RydWN0 IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJaWYgKGxpbmstPnJlcXVlc3QudGVzdF9y ZXF1ZXN0ZWQgIT0gRFBfVEVTVF9MSU5LX1RSQUlOSU5HKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ ICsKPiArCURSTV9ERUJVR19EUCgiVGVzdDoweCV4IGxpbmsgcmF0ZSA9IDB4JXgsIGxhbmUgY291 bnQgPSAweCV4XG4iLAo+ICsJCQlEUF9URVNUX0xJTktfVFJBSU5JTkcsCj4gKwkJCWxpbmstPnJl cXVlc3QudGVzdF9saW5rX3JhdGUsCj4gKwkJCWxpbmstPnJlcXVlc3QudGVzdF9sYW5lX2NvdW50 KTsKPiArCj4gKwlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLm51bV9sYW5lcyA9IGxpbmstPnJl cXVlc3QudGVzdF9sYW5lX2NvdW50Owo+ICsJbGluay0+ZHBfbGluay5saW5rX3BhcmFtcy5yYXRl ID0gbGluay0+cmVxdWVzdC50ZXN0X2xpbmtfcmF0ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ ICsKPiArYm9vbCBkcF9saW5rX3NlbmRfdGVzdF9yZXNwb25zZShzdHJ1Y3QgZHBfbGluayAqZHBf bGluaykKPiArewo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluayA9IE5VTEw7Cj4gKwlp bnQgcmV0ID0gMDsKPiArCj4gKwlpZiAoIWRwX2xpbmspIHsKPiArCQlEUk1fRVJST1IoImludmFs aWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiBmYWxzZTsKPiArCX0KPiArCj4gKwlsaW5rID0gY29u dGFpbmVyX29mKGRwX2xpbmssIHN0cnVjdCBkcF9saW5rX3ByaXZhdGUsIGRwX2xpbmspOwo+ICsK PiArCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYihsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1Rf UkVTUE9OU0UsCj4gKwkJCWRwX2xpbmstPnRlc3RfcmVzcG9uc2UpOwo+ICsJcmV0dXJuIHJldCA9 PSAxOwo+ICt9Cj4gKwo+ICtpbnQgZHBfbGlua19wc21fY29uZmlnKHN0cnVjdCBkcF9saW5rICpk cF9saW5rLAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2RwX2xpbmsgKmxpbmtfaW5mbywgYm9vbCBl bmFibGUpCj4gK3sKPiArCXN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmsgPSBOVUxMOwo+ICsJ aW50IHJldCA9IDA7Cj4gKwo+ICsJaWYgKCFkcF9saW5rKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZh bGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJbGluayA9 IGNvbnRhaW5lcl9vZihkcF9saW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsK PiArCj4gKwlpZiAoZW5hYmxlKQo+ICsJCXJldCA9IGRybV9kcF9saW5rX3Bvd2VyX2Rvd24obGlu ay0+YXV4LT5kcm1fYXV4LCBsaW5rX2luZm8pOwo+ICsJZWxzZQo+ICsJCXJldCA9IGRybV9kcF9s aW5rX3Bvd2VyX3VwKGxpbmstPmF1eC0+ZHJtX2F1eCwgbGlua19pbmZvKTsKPiArCj4gKwlpZiAo cmV0KQo+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvICVzIGxvdyBwb3dlciBtb2RlXG4iLCBlbmFi bGUgPyAiZW50ZXIiIDogImV4aXQiKTsKPiArCWVsc2UKPiArCQlkcF9saW5rLT5wc21fZW5hYmxl ZCA9IGVuYWJsZTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtib29sIGRwX2xpbmtf c2VuZF9lZGlkX2NoZWNrc3VtKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLCB1OCBjaGVja3N1bSkK PiArewo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluayA9IE5VTEw7Cj4gKwlpbnQgcmV0 ID0gMDsKPiArCj4gKwlpZiAoIWRwX2xpbmspIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5w dXRcbiIpOwo+ICsJCXJldHVybiBmYWxzZTsKPiArCX0KPiArCj4gKwlsaW5rID0gY29udGFpbmVy X29mKGRwX2xpbmssIHN0cnVjdCBkcF9saW5rX3ByaXZhdGUsIGRwX2xpbmspOwo+ICsKPiArCXJl dCA9IGRybV9kcF9kcGNkX3dyaXRlYihsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1RfRURJRF9D SEVDS1NVTSwgY2hlY2tzdW0pOwo+ICsJcmV0dXJuIHJldCA9PSAxOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGRwX2xpbmtfcGFyc2VfdnhfcHgoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykK PiArewo+ICsJdTggZGF0YTsKPiArCWludCByZXQgPSAwOwo+ICsJdTMyIHYwLCBwMCwgdjEsIHAx LCB2MiwgcDIsIHYzLCBwMzsKPiArCXNzaXplX3QgcmxlbjsKPiArCj4gKwlybGVuID0gZHJtX2Rw X2RwY2RfcmVhZGIobGluay0+YXV4LT5kcm1fYXV4LCBEUF9BREpVU1RfUkVRVUVTVF9MQU5FMF8x LCAmZGF0YSk7Cj4gKwlpZiAocmxlbiA8IDApIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBy ZWFkIGxhbmVzLiBybGVuPSV6ZFxuIiwgcmxlbik7Cj4gKwkJcmV0dXJuIHJsZW47Cj4gKwl9Cj4g Kwo+ICsJRFJNX0RFQlVHX0RQKCJsYW5lcyAwLzEgKEJ5dGUgMHgyMDYpOiAweCV4XG4iLCBkYXRh KTsKPiArCj4gKwl2MCA9IGRhdGEgJiAweDM7Cj4gKwlkYXRhID0gZGF0YSA+PiAyOwo+ICsJcDAg PSBkYXRhICYgMHgzOwo+ICsJZGF0YSA9IGRhdGEgPj4gMjsKPiArCj4gKwl2MSA9IGRhdGEgJiAw eDM7Cj4gKwlkYXRhID0gZGF0YSA+PiAyOwo+ICsJcDEgPSBkYXRhICYgMHgzOwo+ICsJZGF0YSA9 IGRhdGEgPj4gMjsKPiArCj4gKwlybGVuID0gZHJtX2RwX2RwY2RfcmVhZGIobGluay0+YXV4LT5k cm1fYXV4LCBEUF9BREpVU1RfUkVRVUVTVF9MQU5FMl8zLCAmZGF0YSk7Cj4gKwlpZiAocmxlbiA8 IDApIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byByZWFkIGxhbmVzIDIvMy4gcmxlbj0lemRc biIsIHJsZW4pOwo+ICsJCXJldHVybiBybGVuOwo+ICsJfQo+ICsKPiArCURSTV9ERUJVR19EUCgi bGFuZXMgMi8zIChCeXRlIDB4MjA3KTogMHgleFxuIiwgZGF0YSk7Cj4gKwo+ICsJdjIgPSBkYXRh ICYgMHgzOwo+ICsJZGF0YSA9IGRhdGEgPj4gMjsKPiArCXAyID0gZGF0YSAmIDB4MzsKPiArCWRh dGEgPSBkYXRhID4+IDI7Cj4gKwo+ICsJdjMgPSBkYXRhICYgMHgzOwo+ICsJZGF0YSA9IGRhdGEg Pj4gMjsKPiArCXAzID0gZGF0YSAmIDB4MzsKPiArCWRhdGEgPSBkYXRhID4+IDI7Cj4gKwo+ICsJ RFJNX0RFQlVHX0RQKCJ2eDogMD0lZCwgMT0lZCwgMj0lZCwgMz0lZFxuIiwgdjAsIHYxLCB2Miwg djMpOwo+ICsJRFJNX0RFQlVHX0RQKCJweDogMD0lZCwgMT0lZCwgMj0lZCwgMz0lZFxuIiwgcDAs IHAxLCBwMiwgcDMpOwo+ICsKPiArCS8qKgo+ICsJICogVXBkYXRlIHRoZSB2b2x0YWdlIGFuZCBw cmUtZW1waGFzaXMgbGV2ZWxzIGFzIHBlciBEUENEIHJlcXVlc3QKPiArCSAqIHZlY3Rvci4KPiAr CSAqLwo+ICsJRFJNX0RFQlVHX0RQKCJDdXJyZW50OiB2X2xldmVsID0gMHgleCwgcF9sZXZlbCA9 IDB4JXhcbiIsCj4gKwkJCWxpbmstPmRwX2xpbmsucGh5X3BhcmFtcy52X2xldmVsLAo+ICsJCQls aW5rLT5kcF9saW5rLnBoeV9wYXJhbXMucF9sZXZlbCk7Cj4gKwlEUk1fREVCVUdfRFAoIlJlcXVl c3RlZDogdl9sZXZlbCA9IDB4JXgsIHBfbGV2ZWwgPSAweCV4XG4iLCB2MCwgcDApOwo+ICsJbGlu ay0+ZHBfbGluay5waHlfcGFyYW1zLnZfbGV2ZWwgPSB2MDsKPiArCWxpbmstPmRwX2xpbmsucGh5 X3BhcmFtcy5wX2xldmVsID0gcDA7Cj4gKwo+ICsJcmV0dXJuIHJldDsKCnJldCBpcyB1bnVzZWQg aW4gdGhpcyBmdW5jdGlvbi4gIFlvdSBjYW4gcmV0dXJuIDA7Cgo+ICt9Cj4gKwo+ICsvKioKPiAr ICogZHBfbGlua19wcm9jZXNzX3BoeV90ZXN0X3BhdHRlcm5fcmVxdWVzdCgpIC0gcHJvY2VzcyBu ZXcgcGh5IGxpbmsgcmVxdWVzdHMKPiArICogQGxpbms6IERpc3BsYXkgUG9ydCBEcml2ZXIgZGF0 YQo+ICsgKgo+ICsgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIG5ldyBwaHkgbGluayBwYXR0 ZXJuIHJlcXVlc3RzIHRoYXQgYXJlIGluaXRpYXRlZAo+ICsgKiBieSB0aGUgc2luay4gVGhlIGZ1 bmN0aW9uIHdpbGwgcmV0dXJuIDAgaWYgYSBwaHkgbGluayBwYXR0ZXJuIGhhcyBiZWVuCj4gKyAq IHByb2Nlc3NlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIC1FSU5WQUwuCj4gKyAqLwo+ICtz dGF0aWMgaW50IGRwX2xpbmtfcHJvY2Vzc19waHlfdGVzdF9wYXR0ZXJuX3JlcXVlc3QoCj4gKwkJ c3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ ICsJaWYgKCEobGluay0+cmVxdWVzdC50ZXN0X3JlcXVlc3RlZCAmIERQX1RFU1RfTElOS19QSFlf VEVTVF9QQVRURVJOKSkgewo+ICsJCURSTV9ERUJVR19EUCgibm8gcGh5IHRlc3RcbiIpOwo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWlmICghaXNfbGlua19yYXRlX3ZhbGlkKGxp bmstPnJlcXVlc3QudGVzdF9saW5rX3JhdGUpIHx8Cj4gKwkJIWlzX2xhbmVfY291bnRfdmFsaWQo bGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQpKSB7Cj4gKwkJRFJNX0VSUk9SKCJJbnZhbGlk IHBhcmFtczogbGluayByYXRlID0gMHgleCwgbGFuZSBjb3VudCA9IDB4JXhcbiIsCj4gKwkJCWxp bmstPnJlcXVlc3QudGVzdF9saW5rX3JhdGUsIGxpbmstPnJlcXVlc3QudGVzdF9sYW5lX2NvdW50 KTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlEUk1fREVCVUdfRFAoIkN1cnJl bnQ6IHJhdGUgPSAweCV4LCBsYW5lIGNvdW50ID0gMHgleFxuIiwKPiArCQkJbGluay0+ZHBfbGlu ay5saW5rX3BhcmFtcy5yYXRlLAo+ICsJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLm51bV9s YW5lcyk7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJSZXF1ZXN0ZWQ6IHJhdGUgPSAweCV4LCBsYW5l IGNvdW50ID0gMHgleFxuIiwKPiArCQkJbGluay0+cmVxdWVzdC50ZXN0X2xpbmtfcmF0ZSwgbGlu ay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQpOwo+ICsKPiArCWxpbmstPmRwX2xpbmsubGlua19w YXJhbXMubnVtX2xhbmVzID0gbGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQ7Cj4gKwlsaW5r LT5kcF9saW5rLmxpbmtfcGFyYW1zLnJhdGUgPSBsaW5rLT5yZXF1ZXN0LnRlc3RfbGlua19yYXRl Owo+ICsKPiArCXJldCA9IGRwX2xpbmtfcGFyc2VfdnhfcHgobGluayk7Cj4gKwlpZiAocmV0KQo+ ICsJCSAgRFJNX0VSUk9SKCJwYXJzZV92eF9weCBmYWlsZWQuIHJldD0lZFxuIiwgcmV0KTsKPiAr Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdTggZ2V0X2xpbmtfc3RhdHVzKGNv bnN0IHU4IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdLCBpbnQgcikKPiArewo+ICsJ cmV0dXJuIGxpbmtfc3RhdHVzW3IgLSBEUF9MQU5FMF8xX1NUQVRVU107Cj4gK30KPiArCj4gKy8q Kgo+ICsgKiBkcF9saW5rX3Byb2Nlc3NfbGlua19zdGF0dXNfdXBkYXRlKCkgLSBwcm9jZXNzZXMg bGluayBzdGF0dXMgdXBkYXRlcwo+ICsgKiBAbGluazogRGlzcGxheSBQb3J0IGxpbmsgbW9kdWxl IGRhdGEKPiArICoKPiArICogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGZvciBjaGFuZ2VzIGlu IHRoZSBsaW5rIHN0YXR1cywgZS5nLiBjbG9jawo+ICsgKiByZWNvdmVyeSBkb25lIG9uIGFsbCBs YW5lcywgYW5kIHRyaWdnZXIgbGluayB0cmFpbmluZyBpZiB0aGVyZSBpcyBhCj4gKyAqIGZhaWx1 cmUvZXJyb3Igb24gdGhlIGxpbmsuCj4gKyAqCj4gKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVy biAwIGlmIHRoZSBhIGxpbmsgc3RhdHVzIHVwZGF0ZSBoYXMgYmVlbiBwcm9jZXNzZWQsCj4gKyAq IG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiAtRUlOVkFMLgo+ICsgKi8KPiArc3RhdGljIGludCBk cF9saW5rX3Byb2Nlc3NfbGlua19zdGF0dXNfdXBkYXRlKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUg KmxpbmspCj4gK3sKPiArCWlmICghKGdldF9saW5rX3N0YXR1cyhsaW5rLT5saW5rX3N0YXR1cywg RFBfTEFORV9BTElHTl9TVEFUVVNfVVBEQVRFRCkgJgo+ICsJCQkJCQkJRFBfTElOS19TVEFUVVNf VVBEQVRFRCkgfHwKPiArCQkJKGRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rLT5saW5rX3N0 YXR1cywKPiArCQkJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLm51bV9sYW5lcykgJiYKPiAr CQkJZHJtX2RwX2NoYW5uZWxfZXFfb2sobGluay0+bGlua19zdGF0dXMsCj4gKwkJCQkJbGluay0+ ZHBfbGluay5saW5rX3BhcmFtcy5udW1fbGFuZXMpKSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiAr Cj4gKwlEUk1fREVCVUdfRFAoImNoYW5uZWxfZXFfZG9uZSA9ICVkLCBjbG9ja19yZWNvdmVyeV9k b25lID0gJWRcbiIsCj4gKwkJCWRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rLT5saW5rX3N0 YXR1cywKPiArCQkJbGluay0+ZHBfbGluay5saW5rX3BhcmFtcy5udW1fbGFuZXMpLAo+ICsJCQlk cm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGluay0+bGlua19zdGF0dXMsCj4gKwkJCWxpbmstPmRw X2xpbmsubGlua19wYXJhbXMubnVtX2xhbmVzKSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gKy8qKgo+ICsgKiBkcF9saW5rX3Byb2Nlc3NfZG93bnN0cmVhbV9wb3J0X3N0YXR1c19jaGFu Z2UoKSAtIHByb2Nlc3MgcG9ydCBzdGF0dXMgY2hhbmdlcwo+ICsgKiBAbGluazogRGlzcGxheSBQ b3J0IERyaXZlciBkYXRhCj4gKyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgZG93 bnN0cmVhbSBwb3J0IHVwZGF0ZXMgdGhhdCBhcmUgaW5pdGlhdGVkIGJ5Cj4gKyAqIHRoZSBzaW5r LiBJZiB0aGUgZG93bnN0cmVhbSBwb3J0IHN0YXR1cyBoYXMgY2hhbmdlZCwgdGhlIEVESUQgaXMg cmVhZCB2aWEKPiArICogQVVYLgo+ICsgKgo+ICsgKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4g MCBpZiBhIGRvd25zdHJlYW0gcG9ydCB1cGRhdGUgaGFzIGJlZW4KPiArICogcHJvY2Vzc2VkLCBv dGhlcndpc2UgaXQgd2lsbCByZXR1cm4gLUVJTlZBTC4KPiArICovCj4gK3N0YXRpYyBpbnQgZHBf bGlua19wcm9jZXNzX2RzX3BvcnRfc3RhdHVzX2NoYW5nZShzdHJ1Y3QgZHBfbGlua19wcml2YXRl ICpsaW5rKQo+ICt7Cj4gKwlpZiAoZ2V0X2xpbmtfc3RhdHVzKGxpbmstPmxpbmtfc3RhdHVzLCBE UF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKSAmCj4gKwkJCQkJRFBfRE9XTlNUUkVBTV9QT1JU X1NUQVRVU19DSEFOR0VEKQo+ICsJCWdvdG8gcmVzZXQ7Cj4gKwo+ICsJaWYgKGxpbmstPnByZXZf c2lua19jb3VudCA9PSBsaW5rLT5kcF9saW5rLnNpbmtfY291bnQpCj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwo+ICtyZXNldDoKPiArCS8qIHJlc2V0IHByZXZfc2lua19jb3VudCAqLwo+ICsJbGlu ay0+cHJldl9zaW5rX2NvdW50ID0gbGluay0+ZHBfbGluay5zaW5rX2NvdW50Owo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBkcF9saW5rX2lzX3ZpZGVvX3BhdHRlcm5f cmVxdWVzdGVkKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCj4gK3sKPiArCXJldHVybiAo bGluay0+cmVxdWVzdC50ZXN0X3JlcXVlc3RlZCAmIERQX1RFU1RfTElOS19WSURFT19QQVRURVJO KQo+ICsJCSYmICEobGluay0+cmVxdWVzdC50ZXN0X3JlcXVlc3RlZCAmCj4gKwkJRFBfVEVTVF9M SU5LX0FVRElPX0RJU0FCTEVEX1ZJREVPKTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgZHBfbGlu a19pc19hdWRpb19wYXR0ZXJuX3JlcXVlc3RlZChzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5r KQo+ICt7Cj4gKwlyZXR1cm4gKGxpbmstPnJlcXVlc3QudGVzdF9yZXF1ZXN0ZWQgJiBEUF9URVNU X0xJTktfQVVESU9fUEFUVEVSTik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2xpbmtfcmVz ZXRfZGF0YShzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rKQo+ICt7Cj4gKwlsaW5rLT5yZXF1 ZXN0ID0gKGNvbnN0IHN0cnVjdCBkcF9saW5rX3JlcXVlc3QpeyAwIH07Cj4gKwlsaW5rLT5kcF9s aW5rLnRlc3RfdmlkZW8gPSAoY29uc3Qgc3RydWN0IGRwX2xpbmtfdGVzdF92aWRlbyl7IDAgfTsK PiArCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCA9IERQX1RFU1RfQklU X0RFUFRIX1VOS05PV047Cj4gKwlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8gPSAoY29uc3Qgc3Ry dWN0IGRwX2xpbmtfdGVzdF9hdWRpbyl7IDAgfTsKPiArCWxpbmstPmRwX2xpbmsucGh5X3BhcmFt cy5waHlfdGVzdF9wYXR0ZXJuX3NlbCA9IDA7Cj4gKwlsaW5rLT5kcF9saW5rLnNpbmtfcmVxdWVz dCA9IDA7Cj4gKwlsaW5rLT5kcF9saW5rLnRlc3RfcmVzcG9uc2UgPSAwOwo+ICt9Cj4gKwo+ICsv KioKPiArICogZHBfbGlua19wcm9jZXNzX3JlcXVlc3QoKSAtIGhhbmRsZSBIUEQgSVJRIHRyYW5z aXRpb24gdG8gSElHSAo+ICsgKiBAbGluazogcG9pbnRlciB0byBsaW5rIG1vZHVsZSBkYXRhCj4g KyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIEhQRCBJUlEgc3RhdGUgdHJh bnNpdGlvbnMgZnJvbSBMT1cgdG8gSElHSAo+ICsgKiAoaW5jbHVkaW5nIGNhc2VzIHdoZW4gdGhl cmUgYXJlIGJhY2sgdG8gYmFjayBIUEQgSVJRIEhJR0gpIGluZGljYXRpbmcKPiArICogdGhlIHN0 YXJ0IG9mIGEgbmV3IGxpbmsgdHJhaW5pbmcgcmVxdWVzdCBvciBzaW5rIHN0YXR1cyB1cGRhdGUu Cj4gKyAqLwo+ICtpbnQgZHBfbGlua19wcm9jZXNzX3JlcXVlc3Qoc3RydWN0IGRwX2xpbmsgKmRw X2xpbmspCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAq bGluazsKPiArCj4gKwlpZiAoIWRwX2xpbmspIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5w dXRcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWxpbmsgPSBjb250YWlu ZXJfb2YoZHBfbGluaywgc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSwgZHBfbGluayk7Cj4gKwo+ICsJ ZHBfbGlua19yZXNldF9kYXRhKGxpbmspOwo+ICsKPiArCWRwX2xpbmtfcGFyc2Vfc2lua19zdGF0 dXNfZmllbGQobGluayk7Cj4gKwo+ICsJaWYgKGxpbmstPnJlcXVlc3QudGVzdF9yZXF1ZXN0ZWQg PT0gRFBfVEVTVF9MSU5LX0VESURfUkVBRCkgewo+ICsJCWRwX2xpbmstPnNpbmtfcmVxdWVzdCB8 PSBEUF9URVNUX0xJTktfRURJRF9SRUFEOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJ cmV0ID0gZHBfbGlua19wcm9jZXNzX2RzX3BvcnRfc3RhdHVzX2NoYW5nZShsaW5rKTsKPiArCWlm ICghcmV0KSB7Cj4gKwkJZHBfbGluay0+c2lua19yZXF1ZXN0IHw9IERTX1BPUlRfU1RBVFVTX0NI QU5HRUQ7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXQgPSBkcF9saW5rX3Byb2Nl c3NfbGlua190cmFpbmluZ19yZXF1ZXN0KGxpbmspOwo+ICsJaWYgKCFyZXQpIHsKPiArCQlkcF9s aW5rLT5zaW5rX3JlcXVlc3QgfD0gRFBfVEVTVF9MSU5LX1RSQUlOSU5HOwo+ICsJCXJldHVybiBy ZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19wcm9jZXNzX3BoeV90ZXN0X3BhdHRlcm5f cmVxdWVzdChsaW5rKTsKPiArCWlmICghcmV0KSB7Cj4gKwkJZHBfbGluay0+c2lua19yZXF1ZXN0 IHw9IERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9 Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19wcm9jZXNzX2xpbmtfc3RhdHVzX3VwZGF0ZShsaW5rKTsK PiArCWlmICghcmV0KSB7Cj4gKwkJZHBfbGluay0+c2lua19yZXF1ZXN0IHw9IERQX0xJTktfU1RB VFVTX1VQREFURUQ7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlpZiAoZHBfbGlua19p c192aWRlb19wYXR0ZXJuX3JlcXVlc3RlZChsaW5rKSkgewo+ICsJCWRwX2xpbmstPnNpbmtfcmVx dWVzdCB8PSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTjsKPiArCQlyZXR1cm4gLUVJTlZBTDsK PiArCX0KPiArCj4gKwlpZiAoZHBfbGlua19pc19hdWRpb19wYXR0ZXJuX3JlcXVlc3RlZChsaW5r KSkgewo+ICsJCWRwX2xpbmstPnNpbmtfcmVxdWVzdCB8PSBEUF9URVNUX0xJTktfQVVESU9fUEFU VEVSTjsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9 Cj4gKwo+ICtpbnQgZHBfbGlua19nZXRfY29sb3JpbWV0cnlfY29uZmlnKHN0cnVjdCBkcF9saW5r ICpkcF9saW5rKQo+ICt7Cj4gKwl1MzIgY2M7Cj4gKwlzdHJ1Y3QgZHBfbGlua19wcml2YXRlICps aW5rOwo+ICsKPiArCWlmICghZHBfbGluaykgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1 dFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJbGluayA9IGNvbnRhaW5l cl9vZihkcF9saW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKPiArCj4gKwkv Kgo+ICsJICogVW5sZXNzIGEgdmlkZW8gcGF0dGVybiBDVFMgdGVzdCBpcyBvbmdvaW5nLCB1c2Ug UkdCX1ZFU0EKPiArCSAqIE9ubHkgUkdCX1ZFU0EgYW5kIFJHQl9DRUEgc3VwcG9ydGVkIGZvciBu b3cKPiArCSAqLwo+ICsJaWYgKGRwX2xpbmtfaXNfdmlkZW9fcGF0dGVybl9yZXF1ZXN0ZWQobGlu aykpCj4gKwkJY2MgPSBsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9keW5fcmFuZ2U7Cj4g KwllbHNlCj4gKwkJY2MgPSBEUF9URVNUX0RZTkFNSUNfUkFOR0VfVkVTQTsKPiArCj4gKwlyZXR1 cm4gY2M7Cj4gK30KPiArCj4gK2ludCBkcF9saW5rX2FkanVzdF9sZXZlbHMoc3RydWN0IGRwX2xp bmsgKmRwX2xpbmssIHU4ICpsaW5rX3N0YXR1cykKPiArewo+ICsJaW50IGk7Cj4gKwlpbnQgbWF4 ID0gMDsKPiArCXU4IGRhdGE7Cj4gKwlzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rOwo+ICsK PiArCWlmICghZHBfbGluaykgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJbGluayA9IGNvbnRhaW5lcl9vZihkcF9s aW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKPiArCj4gKwkvKiB1c2UgdGhl IG1heCBsZXZlbCBhY3Jvc3MgbGFuZXMgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBkcF9saW5rLT5s aW5rX3BhcmFtcy5udW1fbGFuZXM7IGkrKykgewo+ICsJCWRhdGEgPSBkcm1fZHBfZ2V0X2FkanVz dF9yZXF1ZXN0X3ZvbHRhZ2UobGlua19zdGF0dXMsIGkpOwo+ICsJCURSTV9ERUJVR19EUCgibGFu ZT0lZCByZXFfdm9sdGFnZV9zd2luZz0lZFxuIiwgaSwgZGF0YSk7Cj4gKwkJaWYgKG1heCA8IGRh dGEpCj4gKwkJCW1heCA9IGRhdGE7Cj4gKwl9Cj4gKwo+ICsJZHBfbGluay0+cGh5X3BhcmFtcy52 X2xldmVsID0gbWF4ID4+IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfU0hJRlQ7Cj4gKwo+ICsJLyog dXNlIHRoZSBtYXggbGV2ZWwgYWNyb3NzIGxhbmVzICovCj4gKwltYXggPSAwOwo+ICsJZm9yIChp ID0gMDsgaSA8IGRwX2xpbmstPmxpbmtfcGFyYW1zLm51bV9sYW5lczsgaSsrKSB7Cj4gKwkJZGF0 YSA9IGRybV9kcF9nZXRfYWRqdXN0X3JlcXVlc3RfcHJlX2VtcGhhc2lzKGxpbmtfc3RhdHVzLCBp KTsKPiArCQlEUk1fREVCVUdfRFAoImxhbmU9JWQgcmVxX3ByZV9lbXBoYXNpcz0lZFxuIiwgaSwg ZGF0YSk7Cj4gKwkJaWYgKG1heCA8IGRhdGEpCj4gKwkJCW1heCA9IGRhdGE7Cj4gKwl9Cj4gKwo+ ICsJZHBfbGluay0+cGh5X3BhcmFtcy5wX2xldmVsID0gbWF4ID4+IERQX1RSQUlOX1BSRV9FTVBI QVNJU19TSElGVDsKPiArCj4gKwkvKioKPiArCSAqIEFkanVzdCB0aGUgdm9sdGFnZSBzd2luZyBh bmQgcHJlLWVtcGhhc2lzIGxldmVsIGNvbWJpbmF0aW9uIHRvIHdpdGhpbgo+ICsJICogdGhlIGFs bG93YWJsZSByYW5nZS4KPiArCSAqLwo+ICsJaWYgKGRwX2xpbmstPnBoeV9wYXJhbXMudl9sZXZl bCA+IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFYKSB7Cj4gKwkJRFJNX0RFQlVHX0RQKCJSZXF1 ZXN0ZWQgdlN3aW5nTGV2ZWw9JWQsIGNoYW5nZSB0byAlZFxuIiwKPiArCQkJZHBfbGluay0+cGh5 X3BhcmFtcy52X2xldmVsLCBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BWCk7Cj4gKwkJZHBfbGlu ay0+cGh5X3BhcmFtcy52X2xldmVsID0gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVg7Cj4gKwl9 Cj4gKwo+ICsJaWYgKGRwX2xpbmstPnBoeV9wYXJhbXMucF9sZXZlbCA+IERQX1RSQUlOX1BSRV9F TVBIQVNJU19NQVgpIHsKPiArCQlEUk1fREVCVUdfRFAoIlJlcXVlc3RlZCBwcmVFbXBoYXNpc0xl dmVsPSVkLCBjaGFuZ2UgdG8gJWRcbiIsCj4gKwkJCWRwX2xpbmstPnBoeV9wYXJhbXMucF9sZXZl bCwgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BWCk7Cj4gKwkJZHBfbGluay0+cGh5X3BhcmFtcy5w X2xldmVsID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BWDsKPiArCX0KPiArCj4gKwlpZiAoKGRw X2xpbmstPnBoeV9wYXJhbXMucF9sZXZlbCA+IERQX1RSQUlOX1BSRV9FTVBIQVNJU19MVkxfMSkK PiArCQkmJiAoZHBfbGluay0+cGh5X3BhcmFtcy52X2xldmVsID09IERQX1RSQUlOX1ZPTFRBR0Vf U1dJTkdfTFZMXzIpKSB7Cj4gKwkJRFJNX0RFQlVHX0RQKCJSZXF1ZXN0ZWQgcHJlRW1waGFzaXNM ZXZlbD0lZCwgY2hhbmdlIHRvICVkXG4iLAo+ICsJCQlkcF9saW5rLT5waHlfcGFyYW1zLnBfbGV2 ZWwsCj4gKwkJCURQX1RSQUlOX1BSRV9FTVBIQVNJU19MVkxfMSk7Cj4gKwkJZHBfbGluay0+cGh5 X3BhcmFtcy5wX2xldmVsID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX0xWTF8xOwo+ICsJfQo+ICsK PiArCURSTV9ERUJVR19EUCgiYWRqdXN0ZWQ6IHZfbGV2ZWw9JWQsIHBfbGV2ZWw9JWRcbiIsCj4g KwkJZHBfbGluay0+cGh5X3BhcmFtcy52X2xldmVsLCBkcF9saW5rLT5waHlfcGFyYW1zLnBfbGV2 ZWwpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICt1MzIgZHBfbGlua19nZXRfdGVzdF9i aXRzX2RlcHRoKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLCB1MzIgYnBwKQo+ICt7Cj4gKwl1MzIg dGJkOwo+ICsKPiArCS8qCj4gKwkgKiBGZXcgc2ltcGxpc3RpYyBydWxlcyBhbmQgYXNzdW1wdGlv bnMgbWFkZSBoZXJlOgo+ICsJICogICAgMS4gVGVzdCBiaXQgZGVwdGggaXMgYml0IGRlcHRoIHBl ciBjb2xvciBjb21wb25lbnQKPiArCSAqICAgIDIuIEFzc3VtZSAzIGNvbG9yIGNvbXBvbmVudHMK PiArCSAqLwo+ICsJc3dpdGNoIChicHApIHsKPiArCWNhc2UgMTg6Cj4gKwkJdGJkID0gRFBfVEVT VF9CSVRfREVQVEhfNjsKPiArCQlicmVhazsKPiArCWNhc2UgMjQ6Cj4gKwkJdGJkID0gRFBfVEVT VF9CSVRfREVQVEhfODsKPiArCQlicmVhazsKPiArCWNhc2UgMzA6Cj4gKwkJdGJkID0gRFBfVEVT VF9CSVRfREVQVEhfMTA7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXRiZCA9IERQX1RF U1RfQklUX0RFUFRIX1VOS05PV047Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gKwo+ICsJaWYgKHRiZCAh PSBEUF9URVNUX0JJVF9ERVBUSF9VTktOT1dOKQo+ICsJCXRiZCA9ICh0YmQgPj4gRFBfVEVTVF9C SVRfREVQVEhfU0hJRlQpOwo+ICsKPiArCXJldHVybiB0YmQ7Cj4gK30KPiArCj4gK3N0cnVjdCBk cF9saW5rICpkcF9saW5rX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9hdXggKmF1 eCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbms7 Cj4gKwlzdHJ1Y3QgZHBfbGluayAqZHBfbGluazsKPiArCj4gKwlpZiAoIWRldiB8fCAhYXV4KSB7 Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0XG4iKTsKcmV0dXJuIEVSUl9QVFIoLUVJTlZB TCkKCj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4gKwo+ICsJbGlu ayA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbGluayksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFsaW5rKSB7CgpUaGlzIHNob3VsZCBiZSBFUlJfUFRSKC1FTk9NRU0pCgo+ICsJCXJjID0gLUVJ TlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ICsKPiArCWxpbmstPmRldiAgID0gZGV2Owo+ ICsJbGluay0+YXV4ICAgPSBhdXg7Cj4gKwo+ICsJZHBfbGluayA9ICZsaW5rLT5kcF9saW5rOwo+ ICsKPiArCXJldHVybiBkcF9saW5rOwo+ICtlcnJvcjoKPiArCXJldHVybiBFUlJfUFRSKHJjKTsK ClRoZSBsYWJlbCBhbmQgcmV0dXJuIGlzbid0IG5lZWRlZC4KCj4gK30KPiArCj4gK3ZvaWQgZHBf bGlua19wdXQoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspCj4gK3sKPiArCXN0cnVjdCBkcF9saW5r X3ByaXZhdGUgKmxpbms7Cj4gKwo+ICsJaWYgKCFkcF9saW5rKQo+ICsJCXJldHVybjsKPiArCj4g KwlsaW5rID0gY29udGFpbmVyX29mKGRwX2xpbmssIHN0cnVjdCBkcF9saW5rX3ByaXZhdGUsIGRw X2xpbmspOwo+ICsKPiArCWRldm1fa2ZyZWUobGluay0+ZGV2LCBsaW5rKTsKClNhbWUgYXMgdGhl IG90aGVyIGRldm1fa2ZyZWUoKSB1c2FnZXMKCj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL21zbS9kcC9kcF9saW5rLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsu aAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNjA3OTA0Ygo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaAo+IEBAIC0w LDAgKzEsMTMyIEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkg Ki8KPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTksIFRoZSBMaW51eCBGb3VuZGF0 aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNpZm5kZWYgX0RQX0xJTktf SF8KPiArI2RlZmluZSBfRFBfTElOS19IXwo+ICsKPiArI2luY2x1ZGUgImRwX2F1eC5oIgo+ICsK PiArI2RlZmluZSBEU19QT1JUX1NUQVRVU19DSEFOR0VEIDB4MjAwCj4gKyNkZWZpbmUgRFBfVEVT VF9CSVRfREVQVEhfVU5LTk9XTiAweEZGRkZGRkZGCj4gKwo+ICtlbnVtIGRwX2xpbmtfdm9sdGFn ZV9sZXZlbCB7Cj4gKwlEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX0xWTF8wCT0gMCwKPiArCURQX1RS QUlOX1ZPTFRBR0VfU1dJTkdfTFZMXzEJPSAxLAo+ICsJRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19M VkxfMgk9IDIsCj4gKwlEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BWAk9IERQX1RSQUlOX1ZPTFRB R0VfU1dJTkdfTFZMXzIsCj4gK307Cj4gKwo+ICtlbnVtIGRwX2xpbmtfcHJlZW1hcGhhc2lzX2xl dmVsIHsKPiArCURQX1RSQUlOX1BSRV9FTVBIQVNJU19MVkxfMAk9IDAsCj4gKwlEUF9UUkFJTl9Q UkVfRU1QSEFTSVNfTFZMXzEJPSAxLAo+ICsJRFBfVFJBSU5fUFJFX0VNUEhBU0lTX0xWTF8yCT0g MiwKPiArCURQX1RSQUlOX1BSRV9FTVBIQVNJU19NQVgJPSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNf TFZMXzIsCj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlua190ZXN0X3ZpZGVvIHsKPiArCXUzMiB0 ZXN0X3ZpZGVvX3BhdHRlcm47Cj4gKwl1MzIgdGVzdF9iaXRfZGVwdGg7Cj4gKwl1MzIgdGVzdF9k eW5fcmFuZ2U7Cj4gKwl1MzIgdGVzdF9oX3RvdGFsOwo+ICsJdTMyIHRlc3Rfdl90b3RhbDsKPiAr CXUzMiB0ZXN0X2hfc3RhcnQ7Cj4gKwl1MzIgdGVzdF92X3N0YXJ0Owo+ICsJdTMyIHRlc3RfaHN5 bmNfcG9sOwo+ICsJdTMyIHRlc3RfaHN5bmNfd2lkdGg7Cj4gKwl1MzIgdGVzdF92c3luY19wb2w7 Cj4gKwl1MzIgdGVzdF92c3luY193aWR0aDsKPiArCXUzMiB0ZXN0X2hfd2lkdGg7Cj4gKwl1MzIg dGVzdF92X2hlaWdodDsKPiArCXUzMiB0ZXN0X3JyX2Q7Cj4gKwl1MzIgdGVzdF9ycl9uOwo+ICt9 Owo+ICsKPiArc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyB7Cj4gKwl1MzIgdGVzdF9hdWRpb19z YW1wbGluZ19yYXRlOwo+ICsJdTMyIHRlc3RfYXVkaW9fY2hhbm5lbF9jb3VudDsKPiArCXUzMiB0 ZXN0X2F1ZGlvX3BhdHRlcm5fdHlwZTsKPiArCXUzMiB0ZXN0X2F1ZGlvX3BlcmlvZF9jaF8xOwo+ ICsJdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzI7Cj4gKwl1MzIgdGVzdF9hdWRpb19wZXJpb2Rf Y2hfMzsKPiArCXUzMiB0ZXN0X2F1ZGlvX3BlcmlvZF9jaF80Owo+ICsJdTMyIHRlc3RfYXVkaW9f cGVyaW9kX2NoXzU7Cj4gKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfNjsKPiArCXUzMiB0ZXN0 X2F1ZGlvX3BlcmlvZF9jaF83Owo+ICsJdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzg7Cj4gK307 Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlua19waHlfcGFyYW1zIHsKPiArCXUzMiBwaHlfdGVzdF9wYXR0 ZXJuX3NlbDsKPiArCXU4IHZfbGV2ZWw7Cj4gKwl1OCBwX2xldmVsOwo+ICt9Owo+ICsKPiArc3Ry dWN0IGRwX2xpbmsgewo+ICsJdTMyIHNpbmtfcmVxdWVzdDsKPiArCXUzMiB0ZXN0X3Jlc3BvbnNl Owo+ICsJYm9vbCBwc21fZW5hYmxlZDsKPiArCj4gKwl1OCBzaW5rX2NvdW50Owo+ICsJc3RydWN0 IGRwX2xpbmtfdGVzdF92aWRlbyB0ZXN0X3ZpZGVvOwo+ICsJc3RydWN0IGRwX2xpbmtfdGVzdF9h dWRpbyB0ZXN0X2F1ZGlvOwo+ICsJc3RydWN0IGRwX2xpbmtfcGh5X3BhcmFtcyBwaHlfcGFyYW1z Owo+ICsJc3RydWN0IGRybV9kcF9saW5rIGxpbmtfcGFyYW1zOwo+ICt9Owo+ICsKPiArLyoqCj4g KyAqIG1kc3NfZHBfdGVzdF9iaXRfZGVwdGhfdG9fYnBwKCkgLSBjb252ZXJ0IHRlc3QgYml0IGRl cHRoIHRvIGJwcAo+ICsgKiBAdGJkOiB0ZXN0IGJpdCBkZXB0aAo+ICsgKgo+ICsgKiBSZXR1cm5z IHRoZSBiaXRzIHBlciBwaXhlbCAoYnBwKSB0byBiZSB1c2VkIGNvcnJlc3BvbmRpbmcgdG8gdGhl Cj4gKyAqIGdpdCBiaXQgZGVwdGggdmFsdWUuIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGJp dCBkZXB0aCBoYXMKPiArICogYWxyZWFkeSBiZWVuIHZhbGlkYXRlZC4KPiArICovCj4gK3N0YXRp YyBpbmxpbmUgdTMyIGRwX2xpbmtfYml0X2RlcHRoX3RvX2JwcCh1MzIgdGJkKQo+ICt7Cj4gKwkv Kgo+ICsJICogRmV3IHNpbXBsaXN0aWMgcnVsZXMgYW5kIGFzc3VtcHRpb25zIG1hZGUgaGVyZToK PiArCSAqICAgIDEuIEJpdCBkZXB0aCBpcyBwZXIgY29sb3IgY29tcG9uZW50Cj4gKwkgKiAgICAy LiBJZiBiaXQgZGVwdGggaXMgdW5rbm93biByZXR1cm4gMAo+ICsJICogICAgMy4gQXNzdW1lIDMg Y29sb3IgY29tcG9uZW50cwo+ICsJICovCj4gKwlzd2l0Y2ggKHRiZCkgewo+ICsJY2FzZSBEUF9U RVNUX0JJVF9ERVBUSF82Ogo+ICsJCXJldHVybiAxODsKPiArCWNhc2UgRFBfVEVTVF9CSVRfREVQ VEhfODoKPiArCQlyZXR1cm4gMjQ7Cj4gKwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzEwOgo+ICsJ CXJldHVybiAzMDsKPiArCWNhc2UgRFBfVEVTVF9CSVRfREVQVEhfVU5LTk9XTjoKPiArCWRlZmF1 bHQ6Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gK30KPiArCj4gK3UzMiBkcF9saW5rX2dldF90ZXN0 X2JpdHNfZGVwdGgoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmssIHUzMiBicHApOwo+ICtpbnQgZHBf bGlua19wcm9jZXNzX3JlcXVlc3Qoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspOwo+ICtpbnQgZHBf bGlua19nZXRfY29sb3JpbWV0cnlfY29uZmlnKHN0cnVjdCBkcF9saW5rICpkcF9saW5rKTsKPiAr aW50IGRwX2xpbmtfYWRqdXN0X2xldmVscyhzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTggKmxp bmtfc3RhdHVzKTsKPiArYm9vbCBkcF9saW5rX3NlbmRfdGVzdF9yZXNwb25zZShzdHJ1Y3QgZHBf bGluayAqZHBfbGluayk7Cj4gK2ludCBkcF9saW5rX3BzbV9jb25maWcoc3RydWN0IGRwX2xpbmsg KmRwX2xpbmssCj4gKwkJc3RydWN0IGRybV9kcF9saW5rICpsaW5rX2luZm8sIGJvb2wgZW5hYmxl KTsKPiArYm9vbCBkcF9saW5rX3NlbmRfZWRpZF9jaGVja3N1bShzdHJ1Y3QgZHBfbGluayAqZHBf bGluaywgdTggY2hlY2tzdW0pOwo+ICsKPiArLyoqCj4gKyAqIGRwX2xpbmtfZ2V0KCkgLSBnZXQg dGhlIGZ1bmN0aW9uYWxpdGllcyBvZiBkcCB0ZXN0IG1vZHVsZQo+ICsgKgo+ICsgKgo+ICsgKiBy ZXR1cm46IGEgcG9pbnRlciB0byBkcF9saW5rIHN0cnVjdAo+ICsgKi8KPiArc3RydWN0IGRwX2xp bmsgKmRwX2xpbmtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX2F1eCAqYXV4KTsK PiArCj4gKy8qKgo+ICsgKiBkcF9saW5rX3B1dCgpIC0gcmVsZWFzZXMgdGhlIGRwIHRlc3QgbW9k dWxlJ3MgcmVzb3VyY2VzCj4gKyAqCj4gKyAqIEBkcF9saW5rOiBhbiBpbnN0YW5jZSBvZiBkcF9s aW5rIG1vZHVsZQo+ICsgKgo+ICsgKi8KPiArdm9pZCBkcF9saW5rX3B1dChzdHJ1Y3QgZHBfbGlu ayAqZHBfbGluayk7Cj4gKwo+ICsjZW5kaWYgLyogX0RQX0xJTktfSF8gKi8KPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9wYW5lbC5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5k N2UxNjVmMQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2Rw X3BhbmVsLmMKPiBAQCAtMCwwICsxLDUwNCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE5LCBUaGUg TGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICovCj4gKwo+ICsjZGVm aW5lIHByX2ZtdChmbXQpCSJbZHJtLWRwXSAlczogIiBmbXQsIF9fZnVuY19fCj4gKwo+ICsjaW5j bHVkZSAiZHBfcGFuZWwuaCIKPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgo+ ICsjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+Cj4gKwo+ICsjZGVmaW5lIERQX01BWF9EU19QT1JU X0NPVU5UIDEKPiArCj4gK3N0cnVjdCBkcF9wYW5lbF9wcml2YXRlIHsKPiArCXN0cnVjdCBkZXZp Y2UgKmRldjsKPiArCXN0cnVjdCBkcF9wYW5lbCBkcF9wYW5lbDsKPiArCXN0cnVjdCBkcF9hdXgg KmF1eDsKPiArCXN0cnVjdCBkcF9saW5rICpsaW5rOwo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcGFu ZWwgKmNhdGFsb2c7Cj4gKwlib29sIHBhbmVsX29uOwo+ICsJYm9vbCBhdXhfY2ZnX3VwZGF0ZV9k b25lOwo+ICt9Owo+ICsKPiArc3RhdGljIGludCBkcF9wYW5lbF9yZWFkX2RwY2Qoc3RydWN0IGRw X3BhbmVsICpkcF9wYW5lbCkKPiArewo+ICsJaW50IHJsZW4sIHJjID0gMDsKPiArCXN0cnVjdCBk cF9wYW5lbF9wcml2YXRlICpwYW5lbDsKPiArCXN0cnVjdCBkcm1fZHBfbGluayAqbGlua19pbmZv Owo+ICsJdTggKmRwY2QsIG1ham9yID0gMCwgbWlub3IgPSAwOwo+ICsJdTMyIGRmcF9jb3VudCA9 IDA7Cj4gKwl1bnNpZ25lZCBsb25nIGNhcHMgPSBEUF9MSU5LX0NBUF9FTkhBTkNFRF9GUkFNSU5H Owo+ICsKPiArCWRwY2QgPSBkcF9wYW5lbC0+ZHBjZDsKPiArCj4gKwlwYW5lbCA9IGNvbnRhaW5l cl9vZihkcF9wYW5lbCwgc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUsIGRwX3BhbmVsKTsKPiArCWxp bmtfaW5mbyA9ICZkcF9wYW5lbC0+bGlua19pbmZvOwo+ICsKPiArCXJsZW4gPSBkcm1fZHBfZHBj ZF9yZWFkKHBhbmVsLT5hdXgtPmRybV9hdXgsIERQX0RQQ0RfUkVWLAo+ICsJCWRwY2QsIChEUF9S RUNFSVZFUl9DQVBfU0laRSArIDEpKTsKPiArCWlmIChybGVuIDwgKERQX1JFQ0VJVkVSX0NBUF9T SVpFICsgMSkpIHsKPiArCQlEUk1fRVJST1IoImRwY2QgcmVhZCBmYWlsZWQsIHJsZW49JWRcbiIs IHJsZW4pOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWxpbmtfaW5mby0+cmV2 aXNpb24gPSBkcF9wYW5lbC0+ZHBjZFtEUF9EUENEX1JFVl07Cj4gKwo+ICsJbWFqb3IgPSAobGlu a19pbmZvLT5yZXZpc2lvbiA+PiA0KSAmIDB4MGY7Cj4gKwltaW5vciA9IGxpbmtfaW5mby0+cmV2 aXNpb24gJiAweDBmOwo+ICsJRFJNX0RFQlVHX0RQKCJ2ZXJzaW9uOiAlZC4lZFxuIiwgbWFqb3Is IG1pbm9yKTsKPiArCj4gKwlsaW5rX2luZm8tPnJhdGUgPQo+ICsJCWRybV9kcF9id19jb2RlX3Rv X2xpbmtfcmF0ZShkcF9wYW5lbC0+ZHBjZFtEUF9NQVhfTElOS19SQVRFXSk7Cj4gKwlEUk1fREVC VUdfRFAoImxpbmtfcmF0ZT0lZFxuIiwgbGlua19pbmZvLT5yYXRlKTsKPiArCj4gKwlsaW5rX2lu Zm8tPm51bV9sYW5lcyA9IGRwX3BhbmVsLT5kcGNkW0RQX01BWF9MQU5FX0NPVU5UXSAmCj4gKwkJ CQlEUF9NQVhfTEFORV9DT1VOVF9NQVNLOwo+ICsKPiArCURSTV9ERUJVR19EUCgibGFuZV9jb3Vu dD0lZFxuIiwgbGlua19pbmZvLT5udW1fbGFuZXMpOwo+ICsKPiArCWlmIChkcm1fZHBfZW5oYW5j ZWRfZnJhbWVfY2FwKGRwY2QpKQo+ICsJCWxpbmtfaW5mby0+Y2FwYWJpbGl0aWVzIHw9IGNhcHM7 Cj4gKwo+ICsJZGZwX2NvdW50ID0gZHBjZFtEUF9ET1dOX1NUUkVBTV9QT1JUX0NPVU5UXSAmCj4g KwkJCQkJCURQX0RPV05fU1RSRUFNX1BPUlRfQ09VTlQ7Cj4gKwlpZiAoZGZwX2NvdW50ID4gRFBf TUFYX0RTX1BPUlRfQ09VTlQpCj4gKwkJRFJNX0VSUk9SKCJEUyBwb3J0IGNvdW50ICVkIGdyZWF0 ZXIgdGhhdCBtYXggKCVkKSBzdXBwb3J0ZWRcbiIsCj4gKwkJCWRmcF9jb3VudCwgRFBfTUFYX0RT X1BPUlRfQ09VTlQpOwo+ICsKPiArCXJldHVybiByYzsKCnJjIGlzIHVudXNlZCBpbiB0aGlzIGZ1 bmN0aW9uIC0geW8gdWNhbiByZXR1cm4gMDsKCj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcGFu ZWxfcmVhZF9lZGlkKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwlzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlpbnQgcmV0cnlfY250ID0gMDsKPiArCWNvbnN0 IGludCBtYXhfcmV0cnkgPSAxMDsKPiArCXN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbDsK PiArCj4gKwlwYW5lbCA9IGNvbnRhaW5lcl9vZihkcF9wYW5lbCwgc3RydWN0IGRwX3BhbmVsX3By aXZhdGUsIGRwX3BhbmVsKTsKPiArCj4gKwlkbyB7Cj4gKwkJa2ZyZWUoZHBfcGFuZWwtPmVkaWQp Owo+ICsJCWRwX3BhbmVsLT5lZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwKPiArCQkJCQkg ICAgICAmcGFuZWwtPmF1eC0+ZHJtX2F1eC0+ZGRjKTsKPiArCQlpZiAoIWRwX3BhbmVsLT5lZGlk KSB7Cj4gKwkJCURSTV9FUlJPUigiRURJRCByZWFkIGZhaWxlZFxuIik7Cj4gKwkJCXJldHJ5X2Nu dCsrOwo+ICsJCQlkcF9hdXhfcmVjb25maWcocGFuZWwtPmF1eCk7Cj4gKwkJCXBhbmVsLT5hdXhf Y2ZnX3VwZGF0ZV9kb25lID0gdHJ1ZTsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXR1cm4gMDsKPiAr CQl9Cj4gKwl9IHdoaWxlIChyZXRyeV9jbnQgPCBtYXhfcmV0cnkpOwo+ICsKPiArCXJldHVybiAt RUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIGRwX3BhbmVsX2dldF9zdXBwb3J0ZWRfYnBw KHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwkJdTMyIG1vZGVfZWRpZF9icHAsIHUzMiBt b2RlX3BjbGtfa2h6KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2xpbmsgKmxpbmtfaW5mbzsKPiAr CWNvbnN0IHUzMiBtYXhfc3VwcG9ydGVkX2JwcCA9IDMwLCBtaW5fc3VwcG9ydGVkX2JwcCA9IDE4 Owo+ICsJdTMyIGJwcCA9IDAsIGRhdGFfcmF0ZV9raHogPSAwOwo+ICsKPiArCWJwcCA9IG1pbl90 KHUzMiwgbW9kZV9lZGlkX2JwcCwgbWF4X3N1cHBvcnRlZF9icHApOwo+ICsKPiArCWxpbmtfaW5m byA9ICZkcF9wYW5lbC0+bGlua19pbmZvOwo+ICsJZGF0YV9yYXRlX2toeiA9IGxpbmtfaW5mby0+ bnVtX2xhbmVzICogbGlua19pbmZvLT5yYXRlICogODsKPiArCj4gKwl3aGlsZSAoYnBwID4gbWlu X3N1cHBvcnRlZF9icHApIHsKPiArCQlpZiAobW9kZV9wY2xrX2toeiAqIGJwcCA8PSBkYXRhX3Jh dGVfa2h6KQo+ICsJCQlicmVhazsKPiArCQlicHAgLT0gNjsKPiArCX0KPiArCj4gKwlyZXR1cm4g YnBwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9wYW5lbF9zZXRfdGVzdF9tb2RlKHN0cnVj dCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbCwKPiArCQlzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICpt b2RlKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGUgPSBOVUxMOwo+ ICsJc3RydWN0IGRwX2xpbmtfdGVzdF92aWRlbyAqdGVzdF9pbmZvID0gTlVMTDsKPiArCj4gKwlp ZiAoIXBhbmVsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0 dXJuOwo+ICsJfQoKSXQgZG9lc24ndCBsb29rIGxpa2UgcGFuZWwgY2FuIGV2ZXIgYmUgTlVMTCBo ZXJlLgoKPiArCj4gKwlkcm1fbW9kZSA9ICZtb2RlLT5kcm1fbW9kZTsKPiArCXRlc3RfaW5mbyA9 ICZwYW5lbC0+bGluay0+dGVzdF92aWRlbzsKPiArCj4gKwlkcm1fbW9kZS0+aGRpc3BsYXkgPSB0 ZXN0X2luZm8tPnRlc3RfaF93aWR0aDsKPiArCWRybV9tb2RlLT5oc3luY19zdGFydCA9IGRybV9t b2RlLT5oZGlzcGxheSArIHRlc3RfaW5mby0+dGVzdF9oX3RvdGFsIC0KPiArCQkJKHRlc3RfaW5m by0+dGVzdF9oX3N0YXJ0ICsgdGVzdF9pbmZvLT50ZXN0X2hfd2lkdGgpOwo+ICsJZHJtX21vZGUt PmhzeW5jX2VuZCA9IGRybV9tb2RlLT5oc3luY19zdGFydCArIHRlc3RfaW5mby0+dGVzdF9oc3lu Y193aWR0aDsKPiArCWRybV9tb2RlLT5odG90YWwgPSBkcm1fbW9kZS0+aHN5bmNfZW5kICsgdGVz dF9pbmZvLT50ZXN0X2hfc3RhcnQgLQo+ICsJCQkJCQl0ZXN0X2luZm8tPnRlc3RfaHN5bmNfd2lk dGg7Cj4gKwo+ICsJZHJtX21vZGUtPnZkaXNwbGF5ID0gdGVzdF9pbmZvLT50ZXN0X3ZfaGVpZ2h0 Owo+ICsJZHJtX21vZGUtPnZzeW5jX3N0YXJ0ID0gZHJtX21vZGUtPnZkaXNwbGF5ICsgdGVzdF9p bmZvLT50ZXN0X3ZfdG90YWwgLQo+ICsJCQkodGVzdF9pbmZvLT50ZXN0X3Zfc3RhcnQgKyB0ZXN0 X2luZm8tPnRlc3Rfdl9oZWlnaHQpOwo+ICsJZHJtX21vZGUtPnZzeW5jX2VuZCA9IGRybV9tb2Rl LT52c3luY19zdGFydCArIHRlc3RfaW5mby0+dGVzdF92c3luY193aWR0aDsKPiArCWRybV9tb2Rl LT52dG90YWwgPSBkcm1fbW9kZS0+dnN5bmNfZW5kICsgdGVzdF9pbmZvLT50ZXN0X3Zfc3RhcnQg LQo+ICsJCQkJCQl0ZXN0X2luZm8tPnRlc3RfdnN5bmNfd2lkdGg7Cj4gKwo+ICsJZHJtX21vZGUt PnZyZWZyZXNoID0gdGVzdF9pbmZvLT50ZXN0X3JyX247Cj4gKwlkcm1fbW9kZS0+Y2xvY2sgPSB0 ZXN0X2luZm8tPnRlc3RfaF90b3RhbCAqCj4gKwkJdGVzdF9pbmZvLT50ZXN0X3ZfdG90YWwgKiBk cm1fbW9kZS0+dnJlZnJlc2g7Cj4gKwo+ICsJZHJtX21vZGUtPnR5cGUgPSAweDQ4Owo+ICsJZHJt X21vZGVfc2V0X25hbWUoZHJtX21vZGUpOwo+ICsKPiArCWlmICh0ZXN0X2luZm8tPnRlc3RfcnJf ZCA9PSAwKQo+ICsJCWRybV9tb2RlLT5jbG9jayAvPSAxMDAwOwo+ICsJZWxzZQo+ICsJCWRybV9t b2RlLT5jbG9jayAvPSAxMDAxOwo+ICsKPiArCWlmICh0ZXN0X2luZm8tPnRlc3RfaF93aWR0aCA9 PSA2NDApCj4gKwkJZHJtX21vZGUtPmNsb2NrID0gMjUxNzA7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZHBfcGFuZWxfdXBkYXRlX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is Cj4gKwlzdHJ1Y3QgZWRpZCAqZWRpZCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCj4gKwlpZiAo ZWRpZCkgewo+ICsJCXJjID0gZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25u ZWN0b3IsIGVkaWQpOwo+ICsJCWlmIChyYykgewo+ICsJCQlEUk1fRVJST1IoImZhaWxlZCB0byB1 cGRhdGUgZWRpZCBwcm9wZXJ0eSAlZFxuIiwgcmMpOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ ICsJCXJjID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7Cj4gKwkJRFJNX0RF QlVHX0RQKCIlcyAtIiwgX19mdW5jX18pOwo+ICsJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwly YyA9IGRybV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBOVUxMKTsK PiArCWlmIChyYykKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byB1cGRhdGUgZWRpZCBwcm9wZXJ0 eSAlZFxuIiwgcmMpOwo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiAraW50IGRwX3BhbmVs X3JlYWRfc2lua19jYXBzKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwlzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlpbnQgcmMgPSAwLCBid19jb2RlOwo+ICsJ c3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOwo+ICsKPiArCWlmICghZHBfcGFuZWwgfHwg IWNvbm5lY3Rvcikgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWws IHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwo+ICsJcmMgPSBkcF9wYW5l bF9yZWFkX2RwY2QoZHBfcGFuZWwpOwo+ICsJYndfY29kZSA9IGRybV9kcF9saW5rX3JhdGVfdG9f YndfY29kZShkcF9wYW5lbC0+bGlua19pbmZvLnJhdGUpOwo+ICsJaWYgKHJjIHx8ICFpc19saW5r X3JhdGVfdmFsaWQoYndfY29kZSkgfHwKPiArCQkJIWlzX2xhbmVfY291bnRfdmFsaWQoZHBfcGFu ZWwtPmxpbmtfaW5mby5udW1fbGFuZXMpIHx8Cj4gKwkJCShid19jb2RlID4gZHBfcGFuZWwtPm1h eF9id19jb2RlKSkgewo+ICsJCURSTV9FUlJPUigicmVhZCBkcGNkIGZhaWxlZCAlZFxuIiwgcmMp Owo+ICsJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwlyYyA9IGRwX3BhbmVsX3JlYWRfZWRpZChk cF9wYW5lbCwgY29ubmVjdG9yKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigicGFuZWwg ZWRpZCByZWFkIGZhaWxlZCwgc2V0IGZhaWxzYWZlIG1vZGUucmM9JWRcbiIsIHJjKTsKPiArCQly ZXR1cm4gcmM7Cj4gKwl9Cj4gKwo+ICsJaWYgKHBhbmVsLT5hdXhfY2ZnX3VwZGF0ZV9kb25lKSB7 Cj4gKwkJRFJNX0RFQlVHX0RQKCJyZWFkIERQQ0Qgd2l0aCB1cGRhdGVkIEFVWCBjb25maWdcbiIp Owo+ICsJCXJjID0gZHBfcGFuZWxfcmVhZF9kcGNkKGRwX3BhbmVsKTsKPiArCQlid19jb2RlID0g ZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGRwX3BhbmVsLT5saW5rX2luZm8ucmF0ZSk7Cj4g KwkJaWYgKHJjIHx8ICFpc19saW5rX3JhdGVfdmFsaWQoYndfY29kZSkgfHwKPiArCQkJCSFpc19s YW5lX2NvdW50X3ZhbGlkKGRwX3BhbmVsLT5saW5rX2luZm8ubnVtX2xhbmVzKSB8fAo+ICsJCQkJ KGJ3X2NvZGUgPiBkcF9wYW5lbC0+bWF4X2J3X2NvZGUpKSB7Cj4gKwkJCURSTV9FUlJPUigicmVh ZCBkcGNkIGZhaWxlZCAlZFxuIiwgcmMpOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ICsJCXBh bmVsLT5hdXhfY2ZnX3VwZGF0ZV9kb25lID0gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiArCj4gK3UzMiBkcF9wYW5lbF9nZXRfbW9kZV9icHAoc3RydWN0IGRwX3BhbmVsICpk cF9wYW5lbCwKPiArCQl1MzIgbW9kZV9lZGlkX2JwcCwgdTMyIG1vZGVfcGNsa19raHopCj4gK3sK PiArCXN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbDsKPiArCXUzMiBicHAgPSBtb2RlX2Vk aWRfYnBwOwo+ICsKPiArCWlmICghZHBfcGFuZWwgfHwgIW1vZGVfZWRpZF9icHAgfHwgIW1vZGVf cGNsa19raHopIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVy biAwOwo+ICsJfQo+ICsKPiArCXBhbmVsID0gY29udGFpbmVyX29mKGRwX3BhbmVsLCBzdHJ1Y3Qg ZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwo+ICsKPiArCWlmIChkcF9wYW5lbC0+dmlkZW9f dGVzdCkKPiArCQlicHAgPSBkcF9saW5rX2JpdF9kZXB0aF90b19icHAoCj4gKwkJCQlwYW5lbC0+ bGluay0+dGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCk7Cj4gKwllbHNlCj4gKwkJYnBwID0gZHBf cGFuZWxfZ2V0X3N1cHBvcnRlZF9icHAoZHBfcGFuZWwsIG1vZGVfZWRpZF9icHAsCj4gKwkJCQlt b2RlX3BjbGtfa2h6KTsKPiArCj4gKwlyZXR1cm4gYnBwOwo+ICt9Cj4gKwo+ICtpbnQgZHBfcGFu ZWxfZ2V0X21vZGVzKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwlzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICptb2RlKQo+ICt7Cj4g KwlzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSAqcGFuZWw7Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkg ewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gKwl9Cj4gKwo+ICsJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9w YW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwo+ICsJaWYgKGRwX3BhbmVsLT52aWRlb190ZXN0 KSB7Cj4gKwkJZHBfcGFuZWxfc2V0X3Rlc3RfbW9kZShwYW5lbCwgbW9kZSk7Cj4gKwkJcmV0dXJu IDE7Cj4gKwl9IGVsc2UgaWYgKGRwX3BhbmVsLT5lZGlkKSB7Cj4gKwkJcmV0dXJuIGRwX3BhbmVs X3VwZGF0ZV9tb2Rlcyhjb25uZWN0b3IsIGRwX3BhbmVsLT5lZGlkKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArdTggZHBfcGFuZWxfZ2V0X2VkaWRfY2hlY2tzdW0oc3RydWN0 IGVkaWQgKmVkaWQpCj4gK3sKPiArCXN0cnVjdCBlZGlkICpsYXN0X2Jsb2NrOwo+ICsJdTggKnJh d19lZGlkOwo+ICsJYm9vbCBpc19lZGlkX2NvcnJ1cHQ7Cj4gKwo+ICsJaWYgKCFlZGlkKSB7Cj4g KwkJRFJNX0VSUk9SKCJpbnZhbGlkIGVkaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJ fQo+ICsKPiArCXJhd19lZGlkID0gKHU4ICopZWRpZDsKPiArCXJhd19lZGlkICs9IChlZGlkLT5l eHRlbnNpb25zICogRURJRF9MRU5HVEgpOwo+ICsJbGFzdF9ibG9jayA9IChzdHJ1Y3QgZWRpZCAq KXJhd19lZGlkOwo+ICsKPiArCS8qIGJsb2NrIHR5cGUgZXh0ZW5zaW9uICovCj4gKwlkcm1fZWRp ZF9ibG9ja192YWxpZChyYXdfZWRpZCwgMSwgZmFsc2UsICZpc19lZGlkX2NvcnJ1cHQpOwo+ICsJ aWYgKCFpc19lZGlkX2NvcnJ1cHQpCj4gKwkJcmV0dXJuIGxhc3RfYmxvY2stPmNoZWNrc3VtOwo+ ICsKPiArCURSTV9FUlJPUigiSW52YWxpZCBibG9jaywgbm8gY2hlY2tzdW1cbiIpOwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3ZvaWQgZHBfcGFuZWxfaGFuZGxlX3NpbmtfcmVxdWVzdChzdHJ1 Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSAq cGFuZWw7Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBp bnB1dFxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCXBhbmVsID0gY29udGFpbmVyX29m KGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwo+ICsKPiArCWlm IChwYW5lbC0+bGluay0+c2lua19yZXF1ZXN0ICYgRFBfVEVTVF9MSU5LX0VESURfUkVBRCkgewo+ ICsJCXU4IGNoZWNrc3VtID0gZHBfcGFuZWxfZ2V0X2VkaWRfY2hlY2tzdW0oZHBfcGFuZWwtPmVk aWQpOwo+ICsKPiArCQlkcF9saW5rX3NlbmRfZWRpZF9jaGVja3N1bShwYW5lbC0+bGluaywgY2hl Y2tzdW0pOwo+ICsJCWRwX2xpbmtfc2VuZF90ZXN0X3Jlc3BvbnNlKHBhbmVsLT5saW5rKTsKPiAr CX0KPiArfQo+ICsKPiArdm9pZCBkcF9wYW5lbF90cGdfY29uZmlnKHN0cnVjdCBkcF9wYW5lbCAq ZHBfcGFuZWwsIGJvb2wgZW5hYmxlKQo+ICt7Cj4gKwl1MzIgaHN5bmNfc3RhcnRfeCwgaHN5bmNf ZW5kX3g7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqY2F0YWxvZzsKPiArCXN0cnVjdCBk cF9wYW5lbF9wcml2YXRlICpwYW5lbDsKPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1f bW9kZTsKPiArCj4gKwlpZiAoIWRwX3BhbmVsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlu cHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcGFuZWwgPSBjb250YWluZXJfb2Yo ZHBfcGFuZWwsIHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwljYXRhbG9n ID0gcGFuZWwtPmNhdGFsb2c7Cj4gKwlkcm1fbW9kZSA9ICZwYW5lbC0+ZHBfcGFuZWwuZHBfbW9k ZS5kcm1fbW9kZTsKPiArCj4gKwlpZiAoIXBhbmVsLT5wYW5lbF9vbikgewo+ICsJCURSTV9ERUJV R19EUCgiRFAgcGFuZWwgbm90IGVuYWJsZWQsIGhhbmRsZSBUUEcgb24gbmV4dCBwYW5lbCBvblxu Iik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlmICghZW5hYmxlKSB7Cj4gKwkJZHBfY2F0 YWxvZ19wYW5lbF90cGdfZGlzYWJsZShjYXRhbG9nKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ ICsJLyogVFBHIGNvbmZpZyAqLwo+ICsJY2F0YWxvZy0+aHN5bmNfcGVyaW9kID0gZHJtX21vZGUt Pmh0b3RhbDsKPiArCWNhdGFsb2ctPnZzeW5jX3BlcmlvZCA9IGRybV9tb2RlLT52dG90YWw7Cj4g Kwo+ICsJY2F0YWxvZy0+ZGlzcGxheV92X3N0YXJ0ID0gKChkcm1fbW9kZS0+dnRvdGFsIC0gZHJt X21vZGUtPnZzeW5jX3N0YXJ0KSAqCj4gKwkJCQkJY2F0YWxvZy0+aHN5bmNfcGVyaW9kKTsKPiAr CWNhdGFsb2ctPmRpc3BsYXlfdl9lbmQgPSAoKGNhdGFsb2ctPnZzeW5jX3BlcmlvZCAtIGRybV9t b2RlLT52c3luY19zdGFydCAtCj4gKwkJCQkJZHJtX21vZGUtPnZkaXNwbGF5KSAqIGNhdGFsb2ct PmhzeW5jX3BlcmlvZCkgLSAxOwo+ICsKPiArCWNhdGFsb2ctPmRpc3BsYXlfdl9zdGFydCArPSBk cm1fbW9kZS0+aHRvdGFsIC0gZHJtX21vZGUtPmhzeW5jX3N0YXJ0Owo+ICsJY2F0YWxvZy0+ZGlz cGxheV92X2VuZCAtPSBkcm1fbW9kZS0+aHN5bmNfc3RhcnQgLSBkcm1fbW9kZS0+aGRpc3BsYXk7 Cj4gKwo+ICsJaHN5bmNfc3RhcnRfeCA9IGRybV9tb2RlLT5odG90YWwgLSBkcm1fbW9kZS0+aHN5 bmNfc3RhcnQ7Cj4gKwloc3luY19lbmRfeCA9IGNhdGFsb2ctPmhzeW5jX3BlcmlvZCAtIGRybV9t b2RlLT5oc3luY19zdGFydCAtCj4gKwkJCQkJZHJtX21vZGUtPmhkaXNwbGF5IC0gMTsKPiArCj4g KwljYXRhbG9nLT52X3N5bmNfd2lkdGggPSBkcm1fbW9kZS0+dnN5bmNfZW5kIC0gZHJtX21vZGUt PnZzeW5jX3N0YXJ0Owo+ICsKPiArCWNhdGFsb2ctPmhzeW5jX2N0bCA9IChjYXRhbG9nLT5oc3lu Y19wZXJpb2QgPDwgMTYpIHwKPiArCQkJKGRybV9tb2RlLT5oc3luY19lbmQgLSBkcm1fbW9kZS0+ aHN5bmNfc3RhcnQpOwo+ICsJY2F0YWxvZy0+ZGlzcGxheV9oY3RsID0gKGhzeW5jX2VuZF94IDw8 IDE2KSB8IGhzeW5jX3N0YXJ0X3g7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCIlczogY2FsbGluZyBj YXRhbG9nIHRwZ19lbmFibGVcbiIsIF9fZnVuY19fKTsKPiArCWRwX2NhdGFsb2dfcGFuZWxfdHBn X2VuYWJsZShjYXRhbG9nKTsKPiArfQo+ICsKPiAraW50IGRwX3BhbmVsX3RpbWluZ19jZmcoc3Ry dWN0IGRwX3BhbmVsICpkcF9wYW5lbCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXUzMiBkYXRh LCB0b3RhbF92ZXIsIHRvdGFsX2hvcjsKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3BhbmVsICpjYXRh bG9nOwo+ICsJc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOwo+ICsJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKmRybV9tb2RlOwo+ICsKPiArCXBhbmVsID0gY29udGFpbmVyX29mKGRwX3Bh bmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwo+ICsJY2F0YWxvZyA9IHBh bmVsLT5jYXRhbG9nOwo+ICsJZHJtX21vZGUgPSAmcGFuZWwtPmRwX3BhbmVsLmRwX21vZGUuZHJt X21vZGU7Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJ3aWR0aD0lZCBocG9yY2g9ICVkICVkICVkXG4i LAo+ICsJCWRybV9tb2RlLT5oZGlzcGxheSwgZHJtX21vZGUtPmh0b3RhbCAtIGRybV9tb2RlLT5o c3luY19lbmQsCj4gKwkJZHJtX21vZGUtPmhzeW5jX3N0YXJ0IC0gZHJtX21vZGUtPmhkaXNwbGF5 LAo+ICsJCWRybV9tb2RlLT5oc3luY19lbmQgLSBkcm1fbW9kZS0+aHN5bmNfc3RhcnQpOwo+ICsK PiArCURSTV9ERUJVR19EUCgiaGVpZ2h0PSVkIHZwb3JjaD0gJWQgJWQgJWRcbiIsCj4gKwkJZHJt X21vZGUtPnZkaXNwbGF5LCBkcm1fbW9kZS0+dnRvdGFsIC0gZHJtX21vZGUtPnZzeW5jX2VuZCwK PiArCQlkcm1fbW9kZS0+dnN5bmNfc3RhcnQgLSBkcm1fbW9kZS0+dmRpc3BsYXksCj4gKwkJZHJt X21vZGUtPnZzeW5jX2VuZCAtIGRybV9tb2RlLT52c3luY19zdGFydCk7Cj4gKwo+ICsJdG90YWxf aG9yID0gZHJtX21vZGUtPmh0b3RhbDsKPiArCj4gKwl0b3RhbF92ZXIgPSBkcm1fbW9kZS0+dnRv dGFsOwo+ICsKPiArCWRhdGEgPSB0b3RhbF92ZXI7Cj4gKwlkYXRhIDw8PSAxNjsKPiArCWRhdGEg fD0gdG90YWxfaG9yOwo+ICsKPiArCWNhdGFsb2ctPnRvdGFsID0gZGF0YTsKPiArCj4gKwlkYXRh ID0gKGRybV9tb2RlLT52dG90YWwgLSBkcm1fbW9kZS0+dnN5bmNfc3RhcnQpOwo+ICsJZGF0YSA8 PD0gMTY7Cj4gKwlkYXRhIHw9IChkcm1fbW9kZS0+aHRvdGFsIC0gZHJtX21vZGUtPmhzeW5jX3N0 YXJ0KTsKPiArCj4gKwljYXRhbG9nLT5zeW5jX3N0YXJ0ID0gZGF0YTsKPiArCj4gKwlkYXRhID0g ZHJtX21vZGUtPnZzeW5jX2VuZCAtIGRybV9tb2RlLT52c3luY19zdGFydDsKPiArCWRhdGEgPDw9 IDE2Owo+ICsJZGF0YSB8PSAocGFuZWwtPmRwX3BhbmVsLmRwX21vZGUudl9hY3RpdmVfbG93IDw8 IDMxKTsKPiArCWRhdGEgfD0gZHJtX21vZGUtPmhzeW5jX2VuZCAtIGRybV9tb2RlLT5oc3luY19z dGFydDsKPiArCWRhdGEgfD0gKHBhbmVsLT5kcF9wYW5lbC5kcF9tb2RlLmhfYWN0aXZlX2xvdyA8 PCAxNSk7Cj4gKwo+ICsJY2F0YWxvZy0+d2lkdGhfYmxhbmtpbmcgPSBkYXRhOwo+ICsKPiArCWRh dGEgPSBkcm1fbW9kZS0+dmRpc3BsYXk7Cj4gKwlkYXRhIDw8PSAxNjsKPiArCWRhdGEgfD0gZHJt X21vZGUtPmhkaXNwbGF5Owo+ICsKPiArCWNhdGFsb2ctPmRwX2FjdGl2ZSA9IGRhdGE7Cj4gKwo+ ICsJZHBfY2F0YWxvZ19wYW5lbF90aW1pbmdfY2ZnKGNhdGFsb2cpOwo+ICsJcGFuZWwtPnBhbmVs X29uID0gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gcmM7CgpyYyBpcyB1bnVzZWQgaW4gdGhpcyBmdW5j dGlvbi4gIFlvdSBjYW4gcmV0dXJuIDA7Cgo+ICt9Cj4gKwo+ICtpbnQgZHBfcGFuZWxfaW5pdF9w YW5lbF9pbmZvKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpCj4gK3sKPiArCWludCByYyA9IDA7 Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGU7Cj4gKwo+ICsJZHJtX21vZGUg PSAmZHBfcGFuZWwtPmRwX21vZGUuZHJtX21vZGU7Cj4gKwo+ICsJLyoKPiArCSAqIHByaW50IHJl c29sdXRpb24gaW5mbyBhcyB0aGlzIGlzIGEgcmVzdWx0Cj4gKwkgKiBvZiB1c2VyIGluaXRpYXRl ZCBhY3Rpb24gb2YgY2FibGUgY29ubmVjdGlvbgo+ICsJICovCj4gKwlEUk1fREVCVUdfRFAoIlNF VCBORVcgUkVTT0xVVElPTjpcbiIpOwo+ICsJRFJNX0RFQlVHX0RQKCIlZHglZEAlZGZwc1xuIiwg ZHJtX21vZGUtPmhkaXNwbGF5LAo+ICsJCWRybV9tb2RlLT52ZGlzcGxheSwgZHJtX21vZGUtPnZy ZWZyZXNoKTsKPiArCURSTV9ERUJVR19EUCgiaF9wb3JjaGVzKGJhY2t8ZnJvbnR8d2lkdGgpID0g KCVkfCVkfCVkKVxuIiwKPiArCQkJZHJtX21vZGUtPmh0b3RhbCAtIGRybV9tb2RlLT5oc3luY19l bmQsCj4gKwkJCWRybV9tb2RlLT5oc3luY19zdGFydCAtIGRybV9tb2RlLT5oZGlzcGxheSwKPiAr CQkJZHJtX21vZGUtPmhzeW5jX2VuZCAtIGRybV9tb2RlLT5oc3luY19zdGFydCk7Cj4gKwlEUk1f REVCVUdfRFAoInZfcG9yY2hlcyhiYWNrfGZyb250fHdpZHRoKSA9ICglZHwlZHwlZClcbiIsCj4g KwkJCWRybV9tb2RlLT52dG90YWwgLSBkcm1fbW9kZS0+dnN5bmNfZW5kLAo+ICsJCQlkcm1fbW9k ZS0+dnN5bmNfc3RhcnQgLSBkcm1fbW9kZS0+dmRpc3BsYXksCj4gKwkJCWRybV9tb2RlLT52c3lu Y19lbmQgLSBkcm1fbW9kZS0+dnN5bmNfc3RhcnQpOwo+ICsJRFJNX0RFQlVHX0RQKCJwaXhlbCBj bG9jayAoS0h6KT0oJWQpXG4iLCBkcm1fbW9kZS0+Y2xvY2spOwo+ICsJRFJNX0RFQlVHX0RQKCJi cHAgPSAlZFxuIiwgZHBfcGFuZWwtPmRwX21vZGUuYnBwKTsKPiArCj4gKwlkcF9wYW5lbC0+ZHBf bW9kZS5icHAgPSBtYXhfdCh1MzIsIDE4LCBtaW5fdCh1MzIsIGRwX3BhbmVsLT5kcF9tb2RlLmJw cCwgMzApKTsKPiArCURSTV9ERUJVR19EUCgidXBkYXRlZCBicHAgPSAlZFxuIiwgZHBfcGFuZWwt PmRwX21vZGUuYnBwKTsKPiArCj4gKwlyZXR1cm4gcmM7CgpyYyBpcyB1bnNldCBpbiB0aGlzIGZ1 bmN0aW9uLgoKPiArfQo+ICsKPiArc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbF9nZXQoc3RydWN0 IGRwX3BhbmVsX2luICppbikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9wYW5l bF9wcml2YXRlICpwYW5lbDsKPiArCXN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWw7Cj4gKwo+ICsJ aWYgKCFpbi0+ZGV2IHx8ICFpbi0+Y2F0YWxvZyB8fCAhaW4tPmF1eCB8fCAhaW4tPmxpbmspIHsK CnJldHVybiBFUlJfUFRSKC1FSU5WQUwpIGJ1dCByZWFsbHkgZXZhbHVhdGUgaWYgdGhpcyBpcyBw b3NzaWJsZSBzaW5jZSB0aGUgY2FsbGVyCndvdWxkIHByZXN1bWFibHkgaGF2ZSBwb3B1bGF0ZWQg ZXZlcnl0aGluZyBiZWZvcmUgY2FsbGluZy4KCj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGlucHV0 XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPiArCj4gKwlw YW5lbCA9IGRldm1fa3phbGxvYyhpbi0+ZGV2LCBzaXplb2YoKnBhbmVsKSwgR0ZQX0tFUk5FTCk7 Cj4gKwlpZiAoIXBhbmVsKSB7Cj4gKwkJcmMgPSAtRU5PTUVNOwoKcmV0dXJuIEVSUl9QUlRSKC1F Tk9NRU0pCgo+ICsJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4gKwo+ICsJcGFuZWwtPmRldiA9IGluLT5k ZXY7Cj4gKwlwYW5lbC0+YXV4ID0gaW4tPmF1eDsKPiArCXBhbmVsLT5jYXRhbG9nID0gaW4tPmNh dGFsb2c7Cj4gKwlwYW5lbC0+bGluayA9IGluLT5saW5rOwo+ICsKPiArCWRwX3BhbmVsID0gJnBh bmVsLT5kcF9wYW5lbDsKPiArCWRwX3BhbmVsLT5tYXhfYndfY29kZSA9IERQX0xJTktfQldfOF8x Owo+ICsJcGFuZWwtPmF1eF9jZmdfdXBkYXRlX2RvbmUgPSBmYWxzZTsKPiArCj4gKwlyZXR1cm4g ZHBfcGFuZWw7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIEVSUl9QVFIocmMpOwo+ICt9Cj4gKwo+ICt2 b2lkIGRwX3BhbmVsX3B1dChzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQo+ICt7Cj4gKwlzdHJ1 Y3QgZHBfcGFuZWxfcHJpdmF0ZSAqcGFuZWw7Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkKPiArCQly ZXR1cm47Cj4gKwo+ICsJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9w YW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwo+ICsJa2ZyZWUoZHBfcGFuZWwtPmVkaWQpOwo+ ICsJZHBfcGFuZWwtPmVkaWQgPSBOVUxMOwo+ICsJZGV2bV9rZnJlZShwYW5lbC0+ZGV2LCBwYW5l bCk7CgpTYW1lIGFzIHRoZSBvdGhlciBjYWxsZXJzIG9mIGRldm1fa2ZyZWUoKQoKPiArfQo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhbmVsLmggYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX3BhbmVsLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAw MDAwMDAuLjBkMzZhMWEKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9wYW5lbC5oCj4gQEAgLTAsMCArMSw5MSBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMC1vbmx5ICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMi0y MDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICovCj4g Kwo+ICsjaWZuZGVmIF9EUF9QQU5FTF9IXwo+ICsjZGVmaW5lIF9EUF9QQU5FTF9IXwo+ICsKPiAr I2luY2x1ZGUgPGRybS9tc21fZHJtLmg+Cj4gKwo+ICsjaW5jbHVkZSAiZHBfYXV4LmgiCj4gKyNp bmNsdWRlICJkcF9saW5rLmgiCj4gKyNpbmNsdWRlICJkcF9leHRjb24uaCIKPiArCj4gK3N0cnVj dCBlZGlkOwo+ICsKPiArI2RlZmluZSBEUF9NQVhfRE9XTlNUUkVBTV9QT1JUUyAweDEwCj4gKwo+ ICtzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlIHsKPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGRy bV9tb2RlOwo+ICsJdTMyIGNhcGFiaWxpdGllczsKPiArCXUzMiBicHA7Cj4gKwl1MzIgaF9hY3Rp dmVfbG93Owo+ICsJdTMyIHZfYWN0aXZlX2xvdzsKPiArfTsKPiArCj4gK3N0cnVjdCBkcF9wYW5l bF9pbiB7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgZHBfYXV4ICphdXg7Cj4g KwlzdHJ1Y3QgZHBfbGluayAqbGluazsKPiArCXN0cnVjdCBkcF9jYXRhbG9nX3BhbmVsICpjYXRh bG9nOwo+ICt9Owo+ICsKPiArc3RydWN0IGRwX3BhbmVsIHsKPiArCS8qIGRwY2QgcmF3IGRhdGEg Ki8KPiArCXU4IGRwY2RbRFBfUkVDRUlWRVJfQ0FQX1NJWkUgKyAxXTsKPiArCj4gKwlzdHJ1Y3Qg ZHJtX2RwX2xpbmsgbGlua19pbmZvOwo+ICsJc3RydWN0IGVkaWQgKmVkaWQ7Cj4gKwlzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSBkcF9t b2RlOwo+ICsJYm9vbCB2aWRlb190ZXN0Owo+ICsKPiArCXUzMiB2aWM7Cj4gKwl1MzIgbWF4X3Bj bGtfa2h6Owo+ICsKPiArCXUzMiBtYXhfYndfY29kZTsKPiArfTsKPiArCj4gK2ludCBkcF9wYW5l bF9pbml0X3BhbmVsX2luZm8oc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7Cj4gK2ludCBkcF9w YW5lbF9kZWluaXQoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7Cj4gK2ludCBkcF9wYW5lbF90 aW1pbmdfY2ZnKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpOwo+ICtpbnQgZHBfcGFuZWxfcmVh ZF9zaW5rX2NhcHMoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCwKPiArCQlzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yKTsKPiArdTMyIGRwX3BhbmVsX2dldF9tb2RlX2JwcChzdHJ1Y3Qg ZHBfcGFuZWwgKmRwX3BhbmVsLCB1MzIgbW9kZV9tYXhfYnBwLAo+ICsJCQl1MzIgbW9kZV9wY2xr X2toeik7Cj4gK2ludCBkcF9wYW5lbF9nZXRfbW9kZXMoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5l bCwKPiArCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHBfZGlzcGxh eV9tb2RlICptb2RlKTsKPiArdm9pZCBkcF9wYW5lbF9oYW5kbGVfc2lua19yZXF1ZXN0KHN0cnVj dCBkcF9wYW5lbCAqZHBfcGFuZWwpOwo+ICt2b2lkIGRwX3BhbmVsX3RwZ19jb25maWcoc3RydWN0 IGRwX3BhbmVsICpkcF9wYW5lbCwgYm9vbCBlbmFibGUpOwo+ICsKPiArLyoqCj4gKyAqIGlzX2xp bmtfcmF0ZV92YWxpZCgpIC0gdmFsaWRhdGVzIHRoZSBsaW5rIHJhdGUKPiArICogQGxhbmVfcmF0 ZTogbGluayByYXRlIHJlcXVlc3RlZCBieSB0aGUgc2luawo+ICsgKgo+ICsgKiBSZXR1cm5zIHRy dWUgaWYgdGhlIHJlcXVlc3RlZCBsaW5rIHJhdGUgaXMgc3VwcG9ydGVkLgo+ICsgKi8KPiArc3Rh dGljIGlubGluZSBib29sIGlzX2xpbmtfcmF0ZV92YWxpZCh1MzIgYndfY29kZSkKPiArewo+ICsJ cmV0dXJuIChid19jb2RlID09IERQX0xJTktfQldfMV82MiB8fAo+ICsJCWJ3X2NvZGUgPT0gRFBf TElOS19CV18yXzcgfHwKPiArCQlid19jb2RlID09IERQX0xJTktfQldfNV80IHx8Cj4gKwkJYndf Y29kZSA9PSBEUF9MSU5LX0JXXzhfMSk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkcF9saW5rX2lz X2xhbmVfY291bnRfdmFsaWQoKSAtIHZhbGlkYXRlcyB0aGUgbGFuZSBjb3VudAo+ICsgKiBAbGFu ZV9jb3VudDogbGFuZSBjb3VudCByZXF1ZXN0ZWQgYnkgdGhlIHNpbmsKPiArICoKPiArICogUmV0 dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgbGFuZSBjb3VudCBpcyBzdXBwb3J0ZWQuCj4gKyAq Lwo+ICtzdGF0aWMgaW5saW5lIGJvb2wgaXNfbGFuZV9jb3VudF92YWxpZCh1MzIgbGFuZV9jb3Vu dCkKPiArewo+ICsJcmV0dXJuIChsYW5lX2NvdW50ID09IDEgfHwKPiArCQlsYW5lX2NvdW50ID09 IDIgfHwKPiArCQlsYW5lX2NvdW50ID09IDQpOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgZHBfcGFuZWwg KmRwX3BhbmVsX2dldChzdHJ1Y3QgZHBfcGFuZWxfaW4gKmluKTsKPiArdm9pZCBkcF9wYW5lbF9w dXQoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7Cj4gKyNlbmRpZiAvKiBfRFBfUEFORUxfSF8g Ki8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAuLjUwMjBkMTAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuYwo+IEBAIC0wLDAgKzEsNjIxIEBACj4gKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiArLyoKPiArICogQ29weXJpZ2h0IChj KSAyMDEyLTIwMTksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ ICsgKi8KPiArCj4gKyNkZWZpbmUgcHJfZm10KGZtdCkJIltkcm0tZHBdICVzOiAiIGZtdCwgX19m dW5jX18KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Cj4gKwo+ICsjaW5jbHVkZSAi ZHBfcGFyc2VyLmgiCj4gKwo+ICtzdGF0aWMgaW50IG1zbV9kc3NfaW9yZW1hcF9ieW5hbWUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkJICAgc3RydWN0IGRzc19pb19kYXRhICpp b19kYXRhLCBjb25zdCBjaGFyICpuYW1lKQo+ICt7Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9 IE5VTEw7Cj4gKwo+ICsJaWYgKCFpb19kYXRhKSB7Cj4gKwkJRFJNX0VSUk9SKCIlcFMtPiVzOiBp bnZhbGlkIGlucHV0XG4iLAo+ICsJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIF9fZnVu Y19fKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXMgPSBwbGF0Zm9ybV9n ZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKPiArCWlmICgh cmVzKSB7Cj4gKwkJRFJNX0VSUk9SKCIlcFMtPiVzOiAnJXMnIG1zbV9kc3NfZ2V0X3Jlc19ieW5h bWUgZmFpbGVkXG4iLAo+ICsJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIF9fZnVuY19f LCBuYW1lKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KPiArCj4gKwlpb19kYXRhLT5sZW4g PSAodTMyKXJlc291cmNlX3NpemUocmVzKTsKPiArCWlvX2RhdGEtPmJhc2UgPSBpb3JlbWFwKHJl cy0+c3RhcnQsIGlvX2RhdGEtPmxlbik7Cj4gKwlpZiAoIWlvX2RhdGEtPmJhc2UpIHsKPiArCQlE Uk1fRVJST1IoIiVwUy0+JXM6ICclcycgaW9yZW1hcCBmYWlsZWRcbiIsCj4gKwkJCV9fYnVpbHRp bl9yZXR1cm5fYWRkcmVzcygwKSwgX19mdW5jX18sIG5hbWUpOwo+ICsJCXJldHVybiAtRUlPOwo+ ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cgptc21fZHJ2IGFscmVhZHkgaGFzIGEgbXNtX2lv cmVtYXAoKSBmdW5jdGlvbiAtIHlvdSBzaG91bGQgY29uc2lkZXIgcmV1c2luZyB0aGF0LgoKPiAr Cj4gK3N0YXRpYyB2b2lkIG1zbV9kc3NfaW91bm1hcChzdHJ1Y3QgZHNzX2lvX2RhdGEgKmlvX2Rh dGEpCj4gK3sKPiArCWlmICghaW9fZGF0YSkgewo+ICsJCURSTV9FUlJPUigiJXBTLT4lczogaW52 YWxpZCBpbnB1dFxuIiwKPiArCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBfX2Z1bmNf Xyk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlmIChpb19kYXRhLT5iYXNlKSB7Cj4gKwkJ aW91bm1hcChpb19kYXRhLT5iYXNlKTsKPiArCQlpb19kYXRhLT5iYXNlID0gTlVMTDsKPiArCX0K PiArCWlvX2RhdGEtPmxlbiA9IDA7Cj4gK30KCkJvbnVzIHRoYXQgbXNtX2lvcmVtYXAoKSB1c2Vz IGRldl9pb3JlbWFwKCkgc28geW91IHByb2JhYmx5IGRvbid0IG5lZWQgdGhpcwpmdW5jdGlvbi4K Cj4gK3N0YXRpYyB2b2lkIGRwX3BhcnNlcl91bm1hcF9pb19yZXNvdXJjZXMoc3RydWN0IGRwX3Bh cnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfaW8gKmlvID0gJnBhcnNlci0+aW87Cj4g Kwo+ICsJbXNtX2Rzc19pb3VubWFwKCZpby0+ZHBfYWhiKTsKPiArCW1zbV9kc3NfaW91bm1hcCgm aW8tPmRwX2F1eCk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT5kcF9saW5rKTsKPiArCW1zbV9k c3NfaW91bm1hcCgmaW8tPmRwX3AwKTsKPiArCW1zbV9kc3NfaW91bm1hcCgmaW8tPnBoeV9pbyk7 Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT5sbl90eDBfaW8pOwo+ICsJbXNtX2Rzc19pb3VubWFw KCZpby0+bG5fdHgwX2lvKTsKPiArCW1zbV9kc3NfaW91bm1hcCgmaW8tPmRwX3BsbF9pbyk7Cj4g Kwltc21fZHNzX2lvdW5tYXAoJmlvLT5kcF9jY19pbyk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlv LT51c2IzX2RwX2NvbSk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT5xZnByb21faW8pOwo+ICt9 CgpPciB0aGlzIGZ1bmN0aW9uLgoKPiArc3RhdGljIGludCBkcF9wYXJzZXJfY3RybF9yZXMoc3Ry dWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJdTMyIGluZGV4 Owo+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHBhcnNlci0+cGRldjsKPiArCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IHBhcnNlci0+cGRldi0+ZGV2Lm9mX25vZGU7Cj4g KwlzdHJ1Y3QgZHBfaW8gKmlvID0gJnBhcnNlci0+aW87Cj4gKwo+ICsJcmMgPSBvZl9wcm9wZXJ0 eV9yZWFkX3UzMihvZl9ub2RlLCAiY2VsbC1pbmRleCIsICZpbmRleCk7Cj4gKwlpZiAocmMpIHsK PiArCQlEUk1fRVJST1IoImNlbGwtaW5kZXggbm90IHNwZWNpZmllZCwgJWRcbiIsIHJjKTsKPiAr CQlyZXR1cm4gcmM7Cj4gKwl9CgpXaHkgaXMgdGhpcyBmYXRhbD8KCj4gKwlyYyA9IG1zbV9kc3Nf aW9yZW1hcF9ieW5hbWUocGRldiwgJmlvLT5kcF9haGIsICJkcF9haGIiKTsKPiArCWlmIChyYykg ewo+ICsJCURSTV9FUlJPUigidW5hYmxlIHRvIHJlbWFwIGRwIGlvIHJlc291cmNlcywgJWRcbiIs IHJjKTsKPiArCQlnb3RvIGVycjsKCklmIHlvdSBmb2xsb3cgdGhlIGFib3ZlIHN1Z2dlc3Rpb25z LCB0aGVuIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwKZHBfcGFyc2VyX3VubWFwX2lvX3Jlc291cmNl cyBhbmQgeW91IGNhbiByZXR1cm4gcmMgKHdlbGwsIGFjdHVhbGx5LCB0aGUgUFRSX0VSUgpvZiB0 aGUgcmV0dXJuIHBvaW50ZXIpLiAgQWxzbywgbXNtX2lvcmVtYXAoKSBhbHJlYWR5IHByaW50cyBh IGxvZyBtZXNzYWdlIHNvIHlvdQpkb24ndCBuZWVkIG9uZS4KCj4gKwl9Cj4gKwo+ICsJcmMgPSBt c21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfYXV4LCAiZHBfYXV4Iik7Cj4gKwlp ZiAocmMpIHsKPiArCQlEUk1fRVJST1IoInVuYWJsZSB0byByZW1hcCBkcCBpbyByZXNvdXJjZXMs ICVkXG4iLCByYyk7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmMgPSBtc21fZHNzX2lv cmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfbGluaywgImRwX2xpbmsiKTsKPiArCWlmIChyYykg ewo+ICsJCURSTV9FUlJPUigidW5hYmxlIHRvIHJlbWFwIGRwIGlvIHJlc291cmNlcywgJWRcbiIs IHJjKTsKPiArCQlnb3RvIGVycjsKPiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfaW9yZW1hcF9i eW5hbWUocGRldiwgJmlvLT5kcF9wMCwgImRwX3AwIik7Cj4gKwlpZiAocmMpIHsKPiArCQlEUk1f RVJST1IoInVuYWJsZSB0byByZW1hcCBkcCBpbyByZXNvdXJjZXMsICVkXG4iLCByYyk7Cj4gKwkJ Z290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmMgPSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYs ICZpby0+cGh5X2lvLCAiZHBfcGh5Iik7Cj4gKwlpZiAocmMpIHsKPiArCQlEUk1fRVJST1IoInVu YWJsZSB0byByZW1hcCBkcCBQSFkgcmVzb3VyY2VzLCAlZFxuIiwgcmMpOwo+ICsJCWdvdG8gZXJy Owo+ICsJfQo+ICsKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8tPmxu X3R4MF9pbywgImRwX2xuX3R4MCIpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJ1bmFi bGUgdG8gcmVtYXAgZHAgVFgwIHJlc291cmNlcywgJWRcbiIsIHJjKTsKPiArCQlnb3RvIGVycjsK PiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfaW9yZW1hcF9ieW5hbWUocGRldiwgJmlvLT5sbl90 eDFfaW8sICJkcF9sbl90eDEiKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigidW5hYmxl IHRvIHJlbWFwIGRwIFRYMSByZXNvdXJjZXMsICVkXG4iLCByYyk7Cj4gKwkJZ290byBlcnI7Cj4g Kwl9Cj4gKwo+ICsJcmMgPSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfcGxs X2lvLCAiZHBfcGxsIik7Cj4gKwlpZiAocmMpIHsKPiArCQlEUk1fRVJST1IoInVuYWJsZSB0byBy ZW1hcCBEUCBQTEwgcmVzb3VyY2VzLCAlZFxuIiwgcmMpOwo+ICsJCWdvdG8gZXJyOwo+ICsJfQo+ ICsKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8tPnVzYjNfZHBfY29t LCAidXNiM19kcF9jb20iKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigidW5hYmxlIHRv IHJlbWFwIFVTQjMgRFAgY29tIHJlc291cmNlcywgJWRcbiIsIHJjKTsKPiArCQlnb3RvIGVycjsK PiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfaW9yZW1hcF9ieW5hbWUocGRldiwgJmlvLT5kcF9j Y19pbywgImRwX21tc3NfY2MiKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigidW5hYmxl IHRvIHJlbWFwIGRwIE1NU1NfQ0MgcmVzb3VyY2VzXG4iKTsKPiArCQlnb3RvIGVycjsKPiArCX0K PiArCj4gKwlpZiAobXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8tPnFmcHJvbV9pbywg InFmcHJvbV9waHlzaWNhbCIpKQo+ICsJCXByX3dhcm4oInVuYWJsZSB0byByZW1hcCBkcCBxZnBy b20gcmVzb3VyY2VzXG4iKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArZXJyOgo+ICsJZHBfcGFyc2Vy X3VubWFwX2lvX3Jlc291cmNlcyhwYXJzZXIpOwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3QgY2hhciAqZHBfZ2V0X3BoeV9hdXhfY29uZmlnX3Byb3BlcnR5KHUzMiBjZmdf dHlwZSkKPiArewo+ICsJc3dpdGNoIChjZmdfdHlwZSkgewo+ICsJY2FzZSBQSFlfQVVYX0NGRzA6 Cj4gKwkJcmV0dXJuICJxY29tLGF1eC1jZmcwLXNldHRpbmdzIjsKPiArCWNhc2UgUEhZX0FVWF9D RkcxOgo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnMS1zZXR0aW5ncyI7Cj4gKwljYXNlIFBIWV9B VVhfQ0ZHMjoKPiArCQlyZXR1cm4gInFjb20sYXV4LWNmZzItc2V0dGluZ3MiOwo+ICsJY2FzZSBQ SFlfQVVYX0NGRzM6Cj4gKwkJcmV0dXJuICJxY29tLGF1eC1jZmczLXNldHRpbmdzIjsKPiArCWNh c2UgUEhZX0FVWF9DRkc0Ogo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnNC1zZXR0aW5ncyI7Cj4g KwljYXNlIFBIWV9BVVhfQ0ZHNToKPiArCQlyZXR1cm4gInFjb20sYXV4LWNmZzUtc2V0dGluZ3Mi Owo+ICsJY2FzZSBQSFlfQVVYX0NGRzY6Cj4gKwkJcmV0dXJuICJxY29tLGF1eC1jZmc2LXNldHRp bmdzIjsKPiArCWNhc2UgUEhZX0FVWF9DRkc3Ogo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnNy1z ZXR0aW5ncyI7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHODoKPiArCQlyZXR1cm4gInFjb20sYXV4LWNm Zzgtc2V0dGluZ3MiOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzk6Cj4gKwkJcmV0dXJuICJxY29tLGF1 eC1jZmc5LXNldHRpbmdzIjsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuICJ1bmtub3duIjsKPiAr CX0KPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wYXJzZXJfYXV4KHN0cnVjdCBkcF9wYXJzZXIg KnBhcnNlcikKPiArewo+ICsJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gcGFyc2VyLT5w ZGV2LT5kZXYub2Zfbm9kZTsKPiArCWludCBsZW4gPSAwLCBpID0gMCwgaiA9IDAsIGNvbmZpZ19j b3VudCA9IDA7Cj4gKwljb25zdCBjaGFyICpkYXRhOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBQ SFlfQVVYX0NGR19NQVg7IGkrKykgewo+ICsJCWNvbnN0IGNoYXIgKnByb3BlcnR5ID0gZHBfZ2V0 X3BoeV9hdXhfY29uZmlnX3Byb3BlcnR5KGkpOwo+ICsKCkl0IGxvb2tzIGxpa2UgdGhpcyBpcyBi YXNpY2FsbHkgdGhlIHNhbWUgYXM6CgpjaGFyIHByb3BlcnR5WzI0XTsKCnNucHJpbnRmKHByb3Bl cnR5LCBzaXplb2YocHJvcGVydHkpLCAicWNvbSxhdXgtY2ZnJWQtc2V0dGluZ3MiLCBpKTsKCj4g KwkJZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCBwcm9wZXJ0eSwgJmxlbik7Cj4gKwkJ aWYgKCFkYXRhKSB7Cj4gKwkJCURSTV9FUlJPUigiVW5hYmxlIHRvIHJlYWQgJXNcbiIsIHByb3Bl cnR5KTsKPiArCQkJZ290byBlcnJvcjsKPiArCQl9Cj4gKwo+ICsJCWNvbmZpZ19jb3VudCA9IGxl biAtIDE7Cj4gKwkJaWYgKGNvbmZpZ19jb3VudCA8IDEgfHwgLyogbWluaW11bSBjb25maWcgY291 bnQgPSAxICovCj4gKwkJCWNvbmZpZ19jb3VudCA+IERQX0FVWF9DRkdfTUFYX1ZBTFVFX0NOVCkg ewo+ICsJCQlEUk1fRVJST1IoIkludmFsaWQgY29uZmlnIGNvdW50ICglZCkgY29uZmlncyBmb3Ig JXNcbiIsCj4gKwkJCQkJY29uZmlnX2NvdW50LCBwcm9wZXJ0eSk7Cj4gKwkJCWdvdG8gZXJyb3I7 Cj4gKwkJfQo+ICsKPiArCQlwYXJzZXItPmF1eF9jZmdbaV0ub2Zmc2V0ID0gZGF0YVswXTsKPiAr CQlwYXJzZXItPmF1eF9jZmdbaV0uY2ZnX2NudCA9IGNvbmZpZ19jb3VudDsKPiArCQlEUk1fREVC VUdfRFAoIiVzIG9mZnNldD0weCV4LCBjZmdfY250PSVkXG4iLAo+ICsJCQkJcHJvcGVydHksCj4g KwkJCQlwYXJzZXItPmF1eF9jZmdbaV0ub2Zmc2V0LAo+ICsJCQkJcGFyc2VyLT5hdXhfY2ZnW2ld LmNmZ19jbnQpOwo+ICsJCWZvciAoaiA9IDE7IGogPCBsZW47IGorKykgewo+ICsJCQlwYXJzZXIt PmF1eF9jZmdbaV0ubHV0W2ogLSAxXSA9IGRhdGFbal07Cj4gKwkJCURSTV9ERUJVR19EUCgiJXMg bHV0WyVkXT0weCV4XG4iLAo+ICsJCQkJCXByb3BlcnR5LAo+ICsJCQkJCWksCj4gKwkJCQkJcGFy c2VyLT5hdXhfY2ZnW2ldLmx1dFtqIC0gMV0pOwo+ICsJCX0KPiArCX0KPiArCQlyZXR1cm4gMDsK PiArCj4gK2Vycm9yOgo+ICsJZm9yIChpID0gMDsgaSA8IFBIWV9BVVhfQ0ZHX01BWDsgaSsrKSB7 Cj4gKwkJcGFyc2VyLT5hdXhfY2ZnW2ldID0gKGNvbnN0IHN0cnVjdCBkcF9hdXhfY2ZnKXsgMCB9 Owo+ICsJfQoKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bh cnNlcl9taXNjKHN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcikKPiArewo+ICsJaW50IHJjID0gMDsK PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IHBhcnNlci0+cGRldi0+ZGV2Lm9mX25v ZGU7Cj4gKwoKb2ZfcHJvcGVydHlfcmVhZF91MzIgZG9lc24ndCBjaGFuZ2UgdGhlIHZhbHVlIG9m IHRoZSBwb2ludGVyIGlmIGl0IGhhcyBhbiBlcnJvciwKc28gdGhpcyBjYW4gYmU6CgpwYXJzZXIt Pm1heF9wY2xrX2toeiA9IERQX01BWF9QSVhFTF9DTEtfS0haOwpvZl9wcm9wZXJ0eV9yZWFkX3Uz MihvZl9ub2RlLCAicWNvbSxtYXgtcGNsay1mcmVxdWVuY3kta2h6IiwgJnBhcnNlci0+bWF4X3Bj bGtfa2h6KTsKCkFuZCB0aGF0cyBpdC4gIEluIGZhY3QsIHRoaXMgbWlnaHQgbm90IGV2ZW4gcXVh bGlmeSBhcyBhIGZ1bmN0aW9uIC0gaXQgc2VlbXMKbGlrZSB0aGlzIHdvdWxkIGJlIGEgbG90IGhh cHBpZXIgaWYgaXQgd2FzIGRvbmUgaW5saW5lLgoKPiArCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91 MzIob2Zfbm9kZSwKPiArCQkicWNvbSxtYXgtcGNsay1mcmVxdWVuY3kta2h6IiwgJnBhcnNlci0+ bWF4X3BjbGtfa2h6KTsKPiArCWlmIChyYykKPiArCQlwYXJzZXItPm1heF9wY2xrX2toeiA9IERQ X01BWF9QSVhFTF9DTEtfS0haOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGRwX3BhcnNlcl9waW5jdHJsKHN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcikKPiArewo+ICsJ c3RydWN0IGRwX3BpbmN0cmwgKnBpbmN0cmwgPSAmcGFyc2VyLT5waW5jdHJsOwo+ICsKPiArCXBp bmN0cmwtPnBpbiA9IGRldm1fcGluY3RybF9nZXQoJnBhcnNlci0+cGRldi0+ZGV2KTsKPiArCj4g KwlpZiAoSVNfRVJSX09SX05VTEwocGluY3RybC0+cGluKSkgewo+ICsJCURSTV9FUlJPUigiZmFp bGVkIHRvIGdldCBwaW5jdHJsLCByYz0lbGRcbiIsIFBUUl9FUlIocGluY3RybC0+cGluKSk7Cj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcGluY3RybC0+c3RhdGVfYWN0aXZlID0g cGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybC0+cGluLAo+ICsJCQkJCSJtZHNzX2RwX2FjdGl2 ZSIpOwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKHBpbmN0cmwtPnN0YXRlX2FjdGl2ZSkpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgcGluY3RybCBhY3RpdmUgc3RhdGUsICVsZFxuIiwK PiArCQkJUFRSX0VSUihwaW5jdHJsLT5zdGF0ZV9hY3RpdmUpKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwlwaW5jdHJsLT5zdGF0ZV9zdXNwZW5kID0gcGluY3RybF9sb29rdXBf c3RhdGUocGluY3RybC0+cGluLAo+ICsJCQkJCSJtZHNzX2RwX3NsZWVwIik7Cj4gKwlpZiAoSVNf RVJSX09SX05VTEwocGluY3RybC0+c3RhdGVfc3VzcGVuZCkpIHsKPiArCQlEUk1fRVJST1IoImZh aWxlZCB0byBnZXQgcGluY3RybCBzdXNwZW5kIHN0YXRlLCAlbGRcbiIsCj4gKwkJCVBUUl9FUlIo cGluY3RybC0+c3RhdGVfc3VzcGVuZCkpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3BhcnNlcl9ncGlvKHN0cnVj dCBkcF9wYXJzZXIgKnBhcnNlcikKPiArewo+ICsJaW50IGkgPSAwOwo+ICsJc3RydWN0IGRldmlj ZSAqZGV2ID0gJnBhcnNlci0+cGRldi0+ZGV2Owo+ICsJc3RydWN0IGRldmljZV9ub2RlICpvZl9u b2RlID0gZGV2LT5vZl9ub2RlOwo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKm1wID0gJnBh cnNlci0+bXBbRFBfQ09SRV9QTV07Cj4gKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRwX2dw aW9zW10gPSB7Cj4gKwkJInFjb20sYXV4LWVuLWdwaW8iLAo+ICsJCSJxY29tLGF1eC1zZWwtZ3Bp byIsCj4gKwkJInFjb20sdXNicGx1Zy1jYy1ncGlvIiwKPiArCX07Cj4gKwo+ICsJbXAtPmdwaW9f Y29uZmlnID0gZGV2bV9remFsbG9jKGRldiwKPiArCQlzaXplb2Yoc3RydWN0IGRzc19ncGlvKSAq IEFSUkFZX1NJWkUoZHBfZ3Bpb3MpLCBHRlBfS0VSTkVMKTsKCnVzZSBkZXZtX2tjYWxsb2MoKSBo ZXJlIGluc3RlYWQuCgo+ICsJaWYgKCFtcC0+Z3Bpb19jb25maWcpCj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4gKwo+ICsJbXAtPm51bV9ncGlvID0gQVJSQVlfU0laRShkcF9ncGlvcyk7Cj4gKwo+ICsJ Zm9yIChpID0gMDsgaSA8IG1wLT5udW1fZ3BpbzsgaSsrKSB7Cj4gKwkJbXAtPmdwaW9fY29uZmln W2ldLmdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhvZl9ub2RlLAo+ICsJCQlkcF9ncGlvc1tpXSwg MCk7Cj4gKwo+ICsJCWlmICghZ3Bpb19pc192YWxpZChtcC0+Z3Bpb19jb25maWdbaV0uZ3Bpbykp IHsKPiArCQkJRFJNX0VSUk9SKCIlcyBncGlvIG5vdCBzcGVjaWZpZWRcbiIsIGRwX2dwaW9zW2ld KTsKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlzdHJsY3B5KG1wLT5ncGlv X2NvbmZpZ1tpXS5ncGlvX25hbWUsIGRwX2dwaW9zW2ldLAo+ICsJCQlzaXplb2YobXAtPmdwaW9f Y29uZmlnW2ldLmdwaW9fbmFtZSkpOwo+ICsKPiArCQltcC0+Z3Bpb19jb25maWdbaV0udmFsdWUg PSAwOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QgY2hh ciAqZHBfcGFyc2VyX3N1cHBseV9ub2RlX25hbWUoZW51bSBkcF9wbV90eXBlIG1vZHVsZSkKPiAr ewo+ICsJc3dpdGNoIChtb2R1bGUpIHsKPiArCWNhc2UgRFBfQ09SRV9QTToJcmV0dXJuICJxY29t LGNvcmUtc3VwcGx5LWVudHJpZXMiOwo+ICsJY2FzZSBEUF9DVFJMX1BNOglyZXR1cm4gInFjb20s Y3RybC1zdXBwbHktZW50cmllcyI7Cj4gKwljYXNlIERQX1BIWV9QTToJCXJldHVybiAicWNvbSxw aHktc3VwcGx5LWVudHJpZXMiOwo+ICsJZGVmYXVsdDoJCXJldHVybiAiPz8/IjsKCklzIHRoaXMg ZXZlbiBwb3NzaWJsZT8KCj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcGFyc2VyX2dl dF92cmVnKHN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlciwKPiArCQllbnVtIGRwX3BtX3R5cGUgbW9k dWxlKQo+ICt7Cj4gKwlpbnQgaSA9IDAsIHJjID0gMDsKPiArCXUzMiB0bXAgPSAwOwo+ICsJY29u c3QgY2hhciAqcG1fc3VwcGx5X25hbWUgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpz dXBwbHlfbm9kZSA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBwYXJz ZXItPnBkZXYtPmRldi5vZl9ub2RlOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpzdXBwbHlfcm9v dF9ub2RlID0gTlVMTDsKPiArCXN0cnVjdCBkc3NfbW9kdWxlX3Bvd2VyICptcCA9ICZwYXJzZXIt Pm1wW21vZHVsZV07Cj4gKwo+ICsJbXAtPm51bV92cmVnID0gMDsKPiArCXBtX3N1cHBseV9uYW1l ID0gZHBfcGFyc2VyX3N1cHBseV9ub2RlX25hbWUobW9kdWxlKTsKPiArCXN1cHBseV9yb290X25v ZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShvZl9ub2RlLCBwbV9zdXBwbHlfbmFtZSk7Cj4gKwlp ZiAoIXN1cHBseV9yb290X25vZGUpIHsKPiArCQlEUk1fRVJST1IoIm5vIHN1cHBseSBlbnRyeSBw cmVzZW50OiAlc1xuIiwgcG1fc3VwcGx5X25hbWUpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsK PiArCW1wLT5udW1fdnJlZyA9IG9mX2dldF9hdmFpbGFibGVfY2hpbGRfY291bnQoc3VwcGx5X3Jv b3Rfbm9kZSk7Cj4gKwo+ICsJaWYgKG1wLT5udW1fdnJlZyA9PSAwKSB7Cj4gKwkJRFJNX0RFQlVH X0RQKCJubyB2cmVnXG4iKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlEUk1fREVCVUdf RFAoInZyZWcgZm91bmQuIGNvdW50PSVkXG4iLCBtcC0+bnVtX3ZyZWcpOwo+ICsKPiArCW1wLT52 cmVnX2NvbmZpZyA9IGRldm1fa3phbGxvYygmcGFyc2VyLT5wZGV2LT5kZXYsCj4gKwkJc2l6ZW9m KHN0cnVjdCBkc3NfdnJlZykgKiBtcC0+bnVtX3ZyZWcsIEdGUF9LRVJORUwpOwoKdXNlIGRldm1f a2NhbGxvYygpCgo+ICsJaWYgKCFtcC0+dnJlZ19jb25maWcpIHsKPiArCQltcC0+bnVtX3ZyZWcg PSAwOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ICsKPiArCWZvcl9lYWNoX2NoaWxkX29m X25vZGUoc3VwcGx5X3Jvb3Rfbm9kZSwgc3VwcGx5X25vZGUpIHsKPiArCQljb25zdCBjaGFyICpz dCA9IE5VTEw7Cj4gKwkJLyogdnJlZy1uYW1lICovCj4gKwkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFk X3N0cmluZyhzdXBwbHlfbm9kZSwKPiArCQkJInFjb20sc3VwcGx5LW5hbWUiLCAmc3QpOwo+ICsJ CWlmIChyYykgewo+ICsJCQlEUk1fRVJST1IoImVycm9yIHJlYWRpbmcgbmFtZS4gcmM9JWRcbiIs IHJjKTsKPiArCQkJbXAtPm51bV92cmVnID0gMDsKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiAr CQlzbnByaW50ZihtcC0+dnJlZ19jb25maWdbaV0udnJlZ19uYW1lLAo+ICsJCQlBUlJBWV9TSVpF KChtcC0+dnJlZ19jb25maWdbaV0udnJlZ19uYW1lKSksICIlcyIsIHN0KTsKPiArCQkvKiB2cmVn LW1pbi12b2x0YWdlICovCj4gKwkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihzdXBwbHlfbm9k ZSwKPiArCQkJInFjb20sc3VwcGx5LW1pbi12b2x0YWdlIiwgJnRtcCk7Cj4gKwkJaWYgKHJjKSB7 Cj4gKwkJCURSTV9FUlJPUigiZXJyb3IgcmVhZGluZyBtaW4gdm9sdC4gcmM9JWRcbiIsIHJjKTsK PiArCQkJbXAtPm51bV92cmVnID0gMDsKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiArCQltcC0+ dnJlZ19jb25maWdbaV0ubWluX3ZvbHRhZ2UgPSB0bXA7Cj4gKwo+ICsJCS8qIHZyZWctbWF4LXZv bHRhZ2UgKi8KPiArCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHN1cHBseV9ub2RlLAo+ICsJ CQkicWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UiLCAmdG1wKTsKPiArCQlpZiAocmMpIHsKPiArCQkJ RFJNX0VSUk9SKCJlcnJvciByZWFkaW5nIG1heCB2b2x0LiByYz0lZFxuIiwgcmMpOwo+ICsJCQlt cC0+bnVtX3ZyZWcgPSAwOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ICsJCW1wLT52cmVnX2Nv bmZpZ1tpXS5tYXhfdm9sdGFnZSA9IHRtcDsKPiArCj4gKwkJLyogZW5hYmxlLWxvYWQgKi8KPiAr CQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHN1cHBseV9ub2RlLAo+ICsJCQkicWNvbSxzdXBw bHktZW5hYmxlLWxvYWQiLCAmdG1wKTsKPiArCQlpZiAocmMpIHsKPiArCQkJRFJNX0VSUk9SKCJl cnJvciByZWFkaW5nIGVuYWJsZSBsb2FkLiByYz0lZFxuIiwgcmMpOwo+ICsJCQltcC0+bnVtX3Zy ZWcgPSAwOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ICsJCW1wLT52cmVnX2NvbmZpZ1tpXS5l bmFibGVfbG9hZCA9IHRtcDsKPiArCj4gKwkJLyogZGlzYWJsZS1sb2FkICovCj4gKwkJcmMgPSBv Zl9wcm9wZXJ0eV9yZWFkX3UzMihzdXBwbHlfbm9kZSwKPiArCQkJInFjb20sc3VwcGx5LWRpc2Fi bGUtbG9hZCIsICZ0bXApOwo+ICsJCWlmIChyYykgewo+ICsJCQlEUk1fRVJST1IoImVycm9yIHJl YWRpbmcgZGlzYWJsZSBsb2FkLiByYz0lZFxuIiwgcmMpOwo+ICsJCQkgbXAtPm51bV92cmVnID0g MDsKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiArCQltcC0+dnJlZ19jb25maWdbaV0uZGlzYWJs ZV9sb2FkID0gdG1wOwo+ICsKPiArCQlEUk1fREVCVUdfRFAoIiVzIG1pbj0lZCwgbWF4PSVkLCBl bmFibGU9JWQsIGRpc2FibGU9JWRcbiIsCj4gKwkJCW1wLT52cmVnX2NvbmZpZ1tpXS52cmVnX25h bWUsCj4gKwkJCW1wLT52cmVnX2NvbmZpZ1tpXS5taW5fdm9sdGFnZSwKPiArCQkJbXAtPnZyZWdf Y29uZmlnW2ldLm1heF92b2x0YWdlLAo+ICsJCQltcC0+dnJlZ19jb25maWdbaV0uZW5hYmxlX2xv YWQsCj4gKwkJCW1wLT52cmVnX2NvbmZpZ1tpXS5kaXNhYmxlX2xvYWQKPiArCQkJKTsKPiArCQkr K2k7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcGFy c2VyX3JlZ3VsYXRvcihzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCBpLCBy YyA9IDA7Cj4gKwo+ICsJLyogUGFyc2UgdGhlIHJlZ3VsYXRvciBpbmZvcm1hdGlvbiAqLwo+ICsJ Zm9yIChpID0gRFBfQ09SRV9QTTsgaSA8IERQX01BWF9QTTsgaSsrKSB7Cj4gKwkJcmMgPSBkcF9w YXJzZXJfZ2V0X3ZyZWcocGFyc2VyLCBpKTsKPiArCQlpZiAocmMpIHsKPiArCQkJRFJNX0VSUk9S KCJnZXRfZHRfdnJlZ19kYXRhIGZhaWxlZCBmb3IgJXMuIHJjPSVkXG4iLAo+ICsJCQkJZHBfcGFy c2VyX3BtX25hbWUoaSksIHJjKTsKCmRwX3BhcnNlcl9nZXRfdnJlZyBwcmludHMgYSBMT1Qgb2Yg ZXJyb3IgbWVzc2FnZXMuICBZb3UgZG9uJ3QgbmVlZCBhbnkgbW9yZS4KCj4gKwkJCWktLTsKClRo aXMgbGluZSBkb2Vzbid0IHNlZW0gdXNlZnVsLgoKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiAr CX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBib29sIGRwX3Bh cnNlcl9jaGVja19wcmVmaXgoY29uc3QgY2hhciAqY2xrX3ByZWZpeCwgY29uc3QgY2hhciAqY2xr X25hbWUpCj4gK3sKPiArCXJldHVybiAhc3RybmNtcChjbGtfcHJlZml4LCBjbGtfbmFtZSwgc3Ry bGVuKGNsa19wcmVmaXgpKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wYXJzZXJfaW5pdF9j bGtfZGF0YShzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCBudW1fY2xrID0g MCwgaSA9IDAsIHJjID0gMDsKPiArCWludCBjb3JlX2Nsa19jb3VudCA9IDAsIGN0cmxfY2xrX2Nv dW50ID0gMDsKPiArCWNvbnN0IGNoYXIgKmNsa19uYW1lOwo+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gJnBhcnNlci0+cGRldi0+ZGV2Owo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKmNvcmVf cG93ZXIgPSAmcGFyc2VyLT5tcFtEUF9DT1JFX1BNXTsKPiArCXN0cnVjdCBkc3NfbW9kdWxlX3Bv d2VyICpjdHJsX3Bvd2VyID0gJnBhcnNlci0+bXBbRFBfQ1RSTF9QTV07Cj4gKwo+ICsJbnVtX2Ns ayA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGV2LT5vZl9ub2RlLCAiY2xvY2stbmFtZXMi KTsKPiArCWlmIChudW1fY2xrIDw9IDApIHsKPiArCQlEUk1fRVJST1IoIm5vIGNsb2NrcyBhcmUg ZGVmaW5lZFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0g MDsgaSA8IG51bV9jbGs7IGkrKykgewo+ICsJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdf aW5kZXgoZGV2LT5vZl9ub2RlLAo+ICsJCQkJImNsb2NrLW5hbWVzIiwgaSwgJmNsa19uYW1lKTsK PiArCQlpZiAocmMpIHsKPiArCQkJRFJNX0VSUk9SKCJlcnJvciByZWFkaW5nIGNsb2NrLW5hbWVz ICVkXG4iLCByYyk7Cj4gKwkJCXJldHVybiByYzsKPiArCQl9Cj4gKwo+ICsJCWlmIChkcF9wYXJz ZXJfY2hlY2tfcHJlZml4KCJjb3JlIiwgY2xrX25hbWUpKQo+ICsJCQljb3JlX2Nsa19jb3VudCsr Owo+ICsKPiArCQlpZiAoZHBfcGFyc2VyX2NoZWNrX3ByZWZpeCgiY3RybCIsIGNsa19uYW1lKSkK PiArCQkJY3RybF9jbGtfY291bnQrKzsKPiArCX0KPiArCj4gKwkvKiBJbml0aWFsaXplIHRoZSBD T1JFIHBvd2VyIG1vZHVsZSAqLwo+ICsJaWYgKGNvcmVfY2xrX2NvdW50IDw9IDApIHsKPiArCQlE Uk1fRVJST1IoIm5vIGNvcmUgY2xvY2tzIGFyZSBkZWZpbmVkXG4iKTsKPiArCQlyZXR1cm4gLUVJ TlZBTDsKPiArCX0KPiArCj4gKwljb3JlX3Bvd2VyLT5udW1fY2xrID0gY29yZV9jbGtfY291bnQ7 Cj4gKwljb3JlX3Bvd2VyLT5jbGtfY29uZmlnID0gZGV2bV9remFsbG9jKGRldiwKPiArCQkJc2l6 ZW9mKHN0cnVjdCBkc3NfY2xrKSAqIGNvcmVfcG93ZXItPm51bV9jbGssCj4gKwkJCUdGUF9LRVJO RUwpOwoKdXNlIGRldm1fa2NhbGxvYygpCgo+ICsJaWYgKCFjb3JlX3Bvd2VyLT5jbGtfY29uZmln KSB7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7CgpyZXR1cm4gLUVOT01FTTsKCj4gKwl9Cj4gKwo+ICsJ LyogSW5pdGlhbGl6ZSB0aGUgQ1RSTCBwb3dlciBtb2R1bGUgKi8KPiArCWlmIChjdHJsX2Nsa19j b3VudCA8PSAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJubyBjdHJsIGNsb2NrcyBhcmUgZGVmaW5lZFxu Iik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJY3RybF9wb3dlci0+bnVtX2Ns ayA9IGN0cmxfY2xrX2NvdW50Owo+ICsJY3RybF9wb3dlci0+Y2xrX2NvbmZpZyA9IGRldm1fa3ph bGxvYyhkZXYsCj4gKwkJCXNpemVvZihzdHJ1Y3QgZHNzX2NsaykgKiBjdHJsX3Bvd2VyLT5udW1f Y2xrLAoKdXNlIGRldm1fa2NhbGxvYygpCgo+ICsJCQlHRlBfS0VSTkVMKTsKPiArCWlmICghY3Ry bF9wb3dlci0+Y2xrX2NvbmZpZykgewo+ICsJCWN0cmxfcG93ZXItPm51bV9jbGsgPSAwOwo+ICsJ CXJldHVybiAtRUlOVkFMOwoKcmV0dXJuIC1FTk9NRU07Cgo+ICsJfQo+ICsKPiArCXJldHVybiAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3BhcnNlcl9jbG9jayhzdHJ1Y3QgZHBfcGFyc2Vy ICpwYXJzZXIpCj4gK3sKPiArCWludCByYyA9IDAsIGkgPSAwOwo+ICsJaW50IG51bV9jbGsgPSAw Owo+ICsJaW50IGNvcmVfY2xrX2luZGV4ID0gMCwgY3RybF9jbGtfaW5kZXggPSAwOwo+ICsJaW50 IGNvcmVfY2xrX2NvdW50ID0gMCwgY3RybF9jbGtfY291bnQgPSAwOwo+ICsJY29uc3QgY2hhciAq Y2xrX25hbWU7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGFyc2VyLT5wZGV2LT5kZXY7Cj4g KwlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciAqY29yZV9wb3dlciA9ICZwYXJzZXItPm1wW0RQX0NP UkVfUE1dOwo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKmN0cmxfcG93ZXIgPSAmcGFyc2Vy LT5tcFtEUF9DVFJMX1BNXTsKPiArCj4gKwljb3JlX3Bvd2VyID0gJnBhcnNlci0+bXBbRFBfQ09S RV9QTV07Cj4gKwljdHJsX3Bvd2VyID0gJnBhcnNlci0+bXBbRFBfQ1RSTF9QTV07Cj4gKwo+ICsJ cmMgPSAgZHBfcGFyc2VyX2luaXRfY2xrX2RhdGEocGFyc2VyKTsKPiArCWlmIChyYykgewo+ICsJ CURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgcG93ZXIgZGF0YSAlZFxuIiwgcmMpOwoK UGxlbnR5IG9mIGVycm9yIG1lc3NhZ2VzIGluIGRwX3BhcnNlcl9pbml0X2Nsa19kYXRhOwoKPiAr CQlyZXR1cm4gLUVJTlZBTDsKCllvdSBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGRwX3Bh cnNlcl9pbml0X2Nsa19kYXRhIHJldHVybmVkLgoKPiArCX0KPiArCj4gKwljb3JlX2Nsa19jb3Vu dCA9IGNvcmVfcG93ZXItPm51bV9jbGs7Cj4gKwljdHJsX2Nsa19jb3VudCA9IGN0cmxfcG93ZXIt Pm51bV9jbGs7Cj4gKwo+ICsJbnVtX2NsayA9IGNvcmVfY2xrX2NvdW50ICsgY3RybF9jbGtfY291 bnQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IG51bV9jbGs7IGkrKykgewo+ICsJCXJjID0gb2Zf cHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLCAiY2xvY2stbmFtZXMiLAo+ ICsJCQkJaSwgJmNsa19uYW1lKTsKPiArCQlpZiAocmMpIHsKPiArCQkJIERSTV9FUlJPUigiZXJy b3IgcmVhZGluZyBjbG9jay1uYW1lcyAlZFxuIiwgcmMpOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJ fQo+ICsJCWlmIChkcF9wYXJzZXJfY2hlY2tfcHJlZml4KCJjb3JlIiwgY2xrX25hbWUpICYmCj4g KwkJCQljb3JlX2Nsa19pbmRleCA8IGNvcmVfY2xrX2NvdW50KSB7Cj4gKwkJCXN0cnVjdCBkc3Nf Y2xrICpjbGsgPQo+ICsJCQkJJmNvcmVfcG93ZXItPmNsa19jb25maWdbY29yZV9jbGtfaW5kZXhd Owo+ICsJCQlzdHJsY3B5KGNsay0+Y2xrX25hbWUsIGNsa19uYW1lLCBzaXplb2YoY2xrLT5jbGtf bmFtZSkpOwo+ICsJCQljbGstPnR5cGUgPSBEU1NfQ0xLX0FIQjsKPiArCQkJY29yZV9jbGtfaW5k ZXgrKzsKPiArCQl9IGVsc2UgaWYgKGRwX3BhcnNlcl9jaGVja19wcmVmaXgoImN0cmwiLCBjbGtf bmFtZSkgJiYKPiArCQkJICAgY3RybF9jbGtfaW5kZXggPCBjdHJsX2Nsa19jb3VudCkgewo+ICsJ CQlzdHJ1Y3QgZHNzX2NsayAqY2xrID0KPiArCQkJCSZjdHJsX3Bvd2VyLT5jbGtfY29uZmlnW2N0 cmxfY2xrX2luZGV4XTsKPiArCQkJc3RybGNweShjbGstPmNsa19uYW1lLCBjbGtfbmFtZSwgc2l6 ZW9mKGNsay0+Y2xrX25hbWUpKTsKPiArCQkJY3RybF9jbGtfaW5kZXgrKzsKPiArCj4gKwkJCWlm ICghc3RybmNtcChjbGtfbmFtZSwgImN0cmxfbGlua19jbGsiLCBzdHJsZW4oImN0cmxfbGlua19j bGsiKSkgfHwKPiArCQkJICAhc3RybmNtcChjbGtfbmFtZSwgImN0cmxfcGl4ZWxfY2xrIiwgc3Ry bGVuKCJjdHJsX3BpeGVsX2NsayIpKSkKCkFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlICJjbGsiIGV4 dGVuc2lvbiBpcyBmcm93bmVkIHVwb24uICBBbmQgSSBkb24ndCB0aGluayB5b3UKd2FudCB0byB1 c2Ugc3RybmNtcCBoZXJlIGJlY2F1c2UgeW91IGFyZSBjb21wYXJpbmcgdGhlIGVudGlyZSBzdHJp bmcgc28KdXNlIHN0cmNtcCgpIGluc3RlYWQuCgo+ICsJCQkJY2xrLT50eXBlID0gRFNTX0NMS19Q Q0xLOwo+ICsJCQllbHNlCj4gKwkJCQljbGstPnR5cGUgPSBEU1NfQ0xLX0FIQjsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJRFJNX0RFQlVHX0RQKCJjbG9jayBwYXJzaW5nIHN1Y2Nlc3NmdWxcbiIpOwo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3BhcnNlcl9wYXJzZShz dHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwo+ICsJaWYg KCFwYXJzZXIpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsJfQoKVGhpcyB3b24ndCBiZSBOVUxMLgoKPiArCj4gKwlyYyA9IGRwX3Bh cnNlcl9jdHJsX3JlcyhwYXJzZXIpOwo+ICsJaWYgKHJjKQo+ICsJCXJldHVybiByYzsKPiArCj4g KwlyYyA9IGRwX3BhcnNlcl9hdXgocGFyc2VyKTsKPiArCWlmIChyYykKPiArCQlyZXR1cm4gcmM7 Cj4gKwo+ICsJcmMgPSBkcF9wYXJzZXJfbWlzYyhwYXJzZXIpOwo+ICsJaWYgKHJjKQo+ICsJCXJl dHVybiByYzsKPiArCj4gKwlyYyA9IGRwX3BhcnNlcl9jbG9jayhwYXJzZXIpOwo+ICsJaWYgKHJj KQo+ICsJCXJldHVybiByYzsKPiArCj4gKwlyYyA9IGRwX3BhcnNlcl9yZWd1bGF0b3IocGFyc2Vy KTsKPiArCWlmIChyYykKPiArCQlyZXR1cm4gcmM7Cj4gKwo+ICsJcmMgPSBkcF9wYXJzZXJfZ3Bp byhwYXJzZXIpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJ1bmFibGUgdG8gcGFyc2Ug R1BJT3NcbiIpOwo+ICsJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwlyYyA9IGRwX3BhcnNlcl9w aW5jdHJsKHBhcnNlcik7Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgZHBf cGFyc2VyICpkcF9wYXJzZXJfZ2V0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sK PiArCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcjsKPiArCj4gKwlwYXJzZXIgPSBkZXZtX2t6YWxs b2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwYXJzZXIpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcGFy c2VyKQo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ICsKPiArCXBhcnNlci0+cGFyc2Ug PSBkcF9wYXJzZXJfcGFyc2U7Cj4gKwlwYXJzZXItPnBkZXYgPSBwZGV2Owo+ICsKPiArCXJldHVy biBwYXJzZXI7Cj4gK30KPiArCj4gK3ZvaWQgZHBfcGFyc2VyX3B1dChzdHJ1Y3QgZHBfcGFyc2Vy ICpwYXJzZXIpCj4gK3sKPiArCj4gK30KCldoeSBkb2VzIHRoaXMgc3R1YiBldmVuIGV4aXN0PwoK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuaCBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGlu ZGV4IDAwMDAwMDAuLmUzNWE1MGIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21zbS9kcC9kcF9wYXJzZXIuaAo+IEBAIC0wLDAgKzEsMTk2IEBACj4gKy8qIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KPiArLyoKPiArICogQ29weXJpZ2h0IChj KSAyMDEyLTIwMTksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ ICsgKi8KPiArCj4gKyNpZm5kZWYgX0RQX1BBUlNFUl9IXwo+ICsjZGVmaW5lIF9EUF9QQVJTRVJf SF8KPiArCj4gKyNpbmNsdWRlICJkcHVfaW9fdXRpbC5oIgo+ICsKPiArI2RlZmluZSBEUF9MQUJF TCAiTURTUyBEUCBESVNQTEFZIgo+ICsjZGVmaW5lIEFVWF9DRkdfTEVOCTEwCj4gKyNkZWZpbmUg RFBfTUFYX1BJWEVMX0NMS19LSFoJNjc1MDAwCj4gKwo+ICtlbnVtIGRwX3BtX3R5cGUgewo+ICsJ RFBfQ09SRV9QTSwKPiArCURQX0NUUkxfUE0sCj4gKwlEUF9QSFlfUE0sCj4gKwlEUF9NQVhfUE0K CkNvbW1hIG5lZWRlZCBhZnRlciB0aGlzIGxpbmUuCgo+ICt9Owo+ICsKPiArc3RhdGljIGlubGlu ZSBjb25zdCBjaGFyICpkcF9wYXJzZXJfcG1fbmFtZShlbnVtIGRwX3BtX3R5cGUgbW9kdWxlKQo+ ICt7Cj4gKwlzd2l0Y2ggKG1vZHVsZSkgewo+ICsJY2FzZSBEUF9DT1JFX1BNOglyZXR1cm4gIkRQ X0NPUkVfUE0iOwo+ICsJY2FzZSBEUF9DVFJMX1BNOglyZXR1cm4gIkRQX0NUUkxfUE0iOwo+ICsJ Y2FzZSBEUF9QSFlfUE06CQlyZXR1cm4gIkRQX1BIWV9QTSI7Cj4gKwlkZWZhdWx0OgkJcmV0dXJu ICI/Pz8iOwoKQXMgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZyB2 ZXJ5IHNpbWlsYXIsIEkgZG9uJ3QgdGhpbmsgdGhpcwppcyBwb3NzaWJsZS4KCj4gKwl9Cj4gK30K PiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgZHBfZGlzcGxheV9kYXRhICAtIGRpc3BsYXkgcmVsYXRl ZCBkZXZpY2UgdHJlZSBkYXRhLgo+ICsgKgo+ICsgKiBAY3RybF9ub2RlOiByZWZlcmVjZSB0byBj b250cm9sbGVyIGRldmljZQoKcmVmcmVjZSAtPiByZWZlcmVuY2UKCj4gKyAqIEBwaHlfbm9kZTog IHJlZmVyZW5jZSB0byBwaHkgZGV2aWNlCj4gKyAqIEBpc19hY3RpdmU6IGlzIHRoZSBjb250cm9s bGVyIGN1cnJlbnRseSBhY3RpdmUKPiArICogQG5hbWU6IG5hbWUgb2YgdGhlIGRpc3BsYXkKPiAr ICogQGRpc3BsYXlfdHlwZTogdHlwZSBvZiB0aGUgZGlzcGxheQo+ICsgKi8KPiArc3RydWN0IGRw X2Rpc3BsYXlfZGF0YSB7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0cmxfbm9kZTsKPiArCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7Cj4gKwlib29sIGlzX2FjdGl2ZTsKPiArCWNvbnN0 IGNoYXIgKm5hbWU7Cj4gKwljb25zdCBjaGFyICpkaXNwbGF5X3R5cGU7Cj4gK307Cj4gKwo+ICsv KioKPiArICogc3RydWN0IGRwX2N0cmxfcmVzb3VyY2UgLSBjb250cm9sbGVyJ3MgSU8gcmVsYXRl ZCBkYXRhCj4gKyAqCj4gKyAqIEBkcF9haGI6IGNvbnRyb2xsZXIncyBhaGIgbWFwcGVkIG1lbW9y eSBhZGRyZXNzCj4gKyAqIEBkcF9hdXg6IGNvbnRyb2xsZXIncyBhdXggbWFwcGVkIG1lbW9yeSBh ZGRyZXNzCj4gKyAqIEBkcF9saW5rOiBjb250cm9sbGVyJ3MgbGluayBtYXBwZWQgbWVtb3J5IGFk ZHJlc3MKPiArICogQGRwX3AwOiBjb250cm9sbGVyJ3MgcDAgbWFwcGVkIG1lbW9yeSBhZGRyZXNz Cj4gKyAqIEBwaHlfaW86IHBoeSdzIG1hcHBlZCBtZW1vcnkgYWRkcmVzcwo+ICsgKiBAbG5fdHgw X2lvOiBVU0ItRFAgbGFuZSBUWDAncyBtYXBwZWQgbWVtb3J5IGFkZHJlc3MKPiArICogQGxuX3R4 MV9pbzogVVNCLURQIGxhbmUgVFgxJ3MgbWFwcGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAqIEBkcF9j Y19pbzogRFAgY2MncyBtYXBwZWQgbWVtb3J5IGFkZHJlc3MKPiArICogQHFmcHJvbV9pbzogcWZw cm9tJ3MgbWFwcGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAqIEBkcF9wbGxfaW86IERQIFBMTCBtYXBw ZWQgbWVtb3J5IGFkZHJlc3MKPiArICogQHVzYjNfZHBfY29tOiBVU0IzIERQIFBIWSBjb21ibyBt YXBwZWQgbWVtb3J5IGFkZHJlc3MKPiArICovCj4gK3N0cnVjdCBkcF9pbyB7Cj4gKwlzdHJ1Y3Qg ZHNzX2lvX2RhdGEgY3RybF9pbzsKPiArCXN0cnVjdCBkc3NfaW9fZGF0YSBkcF9haGI7Cj4gKwlz dHJ1Y3QgZHNzX2lvX2RhdGEgZHBfYXV4Owo+ICsJc3RydWN0IGRzc19pb19kYXRhIGRwX2xpbms7 Cj4gKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgZHBfcDA7Cj4gKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgcGh5 X2lvOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIGxuX3R4MF9pbzsKPiArCXN0cnVjdCBkc3NfaW9f ZGF0YSBsbl90eDFfaW87Cj4gKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgZHBfY2NfaW87Cj4gKwlzdHJ1 Y3QgZHNzX2lvX2RhdGEgcWZwcm9tX2lvOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIGRwX3BsbF9p bzsKPiArCXN0cnVjdCBkc3NfaW9fZGF0YSB1c2IzX2RwX2NvbTsKPiArfTsKPiArCj4gKy8qKgo+ ICsgKiBzdHJ1Y3QgZHBfcGluY3RybCAtIERQJ3MgcGluIGNvbnRyb2wKPiArICoKPiArICogQHBp bjogcGluLWNvbnRyb2xsZXIncyBpbnN0YW5jZQo+ICsgKiBAc3RhdGVfYWN0aXZlOiBhY3RpdmUg c3RhdGUgcGluIGNvbnRyb2wKPiArICogQHN0YXRlX2hwZF9hY3RpdmU6IGhwZCBhY3RpdmUgc3Rh dGUgcGluIGNvbnRyb2wKPiArICogQHN0YXRlX3N1c3BlbmQ6IHN1c3BlbmQgc3RhdGUgcGluIGNv bnRyb2wKPiArICovCj4gK3N0cnVjdCBkcF9waW5jdHJsIHsKPiArCXN0cnVjdCBwaW5jdHJsICpw aW47Cj4gKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqc3RhdGVfYWN0aXZlOwo+ICsJc3RydWN0IHBp bmN0cmxfc3RhdGUgKnN0YXRlX2hwZF9hY3RpdmU7Cj4gKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAq c3RhdGVfc3VzcGVuZDsKPiArfTsKPiArCj4gKyNkZWZpbmUgRFBfRU5VTV9TVFIoeCkJI3gKPiAr I2RlZmluZSBEUF9BVVhfQ0ZHX01BWF9WQUxVRV9DTlQgMwo+ICsvKioKPiArICogc3RydWN0IGRw X2F1eF9jZmcgLSBEUCdzIEFVWCBjb25maWd1cmF0aW9uIHNldHRpbmdzCj4gKyAqCj4gKyAqIEBj ZmdfY250OiBjb3VudCBvZiB0aGUgY29uZmlndXJhYmxlIHNldHRpbmdzIGZvciB0aGUgQVVYIHJl Z2lzdGVyCj4gKyAqIEBjdXJyZW50X2luZGV4OiBjdXJyZW50IGluZGV4IG9mIHRoZSBBVVggY29u ZmlnIGx1dAo+ICsgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgb2YgdGhlIEFVWCBjb25maWcg cmVnaXN0ZXIKPiArICogQGx1dDogbG9vayB1cCB0YWJsZSBmb3IgdGhlIEFVWCBjb25maWcgdmFs dWVzIGZvciB0aGlzIHJlZ2lzdGVyCj4gKyAqLwo+ICtzdHJ1Y3QgZHBfYXV4X2NmZyB7Cj4gKwl1 MzIgY2ZnX2NudDsKPiArCXUzMiBjdXJyZW50X2luZGV4Owo+ICsJdTMyIG9mZnNldDsKPiArCXUz MiBsdXRbRFBfQVVYX0NGR19NQVhfVkFMVUVfQ05UXTsKPiArfTsKPiArCj4gKy8qIFBIWSBBVVgg Y29uZmlnIHJlZ2lzdGVycyAqLwo+ICtlbnVtIGRwX3BoeV9hdXhfY29uZmlnX3R5cGUgewo+ICsJ UEhZX0FVWF9DRkcwLAo+ICsJUEhZX0FVWF9DRkcxLAo+ICsJUEhZX0FVWF9DRkcyLAo+ICsJUEhZ X0FVWF9DRkczLAo+ICsJUEhZX0FVWF9DRkc0LAo+ICsJUEhZX0FVWF9DRkc1LAo+ICsJUEhZX0FV WF9DRkc2LAo+ICsJUEhZX0FVWF9DRkc3LAo+ICsJUEhZX0FVWF9DRkc4LAo+ICsJUEhZX0FVWF9D Rkc5LAo+ICsJUEhZX0FVWF9DRkdfTUFYLAo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSBjaGFy ICpkcF9waHlfYXV4X2NvbmZpZ190eXBlX3RvX3N0cmluZyh1MzIgY2ZnX3R5cGUpCj4gK3sKPiAr CXN3aXRjaCAoY2ZnX3R5cGUpIHsKPiArCWNhc2UgUEhZX0FVWF9DRkcwOgo+ICsJCXJldHVybiBE UF9FTlVNX1NUUihQSFlfQVVYX0NGRzApOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzE6Cj4gKwkJcmV0 dXJuIERQX0VOVU1fU1RSKFBIWV9BVVhfQ0ZHMSk7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHMjoKPiAr CQlyZXR1cm4gRFBfRU5VTV9TVFIoUEhZX0FVWF9DRkcyKTsKPiArCWNhc2UgUEhZX0FVWF9DRkcz Ogo+ICsJCXJldHVybiBEUF9FTlVNX1NUUihQSFlfQVVYX0NGRzMpOwo+ICsJY2FzZSBQSFlfQVVY X0NGRzQ6Cj4gKwkJcmV0dXJuIERQX0VOVU1fU1RSKFBIWV9BVVhfQ0ZHNCk7Cj4gKwljYXNlIFBI WV9BVVhfQ0ZHNToKPiArCQlyZXR1cm4gRFBfRU5VTV9TVFIoUEhZX0FVWF9DRkc1KTsKPiArCWNh c2UgUEhZX0FVWF9DRkc2Ogo+ICsJCXJldHVybiBEUF9FTlVNX1NUUihQSFlfQVVYX0NGRzYpOwo+ ICsJY2FzZSBQSFlfQVVYX0NGRzc6Cj4gKwkJcmV0dXJuIERQX0VOVU1fU1RSKFBIWV9BVVhfQ0ZH Nyk7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHODoKPiArCQlyZXR1cm4gRFBfRU5VTV9TVFIoUEhZX0FV WF9DRkc4KTsKPiArCWNhc2UgUEhZX0FVWF9DRkc5Ogo+ICsJCXJldHVybiBEUF9FTlVNX1NUUihQ SFlfQVVYX0NGRzkpOwo+ICsJZGVmYXVsdDoKPiArCQlyZXR1cm4gInVua25vd24iOwo+ICsJfQo+ ICt9Cj4gKwo+ICsvKioKPiArICogc3RydWN0IGRwX3BhcnNlciAtIERQIHBhcnNlcidzIGRhdGEg ZXhwb3NlZCB0byBjbGllbnRzCj4gKyAqCj4gKyAqIEBwZGV2OiBwbGF0Zm9ybSBkYXRhIG9mIHRo ZSBjbGllbnQKPiArICogQG1wOiBncGlvLCByZWd1bGF0b3IgYW5kIGNsb2NrIHJlbGF0ZWQgZGF0 YQo+ICsgKiBAcGluY3RybDogcGluLWNvbnRyb2wgcmVsYXRlZCBkYXRhCj4gKyAqIEBkaXNwX2Rh dGE6IGNvbnRyb2xsZXIncyBkaXNwbGF5IHJlbGF0ZWQgZGF0YQo+ICsgKiBAcGFyc2U6IGZ1bmN0 aW9uIHRvIGJlIGNhbGxlZCBieSBjbGllbnQgdG8gcGFyc2UgZGV2aWNlIHRyZWUuCj4gKyAqLwo+ ICtzdHJ1Y3QgZHBfcGFyc2VyIHsKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cj4g KwlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciBtcFtEUF9NQVhfUE1dOwo+ICsJc3RydWN0IGRwX3Bp bmN0cmwgcGluY3RybDsKPiArCXN0cnVjdCBkcF9pbyBpbzsKPiArCXN0cnVjdCBkcF9kaXNwbGF5 X2RhdGEgZGlzcF9kYXRhOwo+ICsKPiArCXU4IGxfbWFwWzRdOwo+ICsJc3RydWN0IGRwX2F1eF9j ZmcgYXV4X2NmZ1tBVVhfQ0ZHX0xFTl07Cj4gKwl1MzIgbWF4X3BjbGtfa2h6Owo+ICsKPiArCWlu dCAoKnBhcnNlKShzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpOwo+ICt9Owo+ICsKPiArLyoqCj4g KyAqIGRwX3BhcnNlcl9nZXQoKSAtIGdldCB0aGUgRFAncyBkZXZpY2UgdHJlZSBwYXJzZXIgbW9k dWxlCj4gKyAqCj4gKyAqIEBwZGV2OiBwbGF0Zm9ybSBkYXRhIG9mIHRoZSBjbGllbnQKPiArICog cmV0dXJuOiBwb2ludGVyIHRvIGRwX3BhcnNlciBzdHJ1Y3R1cmUuCj4gKyAqCj4gKyAqIFRoaXMg ZnVuY3Rpb24gcHJvdmlkZXMgY2xpZW50IGNhcGFiaWxpdHkgdG8gcGFyc2UgdGhlCj4gKyAqIGRl dmljZSB0cmVlIGFuZCBwb3B1bGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgZGF0YQo+ICsg KiByZWxhdGVkIHRvIGNsb2NrLCByZWd1bGF0b3JzLCBwaW4tY29udHJvbCBhbmQgb3RoZXIKPiAr ICogY2FuIGJlIHBhcnNlZCB1c2luZyB0aGlzIG1vZHVsZS4KPiArICovCj4gK3N0cnVjdCBkcF9w YXJzZXIgKmRwX3BhcnNlcl9nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Cj4gKwo+ ICsvKioKPiArICogZHBfcGFyc2VyX3B1dCgpIC0gY2xlYW5zIHRoZSBkcF9wYXJzZXIgbW9kdWxl Cj4gKyAqCj4gKyAqIEBwYXJzZXI6IHBvaW50ZXIgdG8gdGhlIHBhcnNlcidzIGRhdGEuCj4gKyAq Lwo+ICt2b2lkIGRwX3BhcnNlcl9wdXQoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKTsKPiArI2Vu ZGlmCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcG93ZXIuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcG93ZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMC4uNDc4ZGU3MAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmMKPiBAQCAtMCwwICsxLDczMyBAQAo+ICsvLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykg MjAxMi0yMDE5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAr ICovCj4gKwo+ICsjZGVmaW5lIHByX2ZtdChmbXQpCSJbZHJtLWRwXSAlczogIiBmbXQsIF9fZnVu Y19fCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1 bGF0b3IvY29uc3VtZXIuaD4KPiArI2luY2x1ZGUgImRwX3Bvd2VyLmgiCj4gKwo+ICsjZGVmaW5l IERQX0NMSUVOVF9OQU1FX1NJWkUJMjAKPiArCj4gK3N0cnVjdCBkcF9wb3dlcl9wcml2YXRlIHsK PiArCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcjsKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXY7Cj4gKwlzdHJ1Y3QgY2xrICpwaXhlbF9jbGtfcmNnOwo+ICsJc3RydWN0IGNsayAqbGlu a19jbGtfc3JjOwo+ICsJc3RydWN0IGNsayAqcGl4ZWxfcHJvdmlkZXI7Cj4gKwlzdHJ1Y3QgY2xr ICpsaW5rX3Byb3ZpZGVyOwo+ICsKPiArCXN0cnVjdCBkcF9wb3dlciBkcF9wb3dlcjsKPiArfTsK PiArCj4gK3N0YXRpYyBpbnQgbXNtX2Rzc19pbml0X3ZyZWcoc3RydWN0IGRldmljZSAqZGV2LCBz dHJ1Y3QgZHNzX3ZyZWcgKmluX3ZyZWcsCj4gKwkJCWludCBudW1fdnJlZykKPiArewo+ICsJaW50 IGkgPSAwLCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHNzX3ZyZWcgKmN1cnJfdnJlZyA9IE5VTEw7Cj4g KwllbnVtIGRzc192cmVnX3R5cGUgdHlwZTsKPiArCj4gKwlpZiAoIWluX3ZyZWcgfHwgIW51bV92 cmVnKQo+ICsJCXJldHVybiByYzsKClRoaXMgY2FuIGp1c3QgYmUgcmV0dXJuIDAKCj4gKwo+ICsJ Zm9yIChpID0gMDsgaSA8IG51bV92cmVnOyBpKyspIHsKPiArCQljdXJyX3ZyZWcgPSAmaW5fdnJl Z1tpXTsKPiArCQljdXJyX3ZyZWctPnZyZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LAo+ICsJ CQljdXJyX3ZyZWctPnZyZWdfbmFtZSk7Cj4gKwkJcmMgPSBQVFJfUkVUKGN1cnJfdnJlZy0+dnJl Zyk7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCURSTV9ERVZfRVJST1IoZGV2LCAiJXBTLT4lczogJXMg Z2V0IGZhaWxlZC4gcmM9JWRcbiIsCj4gKwkJCQkgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDAp LCBfX2Z1bmNfXywKCnRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBvbmUgc3BvdCwg c28gcHJpbnRpbmcgdGhlIHJldHVybiBhZGRyZXNzIGlzbid0CnVzZWZ1bC4KCj4gKwkJCQkgY3Vy cl92cmVnLT52cmVnX25hbWUsIHJjKTsKPiArCQkJY3Vycl92cmVnLT52cmVnID0gTlVMTDsKPiAr CQkJZ290byB2cmVnX2dldF9mYWlsOwo+ICsJCX0KPiArCQl0eXBlID0gKHJlZ3VsYXRvcl9jb3Vu dF92b2x0YWdlcyhjdXJyX3ZyZWctPnZyZWcpID4gMCkKPiArCQkJCT8gRFNTX1JFR19MRE8gOiBE U1NfUkVHX1ZTOwo+ICsJCWlmICh0eXBlID09IERTU19SRUdfTERPKSB7Cj4gKwkJCXJjID0gcmVn dWxhdG9yX3NldF92b2x0YWdlKAo+ICsJCQkJY3Vycl92cmVnLT52cmVnLAo+ICsJCQkJY3Vycl92 cmVnLT5taW5fdm9sdGFnZSwKPiArCQkJCWN1cnJfdnJlZy0+bWF4X3ZvbHRhZ2UpOwo+ICsJCQlp ZiAocmMgPCAwKSB7Cj4gKwkJCQlEUk1fREVWX0VSUk9SKGRldiwgIiVwUy0+JXM6JXMgc2V0IHZs dGcgZmFpbFxuIiwKPiArCQkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksCgpTYW1lCgo+ ICsJCQkJCV9fZnVuY19fLAo+ICsJCQkJCWN1cnJfdnJlZy0+dnJlZ19uYW1lKTsKPiArCQkJCWdv dG8gdnJlZ19zZXRfdm9sdGFnZV9mYWlsOwo+ICsJCQl9Cj4gKwkJfQo+ICsJfQo+ICsJcmV0dXJu IDA7Cj4gKwo+ICt2cmVnX3VuY29uZmlnOgo+ICtpZiAodHlwZSA9PSBEU1NfUkVHX0xETykKPiAr CXJlZ3VsYXRvcl9zZXRfbG9hZChjdXJyX3ZyZWctPnZyZWcsIDApOwo+ICsKPiArdnJlZ19zZXRf dm9sdGFnZV9mYWlsOgo+ICsJZGV2bV9yZWd1bGF0b3JfcHV0KGN1cnJfdnJlZy0+dnJlZyk7CgpU aGlzIHdpbGwgYmUgZG9uZSB3aGVuIHRoZSBkZXZpY2UvY29tcG9uZW50IGlzIGRlc3Ryb3llZC4K Cj4gKwljdXJyX3ZyZWctPnZyZWcgPSBOVUxMOwo+ICsKPiArdnJlZ19nZXRfZmFpbDoKPiArCWZv ciAoaS0tOyBpID49IDA7IGktLSkgewo+ICsJCWN1cnJfdnJlZyA9ICZpbl92cmVnW2ldOwo+ICsJ CXR5cGUgPSAocmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKGN1cnJfdnJlZy0+dnJlZykgPiAwKQo+ ICsJCQk/IERTU19SRUdfTERPIDogRFNTX1JFR19WUzsKPiArCQlnb3RvIHZyZWdfdW5jb25maWc7 Cj4gKwl9CgpBbGwgb2YgdGhpcyBpcyBzcGFnaGV0dGkgY29kZSB0aGF0IGNvdWxkIGJlIHR1cm5l ZCBpbnRvIGp1c3QgYSBmZXcgbGluZXM6CgogZm9yKCA7IGkgPj0gMDsgaS0tKSB7CiAJaWYgKGlu X3ZyZWdbaV0udnJlZykKCQlyZWd1bGF0b3Jfc2V0X2xvYWQoaW5fdnJlZ1tpXS52cmVnLCAwKTsK IH0KCgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG1zbV9kc3NfZGVpbml0 X3ZyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHNzX3ZyZWcgKmluX3ZyZWcsCj4gKwkJ CWludCBudW1fdnJlZykKPiArewo+ICsJaW50IGkgPSAwLCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHNz X3ZyZWcgKmN1cnJfdnJlZyA9IE5VTEw7Cj4gKwllbnVtIGRzc192cmVnX3R5cGUgdHlwZTsKPiAr Cj4gKwlpZiAoIWluX3ZyZWcgfHwgIW51bV92cmVnKQo+ICsJCXJldHVybiByYzsKPiArCj4gKwlm b3IgKGkgPSBudW1fdnJlZy0xOyBpID49IDA7IGktLSkgewo+ICsJCWN1cnJfdnJlZyA9ICZpbl92 cmVnW2ldOwo+ICsJCWlmIChjdXJyX3ZyZWctPnZyZWcpIHsKPiArCQkJdHlwZSA9IChyZWd1bGF0 b3JfY291bnRfdm9sdGFnZXMoCj4gKwkJCQljdXJyX3ZyZWctPnZyZWcpID4gMCkKPiArCQkJCT8g RFNTX1JFR19MRE8gOiBEU1NfUkVHX1ZTOwo+ICsJCQlpZiAodHlwZSA9PSBEU1NfUkVHX0xETykg ewo+ICsJCQkJcmVndWxhdG9yX3NldF92b2x0YWdlKGN1cnJfdnJlZy0+dnJlZywKPiArCQkJCQkw LCBjdXJyX3ZyZWctPm1heF92b2x0YWdlKTsKPiArCQkJfQo+ICsJCQlkZXZtX3JlZ3VsYXRvcl9w dXQoY3Vycl92cmVnLT52cmVnKTsKClRoaXMgd2lsbCBiZSBkb25lIGZvciB5b3Ugd2hlbiB0aGUg Y29tcG9uZW50L2RldmljZSBpcyBkZXN0cm95ZWQuCgo+ICsJCQljdXJyX3ZyZWctPnZyZWcgPSBO VUxMOwo+ICsJCX0KPiArCX0KPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG1z bV9kc3NfZW5hYmxlX3ZyZWcoc3RydWN0IGRzc192cmVnICppbl92cmVnLCBpbnQgbnVtX3ZyZWcs IGludCBlbmFibGUpCj4gK3sKPiArCWludCBpID0gMCwgcmMgPSAwOwo+ICsJYm9vbCBuZWVkX3Ns ZWVwOwo+ICsKPiArCWlmIChlbmFibGUpIHsKPiArCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZyZWc7 IGkrKykgewo+ICsJCQlpZiAoSVNfRVJSX09SX05VTEwoaW5fdnJlZ1tpXS52cmVnKSkgewo+ICsJ CQkJcmMgPSBQVFJfRVJSKGluX3ZyZWdbaV0udnJlZyk7Cj4gKwkJCQlEUk1fRVJST1IoIiVwUy0+ JXM6ICVzIHZyZWcgZXJyb3IuIHJjPSVkXG4iLAo+ICsJCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRk cmVzcygwKSwgX19mdW5jX18sCgpBcyBhYm92ZSwgdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIG9u ZSBmdW5jdGlvbi4KCj4gKwkJCQkJaW5fdnJlZ1tpXS52cmVnX25hbWUsIHJjKTsKPiArCQkJCWdv dG8gdnJlZ19zZXRfb3B0X21vZGVfZmFpbDsKPiArCQkJfQo+ICsJCQluZWVkX3NsZWVwID0gIXJl Z3VsYXRvcl9pc19lbmFibGVkKGluX3ZyZWdbaV0udnJlZyk7Cj4gKwkJCWlmIChpbl92cmVnW2ld LnByZV9vbl9zbGVlcCAmJiBuZWVkX3NsZWVwKQo+ICsJCQkJdXNsZWVwX3JhbmdlKGluX3ZyZWdb aV0ucHJlX29uX3NsZWVwICogMTAwMCwKPiArCQkJCQlpbl92cmVnW2ldLnByZV9vbl9zbGVlcCAq IDEwMDApOwo+ICsJCQlyYyA9IHJlZ3VsYXRvcl9zZXRfbG9hZChpbl92cmVnW2ldLnZyZWcsCj4g KwkJCQlpbl92cmVnW2ldLmVuYWJsZV9sb2FkKTsKPiArCQkJaWYgKHJjIDwgMCkgewo+ICsJCQkJ RFJNX0VSUk9SKCIlcFMtPiVzOiAlcyBzZXQgb3B0IG0gZmFpbFxuIiwKPiArCQkJCQlfX2J1aWx0 aW5fcmV0dXJuX2FkZHJlc3MoMCksIF9fZnVuY19fLAoKQXMgYWJvdmUuCj4gKwkJCQkJaW5fdnJl Z1tpXS52cmVnX25hbWUpOwo+ICsJCQkJZ290byB2cmVnX3NldF9vcHRfbW9kZV9mYWlsOwo+ICsJ CQl9Cj4gKwkJCXJjID0gcmVndWxhdG9yX2VuYWJsZShpbl92cmVnW2ldLnZyZWcpOwo+ICsJCQlp ZiAoaW5fdnJlZ1tpXS5wb3N0X29uX3NsZWVwICYmIG5lZWRfc2xlZXApCj4gKwkJCQl1c2xlZXBf cmFuZ2UoaW5fdnJlZ1tpXS5wb3N0X29uX3NsZWVwICogMTAwMCwKPiArCQkJCQlpbl92cmVnW2ld LnBvc3Rfb25fc2xlZXAgKiAxMDAwKTsKPiArCQkJaWYgKHJjIDwgMCkgewo+ICsJCQkJRFJNX0VS Uk9SKCIlcFMtPiVzOiAlcyBlbmFibGUgZmFpbGVkXG4iLAo+ICsJCQkJCV9fYnVpbHRpbl9yZXR1 cm5fYWRkcmVzcygwKSwgX19mdW5jX18sCkFzIGFib3ZlCj4gKwkJCQkJaW5fdnJlZ1tpXS52cmVn X25hbWUpOwo+ICsJCQkJZ290byBkaXNhYmxlX3ZyZWc7Cj4gKwkJCX0KPiArCQl9Cj4gKwl9IGVs c2Ugewo+ICsJCWZvciAoaSA9IG51bV92cmVnLTE7IGkgPj0gMDsgaS0tKSB7Cj4gKwkJCWlmIChp bl92cmVnW2ldLnByZV9vZmZfc2xlZXApCj4gKwkJCQl1c2xlZXBfcmFuZ2UoaW5fdnJlZ1tpXS5w cmVfb2ZmX3NsZWVwICogMTAwMCwKPiArCQkJCQlpbl92cmVnW2ldLnByZV9vZmZfc2xlZXAgKiAx MDAwKTsKPiArCQkJcmVndWxhdG9yX3NldF9sb2FkKGluX3ZyZWdbaV0udnJlZywKPiArCQkJCWlu X3ZyZWdbaV0uZGlzYWJsZV9sb2FkKTsKPiArCQkJcmVndWxhdG9yX2Rpc2FibGUoaW5fdnJlZ1tp XS52cmVnKTsKPiArCQkJaWYgKGluX3ZyZWdbaV0ucG9zdF9vZmZfc2xlZXApCj4gKwkJCQl1c2xl ZXBfcmFuZ2UoaW5fdnJlZ1tpXS5wb3N0X29mZl9zbGVlcCAqIDEwMDAsCj4gKwkJCQkJaW5fdnJl Z1tpXS5wb3N0X29mZl9zbGVlcCAqIDEwMDApOwo+ICsJCX0KPiArCX0KPiArCXJldHVybiByYzsK PiArCj4gK2Rpc2FibGVfdnJlZzoKPiArCXJlZ3VsYXRvcl9zZXRfbG9hZChpbl92cmVnW2ldLnZy ZWcsIGluX3ZyZWdbaV0uZGlzYWJsZV9sb2FkKTsKPiArCj4gK3ZyZWdfc2V0X29wdF9tb2RlX2Zh aWw6Cj4gKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKPiArCQlpZiAoaW5fdnJlZ1tpXS5wcmVf b2ZmX3NsZWVwKQo+ICsJCQl1c2xlZXBfcmFuZ2UoaW5fdnJlZ1tpXS5wcmVfb2ZmX3NsZWVwICog MTAwMCwKPiArCQkJCWluX3ZyZWdbaV0ucHJlX29mZl9zbGVlcCAqIDEwMDApOwo+ICsJCXJlZ3Vs YXRvcl9zZXRfbG9hZChpbl92cmVnW2ldLnZyZWcsCj4gKwkJCWluX3ZyZWdbaV0uZGlzYWJsZV9s b2FkKTsKPiArCQlyZWd1bGF0b3JfZGlzYWJsZShpbl92cmVnW2ldLnZyZWcpOwo+ICsJCWlmIChp bl92cmVnW2ldLnBvc3Rfb2ZmX3NsZWVwKQo+ICsJCQl1c2xlZXBfcmFuZ2UoaW5fdnJlZ1tpXS5w b3N0X29mZl9zbGVlcCAqIDEwMDAsCj4gKwkJCQlpbl92cmVnW2ldLnBvc3Rfb2ZmX3NsZWVwICog MTAwMCk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9IC8qIG1zbV9kc3NfZW5hYmxlX3Zy ZWcgKi8KPiArCj4gK3N0YXRpYyBpbnQgZHBfcG93ZXJfcmVndWxhdG9yX2luaXQoc3RydWN0IGRw X3Bvd2VyX3ByaXZhdGUgKnBvd2VyKQo+ICt7Cj4gKwlpbnQgcmMgPSAwLCBpID0gMCwgaiA9IDA7 Cj4gKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Owo+ICsJc3RydWN0IGRwX3BhcnNlciAq cGFyc2VyOwo+ICsKPiArCXBhcnNlciA9IHBvd2VyLT5wYXJzZXI7Cj4gKwlwZGV2ID0gcG93ZXIt PnBkZXY7Cj4gKwo+ICsJZm9yIChpID0gRFBfQ09SRV9QTTsgIXJjICYmIChpIDwgRFBfTUFYX1BN KTsgaSsrKSB7Cj4gKwkJcmMgPSBtc21fZHNzX2luaXRfdnJlZygmcGRldi0+ZGV2LAo+ICsJCQlw YXJzZXItPm1wW2ldLnZyZWdfY29uZmlnLAo+ICsJCQlwYXJzZXItPm1wW2ldLm51bV92cmVnKTsK PiArCQlpZiAocmMpIHsKPiArCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCB2cmVncyBmb3Ig JXNcbiIsCj4gKwkJCQlkcF9wYXJzZXJfcG1fbmFtZShpKSk7CgpUaGUgY2FsbGluZyBmdW5jdGlv biBwcmludHMgZXZlciBzbyBtYW55IGVycm9yIG1lc3NhZ2VzLgoKPiArCQkJZm9yIChqID0gaSAt IDE7IGogPj0gRFBfQ09SRV9QTTsgai0tKSB7Cj4gKwkJCQltc21fZHNzX2RlaW5pdF92cmVnKCZw ZGV2LT5kZXYsCj4gKwkJCQlwYXJzZXItPm1wW2pdLnZyZWdfY29uZmlnLAo+ICsJCQkJcGFyc2Vy LT5tcFtqXS5udW1fdnJlZyk7Cj4gKwkJCX0KPiArCj4gKwkJCWdvdG8gZXJyb3I7CgpyZXR1cm4g cmM7Cgo+ICsJCX0KPiArCX0KPiArZXJyb3I6Cj4gKwlyZXR1cm4gcmM7CgpMYWJlbCBpc24ndCBu ZWVkZWQgYW5kIHlvdSBjYW4gcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX3Bv d2VyX3JlZ3VsYXRvcl9kZWluaXQoc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyKQo+ICt7 Cj4gKwlpbnQgcmMgPSAwLCBpID0gMDsKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7 Cj4gKwlzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXI7Cj4gKwo+ICsJcGFyc2VyID0gcG93ZXItPnBh cnNlcjsKPiArCXBkZXYgPSBwb3dlci0+cGRldjsKPiArCj4gKwlmb3IgKGkgPSBEUF9DT1JFX1BN OyAoaSA8IERQX01BWF9QTSk7IGkrKykgewo+ICsJCXJjID0gbXNtX2Rzc19kZWluaXRfdnJlZygm cGRldi0+ZGV2LAo+ICsJCQlwYXJzZXItPm1wW2ldLnZyZWdfY29uZmlnLAo+ICsJCQlwYXJzZXIt Pm1wW2ldLm51bV92cmVnKTsKPiArCQlpZiAocmMpCj4gKwkJCURSTV9FUlJPUigiZmFpbGVkIHRv IGRlaW5pdCB2cmVncyBmb3IgJXNcbiIsCj4gKwkJCQlkcF9wYXJzZXJfcG1fbmFtZShpKSk7CgpU aGUgZnVuY3Rpb24geW91IGFyZSBjYWxsaW5nIHByaW50cyBlcnJvciBtZXNzYWdlcyBhbmQgYW55 d2F5LCB5b3UgYXJlIGluIGRlaW5pdApzbyB0aGUgZXJyb3IgbWVzc2FnZXMgYXJlIHByb2JhYmx5 IG5vdCBhcyBpbnRlcmVzdGluZy4KCj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcG93 ZXJfcmVndWxhdG9yX2N0cmwoc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyLCBib29sIGVu YWJsZSkKPiArewo+ICsJaW50IHJjID0gMCwgaSA9IDAsIGogPSAwOwo+ICsJc3RydWN0IGRwX3Bh cnNlciAqcGFyc2VyID0gcG93ZXItPnBhcnNlcjsKPiArCj4gKwlmb3IgKGkgPSBEUF9DT1JFX1BN OyBpIDwgRFBfTUFYX1BNOyBpKyspIHsKPiArCQlyYyA9IG1zbV9kc3NfZW5hYmxlX3ZyZWcoCj4g KwkJCXBhcnNlci0+bXBbaV0udnJlZ19jb25maWcsCj4gKwkJCXBhcnNlci0+bXBbaV0ubnVtX3Zy ZWcsIGVuYWJsZSk7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvICcl cycgdnJlZ3MgZm9yICVzXG4iLAo+ICsJCQkJCWVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUi LAo+ICsJCQkJCWRwX3BhcnNlcl9wbV9uYW1lKGkpKTsKClRoZSBjYWxsZWQgZnVuY3Rpb24gaGFz IG1hbnkgZXJyb3IgbWVzc2FnZXMuCgo+ICsJCQlpZiAoZW5hYmxlKSB7Cj4gKwkJCQlmb3IgKGog PSBpLTE7IGogPj0gRFBfQ09SRV9QTTsgai0tKSB7Cj4gKwkJCQkJbXNtX2Rzc19lbmFibGVfdnJl ZygKPiArCQkJCQlwYXJzZXItPm1wW2pdLnZyZWdfY29uZmlnLAo+ICsJCQkJCXBhcnNlci0+bXBb al0ubnVtX3ZyZWcsIDApOwo+ICsJCQkJfQo+ICsJCQl9Cj4gKwkJCWdvdG8gZXJyb3I7CgpyZXR1 cm4gcmM7Cgo+ICsJCX0KPiArCX0KPiArZXJyb3I6Cj4gKwlyZXR1cm4gcmM7CgpMYWJlbCBub3Qg bmVlZGVkIGFuZCB5b3UgY2FuIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bv d2VyX3BpbmN0cmxfc2V0KHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlciwgYm9vbCBhY3Rp dmUpCj4gK3sKPiArCWludCByYyA9IC1FRkFVTFQ7Cj4gKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAq cGluX3N0YXRlOwo+ICsJc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyID0gcG93ZXItPnBhcnNlcjsK PiArCj4gKwlpZiAoSVNfRVJSX09SX05VTEwocGFyc2VyLT5waW5jdHJsLnBpbikpCj4gKwkJcmV0 dXJuIFBUUl9FUlIocGFyc2VyLT5waW5jdHJsLnBpbik7CgppZiBwYXJzZXItPnBpbmN0cmwucGlu IGlzIE5VTEwgdGhpcyB3aWxsIHJldHVybiAwIHdoaWNoIG1heSBub3QgYmUgeW91cgppbnRlbnRp b24/Cgo+ICsKPiArCXBpbl9zdGF0ZSA9IGFjdGl2ZSA/IHBhcnNlci0+cGluY3RybC5zdGF0ZV9h Y3RpdmUKPiArCQkJCTogcGFyc2VyLT5waW5jdHJsLnN0YXRlX3N1c3BlbmQ7Cj4gKwo+ICsJcmMg PSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwYXJzZXItPnBpbmN0cmwucGluLCBwaW5fc3RhdGUpOwo+ ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJjYW4gbm90IHNldCAlcyBwaW5zXG4iLAo+ICsJ CQlhY3RpdmUgPyAiZHBfYWN0aXZlIiA6ICJkcF9zbGVlcCIpOwo+ICsJCXJldHVybiByYzsKCllv dSBjYW4gc2tpcCB0aGlzLCBkcm9wIG91dCBhbmQgcmV0dXJuIHJjOwo+ICsJfQo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bvd2VyX2Nsa19pbml0KHN0cnVjdCBk cF9wb3dlcl9wcml2YXRlICpwb3dlcikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBk c3NfbW9kdWxlX3Bvd2VyICpjb3JlLCAqY3RybDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZw b3dlci0+cGRldi0+ZGV2Owo+ICsKPiArCWNvcmUgPSAmcG93ZXItPnBhcnNlci0+bXBbRFBfQ09S RV9QTV07Cj4gKwljdHJsID0gJnBvd2VyLT5wYXJzZXItPm1wW0RQX0NUUkxfUE1dOwo+ICsKPiAr CWlmIChwb3dlci0+cGFyc2VyLT5wbGwgJiYgcG93ZXItPnBhcnNlci0+cGxsLT5nZXRfcHJvdmlk ZXIpIHsKPiArCQlyYyA9IHBvd2VyLT5wYXJzZXItPnBsbC0+Z2V0X3Byb3ZpZGVyKHBvd2VyLT5w YXJzZXItPnBsbCwKPiArCQkJCSZwb3dlci0+bGlua19wcm92aWRlciwgJnBvd2VyLT5waXhlbF9w cm92aWRlcik7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCXByX2luZm8oIiVzOiBjYW4ndCBnZXQgcHJv dmlkZXIgZnJvbSBwbGwsIGRvbid0IHNldCBwYXJlbnRcbiIsCj4gKwkJCQlfX2Z1bmNfXyk7CgpE byB5b3Ugd2FudCB0byB1c2UgRFJNX0lORk8gaGVyZT8KCj4gKwkJCXJldHVybiAwOwo+ICsJCX0K PiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfZ2V0X2NsayhkZXYsIGNvcmUtPmNsa19jb25maWcs IGNvcmUtPm51bV9jbGspOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8g Z2V0ICVzIGNsay4gZXJyPSVkXG4iLAo+ICsJCQlkcF9wYXJzZXJfcG1fbmFtZShEUF9DT1JFX1BN KSwgcmMpOwo+ICsJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfZ2V0X2Ns ayhkZXYsIGN0cmwtPmNsa19jb25maWcsIGN0cmwtPm51bV9jbGspOwo+ICsJaWYgKHJjKSB7Cj4g KwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0ICVzIGNsay4gZXJyPSVkXG4iLAo+ICsJCQlkcF9w YXJzZXJfcG1fbmFtZShEUF9DVFJMX1BNKSwgcmMpOwo+ICsJCW1zbV9kc3NfcHV0X2Nsayhjb3Jl LT5jbGtfY29uZmlnLCBjb3JlLT5udW1fY2xrKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0K PiArCj4gKwlwb3dlci0+cGl4ZWxfY2xrX3JjZyA9IGRldm1fY2xrX2dldChkZXYsICJwaXhlbF9j bGtfcmNnIik7Cj4gKwlpZiAoSVNfRVJSKHBvd2VyLT5waXhlbF9jbGtfcmNnKSkgewo+ICsJCURS TV9ERUJVR19EUCgiVW5hYmxlIHRvIGdldCBEUCBwaXhlbCBjbGsgUkNHXG4iKTsKPiArCQlwb3dl ci0+cGl4ZWxfY2xrX3JjZyA9IE5VTEw7Cj4gKwkJbXNtX2Rzc19wdXRfY2xrKGNvcmUtPmNsa19j b25maWcsIGNvcmUtPm51bV9jbGspOwo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiAr CXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bvd2VyX2Nsa19kZWluaXQoc3Ry dWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyKQo+ICt7Cj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9w b3dlciAqY29yZSwgKmN0cmw7Cj4gKwo+ICsJY29yZSA9ICZwb3dlci0+cGFyc2VyLT5tcFtEUF9D T1JFX1BNXTsKPiArCWN0cmwgPSAmcG93ZXItPnBhcnNlci0+bXBbRFBfQ1RSTF9QTV07Cj4gKwo+ ICsJaWYgKCFjb3JlIHx8ICFjdHJsKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBvd2VyX2Rh dGFcbiIpOwoKWW91IGRvbid0IG5lZWQgYSBsb2cgbWVzc2FnZSBpZiB5b3UgYXJlIGluIGRlaW5p dAoKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwltc21fZHNzX3B1dF9jbGsoY3Ry bC0+Y2xrX2NvbmZpZywgY3RybC0+bnVtX2Nsayk7Cj4gKwltc21fZHNzX3B1dF9jbGsoY29yZS0+ Y2xrX2NvbmZpZywgY29yZS0+bnVtX2Nsayk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBkcF9wb3dlcl9jbGtfc2V0X3JhdGUoc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBv d2VyLAo+ICsJCWVudW0gZHBfcG1fdHlwZSBtb2R1bGUsIGJvb2wgZW5hYmxlKQo+ICt7Cj4gKwlp bnQgcmMgPSAwOwo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKm1wID0gJnBvd2VyLT5wYXJz ZXItPm1wW21vZHVsZV07Cj4gKwo+ICsJaWYgKGVuYWJsZSkgewo+ICsJCXJjID0gbXNtX2Rzc19j bGtfc2V0X3JhdGUobXAtPmNsa19jb25maWcsIG1wLT5udW1fY2xrKTsKPiArCQlpZiAocmMpIHsK PiArCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGNsa3MgcmF0ZS5cbiIpOwo+ICsJCQlyZXR1 cm4gcmM7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJjID0gbXNtX2Rzc19lbmFibGVfY2xrKG1wLT5j bGtfY29uZmlnLCBtcC0+bnVtX2NsaywgZW5hYmxlKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9F UlJPUigiZmFpbGVkIHRvICVkIGNsa3MsIGVycjogJWRcbiIsIGVuYWJsZSwgcmMpOwo+ICsJCXJl dHVybiByYzsKCllvdSBjYW4gZHJvcCBvdXQgYW5kIHJldHVybiByYzsKCj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gK2ludCBkcF9wb3dlcl9jbGtfZW5hYmxlKHN0cnVjdCBkcF9w b3dlciAqZHBfcG93ZXIsCj4gKwkJZW51bSBkcF9wbV90eXBlIHBtX3R5cGUsIGJvb2wgZW5hYmxl KQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKm1wOwo+ ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ICsKPiArCXBvd2VyID0gY29udGFp bmVyX29mKGRwX3Bvd2VyLCBzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwo+ICsJ bXAgPSAmcG93ZXItPnBhcnNlci0+bXBbcG1fdHlwZV07Cj4gKwo+ICsJaWYgKHBtX3R5cGUgIT0g RFBfQ09SRV9QTSAmJiBwbV90eXBlICE9IERQX0NUUkxfUE0pIHsKPiArCQlEUk1fRVJST1IoInVu c3VwcG9ydGVkIHBvd2VyIG1vZHVsZTogJXNcbiIsCj4gKwkJCQlkcF9wYXJzZXJfcG1fbmFtZShw bV90eXBlKSk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKGVuYWJsZSkg ewo+ICsJCWlmIChwbV90eXBlID09IERQX0NPUkVfUE0gJiYgZHBfcG93ZXItPmNvcmVfY2xrc19v bikgewo+ICsJCQlEUk1fREVCVUdfRFAoImNvcmUgY2xrcyBhbHJlYWR5IGVuYWJsZWRcbiIpOwo+ ICsJCQlyZXR1cm4gMDsKPiArCQl9Cj4gKwo+ICsJCWlmIChwbV90eXBlID09IERQX0NUUkxfUE0g JiYgZHBfcG93ZXItPmxpbmtfY2xrc19vbikgewo+ICsJCQlEUk1fREVCVUdfRFAoImxpbmtzIGNs a3MgYWxyZWFkeSBlbmFibGVkXG4iKTsKPiArCQkJcmV0dXJuIDA7Cj4gKwkJfQo+ICsKPiArCQlp ZiAoKHBtX3R5cGUgPT0gRFBfQ1RSTF9QTSkgJiYgKCFkcF9wb3dlci0+Y29yZV9jbGtzX29uKSkg ewo+ICsJCQlEUk1fREVCVUdfRFAoIk5lZWQgdG8gZW5hYmxlIGNvcmUgY2xrcyBiZWZvcmUgbGlu ayBjbGtzXG4iKTsKPiArCj4gKwkJCXJjID0gZHBfcG93ZXJfY2xrX3NldF9yYXRlKHBvd2VyLCBE UF9DT1JFX1BNLCBlbmFibGUpOwo+ICsJCQlpZiAocmMpIHsKPiArCQkJCURSTV9FUlJPUigiZmFp bGVkIHRvIGVuYWJsZSBjbGtzOiAlcy4gZXJyPSVkXG4iLAo+ICsJCQkJCWRwX3BhcnNlcl9wbV9u YW1lKERQX0NPUkVfUE0pLCByYyk7Cj4gKwkJCQlyZXR1cm4gcmM7Cj4gKwkJCX0KPiArCQkJZHBf cG93ZXItPmNvcmVfY2xrc19vbiA9IHRydWU7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJjID0gZHBf cG93ZXJfY2xrX3NldF9yYXRlKHBvd2VyLCBwbV90eXBlLCBlbmFibGUpOwo+ICsJaWYgKHJjKSB7 Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gJyVzJyBjbGtzIGZvcjogJXMuIGVycj0lZFxuIiwK PiArCQkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIsCj4gKwkJCWRwX3BhcnNlcl9wbV9u YW1lKHBtX3R5cGUpLCByYyk7Cj4gKwkJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwlpZiAocG1f dHlwZSA9PSBEUF9DT1JFX1BNKQo+ICsJCWRwX3Bvd2VyLT5jb3JlX2Nsa3Nfb24gPSBlbmFibGU7 Cj4gKwllbHNlCj4gKwkJZHBfcG93ZXItPmxpbmtfY2xrc19vbiA9IGVuYWJsZTsKPiArCj4gKwlE Uk1fREVCVUdfRFAoIiVzIGNsb2NrcyBmb3IgJXNcbiIsCj4gKwkJCWVuYWJsZSA/ICJlbmFibGUi IDogImRpc2FibGUiLAo+ICsJCQlkcF9wYXJzZXJfcG1fbmFtZShwbV90eXBlKSk7Cj4gKwlEUk1f REVCVUdfRFAoImxpbmtfY2xrczolcyBjb3JlX2Nsa3M6JXNcbiIsCj4gKwkJZHBfcG93ZXItPmxp bmtfY2xrc19vbiA/ICJvbiIgOiAib2ZmIiwKPiArCQlkcF9wb3dlci0+Y29yZV9jbGtzX29uID8g Im9uIiA6ICJvZmYiKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBk cF9wb3dlcl9yZXF1ZXN0X2dwaW9zKHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlcikKPiAr ewo+ICsJaW50IHJjID0gMCwgaTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwb3dlci0+cGRl di0+ZGV2Owo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKm1wID0gJnBvd2VyLT5wYXJzZXIt Pm1wW0RQX0NPUkVfUE1dOwo+ICsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGlvX25hbWVz W10gPSB7Cj4gKwkJImF1eF9lbmFibGUiLCAiYXV4X3NlbCIsICJ1c2JwbHVnX2NjIiwKPiArCX07 Cj4gKwo+ICsJaWYgKCFwb3dlcikgewo+ICsJCURSTV9FUlJPUigiaW52YWxpZCBwb3dlciBkYXRh XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiAKCkl0IGRvZXNuJ3QgbG9vayBsaWtl IHBvd2VyIGNhbiBiZSBOVUxMIGhlcmUuCgo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo Z3Bpb19uYW1lcyk7IGkrKykgewo+ICsJCXVuc2lnbmVkIGludCBncGlvID0gbXAtPmdwaW9fY29u ZmlnW2ldLmdwaW87Cj4gKwo+ICsJCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkKPiArCQkJY29u dGludWU7Cj4gKwo+ICsJCXJjID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBncGlvLCBncGlvX25h bWVzW2ldKTsKPiArCQlpZiAocmMpIHsKPiArCQkJRFJNX0VSUk9SKCJyZXF1ZXN0ICVzIGdwaW8g ZmFpbGVkLCByYz0lZFxuIiwKPiArCQkJCSAgICAgICBncGlvX25hbWVzW2ldLCByYyk7Cj4gKwkJ CXJldHVybiByYzsKPiArCQl9Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGJvb2wgZHBfcG93ZXJfZmluZF9ncGlvKGNvbnN0IGNoYXIgKmdwaW8xLCBjb25zdCBjaGFyICpn cGlvMikKPiArewo+ICsJcmV0dXJuICEhc3RybnN0cihncGlvMSwgZ3BpbzIsIHN0cmxlbihncGlv MSkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9wb3dlcl9zZXRfZ3BpbyhzdHJ1Y3QgZHBf cG93ZXJfcHJpdmF0ZSAqcG93ZXIsIGJvb2wgZmxpcCkKPiArewo+ICsJaW50IGk7Cj4gKwlzdHJ1 Y3QgZHNzX21vZHVsZV9wb3dlciAqbXAgPSAmcG93ZXItPnBhcnNlci0+bXBbRFBfQ09SRV9QTV07 Cj4gKwlzdHJ1Y3QgZHNzX2dwaW8gKmNvbmZpZyA9IG1wLT5ncGlvX2NvbmZpZzsKPiArCj4gKwlm b3IgKGkgPSAwOyBpIDwgbXAtPm51bV9ncGlvOyBpKyspIHsKPiArCQlpZiAoZHBfcG93ZXJfZmlu ZF9ncGlvKGNvbmZpZy0+Z3Bpb19uYW1lLCAiYXV4LXNlbCIpKQo+ICsJCQljb25maWctPnZhbHVl ID0gZmxpcDsKPiArCj4gKwkJaWYgKGdwaW9faXNfdmFsaWQoY29uZmlnLT5ncGlvKSkgewo+ICsJ CQlEUk1fREVCVUdfRFAoImdwaW8gJXMsIHZhbHVlICVkXG4iLCBjb25maWctPmdwaW9fbmFtZSwK PiArCQkJCWNvbmZpZy0+dmFsdWUpOwo+ICsKPiArCQkJaWYgKGRwX3Bvd2VyX2ZpbmRfZ3Bpbyhj b25maWctPmdwaW9fbmFtZSwgImF1eC1lbiIpIHx8Cj4gKwkJCSAgICBkcF9wb3dlcl9maW5kX2dw aW8oY29uZmlnLT5ncGlvX25hbWUsICJhdXgtc2VsIikpCj4gKwkJCQlncGlvX2RpcmVjdGlvbl9v dXRwdXQoY29uZmlnLT5ncGlvLAo+ICsJCQkJCWNvbmZpZy0+dmFsdWUpOwo+ICsJCQllbHNlCj4g KwkJCQlncGlvX3NldF92YWx1ZShjb25maWctPmdwaW8sIGNvbmZpZy0+dmFsdWUpOwo+ICsKPiAr CQl9Cj4gKwkJY29uZmlnKys7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcG93ZXJf Y29uZmlnX2dwaW9zKHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlciwgYm9vbCBmbGlwLAo+ ICsJCQkJCWJvb2wgZW5hYmxlKQo+ICt7Cj4gKwlpbnQgcmMgPSAwLCBpOwo+ICsJc3RydWN0IGRz c19tb2R1bGVfcG93ZXIgKm1wID0gJnBvd2VyLT5wYXJzZXItPm1wW0RQX0NPUkVfUE1dOwo+ICsJ c3RydWN0IGRzc19ncGlvICpjb25maWcgPSBtcC0+Z3Bpb19jb25maWc7Cj4gKwo+ICsJbXAgPSAm cG93ZXItPnBhcnNlci0+bXBbRFBfQ09SRV9QTV07Cj4gKwljb25maWcgPSBtcC0+Z3Bpb19jb25m aWc7Cj4gKwo+ICsJaWYgKGVuYWJsZSkgewo+ICsJCXJjID0gZHBfcG93ZXJfcmVxdWVzdF9ncGlv cyhwb3dlcik7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCURSTV9FUlJPUigiZ3BpbyByZXF1ZXN0IGZh aWxlZFxuIik7Cgp0aGUgY2FsbGVkIGZ1bmN0aW9uIGFscmVhZHkgcHJpbnRzIGVycm9yIG1lc3Nh Z2VzLgoKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiArCj4gKwkJZHBfcG93ZXJfc2V0X2dwaW8o cG93ZXIsIGZsaXApOwo+ICsJfSBlbHNlIHsKPiArCQlmb3IgKGkgPSAwOyBpIDwgbXAtPm51bV9n cGlvOyBpKyspIHsKPiArCQkJZ3Bpb19zZXRfdmFsdWUoY29uZmlnW2ldLmdwaW8sIDApOwo+ICsJ CQlncGlvX2ZyZWUoY29uZmlnW2ldLmdwaW8pOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiAraW50IGRwX3Bvd2VyX2NsaWVudF9pbml0KHN0cnVjdCBkcF9wb3dlciAq ZHBfcG93ZXIpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0 ZSAqcG93ZXI7Cj4gKwo+ICsJaWYgKCFkcF9wb3dlcikgewo+ICsJCURSTV9FUlJPUigiaW52YWxp ZCBwb3dlciBkYXRhXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlwb3dl ciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUsIGRwX3Bv d2VyKTsKPiArCj4gKwlwbV9ydW50aW1lX2VuYWJsZSgmcG93ZXItPnBkZXYtPmRldik7Cj4gKwo+ ICsJcmMgPSBkcF9wb3dlcl9yZWd1bGF0b3JfaW5pdChwb3dlcik7Cj4gKwlpZiAocmMpIHsKPiAr CQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IHJlZ3VsYXRvcnMgJWRcbiIsIHJjKTsKClRoZSBj YWxsZWQgZnVuY3Rpb24gYW5kIGZyaWVuZHMgcHJpbnRzIGxvdHMgb2YgZXJyb3IgbWVzc2FnZXMu Cgo+ICsJCWdvdG8gZXJyb3JfcG93ZXI7Cj4gKwl9Cj4gKwo+ICsJcmMgPSBkcF9wb3dlcl9jbGtf aW5pdChwb3dlcik7Cj4gKwlpZiAocmMpIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0 IGNsb2NrcyAlZFxuIiwgcmMpOwoKU2FtZS4KCj4gKwkJZ290byBlcnJvcl9jbGs7Cj4gKwl9Cj4g KwlyZXR1cm4gMDsKPiArCj4gK2Vycm9yX2NsazoKPiArCWRwX3Bvd2VyX3JlZ3VsYXRvcl9kZWlu aXQocG93ZXIpOwo+ICtlcnJvcl9wb3dlcjoKPiArCXBtX3J1bnRpbWVfZGlzYWJsZSgmcG93ZXIt PnBkZXYtPmRldik7Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3ZvaWQgZHBfcG93ZXJfY2xp ZW50X2RlaW5pdChzdHJ1Y3QgZHBfcG93ZXIgKmRwX3Bvd2VyKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBf cG93ZXJfcHJpdmF0ZSAqcG93ZXI7Cj4gKwo+ICsJaWYgKCFkcF9wb3dlcikgewo+ICsJCURSTV9F UlJPUigiaW52YWxpZCBwb3dlciBkYXRhXG4iKTsKClRoaXMgaXNuJ3QgYSB1c2VmdWwgbG9nIG1l c3NhZ2Ugd2hpbGUgeW91IGFyZSB0ZWFyaW5nIHRoaW5ncyBkb3duLgoKPiArCQlyZXR1cm47Cj4g Kwl9Cj4gKwo+ICsJcG93ZXIgPSBjb250YWluZXJfb2YoZHBfcG93ZXIsIHN0cnVjdCBkcF9wb3dl cl9wcml2YXRlLCBkcF9wb3dlcik7Cj4gKwo+ICsJZHBfcG93ZXJfY2xrX2RlaW5pdChwb3dlcik7 Cj4gKwlkcF9wb3dlcl9yZWd1bGF0b3JfZGVpbml0KHBvd2VyKTsKPiArCXBtX3J1bnRpbWVfZGlz YWJsZSgmcG93ZXItPnBkZXYtPmRldik7Cj4gKwo+ICt9Cj4gKwo+ICtpbnQgZHBfcG93ZXJfc2V0 X2xpbmtfY2xrX3BhcmVudChzdHJ1Y3QgZHBfcG93ZXIgKmRwX3Bvd2VyKQo+ICt7Cj4gKwlpbnQg cmMgPSAwOwo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ICsJdTMyIG51bTsK PiArCXN0cnVjdCBkc3NfY2xrICpjZmc7Cj4gKwljaGFyICpuYW1lID0gImN0cmxfbGlua19jbGsi Owo+ICsKPiArCWlmICghZHBfcG93ZXIpIHsKPiArCQlEUk1fRVJST1IoImludmFsaWQgcG93ZXIg ZGF0YVxuIik7CgpyZXR1cm4gLUVJTlZBTDsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBl eGl0Owo+ICsJfQo+ICsKPiArCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2VyLCBzdHJ1Y3Qg ZHBfcG93ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwo+ICsKPiArCW51bSA9IHBvd2VyLT5wYXJzZXIt Pm1wW0RQX0NUUkxfUE1dLm51bV9jbGs7Cj4gKwljZmcgPSBwb3dlci0+cGFyc2VyLT5tcFtEUF9D VFJMX1BNXS5jbGtfY29uZmlnOwo+ICsKPiArCXdoaWxlIChudW0gJiYgc3RyY21wKGNmZy0+Y2xr X25hbWUsIG5hbWUpKSB7Cj4gKwkJbnVtLS07Cj4gKwkJY2ZnKys7Cj4gKwl9Cj4gKwo+ICsJaWYg KG51bSAmJiBwb3dlci0+bGlua19wcm92aWRlcikgewo+ICsJCXBvd2VyLT5saW5rX2Nsa19zcmMg PSBjbGtfZ2V0X3BhcmVudChjZmctPmNsayk7Cj4gKwkJCWlmIChwb3dlci0+bGlua19jbGtfc3Jj KSB7Cj4gKwkJCQljbGtfc2V0X3BhcmVudChwb3dlci0+bGlua19jbGtfc3JjLCBwb3dlci0+bGlu a19wcm92aWRlcik7Cj4gKwkJCQlEUk1fREVCVUdfRFAoIiVzOiBpcyB0aGUgcGFyZW50IG9mIGNs az0lc1xuIiwKPiArCQkJCQkJX19jbGtfZ2V0X25hbWUocG93ZXItPmxpbmtfcHJvdmlkZXIpLAo+ ICsJCQkJCQlfX2Nsa19nZXRfbmFtZShwb3dlci0+bGlua19jbGtfc3JjKSk7Cj4gKwkJCX0gZWxz ZSB7Cj4gKwkJCQlEUk1fRVJST1IoImNvdWxkbid0IGdldCBwYXJlbnQgZm9yIGNsaz0lc1xuIiwg bmFtZSk7Cj4gKwkJCQlyYyA9IC1FSU5WQUw7Cj4gKwkJCX0KPiArCX0gZWxzZSB7Cj4gKwkJRFJN X0VSUk9SKCIlcyBjbG9jayBjb3VsZCBub3QgYmUgc2V0IHBhcmVudFxuIiwgbmFtZSk7Cj4gKwkJ cmMgPSAtRUlOVkFMOwo+ICsJfQo+ICtleGl0OgoKTGFibGUgaXMgbm90IG5lZWRlZAoKPiArCXJl dHVybiByYzsKPiArfQo+ICsKPiAraW50IGRwX3Bvd2VyX3NldF9waXhlbF9jbGtfcGFyZW50KHN0 cnVjdCBkcF9wb3dlciAqZHBfcG93ZXIpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3Qg ZHBfcG93ZXJfcHJpdmF0ZSAqcG93ZXI7Cj4gKwo+ICsJcG93ZXIgPSBjb250YWluZXJfb2YoZHBf cG93ZXIsIHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlLCBkcF9wb3dlcik7Cj4gKwo+ICsJaWYgKHBv d2VyLT5waXhlbF9jbGtfcmNnICYmIHBvd2VyLT5waXhlbF9wcm92aWRlcikgewo+ICsJCXJjID0g Y2xrX3NldF9wYXJlbnQocG93ZXItPnBpeGVsX2Nsa19yY2csIHBvd2VyLT5waXhlbF9wcm92aWRl cik7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCBwYXJlbnQg Y2xrIHNyYywgJWRcbiIsIHJjKTsKPiArCQkJcmV0dXJuIHJjOwo+ICsJCX0KPiArCQlEUk1fREVC VUdfRFAoIiVzOiBpcyB0aGUgcGFyZW50IG9mIGNsaz0lc1xuIiwKPiArCQkJCQlfX2Nsa19nZXRf bmFtZShwb3dlci0+cGl4ZWxfcHJvdmlkZXIpLAo+ICsJCQkJCV9fY2xrX2dldF9uYW1lKHBvd2Vy LT5waXhlbF9jbGtfcmNnKSk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK2lu dCBkcF9wb3dlcl9pbml0KHN0cnVjdCBkcF9wb3dlciAqZHBfcG93ZXIsIGJvb2wgZmxpcCkKPiAr ewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlcjsKPiAr Cj4gKwlpZiAoIWRwX3Bvd2VyKSB7Cj4gKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHBvd2VyIGRhdGFc biIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGV4aXQ7CgpUaGlzIHdpbGwgY2FsbCBw bV9ydW50aW1lX3B1dF9zeW5jIHdoaWNoIGlzIHdoYXQgeW91IGRvbid0IHdhbnQsCmp1c3QgcmV0 dXJuIC1FSU5WQUw7Cgo+ICsJfQo+ICsKPiArCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2Vy LCBzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwo+ICsKPiArCXBtX3J1bnRpbWVf Z2V0X3N5bmMoJnBvd2VyLT5wZGV2LT5kZXYpOwoKQWxsIG9mIHRoZSBmdW5jdGlvbnMgaGVyZSBz aG91bGQgYmUgcHJpbnRpbmcgc3VmZmljaWVudCBlcnJvciBtZXNzYWdlcyBzbyB5b3UKZG9uJ3Qg bmVlZCBhbnkgbW9yZS4KCj4gKwlyYyA9IGRwX3Bvd2VyX3JlZ3VsYXRvcl9jdHJsKHBvd2VyLCB0 cnVlKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRvIGVuYWJsZSByZWd1 bGF0b3JzLCAlZFxuIiwgcmMpOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwlyYyA9IGRw X3Bvd2VyX3BpbmN0cmxfc2V0KHBvd2VyLCB0cnVlKTsKPiArCWlmIChyYykgewo+ICsJCURSTV9F UlJPUigiZmFpbGVkIHRvIHNldCBwaW5jdHJsIHN0YXRlLCAlZFxuIiwgcmMpOwo+ICsJCWdvdG8g ZXJyX3BpbmN0cmw7Cj4gKwl9Cj4gKwo+ICsJcmMgPSBkcF9wb3dlcl9jb25maWdfZ3Bpb3MocG93 ZXIsIGZsaXAsIHRydWUpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8g ZW5hYmxlIGdwaW9zLCAlZFxuIiwgcmMpOwo+ICsJCWdvdG8gZXJyX2dwaW87Cj4gKwl9Cj4gKwo+ ICsJcmMgPSBkcF9wb3dlcl9jbGtfZW5hYmxlKGRwX3Bvd2VyLCBEUF9DT1JFX1BNLCB0cnVlKTsK PiArCWlmIChyYykgewo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRvIGVuYWJsZSBEUCBjb3JlIGNs b2NrcywgJWRcbiIsIHJjKTsKPiArCQlnb3RvIGVycl9jbGs7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJu IDA7Cj4gKwo+ICtlcnJfY2xrOgo+ICsJZHBfcG93ZXJfY29uZmlnX2dwaW9zKHBvd2VyLCBmbGlw LCBmYWxzZSk7Cj4gK2Vycl9ncGlvOgo+ICsJZHBfcG93ZXJfcGluY3RybF9zZXQocG93ZXIsIGZh bHNlKTsKPiArZXJyX3BpbmN0cmw6Cj4gKwlkcF9wb3dlcl9yZWd1bGF0b3JfY3RybChwb3dlciwg ZmFsc2UpOwo+ICtleGl0Ogo+ICsJcG1fcnVudGltZV9wdXRfc3luYygmcG93ZXItPnBkZXYtPmRl dik7Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK2ludCBkcF9wb3dlcl9kZWluaXQoc3RydWN0 IGRwX3Bvd2VyICpkcF9wb3dlcikKPiArewo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBv d2VyOwo+ICsKPiArCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2VyLCBzdHJ1Y3QgZHBfcG93 ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwo+ICsKPiArCWRwX3Bvd2VyX2Nsa19lbmFibGUoZHBfcG93 ZXIsIERQX0NPUkVfUE0sIGZhbHNlKTsKPiArCWRwX3Bvd2VyX2NvbmZpZ19ncGlvcyhwb3dlciwg ZmFsc2UsIGZhbHNlKTsKPiArCWRwX3Bvd2VyX3BpbmN0cmxfc2V0KHBvd2VyLCBmYWxzZSk7Cj4g KwlkcF9wb3dlcl9yZWd1bGF0b3JfY3RybChwb3dlciwgZmFsc2UpOwo+ICsJcG1fcnVudGltZV9w dXRfc3luYygmcG93ZXItPnBkZXYtPmRldik7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Ry dWN0IGRwX3Bvd2VyICpkcF9wb3dlcl9nZXQoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7 Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ICsJ c3RydWN0IGRwX3Bvd2VyICpkcF9wb3dlcjsKPiArCj4gKwlpZiAoIXBhcnNlcikgewo+ICsJCURS TV9FUlJPUigiaW52YWxpZCBpbnB1dFxuIik7CgpyZXR1cm4gRVJSX1BUUihyYyk7Cgo+ICsJCXJj ID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ICsKPiArCXBvd2VyID0gZGV2bV9r emFsbG9jKCZwYXJzZXItPnBkZXYtPmRldiwgc2l6ZW9mKCpwb3dlciksIEdGUF9LRVJORUwpOwo+ ICsJaWYgKCFwb3dlcikgewo+ICsJCXJjID0gLUVOT01FTTsKCnJldHVybiBFUlJfUFRSKC1FTk9N RU0pOwoKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ICsKPiArCXBvd2VyLT5wYXJzZXIgPSBwYXJz ZXI7Cj4gKwlwb3dlci0+cGRldiA9IHBhcnNlci0+cGRldjsKPiArCj4gKwlkcF9wb3dlciA9ICZw b3dlci0+ZHBfcG93ZXI7Cj4gKwo+ICsJcmV0dXJuIGRwX3Bvd2VyOwo+ICtlcnJvcjoKPiArCXJl dHVybiBFUlJfUFRSKHJjKTsKPiArfQo+ICsKPiArdm9pZCBkcF9wb3dlcl9wdXQoc3RydWN0IGRw X3Bvd2VyICpkcF9wb3dlcikKPiArewo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2Vy ID0gTlVMTDsKPiArCj4gKwlpZiAoIWRwX3Bvd2VyKQo+ICsJCXJldHVybjsKPiArCj4gKwlwb3dl ciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUsIGRwX3Bv d2VyKTsKPiArCj4gKwlkZXZtX2tmcmVlKCZwb3dlci0+cGRldi0+ZGV2LCBwb3dlcik7CgpTYW1l IGNvbW1lbnQgYXMgYWxsIG9mIHRoZSBvdGhlciBkZXZtX2tmcmVlKCkgY2FsbGVycwoKPiArfQoK PHNuaXA+IEkgaGF2ZSBubyBwcm9ibGVtIHdpdGggdGhlIHJlc3QuCgotLSAKVGhlIFF1YWxjb21t IElubm92YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVtYmVyIG9mIENvZGUgQXVyb3JhIEZvcnVt LAphIExpbnV4IEZvdW5kYXRpb24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0Cl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkZyZWVkcmVubyBtYWlsaW5nIGxpc3QK RnJlZWRyZW5vQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZyZWVkcmVubwo=