From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: Re: [DPU PATCH 2/3] drm/msm/dp: add displayPort driver support Date: Wed, 10 Oct 2018 17:01:12 -0600 Message-ID: <20181010230112.GF9977@jcrouse-lnx.qualcomm.com> References: <1539191759-14836-1-git-send-email-chandanu@codeaurora.org> <1539191759-14836-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: <1539191759-14836-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: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, nganji-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@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 T24gV2VkLCBPY3QgMTAsIDIwMTggYXQgMTA6MTU6NThBTSAtMDcwMCwgQ2hhbmRhbiBVZGRhcmFq dSB3cm90ZToKPiBBZGQgdGhlIG5lZWRlZCBkaXNwbGF5UG9ydCBmaWxlcyB0byBlbmFibGUgRFAg ZHJpdmVyCj4gb24gbXNtIHRhcmdldC4KPiAKPiAiZHBfZGlzcGxheSIgbW9kdWxlIGlzIHRoZSBt YWluIG1vZHVsZSB0aGF0IGNhbGxzIGludG8KPiBvdGhlciBzdWItbW9kdWxlcy4gImRwX2RybSIg ZmlsZSByZXByZXNlbnRzIHRoZSBpbnRlcmZhY2UKPiBiZXR3ZWVuIERSTSBmcmFtZXdvcmsgYW5k IERQIGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBDaGFuZGFuIFVkZGFyYWp1IDxjaGFuZGFu dUBjb2RlYXVyb3JhLm9yZz4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnICAg ICAgICAgICAgICAgICB8ICAgIDkgKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlICAg ICAgICAgICAgICAgIHwgICAxNSArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9k cHVfaW9fdXRpbC5jIHwgIDIwNiArKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUx L2RwdV9pb191dGlsLmggfCAgIDQ0ICsKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdXgu YyAgICAgICAgICAgICB8ICA1NzAgKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Rw L2RwX2F1eC5oICAgICAgICAgICAgIHwgICA0NCArCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAv ZHBfY2F0YWxvZy5jICAgICAgICAgfCAxMTg4ICsrKysrKysrKysrKysrKysrKysrCj4gIGRyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oICAgICAgICAgfCAgMTQ0ICsrKwo+ICBkcml2 ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwuYyAgICAgICAgICAgIHwgMTQ3NSArKysrKysrKysr KysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oICAgICAg ICAgICAgfCAgIDUwICsKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kZWJ1Zy5jICAgICAg ICAgICB8ICA1MDcgKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcu aCAgICAgICAgICAgfCAgIDgxICsrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGlzcGxh eS5jICAgICAgICAgfCAgOTc3ICsrKysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9t c20vZHAvZHBfZGlzcGxheS5oICAgICAgICAgfCAgIDU1ICsKPiAgZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9kcm0uYyAgICAgICAgICAgICB8ICA1NDIgKysrKysrKysrKwo+ICBkcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX2RybS5oICAgICAgICAgICAgIHwgICA1MiArCj4gIGRyaXZlcnMvZ3B1 L2RybS9tc20vZHAvZHBfZXh0Y29uLmMgICAgICAgICAgfCAgNDAwICsrKysrKysKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9leHRjb24uaCAgICAgICAgICB8ICAxMTEgKysKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9saW5rLmMgICAgICAgICAgICB8IDE1NDkgKysrKysrKysrKysr KysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5oICAgICAg ICAgICAgfCAgMTg0ICsrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5jICAg ICAgICAgICB8ICA2MjQgKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9w YW5lbC5oICAgICAgICAgICB8ICAxMjEgKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf cGFyc2VyLmMgICAgICAgICAgfCAgNjc5ICsrKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX3BhcnNlci5oICAgICAgICAgIHwgIDIwNSArKysrCj4gIGRyaXZlcnMvZ3B1L2Ry bS9tc20vZHAvZHBfcG93ZXIuYyAgICAgICAgICAgfCAgNTk5ICsrKysrKysrKysrCj4gIGRyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfcG93ZXIuaCAgICAgICAgICAgfCAgIDU3ICsKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9yZWcuaCAgICAgICAgICAgICB8ICAzNTcgKysrKysrCj4gIGRy aXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jICAgICAgICAgICAgICAgfCAgICAyICsKPiAgZHJp dmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmggICAgICAgICAgICAgICB8ICAgMjIgKwo+ICBpbmNs dWRlL2RybS9kcm1fZHBfaGVscGVyLmggICAgICAgICAgICAgICAgIHwgICAxOSArCj4gIDMwIGZp bGVzIGNoYW5nZWQsIDEwODg3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPiAgY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmMKPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmgKPiAgY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5jCj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2NhdGFsb2cuaAo+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jdHJsLmMKPiAgY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oCj4gIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RlYnVnLmMKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuaAo+ICBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmMKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGlzcGxheS5oCj4gIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL21zbS9kcC9kcF9saW5rLmgKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmMKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9tc20vZHAvZHBfcG93ZXIuaAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL21zbS9kcC9kcF9yZWcuaAoKPHNuaXAgdG8gZHBfZGVidWcuYz4KCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuYyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vZHAvZHBfZGVidWcuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4u NWMwYThjZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2Rw X2RlYnVnLmMKPiBAQCAtMCwwICsxLDUwNyBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIw MTctMjAxOCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAq Cj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAo+ICsgKiBvbmx5IHZlcnNpb24gMiBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPiArICoKPiArICog VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPiArICogR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICovCgpTUERYIHBsZWFzZQoKPiArI2Rl ZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2lu Y2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fY29ubmVjdG9yLmg+ Cj4gKwo+ICsjaW5jbHVkZSAiZHBfcGFyc2VyLmgiCj4gKyNpbmNsdWRlICJkcF9wb3dlci5oIgo+ ICsjaW5jbHVkZSAiZHBfY2F0YWxvZy5oIgo+ICsjaW5jbHVkZSAiZHBfYXV4LmgiCj4gKyNpbmNs dWRlICJkcF9jdHJsLmgiCj4gKyNpbmNsdWRlICJkcF9kZWJ1Zy5oIgo+ICsjaW5jbHVkZSAiZHBf ZGlzcGxheS5oIgo+ICsKPiArI2RlZmluZSBERUJVR19OQU1FICJkcm1fZHAiCj4gKwo+ICtzdHJ1 Y3QgZHBfZGVidWdfcHJpdmF0ZSB7Cj4gKwlzdHJ1Y3QgZGVudHJ5ICpyb290Owo+ICsKPiArCXN0 cnVjdCBkcF91c2JwZCAqdXNicGQ7Cj4gKwlzdHJ1Y3QgZHBfbGluayAqbGluazsKPiArCXN0cnVj dCBkcF9wYW5lbCAqcGFuZWw7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKmNvbm5lY3RvcjsK PiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCj4gKwlzdHJ1Y3QgZHBfZGVidWcgZHBfZGVidWc7 Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBkcF9kZWJ1Z193cml0ZV9ocGQoc3RydWN0IGZp bGUgKmZpbGUsCj4gKwkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZiwgc2l6ZV90IGNvdW50 LCBsb2ZmX3QgKnBwb3MpCj4gK3sKPiArCXN0cnVjdCBkcF9kZWJ1Z19wcml2YXRlICpkZWJ1ZyA9 IGZpbGUtPnByaXZhdGVfZGF0YTsKPiArCWNoYXIgYnVmW1NaXzhdOwo+ICsJc2l6ZV90IGxlbiA9 IDA7Cj4gKwlpbnQgaHBkOwo+ICsKPiArCWlmICghZGVidWcpCj4gKwkJcmV0dXJuIC1FTk9ERVY7 CgpkZWJ1ZyB3aWxsIG5vdCBiZSBOVUxMIGhlcmUuCgo+ICsKPiArCWlmICgqcHBvcykKPiArCQly ZXR1cm4gMDsKPiArCj4gKwkvKiBMZWF2ZSByb29tIGZvciB0ZXJtaW5hdGlvbiBjaGFyICovCj4g KwlsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBTWl84IC0gMSk7Cj4gKwlpZiAoY29weV9mcm9t X3VzZXIoYnVmLCB1c2VyX2J1ZmYsIGxlbikpCj4gKwkJZ290byBlbmQ7Cj4gKwo+ICsJYnVmW2xl bl0gPSAnXDAnOwo+ICsKPiArCWlmIChrc3RydG9pbnQoYnVmLCAxMCwgJmhwZCkgIT0gMCkKPiAr CQlnb3RvIGVuZDsKPiArCgpBbGwgb2YgdGhpcyBjYW4gYmUgcmVwbGFjZWQgYnkga3N0cnRvaW50 X2Zyb21fdXNlcigpLgoKCj4gKwlpZiAoZGVidWctPnVzYnBkICYmIGRlYnVnLT51c2JwZC0+Y29u bmVjdCkKPiArCQlkZWJ1Zy0+dXNicGQtPmNvbm5lY3QoZGVidWctPnVzYnBkLCBocGQpOwo+ICsK PiArZW5kOgo+ICsJcmV0dXJuIC1sZW47CgpPbiBlcnJvciB5b3Ugc2hvdWxkIHJldHVybiBhIHJl YWwgZXJyb3IgY29kZSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCihjb3VudCkgb24g c3VjY2Vzcy4KCj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGRwX2RlYnVnX3dyaXRlX2VkaWRf bW9kZXMoc3RydWN0IGZpbGUgKmZpbGUsCj4gKwkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVm Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCj4gK3sKPiArCXN0cnVjdCBkcF9kZWJ1Z19w cml2YXRlICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKPiArCWNoYXIgYnVmW1NaXzMyXTsK Ckp1c3QgdXNlIDMyLgoKPiArCXNpemVfdCBsZW4gPSAwOwo+ICsJaW50IGhkaXNwbGF5ID0gMCwg dmRpc3BsYXkgPSAwLCB2cmVmcmVzaCA9IDA7Cj4gKwo+ICsJaWYgKCFkZWJ1ZykKPiArCQlyZXR1 cm4gLUVOT0RFVjsKPiAKRGVidWcgY2FuJ3QgYmUgTlVMTCBoZXJlLgoKPiArCWlmICgqcHBvcykK PiArCQlnb3RvIGVuZDsKPiArCj4gKwkvKiBMZWF2ZSByb29tIGZvciB0ZXJtaW5hdGlvbiBjaGFy ICovCj4gKwlsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBTWl8zMiAtIDEpOwoKaW5zdGVhZCBv ZiBTWl8yMyAtIDEsIHVzZSBzaXplb2YoYnVmKSAtIDEKCj4gKwlpZiAoY29weV9mcm9tX3VzZXIo YnVmLCB1c2VyX2J1ZmYsIGxlbikpCj4gKwkJZ290byBjbGVhcjsKPiArCj4gKwlidWZbbGVuXSA9 ICdcMCc7Cj4gKwo+ICsJaWYgKHNzY2FuZihidWYsICIlZCAlZCAlZCIsICZoZGlzcGxheSwgJnZk aXNwbGF5LCAmdnJlZnJlc2gpICE9IDMpCj4gKwkJZ290byBjbGVhcjsKPiArCj4gKwlpZiAoIWhk aXNwbGF5IHx8ICF2ZGlzcGxheSB8fCAhdnJlZnJlc2gpCj4gKwkJZ290byBjbGVhcjsKPiArCj4g KwlkZWJ1Zy0+ZHBfZGVidWcuZGVidWdfZW4gPSB0cnVlOwo+ICsJZGVidWctPmRwX2RlYnVnLmhk aXNwbGF5ID0gaGRpc3BsYXk7Cj4gKwlkZWJ1Zy0+ZHBfZGVidWcudmRpc3BsYXkgPSB2ZGlzcGxh eTsKPiArCWRlYnVnLT5kcF9kZWJ1Zy52cmVmcmVzaCA9IHZyZWZyZXNoOwo+ICsJZ290byBlbmQ7 Cj4gK2NsZWFyOgo+ICsJcHJfZGVidWcoImNsZWFyaW5nIGRlYnVnIG1vZGVzXG4iKTsKPiArCWRl YnVnLT5kcF9kZWJ1Zy5kZWJ1Z19lbiA9IGZhbHNlOwo+ICtlbmQ6Cj4gKwlyZXR1cm4gbGVuOwoK VGhpcyBzaG91bGQgYmUgJ2NvdW50Jwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBkcF9kZWJ1 Z19yZWFkX2Nvbm5lY3RlZChzdHJ1Y3QgZmlsZSAqZmlsZSwKPiArCQljaGFyIF9fdXNlciAqdXNl cl9idWZmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKPiArewo+ICsJc3RydWN0IGRwX2Rl YnVnX3ByaXZhdGUgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwo+ICsJY2hhciBidWZbU1pf OF07Cj4gKwl1MzIgbGVuID0gMDsKPiArCj4gKwlpZiAoIWRlYnVnKQo+ICsJCXJldHVybiAtRU5P REVWOwo+IApEZWJ1ZyBjYW4ndCBiZSBOVUxMCgo+ICsJaWYgKCpwcG9zKQo+ICsJCXJldHVybiAw Owo+ICsKPiArCWlmICghZGVidWctPnVzYnBkKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsKPiAr CWxlbiArPSBzbnByaW50ZihidWYsIFNaXzgsICIlZFxuIiwgZGVidWctPnVzYnBkLT5ocGRfaGln aCk7CgpZb3Ugc2hvdWxkIGFsd2F5cyB1c2Ugc2NucHJpbnRmIGluc3RlYWQgb2Ygc25wcmludGYg aW4gdGhlc2Ugc2l0dWF0aW9ucy4KCkFuZCB1c2Ugc2l6ZW9mKGJ1ZikgaW5zdGVhZCBvZiBhIGNv bnN0YW50LgoKQW5kIHlvdSBjYW4gc2V0IGxlbiA9IHNucHJpbnRmKC4uLikuIHlvdSBkb24ndCBu ZWVkIHRvIGRvIGEgKz0gYW5kIGRlcGVuZCBvbiB0aGUKaW5pdGlhbGl6YXRpb24uCgo+ICsKPiAr CWlmIChjb3B5X3RvX3VzZXIodXNlcl9idWZmLCBidWYsIGxlbikpCj4gKwkJcmV0dXJuIC1FRkFV TFQ7Cj4gKwo+ICsJKnBwb3MgKz0gbGVuOwo+ICsJcmV0dXJuIGxlbjsKPiArfQo+ICsKPiArc3Rh dGljIHNzaXplX3QgZHBfZGVidWdfcmVhZF9lZGlkX21vZGVzKHN0cnVjdCBmaWxlICpmaWxlLAo+ ICsJCWNoYXIgX191c2VyICp1c2VyX2J1ZmYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQo+ ICt7Cj4gKwlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2Rh dGE7Cj4gKwljaGFyICpidWY7Cj4gKwl1MzIgbGVuID0gMDsKPiArCWludCByYyA9IDA7Cj4gKwlz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKm1vZGU7Cj4gKwo+ICsJaWYgKCFkZWJ1Zykgewo+ICsJCXByX2VycigiaW52YWxpZCBkYXRh XG4iKTsKPiArCQlyYyA9IC1FTk9ERVY7Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KCkRlYnVnIGNh bm5vdCBiZSBOVUxMIGhlcmUuCgo+ICsKPiArCWNvbm5lY3RvciA9ICpkZWJ1Zy0+Y29ubmVjdG9y OwoKV2h5IGFyZSB5b3UgZGVyZWZlcmVuY2luZyBkZWJ1Zz8KCj4gKwo+ICsJaWYgKCFjb25uZWN0 b3IpIHsKPiArCQlwcl9lcnIoImNvbm5lY3RvciBpcyBOVUxMXG4iKTsKPiArCQlyYyA9IC1FSU5W QUw7Cj4gKwkJZ290byBlcnJvcjsKCgpKdXN0IHJldHVybiAtRUlOVkFMOwo+ICsJfQoKSSdtIG5v dCBzdXJlIGlmIHRoaXMgY2FuIGJlIGFuIGVycm9yIG9yIG5vdCwgYnV0IHBlcmhhcHMgY29uc2lk ZXIgc2tpcHBpbmcKdGhlIHByaW50IG1lc3NhZ2UuCgo+ICsKPiArCWlmICgqcHBvcykKPiArCQln b3RvIGVycm9yOwoKSnVzdCByZXR1cm4gMDsKCj4gKwo+ICsJYnVmID0ga3phbGxvYyhTWl80Sywg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWJ1Zikgewo+ICsJCXJjID0gLUVOT01FTTsKPiArCQlnb3Rv IGVycm9yOwoKSnVzdCByZXR1cm4gLUVOT01FTTsKCj4gKwl9Cj4gKwo+ICsJbGlzdF9mb3JfZWFj aF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgewo+ICsJCWxlbiArPSBzbnBy aW50ZihidWYgKyBsZW4sIFNaXzRLIC0gbGVuLAoKRGVmaW5pdGVseSB1c2Ugc2NucHJpbnRmKCkg LSB0aGlzIGlzIGEgZGlzYXN0ZXIgd2FpdGluZyB0byBoYXBwZW4vCgo+ICsJCSIlcyAlZCAlZCAl ZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4XG4iLAo+ICsJCW1vZGUtPm5hbWUsIG1vZGUtPnZyZWZy ZXNoLCBtb2RlLT5oZGlzcGxheSwKPiArCQltb2RlLT5oc3luY19zdGFydCwgbW9kZS0+aHN5bmNf ZW5kLCBtb2RlLT5odG90YWwsCj4gKwkJbW9kZS0+dmRpc3BsYXksIG1vZGUtPnZzeW5jX3N0YXJ0 LCBtb2RlLT52c3luY19lbmQsCj4gKwkJbW9kZS0+dnRvdGFsLCBtb2RlLT5mbGFncyk7Cj4gKwl9 Cj4gKwo+ICsJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2J1ZmYsIGJ1ZiwgbGVuKSkgewo+ICsJCWtm cmVlKGJ1Zik7CgpKdXN0IHJldHVybiAtRUZBVUxUIGhlcmUKCj4gKwkJcmMgPSAtRUZBVUxUOwo+ ICsJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4gKwo+ICsJKnBwb3MgKz0gbGVuOwo+ICsJa2ZyZWUoYnVm KTsKPiArCj4gKwlyZXR1cm4gbGVuOwo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKClRoaXMgbGFi ZWwgaXNuJ3QgbmVlZGVkIHdpdGggdGhlIGFib3ZlIGNoYW5nZXMuCgo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhpbnQgcmMsIGludCAqbWF4X3Np emUsIGludCAqbGVuKQo+ICt7Cj4gKwlpZiAocmMgPj0gKm1heF9zaXplKSB7Cj4gKwkJcHJfZXJy KCJidWZmZXIgb3ZlcmZsb3dcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsJKmxl biArPSByYzsKPiArCSptYXhfc2l6ZSA9IFNaXzRLIC0gKmxlbjsKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgZHBfZGVidWdfcmVhZF9pbmZvKHN0cnVjdCBmaWxl ICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWZmLAo+ICsJCXNpemVfdCBjb3VudCwgbG9mZl90 ICpwcG9zKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSAqZGVidWcgPSBmaWxlLT5w cml2YXRlX2RhdGE7Cj4gKwljaGFyICpidWY7Cj4gKwl1MzIgbGVuID0gMCwgcmMgPSAwOwo+ICsJ dTY0IGxjbGsgPSAwOwo+ICsJdTMyIG1heF9zaXplID0gU1pfNEs7Cj4gKwo+ICsJaWYgKCFkZWJ1 ZykKPiArCQlyZXR1cm4gLUVOT0RFVjsKCkRlYnVnIGNhbm5vdCBiZSAwLgoKPiArCj4gKwlpZiAo KnBwb3MpCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICsJYnVmID0ga3phbGxvYyhTWl80SywgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIWJ1ZikKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlyYyA9IHNu cHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3NpemUsICJcdG5hbWUgPSAlc1xuIiwgREVCVUdfTkFNRSk7 CgpVc2Ugc2NucHJpbnRmKCkKCj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93 KHJjLCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7CgpUaGlzIGZ1bmN0aW9uIGlz IHZlcnkgb2RkIC0gaWYgeW91IHVzZSBzY25wcmludGYoKSB5b3UgY2FuIHNhZmVseSBqdXN0IGRv CgpsZW4gPSBzY25wcmludGYoYnVmICsgbGVuLCBTWl80SyAtIGxlbiwgIlx0dG5hbWUgPSAlc1xu IiwgREVCVUdfTkFNRSk7CmxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBTWl80SyAtIGxlbiwg Li4uLikKCkJ1dCB0aGlzIHdob2xlIHRoaW5nIHNlZW1zIGxpa2UgYSByZWFsbHkgZ29vZCBmaXQg Zm9yIHNlcV9maWxlIGFuZCB0aGVuIHlvdQpkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFueXRo aW5nIGVsc2UuCgo+ICsJcmMgPSBzbnByaW50ZihidWYgKyBsZW4sIG1heF9zaXplLAo+ICsJCSJc dGRwX3BhbmVsXG5cdFx0bWF4X3BjbGtfa2h6ID0gJWRcbiIsCj4gKwkJZGVidWctPnBhbmVsLT5t YXhfcGNsa19raHopOwo+ICsJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywg Jm1heF9zaXplLCAmbGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArCXJjID0gc25wcmludGYo YnVmICsgbGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRkcm1fZHBfbGlua1xuXHRcdHJhdGUgPSAldVxu IiwKPiArCQlkZWJ1Zy0+cGFuZWwtPmxpbmtfaW5mby5yYXRlKTsKPiArCWlmIChkcF9kZWJ1Z19j aGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6ZSwgJmxlbikpCj4gKwkJZ290byBlcnJv cjsKPiArCj4gKwlyYyA9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3NpemUsCj4gKwkJIlx0XHRu dW1fbGFuZXMgPSAldVxuIiwKPiArCQlkZWJ1Zy0+cGFuZWwtPmxpbmtfaW5mby5udW1fbGFuZXMp Owo+ICsJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAm bGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBt YXhfc2l6ZSwKPiArCQkiXHRcdGNhcGFiaWxpdGllcyA9ICVsdVxuIiwKPiArCQlkZWJ1Zy0+cGFu ZWwtPmxpbmtfaW5mby5jYXBhYmlsaXRpZXMpOwo+ICsJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZl cl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAmbGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiAr CXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRkcF9wYW5lbF9pbmZv OlxuXHRcdGFjdGl2ZSA9ICVkeCVkXG4iLAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8uaF9hY3Rp dmUsCj4gKwkJZGVidWctPnBhbmVsLT5waW5mby52X2FjdGl2ZSk7Cj4gKwlpZiAoZHBfZGVidWdf Y2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJy b3I7Cj4gKwo+ICsJcmMgPSBzbnByaW50ZihidWYgKyBsZW4sIG1heF9zaXplLAo+ICsJCSJcdFx0 YmFja19wb3JjaCA9ICVkeCVkXG4iLAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8uaF9iYWNrX3Bv cmNoLAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8udl9iYWNrX3BvcmNoKTsKPiArCWlmIChkcF9k ZWJ1Z19jaGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6ZSwgJmxlbikpCj4gKwkJZ290 byBlcnJvcjsKPiArCj4gKwlyYyA9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3NpemUsCj4gKwkJ Ilx0XHRmcm9udF9wb3JjaCA9ICVkeCVkXG4iLAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8uaF9m cm9udF9wb3JjaCwKPiArCQlkZWJ1Zy0+cGFuZWwtPnBpbmZvLnZfZnJvbnRfcG9yY2gpOwo+ICsJ aWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAmbGVuKSkK PiArCQlnb3RvIGVycm9yOwo+ICsKPiArCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6 ZSwKPiArCQkiXHRcdHN5bmNfd2lkdGggPSAlZHglZFxuIiwKPiArCQlkZWJ1Zy0+cGFuZWwtPnBp bmZvLmhfc3luY193aWR0aCwKPiArCQlkZWJ1Zy0+cGFuZWwtPnBpbmZvLnZfc3luY193aWR0aCk7 Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZs ZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJcmMgPSBzbnByaW50ZihidWYgKyBsZW4sIG1h eF9zaXplLAo+ICsJCSJcdFx0YWN0aXZlX2xvdyA9ICVkeCVkXG4iLAo+ICsJCWRlYnVnLT5wYW5l bC0+cGluZm8uaF9hY3RpdmVfbG93LAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8udl9hY3RpdmVf bG93KTsKPiArCWlmIChkcF9kZWJ1Z19jaGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6 ZSwgJmxlbikpCj4gKwkJZ290byBlcnJvcjsKPiArCj4gKwlyYyA9IHNucHJpbnRmKGJ1ZiArIGxl biwgbWF4X3NpemUsCj4gKwkJIlx0XHRoX3NrZXcgPSAlZFxuIiwKPiArCQlkZWJ1Zy0+cGFuZWwt PnBpbmZvLmhfc2tldyk7Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJj LCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJcmMgPSBzbnByaW50 ZihidWYgKyBsZW4sIG1heF9zaXplLAo+ICsJCSJcdFx0cmVmcmVzaCByYXRlID0gJWRcbiIsCj4g KwkJZGVidWctPnBhbmVsLT5waW5mby5yZWZyZXNoX3JhdGUpOwo+ICsJaWYgKGRwX2RlYnVnX2No ZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAmbGVuKSkKPiArCQlnb3RvIGVycm9y Owo+ICsKPiArCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRcdHBp eGVsIGNsb2NrIGtoeiA9ICVkXG4iLAo+ICsJCWRlYnVnLT5wYW5lbC0+cGluZm8ucGl4ZWxfY2xr X2toeik7Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3Np emUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJcmMgPSBzbnByaW50ZihidWYgKyBs ZW4sIG1heF9zaXplLAo+ICsJCSJcdFx0YnBwID0gJWRcbiIsCj4gKwkJZGVidWctPnBhbmVsLT5w aW5mby5icHApOwo+ICsJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1h eF9zaXplLCAmbGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArCS8qIExpbmsgSW5mb3JtYXRp b24gKi8KPiArCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRkcF9s aW5rOlxuXHRcdHRlc3RfcmVxdWVzdGVkID0gJWRcbiIsCj4gKwkJZGVidWctPmxpbmstPnNpbmtf cmVxdWVzdCk7Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4 X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJcmMgPSBzbnByaW50ZihidWYg KyBsZW4sIG1heF9zaXplLAo+ICsJCSJcdFx0bGFuZV9jb3VudCA9ICVkXG4iLCBkZWJ1Zy0+bGlu ay0+bGlua19wYXJhbXMubGFuZV9jb3VudCk7Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVy X292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJ cmMgPSBzbnByaW50ZihidWYgKyBsZW4sIG1heF9zaXplLAo+ICsJCSJcdFx0YndfY29kZSA9ICVk XG4iLCBkZWJ1Zy0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSk7Cj4gKwlpZiAoZHBfZGVidWdf Y2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJy b3I7Cj4gKwo+ICsJbGNsayA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZSgKPiArCQkJZGVi dWctPmxpbmstPmxpbmtfcGFyYW1zLmJ3X2NvZGUpICogMTAwMDsKPiArCXJjID0gc25wcmludGYo YnVmICsgbGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRcdGxjbGsgPSAlbGxkXG4iLCBsY2xrKTsKPiAr CWlmIChkcF9kZWJ1Z19jaGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6ZSwgJmxlbikp Cj4gKwkJZ290byBlcnJvcjsKPiArCj4gKwlyYyA9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3Np emUsCj4gKwkJIlx0XHR2X2xldmVsID0gJWRcbiIsIGRlYnVnLT5saW5rLT5waHlfcGFyYW1zLnZf bGV2ZWwpOwo+ICsJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9z aXplLCAmbGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArCXJjID0gc25wcmludGYoYnVmICsg bGVuLCBtYXhfc2l6ZSwKPiArCQkiXHRcdHBfbGV2ZWwgPSAlZFxuIiwgZGVidWctPmxpbmstPnBo eV9wYXJhbXMucF9sZXZlbCk7Cj4gKwlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93 KHJjLCAmbWF4X3NpemUsICZsZW4pKQo+ICsJCWdvdG8gZXJyb3I7Cj4gKwo+ICsJaWYgKGNvcHlf dG9fdXNlcih1c2VyX2J1ZmYsIGJ1ZiwgbGVuKSkKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArCSpw cG9zICs9IGxlbjsKPiArCj4gKwlrZnJlZShidWYpOwo+ICsJcmV0dXJuIGxlbjsKPiArZXJyb3I6 Cj4gKwlrZnJlZShidWYpOwo+ICsJcmV0dXJuIC1FSU5WQUw7Cj4gK30KPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRwX2RlYnVnX2ZvcHMgPSB7Cj4gKwkub3BlbiA9 IHNpbXBsZV9vcGVuLAo+ICsJLnJlYWQgPSBkcF9kZWJ1Z19yZWFkX2luZm8sCj4gK307Cj4gKwo+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlZGlkX21vZGVzX2ZvcHMgPSB7 Cj4gKwkub3BlbiA9IHNpbXBsZV9vcGVuLAo+ICsJLnJlYWQgPSBkcF9kZWJ1Z19yZWFkX2VkaWRf bW9kZXMsCj4gKwkud3JpdGUgPSBkcF9kZWJ1Z193cml0ZV9lZGlkX21vZGVzLAo+ICt9Owo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBkX2ZvcHMgPSB7Cj4gKwku b3BlbiA9IHNpbXBsZV9vcGVuLAo+ICsJLndyaXRlID0gZHBfZGVidWdfd3JpdGVfaHBkLAo+ICt9 Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29ubmVjdGVkX2Zv cHMgPSB7Cj4gKwkub3BlbiA9IHNpbXBsZV9vcGVuLAo+ICsJLnJlYWQgPSBkcF9kZWJ1Z19yZWFk X2Nvbm5lY3RlZCwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgZHBfZGVidWdfaW5pdChzdHJ1Y3Qg ZHBfZGVidWcgKmRwX2RlYnVnKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rl YnVnX3ByaXZhdGUgKmRlYnVnID0gY29udGFpbmVyX29mKGRwX2RlYnVnLAo+ICsJCXN0cnVjdCBk cF9kZWJ1Z19wcml2YXRlLCBkcF9kZWJ1Zyk7Cj4gKwlzdHJ1Y3QgZGVudHJ5ICpkaXIsICpmaWxl LCAqZWRpZF9tb2RlczsKPiArCXN0cnVjdCBkZW50cnkgKmhwZCwgKmNvbm5lY3RlZDsKPiArCj4g KwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoREVCVUdfTkFNRSwgTlVMTCk7CgpZb3UgZG9uJ3Qg d2FudCB0byBiZSBwdXR0aW5nIHRoZSBkZWJ1Z2JmcyBpbiB0aGUgcm9vdCBkaXIgLSB5b3UnbGwg d2FudCBpdApuaWNlbHkgbmVzdGxlZCBpbiB3aXRoIHRoZSByZXN0IG9mIHRoZSBkcml2ZXIuIFNl ZSB0aGUgR1BVIG9yIERQVSBkZWJ1Z2ZzIGZpbGVzCmZvciBjbHVlcyBvbiBob3cgdG8gZG8gdGhh dC4KCj4gKwlpZiAoSVNfRVJSX09SX05VTEwoZGlyKSkgewoKZGVidWdmc19jcmVhdGVfZGlyIG9u bHkgcmV0dXJucyBOVUxMIG9uIGVycm9yLiAgR2V0dGluZyB0aGUgUFRSX0VSUiB3aWxsIGp1c3QK cmV0dXJuIDAgaW4gdGhhdCBjYXNlLgoKPiArCQlyYyA9IFBUUl9FUlIoZGlyKTsKPiArCQlwcl9l cnIoIlslc10gZGVidWdmcyBjcmVhdGUgZGlyIGZhaWxlZCwgcmMgPSAlZFxuIiwKPiArCQkgICAg ICAgREVCVUdfTkFNRSwgcmMpOwoKWW91IGRvbid0IG5lZWQgREVCVUdfTkFNRSBpbiB0aGUgc3Ry aW5nIC0geW91IGFscmVhZHkgaGF2ZSBpdCBpbiB0aGUgcHJfZm10LgoKPiArCQlnb3RvIGVycm9y Owo+ICsJfQo+ICsKPiArCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkcF9kZWJ1ZyIsIDA0 NDQsIGRpciwKPiArCQkJCWRlYnVnLCAmZHBfZGVidWdfZm9wcyk7Cj4gKwlpZiAoSVNfRVJSX09S X05VTEwoZmlsZSkpIHsKCkFzIGFib3ZlLgoKPiArCQlyYyA9IFBUUl9FUlIoZmlsZSk7Cj4gKwkJ cHJfZXJyKCJbJXNdIGRlYnVnZnMgY3JlYXRlIGZpbGUgZmFpbGVkLCByYz0lZFxuIiwKPiArCQkg ICAgICAgREVCVUdfTkFNRSwgcmMpOwo+ICsJCWdvdG8gZXJyb3JfcmVtb3ZlX2RpcjsKPiArCX0K PiArCj4gKwllZGlkX21vZGVzID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZWRpZF9tb2RlcyIsIDA2 NDQsIGRpciwKPiArCQkJCQlkZWJ1ZywgJmVkaWRfbW9kZXNfZm9wcyk7Cj4gKwlpZiAoSVNfRVJS X09SX05VTEwoZWRpZF9tb2RlcykpIHsKCkFzIGFib3ZlLgoKPiArCQlyYyA9IFBUUl9FUlIoZWRp ZF9tb2Rlcyk7Cj4gKwkJcHJfZXJyKCJbJXNdIGRlYnVnZnMgY3JlYXRlIGVkaWRfbW9kZXMgZmFp bGVkLCByYz0lZFxuIiwKPiArCQkgICAgICAgREVCVUdfTkFNRSwgcmMpOwo+ICsJCWdvdG8gZXJy b3JfcmVtb3ZlX2RpcjsKPiArCX0KPiArCj4gKwlocGQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJo cGQiLCAwNjQ0LCBkaXIsCj4gKwkJCQkJZGVidWcsICZocGRfZm9wcyk7Cj4gKwlpZiAoSVNfRVJS X09SX05VTEwoaHBkKSkgewoKQXMgYWJvdmUuCgo+ICsJCXJjID0gUFRSX0VSUihocGQpOwo+ICsJ CXByX2VycigiWyVzXSBkZWJ1Z2ZzIGhwZCBmYWlsZWQsIHJjPSVkXG4iLAo+ICsJCQlERUJVR19O QU1FLCByYyk7Cj4gKwkJZ290byBlcnJvcl9yZW1vdmVfZGlyOwo+ICsJfQo+ICsKPiArCWNvbm5l Y3RlZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImNvbm5lY3RlZCIsIDA0NDQsIGRpciwKPiArCQkJ CQlkZWJ1ZywgJmNvbm5lY3RlZF9mb3BzKTsKPiArCWlmIChJU19FUlJfT1JfTlVMTChjb25uZWN0 ZWQpKSB7CgpBcyBhYm92ZS4KCj4gKwkJcmMgPSBQVFJfRVJSKGNvbm5lY3RlZCk7Cj4gKwkJcHJf ZXJyKCJbJXNdIGRlYnVnZnMgY29ubmVjdGVkIGZhaWxlZCwgcmM9JWRcbiIsCj4gKwkJCURFQlVH X05BTUUsIHJjKTsKPiArCQlnb3RvIGVycm9yX3JlbW92ZV9kaXI7Cj4gKwl9Cj4gKwo+ICsJZGVi dWctPnJvb3QgPSBkaXI7Cj4gKwlyZXR1cm4gcmM7Cj4gK2Vycm9yX3JlbW92ZV9kaXI6Cj4gKwlk ZWJ1Z2ZzX3JlbW92ZShkaXIpOwo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKCk5vdGUgdGhhdCBy YyB3aWxsIGhhdmUgdG8gYmUgYXNzaWduZWQgYnkgc29tZSB2YWx1ZSBieSB5b3Ugb24gZXJyb3Ig YmVjYXVzZSB5b3UKd29uJ3QgYmUgZ2V0dGluZyBpdCBmcm9tIHRoZSBhcGkgZnVuY3Rpb25zLgoK PiArfQo+ICsKPiArc3RydWN0IGRwX2RlYnVnICpkcF9kZWJ1Z19nZXQoc3RydWN0IGRldmljZSAq ZGV2LCBzdHJ1Y3QgZHBfcGFuZWwgKnBhbmVsLAo+ICsJCQlzdHJ1Y3QgZHBfdXNicGQgKnVzYnBk LCBzdHJ1Y3QgZHBfbGluayAqbGluaywKPiArCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25u ZWN0b3IpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSAq ZGVidWc7Cj4gKwlzdHJ1Y3QgZHBfZGVidWcgKmRwX2RlYnVnOwo+ICsKPiArCWlmICghZGV2IHx8 ICFwYW5lbCB8fCAhdXNicGQgfHwgIWxpbmspIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRc biIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+CkkgZG9uJ3Qg dGhpbmsgYW55IG9mIHRoZXNlIGNoZWNrcyBhcmUgbmVlZGVkIC0gdGhleSBzaG91bGQgYWxsIGJl IG5vbi1OVUxMIGZyb20KdGhlIGNhbGxlci4KCj4gKwlkZWJ1ZyA9IGRldm1fa3phbGxvYyhkZXYs IHNpemVvZigqZGVidWcpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghZGVidWcpIHsKanVzdCByZXR1 cm4gRVJSX1BUUigtRU5PTUVNKTsKCj4gKwkJcmMgPSAtRU5PTUVNOwo+ICsJCWdvdG8gZXJyb3I7 Cj4gKwl9Cj4gKwo+ICsJZGVidWctPmRwX2RlYnVnLmRlYnVnX2VuID0gZmFsc2U7Cj4gKwlkZWJ1 Zy0+dXNicGQgPSB1c2JwZDsKPiArCWRlYnVnLT5saW5rID0gbGluazsKPiArCWRlYnVnLT5wYW5l bCA9IHBhbmVsOwo+ICsJZGVidWctPmRldiA9IGRldjsKPiArCWRlYnVnLT5jb25uZWN0b3IgPSBj b25uZWN0b3I7Cj4gKwo+ICsJZHBfZGVidWcgPSAmZGVidWctPmRwX2RlYnVnOwo+ICsJZHBfZGVi dWctPnZkaXNwbGF5ID0gMDsKPiArCWRwX2RlYnVnLT5oZGlzcGxheSA9IDA7Cj4gKwlkcF9kZWJ1 Zy0+dnJlZnJlc2ggPSAwOwo+ICsKPiArCXJjID0gZHBfZGVidWdfaW5pdChkcF9kZWJ1Zyk7Cj4g KwlpZiAocmMpIHsKPiArCQlkZXZtX2tmcmVlKGRldiwgZGVidWcpOwpqdXN0IHJldHVybiBFUlJf UFRSKHJjKTsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ICsKPiArCXJldHVybiBkcF9kZWJ1ZzsK PiArZXJyb3I6Cj4gKwlyZXR1cm4gRVJSX1BUUihyYyk7CgpUSGlzIGlzbid0IG5lZWRlZAo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2RlYnVnX2RlaW5pdChzdHJ1Y3QgZHBfZGVidWcgKmRwX2Rl YnVnKQoKVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8gcmV0dXJuIGFueXRoaW5nIC0gdGhl ICJlcnJvciIgaXMgdW5pbnRlcmVzdGluZy4KCj4gK3sKPiArCXN0cnVjdCBkcF9kZWJ1Z19wcml2 YXRlICpkZWJ1ZzsKPiArCj4gKwlpZiAoIWRwX2RlYnVnKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ ICsKPiArCWRlYnVnID0gY29udGFpbmVyX29mKGRwX2RlYnVnLCBzdHJ1Y3QgZHBfZGVidWdfcHJp dmF0ZSwgZHBfZGVidWcpOwo+ICsKPiArCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZWJ1Zy0+ cm9vdCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3ZvaWQgZHBfZGVidWdfcHV0KHN0 cnVjdCBkcF9kZWJ1ZyAqZHBfZGVidWcpCj4gK3sKPiArCXN0cnVjdCBkcF9kZWJ1Z19wcml2YXRl ICpkZWJ1ZzsKPiArCj4gKwlpZiAoIWRwX2RlYnVnKQo+ICsJCXJldHVybjsKPiArCj4gKwlkZWJ1 ZyA9IGNvbnRhaW5lcl9vZihkcF9kZWJ1Zywgc3RydWN0IGRwX2RlYnVnX3ByaXZhdGUsIGRwX2Rl YnVnKTsKPiArCj4gKwlkcF9kZWJ1Z19kZWluaXQoZHBfZGVidWcpOwoKSW4gZmFjdCwgZHBfZGVi dWdfZGVpbml0IGRvZXNuJ3QgbmVlZCB0byBleGlzdCAtIHlvdSBjYW4ga2VlcCBpdCBhbGwgaW5s aW5lCmFuZCBib251cyAtIHlvdSBkb24ndCBoYXZlIHRvIGRvIGFuIHVubmVlZGVkIGNvbnRhaW5l cl9vZiBmb3Igbm8gcmVhc29uLgoKPiArCWRldm1fa2ZyZWUoZGVidWctPmRldiwgZGVidWcpOwoK SWYgeW91IGFyZSB1c2luZyBkZXZtXyB5b3UgZG9uJ3QgbmVlZCB0byBmcmVlIGhlcmUuCgo+ICt9 Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuaCBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMC4uYTY0ODBlMQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vbXNtL2RwL2RwX2RlYnVnLmgKPiBAQCAtMCwwICsxLDgxIEBACj4gKy8qCj4gKyAqIENvcHly aWdodCAoYykgMjAxNy0yMDE4LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNl cnZlZC4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCj4gKyAqIG9ubHkg dmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKi8KClNQRFggcGxl YXNlLgoKPiArI2lmbmRlZiBfRFBfREVCVUdfSF8KPiArI2RlZmluZSBfRFBfREVCVUdfSF8KPiAr Cj4gKyNpbmNsdWRlICJkcF9wYW5lbC5oIgo+ICsjaW5jbHVkZSAiZHBfbGluay5oIgo+ICsjaW5j bHVkZSAiZHBfZXh0Y29uLmgiCj4gKwo+ICsvKioKPiArICogc3RydWN0IGRwX2RlYnVnCj4gKyAq IEBkZWJ1Z19lbjogc3BlY2lmaWVzIHdoZXRoZXIgZGVidWcgbW9kZSBlbmFibGVkCj4gKyAqIEB2 ZGlzcGxheTogdXNlZCB0byBmaWx0ZXIgb3V0IHZkaXNwbGF5IHZhbHVlCj4gKyAqIEBoZGlzcGxh eTogdXNlZCB0byBmaWx0ZXIgb3V0IGhkaXNwbGF5IHZhbHVlCj4gKyAqIEB2cmVmcmVzaDogdXNl ZCB0byBmaWx0ZXIgb3V0IHZyZWZyZXNoIHZhbHVlCj4gKyAqIEB0cGdfc3RhdGU6IHNwZWNpZmll cyB3aGV0aGVyIHRwZyBmZWF0dXJlIGlzIGVuYWJsZWQKPiArICovCj4gK3N0cnVjdCBkcF9kZWJ1 ZyB7Cj4gKwlib29sIGRlYnVnX2VuOwo+ICsJaW50IGFzcGVjdF9yYXRpbzsKPiArCWludCB2ZGlz cGxheTsKPiArCWludCBoZGlzcGxheTsKPiArCWludCB2cmVmcmVzaDsKPiArfTsKPiArCj4gKyNp ZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKPiArCj4gKy8qKgo+ICsgKiBkcF9kZWJ1Z19nZXQo KSAtIGNvbmZpZ3VyZSBhbmQgZ2V0IHRoZSBEaXNwbGF5UGxvdCBkZWJ1ZyBtb2R1bGUgZGF0YQoK RGlzcGxheVBsb3Q/ICBEaXNwbGF5UG9ydCBwZXJoYXBzPwoKPiArICoKPiArICogQGRldjogZGV2 aWNlIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIKPiArICogQHBhbmVsOiBpbnN0YW5jZSBvZiBwYW5l bCBtb2R1bGUKPiArICogQHVzYnBkOiBpbnN0YW5jZSBvZiB1c2JwZCBtb2R1bGUKPiArICogQGxp bms6IGluc3RhbmNlIG9mIGxpbmsgbW9kdWxlCj4gKyAqIEBjb25uZWN0b3I6IGRvdWJsZSBwb2lu dGVyIHRvIGRpc3BsYXkgY29ubmVjdG9yCj4gKyAqIHJldHVybjogcG9pbnRlciB0byBhbGxvY2F0 ZWQgZGVidWcgbW9kdWxlIGRhdGEKPiArICoKPiArICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRo ZSBkZWJ1ZyBtb2R1bGUgYW5kIHByb3ZpZGVzIGEgd2F5Cj4gKyAqIGZvciBkZWJ1Z2ZzIGlucHV0 IHRvIGJlIGNvbW11bmljYXRlZCB3aXRoIGV4aXN0aW5nIG1vZHVsZXMKPiArICovCj4gK3N0cnVj dCBkcF9kZWJ1ZyAqZHBfZGVidWdfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX3Bh bmVsICpwYW5lbCwKPiArCQkJc3RydWN0IGRwX3VzYnBkICp1c2JwZCwgc3RydWN0IGRwX2xpbmsg KmxpbmssCj4gKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9yKTsKPiArLyoqCj4g KyAqIGRwX2RlYnVnX3B1dCgpCj4gKyAqCj4gKyAqIENsZWFucyB1cCBkcF9kZWJ1ZyBpbnN0YW5j ZQo+ICsgKgo+ICsgKiBAZHBfZGVidWc6IGluc3RhbmNlIG9mIGRwX2RlYnVnCj4gKyAqLwo+ICt2 b2lkIGRwX2RlYnVnX3B1dChzdHJ1Y3QgZHBfZGVidWcgKmRwX2RlYnVnKTsKPiArCj4gKyNlbHNl Cj4gKwo+ICtzdGF0aWMgaW5saW5lCj4gK3N0cnVjdCBkcF9kZWJ1ZyAqZHBfZGVidWdfZ2V0KHN0 cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX3BhbmVsICpwYW5lbCwKPiArCQkJc3RydWN0IGRw X3VzYnBkICp1c2JwZCwgc3RydWN0IGRwX2xpbmsgKmxpbmssCj4gKwkJCXN0cnVjdCBkcm1fY29u bmVjdG9yICoqY29ubmVjdG9yKQo+ICt7Cj4gKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiAr fQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGRwX2RlYnVnX3B1dChzdHJ1Y3QgZHBfZGVidWcg KmRwX2RlYnVnKQo+ICt7Cj4gK30KPiArCj4gKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ERUJV R19GUykgKi8KPiArCj4gKyNlbmRpZiAvKiBfRFBfREVCVUdfSF8gKi8KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNt L2RwL2RwX2Rpc3BsYXkuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4u OGM5ODM5OQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2Rw X2Rpc3BsYXkuYwo+IEBAIC0wLDAgKzEsOTc3IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykg MjAxNy0yMDE4LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAr ICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCj4gKyAqIG9ubHkgdmVyc2lvbiAy IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsg KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKi8KClNQRFggb2YgY291cnNlLgoK PiArI2RlZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwo+ICsK PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ ICsjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZGVidWdmcy5o Pgo+ICsjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9p cnEuaD4KPiArCj4gKyNpbmNsdWRlICJtc21fZHJ2LmgiCj4gKyNpbmNsdWRlICJkcF9leHRjb24u aCIKPiArI2luY2x1ZGUgImRwX3BhcnNlci5oIgo+ICsjaW5jbHVkZSAiZHBfcG93ZXIuaCIKPiAr I2luY2x1ZGUgImRwX2NhdGFsb2cuaCIKPiArI2luY2x1ZGUgImRwX2F1eC5oIgo+ICsjaW5jbHVk ZSAiZHBfbGluay5oIgo+ICsjaW5jbHVkZSAiZHBfcGFuZWwuaCIKPiArI2luY2x1ZGUgImRwX2N0 cmwuaCIKPiArI2luY2x1ZGUgImRwX2Rpc3BsYXkuaCIKPiArI2luY2x1ZGUgImRwX2RybS5oIgo+ ICsjaW5jbHVkZSAiZHBfZGVidWcuaCIKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbXNtX2RwICpnX2Rw X2Rpc3BsYXk7Cj4gKyNkZWZpbmUgSFBEX1NUUklOR19TSVpFIDMwCj4gKwo+ICtzdHJ1Y3QgZHBf ZGlzcGxheV9wcml2YXRlIHsKPiArCWNoYXIgKm5hbWU7Cj4gKwlpbnQgaXJxOwo+ICsKPiArCS8q IHN0YXRlIHZhcmlhYmxlcyAqLwo+ICsJYm9vbCBjb3JlX2luaXRpYWxpemVkOwo+ICsJYm9vbCBw b3dlcl9vbjsKPiArCWJvb2wgaHBkX2lycV9vbjsKPiArCWJvb2wgYXVkaW9fc3VwcG9ydGVkOwo+ ICsKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cj4gKwlzdHJ1Y3QgZGVudHJ5ICpy b290Owo+ICsJc3RydWN0IGNvbXBsZXRpb24gbm90aWZpY2F0aW9uX2NvbXA7Cj4gKwo+ICsJc3Ry dWN0IGRwX3VzYnBkICAgKnVzYnBkOwo+ICsJc3RydWN0IGRwX3BhcnNlciAgKnBhcnNlcjsKPiAr CXN0cnVjdCBkcF9wb3dlciAgICpwb3dlcjsKPiArCXN0cnVjdCBkcF9jYXRhbG9nICpjYXRhbG9n Owo+ICsJc3RydWN0IGRwX2F1eCAgICAgKmF1eDsKPiArCXN0cnVjdCBkcF9saW5rICAgICpsaW5r Owo+ICsJc3RydWN0IGRwX3BhbmVsICAgKnBhbmVsOwo+ICsJc3RydWN0IGRwX2N0cmwgICAgKmN0 cmw7Cj4gKwlzdHJ1Y3QgZHBfZGVidWcgICAqZGVidWc7Cj4gKwo+ICsJc3RydWN0IGRwX3VzYnBk X2NiIHVzYnBkX2NiOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSBtb2RlOwo+ICsJc3RydWN0 IG1zbV9kcCBkcF9kaXNwbGF5Owo+ICsKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIGRwX2R0X21hdGNoW10gPSB7Cj4gKwl7LmNvbXBhdGlibGUgPSAicWNvbSxk cC1kaXNwbGF5In0sCj4gKwl7fQoKV2UgbGlrZSB0byBoYXZlIGEgY29tbWEgYWZ0ZXIgdGhlIGNs b3Npbmcge30gZm9yIGNvbnNpc3RlbmN5LgoKPiArfTsKPiArCj4gK3N0YXRpYyBpcnFyZXR1cm5f dCBkcF9kaXNwbGF5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gK3sKPiArCXN0cnVjdCBk cF9kaXNwbGF5X3ByaXZhdGUgKmRwID0gZGV2X2lkOwo+ICsKPiArCWlmICghZHApIHsKPiArCQlw cl9lcnIoImludmFsaWQgZGF0YVxuIik7Cj4gKwkJcmV0dXJuIElSUV9OT05FOwo+ICsJfQo+CmRw IHdpbGwgbmV2ZXIgYmUgTlVMTCBoZXJlCgo+ICsJLyogRFAgY29udHJvbGxlciBpc3IgKi8KPiAr CWRwLT5jdHJsLT5pc3IoZHAtPmN0cmwpOwo+ICsKPiArCS8qIERQIGF1eCBpc3IgKi8KPiArCWRw LT5hdXgtPmlzcihkcC0+YXV4KTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IGRldmljZSAqbWFzdGVyLAo+ICsJCQkgICB2b2lkICpkYXRhKQo+ICt7Cj4gKwlpbnQgcmMgPSAw Owo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4gKwlzdHJ1Y3QgZHJtX2Rldmlj ZSAqZHJtOwo+ICsJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdjsKPiArCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKPiArCj4gKwlpZiAo IWRldiB8fCAhcGRldiB8fCAhbWFzdGVyKSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtKHMp LCBkZXYgJXBLLCBwZGV2ICVwSywgbWFzdGVyICVwS1xuIiwKPiArCQkJCWRldiwgcGRldiwgbWFz dGVyKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBlbmQ7Cj4gKwl9Cj4gClRoZXNlIHdp bGwgbmV2ZXIgYmUgTlVMTCBjb21pbmcgb3V0IG9mIGEgY29tcG9uZW50IGJpbmQuCgorCj4gKwlk cm0gPSBkZXZfZ2V0X2RydmRhdGEobWFzdGVyKTsKPiArCWRwID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7Cj4gKwlpZiAoIWRybSB8fCAhZHApIHsKPiArCQlwcl9lcnIoImludmFsaWQgcGFy YW0ocyksIGRybSAlcEssIGRwICVwS1xuIiwKPiArCQkJCWRybSwgZHApOwo+ICsJCXJjID0gLUVJ TlZBTDsKPiArCQlnb3RvIGVuZDsKPiArCX0KClRoZXNlIGFyZSBhbHNvIHZlcnkgdW5saWtlbHkg dG8gYmUgTlVMTC4KPiArCj4gKwlkcC0+ZHBfZGlzcGxheS5kcm1fZGV2ID0gZHJtOwo+ICsJcHJp diA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gKwlwcml2LT5kcCA9ICYoZHAtPmRwX2Rpc3BsYXkpOwo+ ICsKPiArCXJjID0gZHAtPnBhcnNlci0+cGFyc2UoZHAtPnBhcnNlcik7Cj4gKwlpZiAocmMpIHsK PiArCQlwcl9lcnIoImRldmljZSB0cmVlIHBhcnNpbmcgZmFpbGVkXG4iKTsKPiArCQlnb3RvIGVu ZDsKPiArCX0KPiArCj4gKwlyYyA9IGRwLT5hdXgtPmRybV9hdXhfcmVnaXN0ZXIoZHAtPmF1eCk7 Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoIkRSTSBEUCBBVVggcmVnaXN0ZXIgZmFpbGVkXG4i KTsKPiArCQlnb3RvIGVuZDsKPiArCX0KPiArCj4gKwlyYyA9IGRwLT5wb3dlci0+cG93ZXJfY2xp ZW50X2luaXQoZHAtPnBvd2VyKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigiUG93ZXIgY2xp ZW50IGNyZWF0ZSBmYWlsZWRcbiIpOwo+ICsJCWdvdG8gZW5kOwoKWW91IGRvbid0IG5lZWQgdGhp cyBnb3RvIGhlcmUsIHlvdSBjYW4ganVzdCBkcm9wIG91dC4KCj4gKwl9Cj4gKwo+ICtlbmQ6Cj4g KwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfdW5iaW5kKHN0 cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAo+ICsJCQkgICAgICB2b2lk ICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCXN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKPiArCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEobWFzdGVyKTsKPiArCXN0cnVj dCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkcm0tPmRldl9wcml2YXRlOwo+ICsKPiArCWlmICgh ZGV2IHx8ICFwZGV2KSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtKHMpXG4iKTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiAr CWlmICghZHApIHsKPiArCQlwcl9lcnIoIkludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm47 Cj4gKwl9CgpCb3RoIHRoZXNlIGNoZWNrcyBhcmUgbm90IGxpa2VseSB0byBiZSBOVUxMLgoKPiAr Cj4gKwkodm9pZClkcC0+cG93ZXItPnBvd2VyX2NsaWVudF9kZWluaXQoZHAtPnBvd2VyKTsKPiAr CSh2b2lkKWRwLT5hdXgtPmRybV9hdXhfZGVyZWdpc3RlcihkcC0+YXV4KTsKCklmIHlvdSBkb24n dCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBvZiBlaXRoZXIgb2YgdGhlc2UgdGhlbiBjb25zaWRlciBj aGFuZ2luZyB0aGVtCnNvIHRoZXkgZG9uJ3QgcmV0dXJuIGEgdmFsdWUuCgo+ICsJcHJpdi0+ZHAg PSBOVUxMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgZHBf ZGlzcGxheV9jb21wX29wcyA9IHsKPiArCS5iaW5kID0gZHBfZGlzcGxheV9iaW5kLAo+ICsJLnVu YmluZCA9IGRwX2Rpc3BsYXlfdW5iaW5kLAo+ICt9Owo+ICsKPiArc3RhdGljIGJvb2wgZHBfZGlz cGxheV9pc19kc19icmlkZ2Uoc3RydWN0IGRwX3BhbmVsICpwYW5lbCkKPiArewo+ICsJcmV0dXJu IChwYW5lbC0+ZHBjZFtEUF9ET1dOU1RSRUFNUE9SVF9QUkVTRU5UXSAmCj4gKwkJRFBfRFdOX1NU Uk1fUE9SVF9QUkVTRU5UKTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgZHBfZGlzcGxheV9pc19z aW5rX2NvdW50X3plcm8oc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCj4gK3sKPiArCXJl dHVybiBkcF9kaXNwbGF5X2lzX2RzX2JyaWRnZShkcC0+cGFuZWwpICYmCj4gKwkJKGRwLT5saW5r LT5zaW5rX2NvdW50LmNvdW50ID09IDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9kaXNw bGF5X3NlbmRfaHBkX2V2ZW50KHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpCj4gK3sKPiArCXN0 cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvcjsKPiArCj4gKwlpZiAoIWRwX2Rpc3BsYXkpIHsKPiArCQlwcl9lcnIoImludmFsaWQg aW5wdXRcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KCkl0IGxvb2tzIHVubGtlbHkgdGhpcyB3aWxs IGJlIE5VTEwsIHNvIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIG9yIHVzZQpXQVJOX09OLgoK PiArCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3BsYXksIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUsIGRwX2Rpc3BsYXkpOwo+ICsJaWYgKCFkcCkgewo+ICsJCXByX2VycigiaW52YWxpZCBwYXJh bXNcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KClRoZSByZXN1bHQgb2YgYSBjb250YWluZXJfb2Yo KSB3aWxsIE5FVkVSIGJlIE5VTEwgYXQgbGVhc3Qgbm90IHdpdGhvdXQgYSBsb3Qgb2YKdHJvdWJs ZS4KCj4gKwljb25uZWN0b3IgPSBkcC0+ZHBfZGlzcGxheS5jb25uZWN0b3I7Cj4gKwlkcm1faGVs cGVyX2hwZF9pcnFfZXZlbnQoY29ubmVjdG9yLT5kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGRwX2Rpc3BsYXlfc2VuZF9ocGRfbm90aWZpY2F0aW9uKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZh dGUgKmRwLAo+ICsJCQkJCSAgICBib29sIGhwZCkKPiArewo+ICsJaWYgKChocGQgJiYgZHAtPmRw X2Rpc3BsYXkuaXNfY29ubmVjdGVkKSB8fAo+ICsJCQkoIWhwZCAmJiAhZHAtPmRwX2Rpc3BsYXku aXNfY29ubmVjdGVkKSkgewo+ICsJCXByX2luZm8oIkhQRCBhbHJlYWR5ICVzXG4iLCAoaHBkID8g Im9uIiA6ICJvZmYiKSk7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJLyogcmVzZXQgdmlk ZW8gcGF0dGVybiBmbGFnIG9uIGRpc2Nvbm5lY3QgKi8KPiArCWlmICghaHBkKQo+ICsJCWRwLT5w YW5lbC0+dmlkZW9fdGVzdCA9IGZhbHNlOwo+ICsKPiArCWRwLT5kcF9kaXNwbGF5LmlzX2Nvbm5l Y3RlZCA9IGhwZDsKPiArCXJlaW5pdF9jb21wbGV0aW9uKCZkcC0+bm90aWZpY2F0aW9uX2NvbXAp Owo+ICsJZHBfZGlzcGxheV9zZW5kX2hwZF9ldmVudCgmZHAtPmRwX2Rpc3BsYXkpOwo+ICsKPiAr CWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkcC0+bm90aWZpY2F0aW9uX2NvbXAs IEhaICogMikpIHsKPiArCQlwcl93YXJuKCIlcyB0aW1lb3V0XG4iLCBocGQgPyAiY29ubmVjdCIg OiAiZGlzY29ubmVjdCIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwoKUmV0dXJuaW5nIC1FVElNRURP VVQgd291bGQgYmUgbW9yZSBpbmZvcm1hdGl2ZS4KCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV9wcm9jZXNzX2hwZF9oaWdoKHN0cnVjdCBk cF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGVk aWQgKmVkaWQ7Cj4gKwo+ICsJZHAtPmF1eC0+aW5pdChkcC0+YXV4LCBkcC0+cGFyc2VyLT5hdXhf Y2ZnKTsKPiArCj4gKwlpZiAoZHAtPmxpbmstPnBzbV9lbmFibGVkKQo+ICsJCWdvdG8gbm90aWZ5 Owo+ICsKPiArCXJjID0gZHAtPnBhbmVsLT5yZWFkX3NpbmtfY2FwcyhkcC0+cGFuZWwsIGRwLT5k cF9kaXNwbGF5LmNvbm5lY3Rvcik7Cj4gKwlpZiAocmMpCj4gKwkJZ290byBub3RpZnk7Cj4gKwo+ ICsJZHAtPmxpbmstPnByb2Nlc3NfcmVxdWVzdChkcC0+bGluayk7Cj4gKwo+ICsJaWYgKGRwX2Rp c3BsYXlfaXNfc2lua19jb3VudF96ZXJvKGRwKSkgewo+ICsJCXByX2RlYnVnKCJubyBkb3duc3Ry ZWFtIGRldmljZXMgY29ubmVjdGVkXG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7CgpZb3UgY2FuIGp1 c3QgcmV0dXJuIC1FSU5WQUwgaGVyZS4KCj4gKwkJZ290byBlbmQ7Cj4gKwl9Cj4gKwo+ICsJZWRp ZCA9IGRwLT5wYW5lbC0+ZWRpZDsKPiArCj4gKwlkcC0+YXVkaW9fc3VwcG9ydGVkID0gZHJtX2Rl dGVjdF9tb25pdG9yX2F1ZGlvKGVkaWQpOwo+ICsKPiArCWRwLT5wYW5lbC0+aGFuZGxlX3Npbmtf cmVxdWVzdChkcC0+cGFuZWwpOwo+ICsKPiArCWRwLT5kcF9kaXNwbGF5Lm1heF9wY2xrX2toeiA9 IGRwLT5wYXJzZXItPm1heF9wY2xrX2toejsKPiArbm90aWZ5Ogo+ICsJZHBfZGlzcGxheV9zZW5k X2hwZF9ub3RpZmljYXRpb24oZHAsIHRydWUpOwo+ICsKPiArZW5kOgo+ICsJcmV0dXJuIHJjOwoK Tm90IG5lZWRlZC4KCj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfaG9zdF9pbml0 KHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlib29sIGZsaXAgPSBmYWxz ZTsKPiArCj4gKwlpZiAoZHAtPmNvcmVfaW5pdGlhbGl6ZWQpIHsKPiArCQlwcl9kZWJ1ZygiRFAg Y29yZSBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJ aWYgKGRwLT51c2JwZC0+b3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fQ0MyKQo+ICsJCWZsaXAg PSB0cnVlOwo+ICsKPiArCWRwLT5wb3dlci0+aW5pdChkcC0+cG93ZXIsIGZsaXApOwo+ICsJZHAt PmN0cmwtPmluaXQoZHAtPmN0cmwsIGZsaXApOwo+ICsJZW5hYmxlX2lycShkcC0+aXJxKTsKPiAr CWRwLT5jb3JlX2luaXRpYWxpemVkID0gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHBf ZGlzcGxheV9ob3N0X2RlaW5pdChzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcCkKPiArewo+ ICsJaWYgKCFkcC0+Y29yZV9pbml0aWFsaXplZCkgewo+ICsJCXByX2RlYnVnKCJEUCBjb3JlIGFs cmVhZHkgb2ZmXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZHAtPmN0cmwtPmRlaW5p dChkcC0+Y3RybCk7Cj4gKwlkcC0+cG93ZXItPmRlaW5pdChkcC0+cG93ZXIpOwo+ICsJZGlzYWJs ZV9pcnEoZHAtPmlycSk7Cj4gKwlkcC0+Y29yZV9pbml0aWFsaXplZCA9IGZhbHNlOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBkcF9kaXNwbGF5X3Byb2Nlc3NfaHBkX2xvdyhzdHJ1Y3QgZHBfZGlz cGxheV9wcml2YXRlICpkcCkKPiArewo+ICsJLyogY2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3Qg Ki8KPiArCWRwLT5jdHJsLT5hYm9ydChkcC0+Y3RybCk7Cj4gKwo+ICsJZHBfZGlzcGxheV9zZW5k X2hwZF9ub3RpZmljYXRpb24oZHAsIGZhbHNlKTsKPiArCj4gKwlkcC0+YXV4LT5kZWluaXQoZHAt PmF1eCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV91c2JwZF9jb25maWd1cmVf Y2Ioc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRw X2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4gKwo+ICsJaWYgKCFkZXYpIHsKPiArCQlwcl9lcnIoImlu dmFsaWQgZGV2XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBlbmQ7Cj4gKwl9Cj4g CkknbSBub3Qgc3VyZSBpZiB0aGlzIGV2ZXIgYmUgdHJ1ZSAoSSBzdXNwZWN0IGl0IGNhbid0KSBi dXQgaWYgc28geW91IGNhbiB1c2UgdGhlCldBUk5fT04gbWV0aG9kLgoKPiArCWRwID0gZGV2X2dl dF9kcnZkYXRhKGRldik7Cj4gKwlpZiAoIWRwKSB7Cj4gKwkJcHJfZXJyKCJubyBkcml2ZXIgZGF0 YSBmb3VuZFxuIik7Cj4gKwkJcmMgPSAtRU5PREVWOwo+ICsJCWdvdG8gZW5kOwo+ICsJfQoKSSdt IHJlYXNvbmFibHkgc3VyZSB0aGF0IGlmIGRldiBpcyB2YWxpZCwgdGhpcyB3aWxsIGJlIHZhbGlk LgoKPiArCWRwX2Rpc3BsYXlfaG9zdF9pbml0KGRwKTsKPiArCj4gKwlpZiAoZHAtPnVzYnBkLT5o cGRfaGlnaCkKPiArCQlkcF9kaXNwbGF5X3Byb2Nlc3NfaHBkX2hpZ2goZHApOwo+ICtlbmQ6Cj4g KwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfY2xlYW4oc3Ry dWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCj4gK3sKPiArCWRwLT5jdHJsLT5wdXNoX2lkbGUo ZHAtPmN0cmwpOwo+ICsJZHAtPmN0cmwtPm9mZihkcC0+Y3RybCk7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgZHBfZGlzcGxheV91c2JwZF9kaXNjb25uZWN0X2NiKHN0cnVjdCBkZXZpY2UgKmRldikK PiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ ICsKPiArCWlmICghZGV2KSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGRldlxuIik7Cj4gKwkJcmMg PSAtRUlOVkFMOwo+ICsJCWdvdG8gZW5kOwo+ICsJfQo+ICsKPiArCWRwID0gZGV2X2dldF9kcnZk YXRhKGRldik7Cj4gKwlpZiAoIWRwKSB7Cj4gKwkJcHJfZXJyKCJubyBkcml2ZXIgZGF0YSBmb3Vu ZFxuIik7Cj4gKwkJcmMgPSAtRU5PREVWOwo+ICsJCWdvdG8gZW5kOwo+ICsJfQoKQXMgYWJvdmUK Cj4gKwkvKiBjYW5jZWwgYW55IHBlbmRpbmcgcmVxdWVzdCAqLwo+ICsJZHAtPmN0cmwtPmFib3J0 KGRwLT5jdHJsKTsKPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXlfc2VuZF9ocGRfbm90aWZpY2F0aW9u KGRwLCBmYWxzZSk7Cj4gKwo+ICsJLyogaWYgY2FibGUgaXMgZGlzY29ubmVjdGVkLCByZXNldCBw c21fZW5hYmxlZCBmbGFnICovCj4gKwlpZiAoIWRwLT51c2JwZC0+YWx0X21vZGVfY2ZnX2RvbmUp Cj4gKwkJZHAtPmxpbmstPnBzbV9lbmFibGVkID0gZmFsc2U7Cj4gKwo+ICsJaWYgKChyYyA8IDAp ICYmIGRwLT5wb3dlcl9vbikKPiArCQlkcF9kaXNwbGF5X2NsZWFuKGRwKTsKPiArCj4gKwlkcF9k aXNwbGF5X2hvc3RfZGVpbml0KGRwKTsKPiArZW5kOgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBkcF9kaXNwbGF5X2hhbmRsZV92aWRlb19yZXF1ZXN0KHN0cnVjdCBkcF9k aXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlpZiAoZHAtPmxpbmstPnNpbmtfcmVxdWVzdCAm IERQX1RFU1RfTElOS19WSURFT19QQVRURVJOKSB7Cj4gKwkJLyogZm9yY2UgZGlzY29ubmVjdCBm b2xsb3dlZCBieSBjb25uZWN0ICovCj4gKwkJZHAtPnVzYnBkLT5jb25uZWN0KGRwLT51c2JwZCwg ZmFsc2UpOwo+ICsJCWRwLT5wYW5lbC0+dmlkZW9fdGVzdCA9IHRydWU7Cj4gKwkJZHAtPnVzYnBk LT5jb25uZWN0KGRwLT51c2JwZCwgdHJ1ZSk7Cj4gKwkJZHAtPmxpbmstPnNlbmRfdGVzdF9yZXNw b25zZShkcC0+bGluayk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV9o YW5kbGVfaHBkX2lycShzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcCkKPiArewo+ICsJaWYg KGRwLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEU19QT1JUX1NUQVRVU19DSEFOR0VEKSB7Cj4gKwkJ ZHBfZGlzcGxheV9zZW5kX2hwZF9ub3RpZmljYXRpb24oZHAsIGZhbHNlKTsKPiArCj4gKwkJaWYg KGRwX2Rpc3BsYXlfaXNfc2lua19jb3VudF96ZXJvKGRwKSkgewo+ICsJCQlwcl9kZWJ1Zygic2lu ayBjb3VudCBpcyB6ZXJvLCBub3RoaW5nIHRvIGRvXG4iKTsKPiArCQkJcmV0dXJuIDA7Cj4gKwkJ fQo+ICsKPiArCQlyZXR1cm4gZHBfZGlzcGxheV9wcm9jZXNzX2hwZF9oaWdoKGRwKTsKPiArCX0K PiArCj4gKwlkcC0+Y3RybC0+aGFuZGxlX3NpbmtfcmVxdWVzdChkcC0+Y3RybCk7Cj4gKwo+ICsJ ZHBfZGlzcGxheV9oYW5kbGVfdmlkZW9fcmVxdWVzdChkcCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV91c2JwZF9hdHRlbnRpb25fY2Ioc3RydWN0 IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlf cHJpdmF0ZSAqZHA7Cj4gKwo+ICsJaWYgKCFkZXYpIHsKPiArCQlwcl9lcnIoImludmFsaWQgZGV2 XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkcCA9IGRldl9nZXRfZHJ2 ZGF0YShkZXYpOwo+ICsJaWYgKCFkcCkgewo+ICsJCXByX2Vycigibm8gZHJpdmVyIGRhdGEgZm91 bmRcbiIpOwo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQoKQXMgYWJvdmUuCgo+ICsJaWYgKGRw LT51c2JwZC0+aHBkX2lycSkgewo+ICsJCWRwLT5ocGRfaXJxX29uID0gdHJ1ZTsKPiArCj4gKwkJ cmMgPSBkcC0+bGluay0+cHJvY2Vzc19yZXF1ZXN0KGRwLT5saW5rKTsKPiArCQkvKiBjaGVjayBm b3IgYW55IHRlc3QgcmVxdWVzdCBpc3N1ZWQgYnkgc2luayAqLwo+ICsJCWlmICghcmMpCj4gKwkJ CWRwX2Rpc3BsYXlfaGFuZGxlX2hwZF9pcnEoZHApOwo+ICsKPiArCQlkcC0+aHBkX2lycV9vbiA9 IGZhbHNlOwoKSnVzdCByZXR1cm4gcmM7Cj4gKwkJZ290byBlbmQ7Cj4gKwl9Cj4gKwo+ICsJaWYg KCFkcC0+dXNicGQtPmhwZF9oaWdoKSB7Cj4gKwkJZHBfZGlzcGxheV9wcm9jZXNzX2hwZF9sb3co ZHApOwo+ICsJCWdvdG8gZW5kOwoKSnVzdCByZXR1cm4gIHJjOwoKPiArCX0KPiArCj4gKwlpZiAo ZHAtPnVzYnBkLT5hbHRfbW9kZV9jZmdfZG9uZSkKPiArCQlkcF9kaXNwbGF5X3Byb2Nlc3NfaHBk X2hpZ2goZHApOwoKPiArZW5kOgo+ICsJcmV0dXJuIHJjOwoKcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfZGVpbml0X3N1Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNw bGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlkcF9jdHJsX3B1dChkcC0+Y3RybCk7Cj4gKwlkcF9s aW5rX3B1dChkcC0+bGluayk7Cj4gKwlkcF9wYW5lbF9wdXQoZHAtPnBhbmVsKTsKPiArCWRwX2F1 eF9wdXQoZHAtPmF1eCk7Cj4gKwlkcF9wb3dlcl9wdXQoZHAtPnBvd2VyKTsKPiArCWRwX2NhdGFs b2dfcHV0KGRwLT5jYXRhbG9nKTsKPiArCWRwX3BhcnNlcl9wdXQoZHAtPnBhcnNlcik7Cj4gKwlk cF9kZWJ1Z19wdXQoZHAtPmRlYnVnKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9pbml0X3N1 Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQo+ICt7Cj4gKwlpbnQgcmMg PSAwOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmRwLT5wZGV2LT5kZXY7Cj4gKwlzdHJ1Y3Qg ZHBfdXNicGRfY2IgKmNiID0gJmRwLT51c2JwZF9jYjsKPiArCXN0cnVjdCBkcF9jdHJsX2luIGN0 cmxfaW4gPSB7Cj4gKwkJLmRldiA9IGRldiwKPiArCX07Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfaW4g cGFuZWxfaW4gPSB7Cj4gKwkJLmRldiA9IGRldiwKPiArCX07Cj4gKwo+ICsJLyogQ2FsbGJhY2sg QVBJcyB1c2VkIGZvciBjYWJsZSBzdGF0dXMgY2hhbmdlIGV2ZW50ICovCj4gKwljYi0+Y29uZmln dXJlICA9IGRwX2Rpc3BsYXlfdXNicGRfY29uZmlndXJlX2NiOwo+ICsJY2ItPmRpc2Nvbm5lY3Qg PSBkcF9kaXNwbGF5X3VzYnBkX2Rpc2Nvbm5lY3RfY2I7Cj4gKwljYi0+YXR0ZW50aW9uICA9IGRw X2Rpc3BsYXlfdXNicGRfYXR0ZW50aW9uX2NiOwo+ICsKPiArCWRwLT5wYXJzZXIgPSBkcF9wYXJz ZXJfZ2V0KGRwLT5wZGV2KTsKPiArCWlmIChJU19FUlIoZHAtPnBhcnNlcikpIHsKPiArCQlyYyA9 IFBUUl9FUlIoZHAtPnBhcnNlcik7Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBw YXJzZXIsIHJjID0gJWRcbiIsIHJjKTsKPiArCQlkcC0+cGFyc2VyID0gTlVMTDsKPiArCQlnb3Rv IGVycm9yX3BhcnNlcjsKPiArCX0KPiArCj4gKwlkcC0+Y2F0YWxvZyA9IGRwX2NhdGFsb2dfZ2V0 KGRldiwgJmRwLT5wYXJzZXItPmlvKTsKPiArCWlmIChJU19FUlIoZHAtPmNhdGFsb2cpKSB7Cj4g KwkJcmMgPSBQVFJfRVJSKGRwLT5jYXRhbG9nKTsKPiArCQlwcl9lcnIoImZhaWxlZCB0byBpbml0 aWFsaXplIGNhdGFsb2csIHJjID0gJWRcbiIsIHJjKTsKPiArCQlkcC0+Y2F0YWxvZyA9IE5VTEw7 Cj4gKwkJZ290byBlcnJvcl9jYXRhbG9nOwo+ICsJfQo+ICsKPiArCWRwLT5wb3dlciA9IGRwX3Bv d2VyX2dldChkcC0+cGFyc2VyKTsKPiArCWlmIChJU19FUlIoZHAtPnBvd2VyKSkgewo+ICsJCXJj ID0gUFRSX0VSUihkcC0+cG93ZXIpOwo+ICsJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUg cG93ZXIsIHJjID0gJWRcbiIsIHJjKTsKPiArCQlkcC0+cG93ZXIgPSBOVUxMOwo+ICsJCWdvdG8g ZXJyb3JfcG93ZXI7Cj4gKwl9Cj4gKwo+ICsJZHAtPmF1eCA9IGRwX2F1eF9nZXQoZGV2LCAmZHAt PmNhdGFsb2ctPmF1eCwgZHAtPnBhcnNlci0+YXV4X2NmZyk7Cj4gKwlpZiAoSVNfRVJSKGRwLT5h dXgpKSB7Cj4gKwkJcmMgPSBQVFJfRVJSKGRwLT5hdXgpOwo+ICsJCXByX2VycigiZmFpbGVkIHRv IGluaXRpYWxpemUgYXV4LCByYyA9ICVkXG4iLCByYyk7Cj4gKwkJZHAtPmF1eCA9IE5VTEw7Cj4g KwkJZ290byBlcnJvcl9hdXg7Cj4gKwl9Cj4gKwo+ICsJZHAtPmxpbmsgPSBkcF9saW5rX2dldChk ZXYsIGRwLT5hdXgpOwo+ICsJaWYgKElTX0VSUihkcC0+bGluaykpIHsKPiArCQlyYyA9IFBUUl9F UlIoZHAtPmxpbmspOwo+ICsJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgbGluaywgcmMg PSAlZFxuIiwgcmMpOwo+ICsJCWRwLT5saW5rID0gTlVMTDsKPiArCQlnb3RvIGVycm9yX2xpbms7 Cj4gKwl9Cj4gKwo+ICsJcGFuZWxfaW4uYXV4ID0gZHAtPmF1eDsKPiArCXBhbmVsX2luLmNhdGFs b2cgPSAmZHAtPmNhdGFsb2ctPnBhbmVsOwo+ICsJcGFuZWxfaW4ubGluayA9IGRwLT5saW5rOwo+ ICsKPiArCWRwLT5wYW5lbCA9IGRwX3BhbmVsX2dldCgmcGFuZWxfaW4pOwo+ICsJaWYgKElTX0VS UihkcC0+cGFuZWwpKSB7Cj4gKwkJcmMgPSBQVFJfRVJSKGRwLT5wYW5lbCk7Cj4gKwkJcHJfZXJy KCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwYW5lbCwgcmMgPSAlZFxuIiwgcmMpOwo+ICsJCWRwLT5w YW5lbCA9IE5VTEw7Cj4gKwkJZ290byBlcnJvcl9wYW5lbDsKPiArCX0KPiArCj4gKwljdHJsX2lu LmxpbmsgPSBkcC0+bGluazsKPiArCWN0cmxfaW4ucGFuZWwgPSBkcC0+cGFuZWw7Cj4gKwljdHJs X2luLmF1eCA9IGRwLT5hdXg7Cj4gKwljdHJsX2luLnBvd2VyID0gZHAtPnBvd2VyOwo+ICsJY3Ry bF9pbi5jYXRhbG9nID0gJmRwLT5jYXRhbG9nLT5jdHJsOwo+ICsJY3RybF9pbi5wYXJzZXIgPSBk cC0+cGFyc2VyOwo+ICsKPiArCWRwLT5jdHJsID0gZHBfY3RybF9nZXQoJmN0cmxfaW4pOwo+ICsJ aWYgKElTX0VSUihkcC0+Y3RybCkpIHsKPiArCQlyYyA9IFBUUl9FUlIoZHAtPmN0cmwpOwo+ICsJ CXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgY3RybCwgcmMgPSAlZFxuIiwgcmMpOwo+ICsJ CWRwLT5jdHJsID0gTlVMTDsKPiArCQlnb3RvIGVycm9yX2N0cmw7Cj4gKwl9Cj4gKwo+ICsJZHAt PmRlYnVnID0gZHBfZGVidWdfZ2V0KGRldiwgZHAtPnBhbmVsLCBkcC0+dXNicGQsCj4gKwkJCQlk cC0+bGluaywgJmRwLT5kcF9kaXNwbGF5LmNvbm5lY3Rvcik7Cj4gKwlpZiAoSVNfRVJSKGRwLT5k ZWJ1ZykpIHsKPiArCQlyYyA9IFBUUl9FUlIoZHAtPmRlYnVnKTsKPiArCQlwcl9lcnIoImZhaWxl ZCB0byBpbml0aWFsaXplIGRlYnVnLCByYyA9ICVkXG4iLCByYyk7CgpkcF9kZWJ1Z19nZXQoKSBw cmludHMgYWxsIHRoZSBpbnRlcmVzdGluZyBlcnJvciBtZXNzc2FnZXMgLSB5b3UgZG9uJ3QgbmVl ZCB0bwphZGQgb24uCgpJbiBmYWN0LCBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgdHJ1ZSBmb3Ig dGhlIHJlc3Qgb2YgdGhlIGRwXyBjYWxscyBhYm92ZSAtIGluCmdlbmVyYWwsIHRyeSB0byBrZWVw IHRoZSBudW1iZXIgb2YgbG9nIG1lc3NhZ2VzIHBlciBlcnJvciBkb3duIHRvIDEuCgo+ICsJCWRw LT5kZWJ1ZyA9IE5VTEw7Cj4gKwkJZ290byBlcnJvcl9kZWJ1ZzsKPiArCX0KPiArCj4gKwlyZXR1 cm4gcmM7Cj4gK2Vycm9yX2RlYnVnOgo+ICsJZHBfY3RybF9wdXQoZHAtPmN0cmwpOwo+ICtlcnJv cl9jdHJsOgo+ICsJZHBfcGFuZWxfcHV0KGRwLT5wYW5lbCk7Cj4gK2Vycm9yX3BhbmVsOgo+ICsJ ZHBfbGlua19wdXQoZHAtPmxpbmspOwo+ICtlcnJvcl9saW5rOgo+ICsJZHBfYXV4X3B1dChkcC0+ YXV4KTsKPiArZXJyb3JfYXV4Ogo+ICsJZHBfcG93ZXJfcHV0KGRwLT5wb3dlcik7Cj4gK2Vycm9y X3Bvd2VyOgo+ICsJZHBfY2F0YWxvZ19wdXQoZHAtPmNhdGFsb2cpOwo+ICtlcnJvcl9jYXRhbG9n Ogo+ICsJZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKPiArZXJyb3JfcGFyc2VyOgo+ICsJcmV0 dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfc2V0X21vZGUoc3RydWN0 IG1zbV9kcCAqZHBfZGlzcGxheSwKPiArCQkJICAgICAgIHN0cnVjdCBkcF9kaXNwbGF5X21vZGUg Km1vZGUpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRl ICpkcDsKPiArCj4gKwlpZiAoIWRwX2Rpc3BsYXkpIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5w dXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQoKSSdtIGJl dHRpbmcgdGhpcyBjYW4ndCBiZSBOVUxMOwoKPiArCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3Bs YXksIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwo+ICsKPiArCWRwLT5w YW5lbC0+cGluZm8gPSBtb2RlLT50aW1pbmc7Cj4gKwlkcC0+cGFuZWwtPmluaXRfaW5mbyhkcC0+ cGFuZWwpOwo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGludCBk cF9kaXNwbGF5X3ByZXBhcmUoc3RydWN0IG1zbV9kcCAqZHApCj4gK3sKPiArCXJldHVybiAwOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfZW5hYmxlKHN0cnVjdCBtc21fZHAgKmRw X2Rpc3BsYXkpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2 YXRlICpkcDsKPiArCj4gKwlpZiAoIWRwX2Rpc3BsYXkpIHsKPiArCQlwcl9lcnIoImludmFsaWQg aW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQoKSSBh bSBndWVzc2luZyB0aGlzIGNhbid0IGJlIE5VTEwuCgo+ICsJZHAgPSBjb250YWluZXJfb2YoZHBf ZGlzcGxheSwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7Cj4gKwo+ICsJ aWYgKGRwLT5wb3dlcl9vbikgewo+ICsJCXByX2RlYnVnKCJMaW5rIGFscmVhZHkgc2V0dXAsIHJl dHVyblxuIik7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJZHAtPmF1eC0+aW5pdChkcC0+ YXV4LCBkcC0+cGFyc2VyLT5hdXhfY2ZnKTsKPiArCj4gKwlyYyA9IGRwLT5jdHJsLT5vbihkcC0+ Y3RybCk7Cj4gKwlpZiAoIXJjKQo+ICsJCWRwLT5wb3dlcl9vbiA9IHRydWU7Cj4gK2Vycm9yOgo+ ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfcG9zdF9lbmFi bGUoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0 cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsKPiArCWlmICghZHBfZGlzcGxheSkgewo+ ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWdv dG8gZW5kOwo+ICsJfQo+CkFzIGFib3ZlLgoKPiArCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3Bs YXksIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwo+ICsKPiArCWNvbXBs ZXRlX2FsbCgmZHAtPm5vdGlmaWNhdGlvbl9jb21wKTsKPiArCj4gK2VuZDoKPiArCXJldHVybiBy YzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9kaXNwbGF5X3ByZV9kaXNhYmxlKHN0cnVjdCBt c21fZHAgKmRwX2Rpc3BsYXkpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfZGlz cGxheV9wcml2YXRlICpkcDsKPiArCj4gKwlpZiAoIWRwX2Rpc3BsYXkpIHsKPiArCQlwcl9lcnIo ImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ ICsJfQo+ICsKCmFzIGFib3ZlLgoKPiArCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3BsYXksIHN0 cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwo+ICsKPiArCWlmIChkcC0+dXNi cGQtPmFsdF9tb2RlX2NmZ19kb25lICYmIChkcC0+dXNicGQtPmhwZF9oaWdoIHx8Cj4gKwkJZHAt PnVzYnBkLT5mb3JjZWRfZGlzY29ubmVjdCkpCj4gKwkJZHAtPmxpbmstPnBzbV9jb25maWcoZHAt PmxpbmssICZkcC0+cGFuZWwtPmxpbmtfaW5mbywgdHJ1ZSk7Cj4gKwo+ICsJZHAtPmN0cmwtPnB1 c2hfaWRsZShkcC0+Y3RybCk7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGRwX2Rpc3BsYXlfZGlzYWJsZShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KQo+ ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4g Kwo+ICsJaWYgKCFkcF9kaXNwbGF5KSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsK PiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPgpBcyBhYm92ZS4KCj4g KwlkcCA9IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRl LCBkcF9kaXNwbGF5KTsKPiArCj4gKwlpZiAoIWRwLT5wb3dlcl9vbiB8fCAhZHAtPmNvcmVfaW5p dGlhbGl6ZWQpCj4gKwkJZ290byBlcnJvcjsKCmdvdG8gZXJyb3IgaXMgZGVjZXB0aXZlIGhlcmUu ICBZb3UgY2FuIGp1c3QgcmV0dXJuIDAuICBJbiBmYWN0LCBpZiB5b3UgZ2V0CnJpZCBvZiB0aGUg dW5lZWRlZCBOVUxMIGNoZWNrIHlvdSBkb24ndCBoYXZlIHRvIHJldHVybiBhbnl0aGluZyBmcm9t IHRoaXMKZnVuY3Rpb24uCgo+ICsKPiArCWRwLT5jdHJsLT5vZmYoZHAtPmN0cmwpOwo+ICsKPiAr CWRwLT5wb3dlcl9vbiA9IGZhbHNlOwo+ICsKPiArCWNvbXBsZXRlX2FsbCgmZHAtPm5vdGlmaWNh dGlvbl9jb21wKTsKPiArZXJyb3I6Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZHBfcmVxdWVzdF9pcnEoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSkKPiArewo+ICsJaW50 IHJjID0gMDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwo+ICsKPiArCWlmICgh ZHBfZGlzcGxheSkgewo+ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gKwl9CgpMaWtlbHkgbm90IG5lZWRlZC4KCj4gKwlkcCA9IGNvbnRhaW5lcl9v ZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiAr Cj4gKwlkcC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZHAtPnBkZXYtPmRldi5vZl9ub2Rl LCAwKTsKPiArCWlmIChkcC0+aXJxIDwgMCkgewo+ICsJCXJjID0gZHAtPmlycTsKPiArCQlwcl9l cnIoImZhaWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgcmMpOwo+ICsJCXJldHVybiByYzsKPiArCX0K PiArCj4gKwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoJmRwLT5wZGV2LT5kZXYsIGRwLT5pcnEsIGRw X2Rpc3BsYXlfaXJxLAo+ICsJCUlSUUZfVFJJR0dFUl9ISUdILCAiZHBfZGlzcGxheV9pc3IiLCBk cCk7Cj4gKwlpZiAocmMgPCAwKSB7Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBJUlEl dTogJWRcbiIsCj4gKwkJCQlkcC0+aXJxLCByYyk7Cj4gKwkJcmV0dXJuIHJjOwo+ICsJfQo+ICsJ ZGlzYWJsZV9pcnEoZHAtPmlycSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBzdHJ1Y3QgZHBfZGVidWcgKmRwX2dldF9kZWJ1ZyhzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5 KQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcDsKPiArCj4gKwlpZiAoIWRw X2Rpc3BsYXkpIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiBF UlJfUFRSKC1FSU5WQUwpOwo+ICsJfQoKTGlrZWx5IG5vdCBuZWVkZWQuCgo+ICsJZHAgPSBjb250 YWluZXJfb2YoZHBfZGlzcGxheSwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxh eSk7Cj4gKwo+ICsJcmV0dXJuIGRwLT5kZWJ1ZzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9k aXNwbGF5X3VucHJlcGFyZShzdHJ1Y3QgbXNtX2RwICpkcCkKPiArewo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgZHBfZGlzcGxheV92YWxpZGF0ZV9tb2RlKHN0cnVjdCBtc21f ZHAgKmRwLCB1MzIgbW9kZV9wY2xrX2toeikKPiArewo+ICsJY29uc3QgdTMyIG51bV9jb21wb25l bnRzID0gMywgZGVmYXVsdF9icHAgPSAyNDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUg KmRwX2Rpc3BsYXk7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2xpbmsgKmxpbmtfaW5mbzsKPiArCXUzMiBt b2RlX3JhdGVfa2h6ID0gMCwgc3VwcG9ydGVkX3JhdGVfa2h6ID0gMCwgbW9kZV9icHAgPSAwOwo+ ICsKPiArCWlmICghZHAgfHwgIW1vZGVfcGNsa19raHogfHwgIWRwLT5jb25uZWN0b3IpIHsKPiAr CQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0K ClNhbWUgYXMgYWJvdmUuCgo+ICsJZHBfZGlzcGxheSA9IGNvbnRhaW5lcl9vZihkcCwgc3RydWN0 IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7Cj4gKwlsaW5rX2luZm8gPSAmZHBfZGlz cGxheS0+cGFuZWwtPmxpbmtfaW5mbzsKPiArCj4gKwltb2RlX2JwcCA9IGRwLT5jb25uZWN0b3It PmRpc3BsYXlfaW5mby5icGMgKiBudW1fY29tcG9uZW50czsKPiArCWlmICghbW9kZV9icHApCj4g KwkJbW9kZV9icHAgPSBkZWZhdWx0X2JwcDsKPiArCj4gKwltb2RlX2JwcCA9IGRwX2Rpc3BsYXkt PnBhbmVsLT5nZXRfbW9kZV9icHAoZHBfZGlzcGxheS0+cGFuZWwsCj4gKwkJCW1vZGVfYnBwLCBt b2RlX3BjbGtfa2h6KTsKPiArCj4gKwltb2RlX3JhdGVfa2h6ID0gbW9kZV9wY2xrX2toeiAqIG1v ZGVfYnBwOwo+ICsJc3VwcG9ydGVkX3JhdGVfa2h6ID0gbGlua19pbmZvLT5udW1fbGFuZXMgKiBs aW5rX2luZm8tPnJhdGUgKiA4Owo+ICsKPiArCWlmIChtb2RlX3JhdGVfa2h6ID4gc3VwcG9ydGVk X3JhdGVfa2h6KQo+ICsJCXJldHVybiBNT0RFX0JBRDsKPiArCj4gKwlyZXR1cm4gTU9ERV9PSzsK PiArfQo+ICsKPiArc3RhdGljIGludCBkcF9kaXNwbGF5X2dldF9tb2RlcyhzdHJ1Y3QgbXNtX2Rw ICpkcCwKPiArCQkJCXN0cnVjdCBkcF9kaXNwbGF5X21vZGUgKmRwX21vZGUpCj4gK3sKPiArCXN0 cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwX2Rpc3BsYXk7Cj4gKwlpbnQgcmV0ID0gMDsKPiAr Cj4gKwlpZiAoIWRwKSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0 dXJuIDA7Cj4gKwl9CgpMaWtlbHkgbm90IG5lZWRlZC4KCj4gKwlkcF9kaXNwbGF5ID0gY29udGFp bmVyX29mKGRwLCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCj4g KwlyZXQgPSBkcF9kaXNwbGF5LT5wYW5lbC0+Z2V0X21vZGVzKGRwX2Rpc3BsYXktPnBhbmVsLAo+ ICsJCWRwLT5jb25uZWN0b3IsIGRwX21vZGUpOwo+ICsJaWYgKGRwX21vZGUtPnRpbWluZy5waXhl bF9jbGtfa2h6KQo+ICsJCWRwLT5tYXhfcGNsa19raHogPSBkcF9tb2RlLT50aW1pbmcucGl4ZWxf Y2xrX2toejsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGRwX2Rpc3Bs YXlfY2hlY2tfdmlkZW9fdGVzdChzdHJ1Y3QgbXNtX2RwICpkcCkKPiArewo+ICsJc3RydWN0IGRw X2Rpc3BsYXlfcHJpdmF0ZSAqZHBfZGlzcGxheTsKPiArCj4gKwlpZiAoIWRwKSB7Cj4gKwkJcHJf ZXJyKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJfQoKTGlrZWx5 IG5vdCBuZWVkZWQKCj4gKwlkcF9kaXNwbGF5ID0gY29udGFpbmVyX29mKGRwLCBzdHJ1Y3QgZHBf ZGlzcGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKPiArCj4gKwlpZiAoZHBfZGlzcGxheS0+cGFu ZWwtPnZpZGVvX3Rlc3QpCj4gKwkJcmV0dXJuIHRydWU7Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX2Rpc3BsYXlfZ2V0X3Rlc3RfYnBwKHN0cnVjdCBtc21f ZHAgKmRwKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcF9kaXNwbGF5Owo+ ICsKPiArCWlmICghZHApIHsKPiArCQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKPiArCQly ZXR1cm4gMDsKPiArCX0KCkxpa2VseSBub3QgbmVlZGVkLgoKPiArCWRwX2Rpc3BsYXkgPSBjb250 YWluZXJfb2YoZHAsIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwo+ICsK PiArCXJldHVybiBkcF9saW5rX2JpdF9kZXB0aF90b19icHAoCj4gKwkJZHBfZGlzcGxheS0+bGlu ay0+dGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBf ZGlzcGxheV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlpbnQg cmMgPSAwOwo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4gKwo+ICsJaWYgKCFw ZGV2IHx8ICFwZGV2LT5kZXYub2Zfbm9kZSkgewo+ICsJCXByX2VycigicGRldiBub3QgZm91bmRc biIpOwo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQoKQm90aCBvZiB0aGVzZSB3aWxsIGFsd2F5 cyBiZSB0cnVlIGluIGEgcHJvYmUgZnVuY3Rpb24gdGhhdCB5b3UgcmVhY2ggZnJvbSBhCmNvbXBh dGlibGUgbWF0Y2guCgo+ICsJZHAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpk cCksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFkcCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4g Kwlpbml0X2NvbXBsZXRpb24oJmRwLT5ub3RpZmljYXRpb25fY29tcCk7Cj4gKwo+ICsJZHAtPnBk ZXYgPSBwZGV2Owo+ICsJZHAtPm5hbWUgPSAiZHJtX2RwIjsKPiArCj4gKwlyYyA9IGRwX2luaXRf c3ViX21vZHVsZXMoZHApOwo+ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJpbml0IHN1YiBtb2R1 bGUgZmFpbGVkXG4iKTsKSSdtIGd1ZXNzaW5nIHRoYXQgIHRoaXMgbG9nIG1lc3NhZ2Ugd2lsbCBh bHdheXMgYmUgc3VwZXJmbHVvdXMuCgo+ICsJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZHApOwo+ ICsJCXJldHVybiAtRVBST0JFX0RFRkVSOwoKQWx3YXlzIHJldHVybiAtRVBST0JFX0RFRkVSIHJl Z2FyZGxlc3Mgb2YgdGhlIGVycm9yPyAgSXQgc2VlbXMgdGhhdCBhdCBhIGNlcnRhaW4KcG9pbnQg bWFueSBvZiB0aGVzZSBlcnJvcnMgeW91IHBvaW50IG91dCB3b3VsZCBiZSBmYXRhbCB0byB0aGUg ZGV2aWNlIHJlZ2FyZGxlc3MKb2YgdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uLgoKPiArCX0K PiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkcCk7Cj4gKwo+ICsJZ19kcF9kaXNw bGF5ID0gJmRwLT5kcF9kaXNwbGF5Owo+ICsKPiArCWdfZHBfZGlzcGxheS0+ZW5hYmxlICAgICAg ICA9IGRwX2Rpc3BsYXlfZW5hYmxlOwo+ICsJZ19kcF9kaXNwbGF5LT5wb3N0X2VuYWJsZSAgID0g ZHBfZGlzcGxheV9wb3N0X2VuYWJsZTsKPiArCWdfZHBfZGlzcGxheS0+cHJlX2Rpc2FibGUgICA9 IGRwX2Rpc3BsYXlfcHJlX2Rpc2FibGU7Cj4gKwlnX2RwX2Rpc3BsYXktPmRpc2FibGUgICAgICAg PSBkcF9kaXNwbGF5X2Rpc2FibGU7Cj4gKwlnX2RwX2Rpc3BsYXktPnNldF9tb2RlICAgICAgPSBk cF9kaXNwbGF5X3NldF9tb2RlOwo+ICsJZ19kcF9kaXNwbGF5LT52YWxpZGF0ZV9tb2RlID0gZHBf ZGlzcGxheV92YWxpZGF0ZV9tb2RlOwo+ICsJZ19kcF9kaXNwbGF5LT5nZXRfbW9kZXMgICAgID0g ZHBfZGlzcGxheV9nZXRfbW9kZXM7Cj4gKwlnX2RwX2Rpc3BsYXktPnByZXBhcmUgICAgICAgPSBk cF9kaXNwbGF5X3ByZXBhcmU7Cj4gKwlnX2RwX2Rpc3BsYXktPnVucHJlcGFyZSAgICAgPSBkcF9k aXNwbGF5X3VucHJlcGFyZTsKPiArCWdfZHBfZGlzcGxheS0+cmVxdWVzdF9pcnEgICA9IGRwX3Jl cXVlc3RfaXJxOwo+ICsJZ19kcF9kaXNwbGF5LT5nZXRfZGVidWcgICAgID0gZHBfZ2V0X2RlYnVn Owo+ICsJZ19kcF9kaXNwbGF5LT5zZW5kX2hwZF9ldmVudCAgICA9IGRwX2Rpc3BsYXlfc2VuZF9o cGRfZXZlbnQ7Cj4gKwlnX2RwX2Rpc3BsYXktPmlzX3ZpZGVvX3Rlc3QgPSBkcF9kaXNwbGF5X2No ZWNrX3ZpZGVvX3Rlc3Q7Cj4gKwlnX2RwX2Rpc3BsYXktPmdldF90ZXN0X2JwcCA9IGRwX2Rpc3Bs YXlfZ2V0X3Rlc3RfYnBwOwo+ICsKPiArCXJjID0gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAm ZHBfZGlzcGxheV9jb21wX29wcyk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoImNvbXBvbmVu dCBhZGQgZmFpbGVkLCByYz0lZFxuIiwgcmMpOwo+ICsJCWRwX2Rpc3BsYXlfZGVpbml0X3N1Yl9t b2R1bGVzKGRwKTsKPiArCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGRwKTsKPiArCX0KPiArCj4g KwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK2ludCBkcF9kaXNwbGF5X2dldF9kaXNwbGF5cyh2b2lk ICoqZGlzcGxheXMsIGludCBjb3VudCkKPiArewo+ICsJaWYgKCFkaXNwbGF5cykgewo+ICsJCXBy X2VycigiaW52YWxpZCBkYXRhXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4g KwlpZiAoY291bnQgIT0gMSkgewo+ICsJCXByX2VycigiaW52YWxpZCBudW1iZXIgb2YgZGlzcGxh eXNcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWRpc3BsYXlzWzBdID0g Z19kcF9kaXNwbGF5Owo+ICsJcmV0dXJuIGNvdW50Owo+ICt9CgpUaGlzIGlzbid0IHVzZWQgaW4g dGhpcyBwYXRjaCBzbyBJIGRvbid0IHNlZSBob3cgaXQgaXMgdXNlZCBidXQgYmFzZWQgb24KZXZl cnl0aGluZyBpdCBzZWVtcyBsaWtlIHlvdSBjb3VsZCBqdXN0IGFzIGVhc2lseSBnZXQgYXdheSB3 aXRoCgpzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5X2dldF9kaXNwbGF5KHZvaWQpCnsKCXJldHVy biBnX2RwX2Rpc3BsYXk7Cn0KCkV2ZW4gaWYgeW91IGFyZSBwbGFubmluZyBmb3IgdGhlIGZ1dHVy ZSwgeW91IGNhbiBtYWtlIHRoZSBjaGFuZ2VzIHRvIHN1cHBvcnQKbXVsdGlwbGUgZGlzcGxheXMg dGhlbiBhbmQgc2F2ZSB5b3Vyc2VsZiB0aGUgZWZmb3J0IG5vdy4KCj4gK2ludCBkcF9kaXNwbGF5 X2dldF9udW1fb2ZfZGlzcGxheXModm9pZCkKPiArewo+ICsJcmV0dXJuIDE7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgZHBfZGlzcGxheV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKPiArewo+ICsJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7Cj4gKwo+ICsJaWYgKCFw ZGV2KQo+ICsJCXJldHVybiAtRUlOVkFMOwoKcGRldiB3aWxsIG5ldmVyIGJlIE5VTEwgaGVyZS4K Cj4gKwo+ICsJZHAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiArCj4gKwlkcF9kaXNw bGF5X2RlaW5pdF9zdWJfbW9kdWxlcyhkcCk7Cj4gKwo+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEo cGRldiwgTlVMTCk7Cj4gKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGRwKTsKCllvdSBkb24ndCBu ZWVkIHRvIGRldm1fa2ZyZWUoKSBpbiBhIHJlbW92ZSBmdW5jdGlvbiBoZXJlLgo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkcF9kaXNw bGF5X2RyaXZlciA9IHsKPiArCS5wcm9iZSAgPSBkcF9kaXNwbGF5X3Byb2JlLAo+ICsJLnJlbW92 ZSA9IGRwX2Rpc3BsYXlfcmVtb3ZlLAo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJtc20t ZHAtZGlzcGxheSIsCj4gKwkJLm9mX21hdGNoX3RhYmxlID0gZHBfZHRfbWF0Y2gsCj4gKwl9LAo+ ICt9Owo+ICsKPiAraW50IF9faW5pdCBtc21fZHBfcmVnaXN0ZXIodm9pZCkKPiArewo+ICsJaW50 IHJldDsKPiArCj4gKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRwX2Rpc3BsYXlf ZHJpdmVyKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoImRyaXZlciByZWdpc3RlciBmYWls ZWQiKTsKPiArCQlyZXR1cm4gcmV0OwoKWW91IGRvbid0IG5lZWQgdGhpcyByZXR1cm4gcmV0IC0g eW91IGNhbiBqdXN0IGRyb3Agb3V0IHRvIHRoZSBib3R0b20uCgo+ICsJfQo+ICsKPiArCXJldHVy biByZXQ7Cj4gK30KPiArCj4gK3ZvaWQgX19leGl0IG1zbV9kcF91bnJlZ2lzdGVyKHZvaWQpCj4g K3sKPiArCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkcF9kaXNwbGF5X2RyaXZlcik7Cj4g K30KPiArCj4gK2ludCBtc21fZHBfbW9kZXNldF9pbml0KHN0cnVjdCBtc21fZHAgKmRwX2Rpc3Bs YXksIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gKwkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5j b2RlcikKPiArewo+ICsJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdjsKPiArCWludCByZXQ7 Cj4gKwo+ICsJaWYgKFdBUk5fT04oIWVuY29kZXIpIHx8IFdBUk5fT04oIWRwX2Rpc3BsYXkpIHx8 IFdBUk5fT04oIWRldikpCj4gKwkJcmV0dXJuIC1FSU5WQUw7CgpUaGF0cyB3aGF0IEkgbGlrZSB0 byBzZWUgLSBidXQgeW91IGNvdWxkIGFsc28gZG8KCmlmIChXQVJOX09OKCFlbmNvZGVyIHx8ICFk cF9kaXNwbGF5IHx8ICFkZXYpKQoKPiAKPiArCXByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ICsJ ZHBfZGlzcGxheS0+ZHJtX2RldiA9IGRldjsKPiArCj4gKwlyZXQgPSBkcF9kcm1fYnJpZGdlX2lu aXQoZHBfZGlzcGxheSwgZW5jb2Rlcik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYt PmRldiwgImZhaWxlZCB0byBjcmVhdGUgZHAgYnJpZGdlOiAlZFxuIiwgcmV0KTsKCkp1c3QgZG91 YmxlIGNoZWNrIHRvIHNlZSBob3cgcmVkdW5kYW50IHRoaXMgZXJyb3IgbWVzc2FnZSBpcy4KCj4g KwkJZHBfZGlzcGxheS0+YnJpZGdlID0gTlVMTDsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsJ ZHBfZGlzcGxheS0+ZW5jb2RlciA9IGVuY29kZXI7Cj4gKwo+ICsJZHBfZGlzcGxheS0+Y29ubmVj dG9yID0gZHBfZHJtX2Nvbm5lY3Rvcl9pbml0KGRwX2Rpc3BsYXkpOwo+ICsJaWYgKElTX0VSUihk cF9kaXNwbGF5LT5jb25uZWN0b3IpKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihkcF9kaXNwbGF5LT5j b25uZWN0b3IpOwo+ICsJCWRldl9lcnIoZGV2LT5kZXYsCj4gKwkJCSJmYWlsZWQgdG8gY3JlYXRl IGRwIGNvbm5lY3RvcjogJWRcbiIsIHJldCk7CgpTYW1lLgoKPiArCQlkcF9kaXNwbGF5LT5jb25u ZWN0b3IgPSBOVUxMOwo+ICsJCWdvdG8gY29ubl9mYWlsOwo+ICsJfQo+ICsKPiArCXByaXYtPmJy aWRnZXNbcHJpdi0+bnVtX2JyaWRnZXMrK10gPSBkcF9kaXNwbGF5LT5icmlkZ2U7Cj4gKwlwcml2 LT5jb25uZWN0b3JzW3ByaXYtPm51bV9jb25uZWN0b3JzKytdID0gZHBfZGlzcGxheS0+Y29ubmVj dG9yOwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtjb25uX2ZhaWw6Cj4gKwlpZiAoZHBfZGlzcGxheS0+ YnJpZGdlKSB7Cj4gKwkJZHBfZHJtX2JyaWRnZV9kZWluaXQoZHBfZGlzcGxheSk7Cj4gKwkJZHBf ZGlzcGxheS0+YnJpZGdlID0gTlVMTDsKPiArCX0KPiArCXJldHVybiByZXQ7Cj4gK30KPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmggYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXgg MDAwMDAwMC4uY2E1ZWFlNQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX2Rpc3BsYXkuaAo+IEBAIC0wLDAgKzEsNTUgQEAKPiArLyoKPiArICogQ29weXJp Z2h0IChjKSAyMDE3LTIwMTgsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2 ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4g KyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqLwoKU1BEWCBwbGVh c2UuCgo+ICsjaWZuZGVmIF9EUF9ESVNQTEFZX0hfCj4gKyNkZWZpbmUgX0RQX0RJU1BMQVlfSF8K PiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsKPiArI2luY2x1ZGUgImRwX3BhbmVsLmgi Cj4gKwo+ICtzdHJ1Y3QgbXNtX2RwIHsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2Owo+ ICsJc3RydWN0IGRwX2JyaWRnZSAqZHBfYnJpZGdlOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvcjsKPiArCXN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2U7Cj4gKwo+ICsJLyogdGhl IGVuY29kZXIgd2UgYXJlIGhvb2tlZCB0byAob3V0c2lkZSBvZiBkc2kgYmxvY2spICovCj4gKwlz dHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Cj4gKwlib29sIGlzX2Nvbm5lY3RlZDsKPiArCXUz MiBtYXhfcGNsa19raHo7Cj4gKwo+ICsJaW50ICgqZW5hYmxlKShzdHJ1Y3QgbXNtX2RwICpkcF9k aXNwbGF5KTsKPiArCWludCAoKnBvc3RfZW5hYmxlKShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5 KTsKPiArCj4gKwlpbnQgKCpwcmVfZGlzYWJsZSkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7 Cj4gKwlpbnQgKCpkaXNhYmxlKShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KTsKPiArCj4gKwlp bnQgKCpzZXRfbW9kZSkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSwKPiArCQkJc3RydWN0IGRw X2Rpc3BsYXlfbW9kZSAqbW9kZSk7Cj4gKwlpbnQgKCp2YWxpZGF0ZV9tb2RlKShzdHJ1Y3QgbXNt X2RwICpkcF9kaXNwbGF5LCB1MzIgbW9kZV9wY2xrX2toeik7Cj4gKwlpbnQgKCpnZXRfbW9kZXMp KHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXksCj4gKwkJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSAq ZHBfbW9kZSk7Cj4gKwlpbnQgKCpwcmVwYXJlKShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KTsK PiArCWludCAoKnVucHJlcGFyZSkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7Cj4gKwlpbnQg KCpyZXF1ZXN0X2lycSkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7Cj4gKwlzdHJ1Y3QgZHBf ZGVidWcgKigqZ2V0X2RlYnVnKShzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5KTsKPiArCXZvaWQg KCpzZW5kX2hwZF9ldmVudCkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7Cj4gKwlib29sICgq aXNfdmlkZW9fdGVzdCkoc3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheSk7Cj4gKwlpbnQgKCpnZXRf dGVzdF9icHApKHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpOwo+ICt9Owo+ICsKPiAraW50IGRw X2Rpc3BsYXlfZ2V0X251bV9vZl9kaXNwbGF5cyh2b2lkKTsKPiAraW50IGRwX2Rpc3BsYXlfZ2V0 X2Rpc3BsYXlzKHZvaWQgKipkaXNwbGF5cywgaW50IGNvdW50KTsKPiArI2VuZGlmIC8qIF9EUF9E SVNQTEFZX0hfICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJt LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiBpbmRleCAwMDAwMDAwLi42NGQ2NDQ5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmMKPiBAQCAtMCwwICsxLDU0MiBAQAo+ICsvKgo+ICsg KiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAo+ICsg KiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbi4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPiArICogR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICovCgpT UERYCgo+ICsjZGVmaW5lIHByX2ZtdChmbXQpCSJbZHJtLWRwXTogJXM6ICIgZm10LCBfX2Z1bmNf Xwo+ICsKPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8 ZHJtL2RybV9hdG9taWMuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgo+ICsKPiArI2lu Y2x1ZGUgIm1zbV9kcnYuaCIKPiArI2luY2x1ZGUgIm1zbV9rbXMuaCIKPiArLy8jaW5jbHVkZSAi ZHB1X2Nvbm5lY3Rvci5oIgoKSWYgdGhpcyBpc24ndCBuZWVkZWQganVzdCBnZXQgcmlkIG9mIGl0 Cgo+ICsjaW5jbHVkZSAiZHBfZHJtLmgiCj4gKyNpbmNsdWRlICJkcF9kZWJ1Zy5oIgo+ICsKPiAr c3RydWN0IGRwX2Nvbm5lY3RvciB7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBiYXNlOwo+ICsJ c3RydWN0IG1zbV9kcCAqZHBfZGlzcGxheTsKPiArfTsKPiArI2RlZmluZSB0b19kcF9jb25uZWN0 b3IoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcF9jb25uZWN0b3IsIGJhc2UpCj4gKyNkZWZp bmUgdG9fZHBfYnJpZGdlKHgpICAgICBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgZHBfYnJpZGdl LCBiYXNlKQo+ICsKPiArc3RhdGljIHZvaWQgY29udmVydF90b19kcF9tb2RlKGNvbnN0IHN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZSwKPiArCQkJc3RydWN0IGRwX2Rpc3BsYXlfbW9k ZSAqZHBfbW9kZSwgc3RydWN0IG1zbV9kcCAqZHApCj4gK3sKPiArCWNvbnN0IHUzMiBudW1fY29t cG9uZW50cyA9IDM7CgpJIHByZWZlciB0byB1c2UganVzdCB0aGUgY29uc3RhbnRzIGlubGluZSwg ZXNwZWNpYWxseSBzaW5jZSB5b3UgYXJlIG9ubHkgdXNpbmcKb25jZS4KCj4gKwo+ICsJbWVtc2V0 KGRwX21vZGUsIDAsIHNpemVvZigqZHBfbW9kZSkpOwo+ICsKPiArCWRwX21vZGUtPnRpbWluZy5o X2FjdGl2ZSA9IGRybV9tb2RlLT5oZGlzcGxheTsKPiArCWRwX21vZGUtPnRpbWluZy5oX2JhY2tf cG9yY2ggPSBkcm1fbW9kZS0+aHRvdGFsIC0gZHJtX21vZGUtPmhzeW5jX2VuZDsKPiArCWRwX21v ZGUtPnRpbWluZy5oX3N5bmNfd2lkdGggPSBkcm1fbW9kZS0+aHRvdGFsIC0KPiArCQkJKGRybV9t b2RlLT5oc3luY19zdGFydCArIGRwX21vZGUtPnRpbWluZy5oX2JhY2tfcG9yY2gpOwo+ICsJZHBf bW9kZS0+dGltaW5nLmhfZnJvbnRfcG9yY2ggPSBkcm1fbW9kZS0+aHN5bmNfc3RhcnQgLQo+ICsJ CQkJCSBkcm1fbW9kZS0+aGRpc3BsYXk7Cj4gKwlkcF9tb2RlLT50aW1pbmcuaF9za2V3ID0gZHJt X21vZGUtPmhza2V3Owo+ICsKPiArCWRwX21vZGUtPnRpbWluZy52X2FjdGl2ZSA9IGRybV9tb2Rl LT52ZGlzcGxheTsKPiArCWRwX21vZGUtPnRpbWluZy52X2JhY2tfcG9yY2ggPSBkcm1fbW9kZS0+ dnRvdGFsIC0gZHJtX21vZGUtPnZzeW5jX2VuZDsKPiArCWRwX21vZGUtPnRpbWluZy52X3N5bmNf d2lkdGggPSBkcm1fbW9kZS0+dnRvdGFsIC0KPiArCQkoZHJtX21vZGUtPnZzeW5jX3N0YXJ0ICsg ZHBfbW9kZS0+dGltaW5nLnZfYmFja19wb3JjaCk7Cj4gKwo+ICsJZHBfbW9kZS0+dGltaW5nLnZf ZnJvbnRfcG9yY2ggPSBkcm1fbW9kZS0+dnN5bmNfc3RhcnQgLQo+ICsJCQkJCSBkcm1fbW9kZS0+ dmRpc3BsYXk7Cj4gKwo+ICsJaWYgKGRwLT5pc192aWRlb190ZXN0KGRwKSkKPiArCQlkcF9tb2Rl LT50aW1pbmcuYnBwID0gZHAtPmdldF90ZXN0X2JwcChkcCk7Cj4gKwllbHNlCj4gKwkJZHBfbW9k ZS0+dGltaW5nLmJwcCA9IGRwLT5jb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGMgKgo+ICsJCW51 bV9jb21wb25lbnRzOwo+ICsKPiArCWlmICghZHBfbW9kZS0+dGltaW5nLmJwcCkKPiArCQlkcF9t b2RlLT50aW1pbmcuYnBwID0gMjQ7Cj4gKwo+ICsJZHBfbW9kZS0+dGltaW5nLnJlZnJlc2hfcmF0 ZSA9IGRybV9tb2RlLT52cmVmcmVzaDsKPiArCj4gKwlkcF9tb2RlLT50aW1pbmcucGl4ZWxfY2xr X2toeiA9IGRybV9tb2RlLT5jbG9jazsKPiArCj4gKwlkcF9tb2RlLT50aW1pbmcudl9hY3RpdmVf bG93ID0KPiArCQkhIShkcm1fbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQyk7Cj4g Kwo+ICsJZHBfbW9kZS0+dGltaW5nLmhfYWN0aXZlX2xvdyA9Cj4gKwkJISEoZHJtX21vZGUtPmZs YWdzICYgRFJNX01PREVfRkxBR19OSFNZTkMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBjb252 ZXJ0X3RvX2RybV9tb2RlKGNvbnN0IHN0cnVjdCBkcF9kaXNwbGF5X21vZGUgKmRwX21vZGUsCj4g KwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGUpCj4gK3sKPiArCXUzMiBmbGFn cyA9IDA7Cj4gKwo+ICsJbWVtc2V0KGRybV9tb2RlLCAwLCBzaXplb2YoKmRybV9tb2RlKSk7Cj4g Kwo+ICsJZHJtX21vZGUtPmhkaXNwbGF5ID0gZHBfbW9kZS0+dGltaW5nLmhfYWN0aXZlOwo+ICsJ ZHJtX21vZGUtPmhzeW5jX3N0YXJ0ID0gZHJtX21vZGUtPmhkaXNwbGF5ICsKPiArCQkJCWRwX21v ZGUtPnRpbWluZy5oX2Zyb250X3BvcmNoOwo+ICsJZHJtX21vZGUtPmhzeW5jX2VuZCA9IGRybV9t b2RlLT5oc3luY19zdGFydCArCj4gKwkJCSAgICAgIGRwX21vZGUtPnRpbWluZy5oX3N5bmNfd2lk dGg7Cj4gKwlkcm1fbW9kZS0+aHRvdGFsID0gZHJtX21vZGUtPmhzeW5jX2VuZCArIGRwX21vZGUt PnRpbWluZy5oX2JhY2tfcG9yY2g7Cj4gKwlkcm1fbW9kZS0+aHNrZXcgPSBkcF9tb2RlLT50aW1p bmcuaF9za2V3Owo+ICsKPiArCWRybV9tb2RlLT52ZGlzcGxheSA9IGRwX21vZGUtPnRpbWluZy52 X2FjdGl2ZTsKPiArCWRybV9tb2RlLT52c3luY19zdGFydCA9IGRybV9tb2RlLT52ZGlzcGxheSAr Cj4gKwkJCQlkcF9tb2RlLT50aW1pbmcudl9mcm9udF9wb3JjaDsKPiArCWRybV9tb2RlLT52c3lu Y19lbmQgPSBkcm1fbW9kZS0+dnN5bmNfc3RhcnQgKwo+ICsJCQkgICAgICBkcF9tb2RlLT50aW1p bmcudl9zeW5jX3dpZHRoOwo+ICsJZHJtX21vZGUtPnZ0b3RhbCA9IGRybV9tb2RlLT52c3luY19l bmQgKyBkcF9tb2RlLT50aW1pbmcudl9iYWNrX3BvcmNoOwo+ICsKPiArCWRybV9tb2RlLT52cmVm cmVzaCA9IGRwX21vZGUtPnRpbWluZy5yZWZyZXNoX3JhdGU7Cj4gKwlkcm1fbW9kZS0+Y2xvY2sg PSBkcF9tb2RlLT50aW1pbmcucGl4ZWxfY2xrX2toejsKPiArCj4gKwlpZiAoZHBfbW9kZS0+dGlt aW5nLmhfYWN0aXZlX2xvdykKPiArCQlmbGFncyB8PSBEUk1fTU9ERV9GTEFHX05IU1lOQzsKPiAr CWVsc2UKPiArCQlmbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BIU1lOQzsKPiArCj4gKwlpZiAoZHBf bW9kZS0+dGltaW5nLnZfYWN0aXZlX2xvdykKPiArCQlmbGFncyB8PSBEUk1fTU9ERV9GTEFHX05W U1lOQzsKPiArCWVsc2UKPiArCQlmbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BWU1lOQzsKPiArCj4g Kwlkcm1fbW9kZS0+ZmxhZ3MgPSBmbGFnczsKPiArCj4gKwlkcm1fbW9kZS0+dHlwZSA9IDB4NDg7 Cj4gKwlkcm1fbW9kZV9zZXRfbmFtZShkcm1fbW9kZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGRwX2JyaWRnZV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpkcm1fYnJpZGdlKQo+ICt7 Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2JyaWRnZSAqYnJpZGdlOwo+ICsJc3RydWN0 IG1zbV9kcCAqZHA7Cj4gKwo+ICsJaWYgKCFkcm1fYnJpZGdlKSB7Cj4gKwkJcHJfZXJyKCJJbnZh bGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQoKYnJpZGdlIHdpbGwgYWx3YXlzIGJl IHZhbGlkLgoKCj4gKwlicmlkZ2UgPSB0b19kcF9icmlkZ2UoZHJtX2JyaWRnZSk7Cj4gKwlkcCA9 IGJyaWRnZS0+ZGlzcGxheTsKCllvdSBjYW4gbW92ZSB0aGVzZSB0d28gdXAgdG8gdGhlIGRlY2xh cmF0aW9uIGFuZCBzYXZlIHlvdXJzZWxmIHR3byBtb3JlIGxpbmVzCnBlciBmdW5jdGlvbiBoZXJl IGFuZCB0aHJvdWdob3V0LgoKPiArCj4gKwkvKiBCeSB0aGlzIHBvaW50IG1vZGUgc2hvdWxkIGhh dmUgYmVlbiB2YWxpZGF0ZWQgdGhyb3VnaCBtb2RlX2ZpeHVwICovCj4gKwlyYyA9IGRwLT5zZXRf bW9kZShkcCwgJmJyaWRnZS0+ZHBfbW9kZSk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoIlsl ZF0gZmFpbGVkIHRvIHBlcmZvcm0gYSBtb2RlIHNldCwgcmM9JWRcbiIsCj4gKwkJICAgICAgIGJy aWRnZS0+aWQsIHJjKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcmMgPSBkcC0+cHJlcGFy ZShkcCk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoIlslZF0gRFAgZGlzcGxheSBwcmVwYXJl IGZhaWxlZCwgcmM9JWRcbiIsCj4gKwkJICAgICAgIGJyaWRnZS0+aWQsIHJjKTsKPiArCQlyZXR1 cm47Cj4gKwl9Cj4gKwo+ICsJcmMgPSBkcC0+ZW5hYmxlKGRwKTsKPiArCWlmIChyYykgewo+ICsJ CXByX2VycigiWyVkXSBEUCBkaXNwbGF5IGVuYWJsZSBmYWlsZWQsIHJjPSVkXG4iLAo+ICsJCSAg ICAgICBicmlkZ2UtPmlkLCByYyk7Cj4gKwkJZHAtPnVucHJlcGFyZShkcCk7Cj4gKwl9Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIGRwX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmRy bV9icmlkZ2UpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBfYnJpZGdlICpicmlk Z2U7Cj4gKwlzdHJ1Y3QgbXNtX2RwICpkcDsKPiArCj4gKwlpZiAoIWRybV9icmlkZ2UpIHsKPiAr CQlwcl9lcnIoIkludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9CgpicmlkZ2Ug d2lsbCBhbHdheXMgYmUgdmFsaWQuCgo+ICsKPiArCWJyaWRnZSA9IHRvX2RwX2JyaWRnZShkcm1f YnJpZGdlKTsKPiArCWRwID0gYnJpZGdlLT5kaXNwbGF5Owo+ICsKPiArCXJjID0gZHAtPnBvc3Rf ZW5hYmxlKGRwKTsKPiArCWlmIChyYykKPiArCQlwcl9lcnIoIlslZF0gRFAgZGlzcGxheSBwb3N0 IGVuYWJsZSBmYWlsZWQsIHJjPSVkXG4iLAo+ICsJCSAgICAgICBicmlkZ2UtPmlkLCByYyk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2JyaWRnZV9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdl ICpkcm1fYnJpZGdlKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRwX2JyaWRnZSAq YnJpZGdlOwo+ICsJc3RydWN0IG1zbV9kcCAqZHA7Cj4gKwo+ICsJaWYgKCFkcm1fYnJpZGdlKSB7 Cj4gKwkJcHJfZXJyKCJJbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQoKYnJp ZGdlIHdpbGwgYWx3YXlzIGJlIHZhbGlkLgoKPiArCWJyaWRnZSA9IHRvX2RwX2JyaWRnZShkcm1f YnJpZGdlKTsKPiArCWRwID0gYnJpZGdlLT5kaXNwbGF5Owo+ICsKPiArCXJjID0gZHAtPnByZV9k aXNhYmxlKGRwKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigiWyVkXSBEUCBkaXNwbGF5IHBy ZSBkaXNhYmxlIGZhaWxlZCwgcmM9JWRcbiIsCj4gKwkJICAgICAgIGJyaWRnZS0+aWQsIHJjKTsK PiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHBfYnJpZGdlX3Bvc3RfZGlzYWJsZShzdHJ1 Y3QgZHJtX2JyaWRnZSAqZHJtX2JyaWRnZSkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVj dCBkcF9icmlkZ2UgKmJyaWRnZTsKPiArCXN0cnVjdCBtc21fZHAgKmRwOwo+ICsKPiArCWlmICgh ZHJtX2JyaWRnZSkgewo+ICsJCXByX2VycigiSW52YWxpZCBwYXJhbXNcbiIpOwo+ICsJCXJldHVy bjsKPiArCX0KCmJyaWRnZSB3aWxsIGFsd2F5cyBiZSB2YWxpZC4KCj4gKwlicmlkZ2UgPSB0b19k cF9icmlkZ2UoZHJtX2JyaWRnZSk7Cj4gKwlkcCA9IGJyaWRnZS0+ZGlzcGxheTsKPiArCj4gKwly YyA9IGRwLT5kaXNhYmxlKGRwKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigiWyVkXSBEUCBk aXNwbGF5IGRpc2FibGUgZmFpbGVkLCByYz0lZFxuIiwKPiArCQkgICAgICAgYnJpZGdlLT5pZCwg cmMpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlyYyA9IGRwLT51bnByZXBhcmUoZHApOwo+ ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJbJWRdIERQIGRpc3BsYXkgdW5wcmVwYXJlIGZhaWxl ZCwgcmM9JWRcbiIsCj4gKwkJICAgICAgIGJyaWRnZS0+aWQsIHJjKTsKPiArCQlyZXR1cm47Cj4g Kwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJt X2JyaWRnZSAqZHJtX2JyaWRnZSwKPiArCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl LAo+ICsJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCj4gK3sKPiAr CXN0cnVjdCBkcF9icmlkZ2UgKmJyaWRnZTsKPiArCXN0cnVjdCBtc21fZHAgKmRwOwo+ICsKPiAr CWlmICghZHJtX2JyaWRnZSB8fCAhbW9kZSB8fCAhYWRqdXN0ZWRfbW9kZSkgewo+ICsJCXByX2Vy cigiSW52YWxpZCBwYXJhbXNcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KCmJyaWRnZSB3aWxsIGFs d2F5cyBiZSB2YWxpZC4gTm90IHN1cmUgYWJvdXQgbW9kZSBvciBhZGp1c3RlZF9tb2RlLCBtYXli ZSB5b3UKc2hvdWxkIHVzZSBXQVJOX09OIGZvciB0aG9zZS4KCj4gKwo+ICsJYnJpZGdlID0gdG9f ZHBfYnJpZGdlKGRybV9icmlkZ2UpOwo+ICsJZHAgPSBicmlkZ2UtPmRpc3BsYXk7Cj4gKwo+ICsJ bWVtc2V0KCZicmlkZ2UtPmRwX21vZGUsIDB4MCwgc2l6ZW9mKHN0cnVjdCBkcF9kaXNwbGF5X21v ZGUpKTsKPiArCWNvbnZlcnRfdG9fZHBfbW9kZShhZGp1c3RlZF9tb2RlLCAmYnJpZGdlLT5kcF9t b2RlLCBkcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGRwX2JyaWRnZV9tb2RlX2ZpeHVwKHN0 cnVjdCBkcm1fYnJpZGdlICpkcm1fYnJpZGdlLAo+ICsJCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqbW9kZSwKPiArCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVz dGVkX21vZGUpCj4gK3sKPiArCWJvb2wgcmV0ID0gdHJ1ZTsKPiArCXN0cnVjdCBkcF9kaXNwbGF5 X21vZGUgZHBfbW9kZTsKPiArCXN0cnVjdCBkcF9icmlkZ2UgKmJyaWRnZTsKPiArCXN0cnVjdCBt c21fZHAgKmRwOwo+ICsKPiArCWlmICghZHJtX2JyaWRnZSB8fCAhbW9kZSB8fCAhYWRqdXN0ZWRf bW9kZSkgewo+ICsJCXByX2VycigiSW52YWxpZCBwYXJhbXNcbiIpOwo+ICsJCXJldCA9IGZhbHNl Owo+ICsJCWdvdG8gZW5kOwo+ICsJfQo+CmRybV9icmlkZ2Ugd2lsbCBhbHdheXMgYmUgdmFsaWQs IG5vdCBwb3NpdGl2ZSBhYm91dCB0aGUgb3RoZXIgdHdvLgoKPiArCWJyaWRnZSA9IHRvX2RwX2Jy aWRnZShkcm1fYnJpZGdlKTsKPiArCWRwID0gYnJpZGdlLT5kaXNwbGF5Owo+ICsKPiArCWNvbnZl cnRfdG9fZHBfbW9kZShtb2RlLCAmZHBfbW9kZSwgZHApOwo+ICsJY29udmVydF90b19kcm1fbW9k ZSgmZHBfbW9kZSwgYWRqdXN0ZWRfbW9kZSk7Cj4gK2VuZDoKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcyBkcF9icmlkZ2Vfb3Bz ID0gewo+ICsJLm1vZGVfZml4dXAgICA9IGRwX2JyaWRnZV9tb2RlX2ZpeHVwLAo+ICsJLnByZV9l bmFibGUgICA9IGRwX2JyaWRnZV9wcmVfZW5hYmxlLAo+ICsJLmVuYWJsZSAgICAgICA9IGRwX2Jy aWRnZV9lbmFibGUsCj4gKwkuZGlzYWJsZSAgICAgID0gZHBfYnJpZGdlX2Rpc2FibGUsCj4gKwku cG9zdF9kaXNhYmxlID0gZHBfYnJpZGdlX3Bvc3RfZGlzYWJsZSwKPiArCS5tb2RlX3NldCAgICAg PSBkcF9icmlkZ2VfbW9kZV9zZXQsCj4gK307Cj4gKwo+ICtpbnQgZHBfY29ubmVjdG9yX3Bvc3Rf aW5pdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB2b2lkICpkaXNwbGF5KQo+ICt7 Cj4gKwlzdHJ1Y3QgbXNtX2RwICpkcF9kaXNwbGF5ID0gZGlzcGxheTsKPiArCj4gKwlpZiAoIWRw X2Rpc3BsYXkpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZHBfZGlzcGxheS0+Y29ubmVj dG9yID0gY29ubmVjdG9yOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkcF9j b25uZWN0b3JfZGV0ZWN0IC0gY2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGNvbm5lY3RvciBpcyBj b25uZWN0ZWQKPiArICogQGNvbm5lY3RvcjogUG9pbnRlciB0byBkcm0gY29ubmVjdG9yIHN0cnVj dHVyZQo+ICsgKiBAZm9yY2U6IEZvcmNlIGRldGVjdCBzZXR0aW5nIGZyb20gZHJtIGZyYW1ld29y awo+ICsgKiBSZXR1cm5zOiBDb25uZWN0b3IgJ2lzIGNvbm5lY3RlZCcgc3RhdHVzCj4gKyAqLwo+ ICtzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkcF9jb25uZWN0b3JfZGV0ZWN0KHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uLAo+ICsJCWJvb2wgZm9yY2UpCj4gK3sKPiArCWVudW0g ZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwo+ ICsJc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY3VycmVudF9zdGF0dXMgPSBjb25u ZWN0b3Jfc3RhdHVzX3Vua25vd247Cj4gKwlzdHJ1Y3QgbXNtX2RwICpkcDsKPiArCXN0cnVjdCBk cF9jb25uZWN0b3IgKmRwX2Nvbm47Cj4gKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0g Y29ubi0+ZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0cnVjdCBtc21fa21zICprbXMgPSBwcml2LT5r bXM7Cj4gKwo+ICsJZHBfY29ubiA9IHRvX2RwX2Nvbm5lY3Rvcihjb25uKTsKPiArCWRwID0gZHBf Y29ubi0+ZHBfZGlzcGxheTsKPiArCj4gKwlwcl9lcnIoImlzX2Nvbm5lY3RlZCA9ICVzXG4iLAo+ ICsJCShkcC0+aXNfY29ubmVjdGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoKT29wcywgdGhpcyBs b29rcyBsaWtlIGEgZGVidWcgbWVzc2FnZS4KCj4gKwo+ICsJc3RhdHVzID0gKGRwLT5pc19jb25u ZWN0ZWQpID8gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgo+ICsJCQkJCWNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+ICsKPiArCWlmIChkcC0+aXNfY29ubmVjdGVkICYmIGRwLT5i cmlkZ2UtPmVuY29kZXIKPiArCQkJCSYmIChjdXJyZW50X3N0YXR1cyAhPSBzdGF0dXMpCj4gKwkJ CQkmJiBrbXMtPmZ1bmNzLT5zZXRfZW5jb2Rlcl9tb2RlKSB7Cj4gKwkJa21zLT5mdW5jcy0+c2V0 X2VuY29kZXJfbW9kZShrbXMsCj4gKwkJCQlkcC0+YnJpZGdlLT5lbmNvZGVyLCBmYWxzZSk7Cj4g KwkJcHJfZXJyKCJjYWxsIHNldF9lbmNvZGVyX21vZGVcbiIpOwoKVGhpcyB0b28uCgo+ICsJfQo+ ICsJY3VycmVudF9zdGF0dXMgPSBzdGF0dXM7Cj4gKwlyZXR1cm4gc3RhdHVzOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBkcF9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAq Y29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfY29ubmVjdG9yICpkcF9jb25uID0gdG9fZHBf Y29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gKwo+ICsJREJHKCIiKTsKPiArCj4gKwlkcm1fY29ubmVj dG9yX2NsZWFudXAoY29ubmVjdG9yKTsKPiArCj4gKwlrZnJlZShkcF9jb25uKTsKPiArfQo+ICsK PiArdm9pZCBkcF9jb25uZWN0b3Jfc2VuZF9ocGRfZXZlbnQodm9pZCAqZGlzcGxheSkKPiArewo+ ICsJc3RydWN0IG1zbV9kcCAqZHA7Cj4gKwo+ICsJaWYgKCFkaXNwbGF5KSB7Cj4gKwkJcHJfZXJy KCJpbnZhbGlkIGlucHV0XG4iKTsKCkV2ZW4gaWYgdGhpcyBpcyBpbnZhbGlkLCB5b3UgZG9uJ3Qg bmVlZCBhIGVycm9yIG1lc3NhZ2UuICBBIFdBUk5fT04gaWYgeW91IG11c3QuCgo+ICsJCXJldHVy bjsKPiArCX0KPiArCj4gKwlkcCA9IGRpc3BsYXk7Cj4gKwo+ICsJaWYgKGRwLT5zZW5kX2hwZF9l dmVudCkKPiArCQlkcC0+c2VuZF9ocGRfZXZlbnQoZHApOwo+ICt9Cj4gKwo+ICsvKioKPiArICog ZHBfY29ubmVjdG9yX2dldF9tb2RlcyAtIGNhbGxiYWNrIHRvIGFkZCBkcm0gbW9kZXMgdmlhIGRy bV9tb2RlX3Byb2JlZF9hZGQoKQo+ICsgKiBAY29ubmVjdG9yOiBQb2ludGVyIHRvIGRybSBjb25u ZWN0b3Igc3RydWN0dXJlCj4gKyAqIFJldHVybnM6IE51bWJlciBvZiBtb2RlcyBhZGRlZAo+ICsg Ki8KPiArc3RhdGljIGludCBkcF9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgbXNtX2RwICpk cDsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X21vZGUgKmRwX21vZGUgPSBOVUxMOwo+ICsJc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKm0sIGRybV9tb2RlOwo+ICsJc3RydWN0IGRwX2Nvbm5lY3RvciAq ZHBfY29ubjsKPiArCj4gKwlpZiAoIWNvbm5lY3RvcikKPiArCQlyZXR1cm4gMDsKPiAKQ29ubmVj dG9yIGNhbiBuZXZlciBiZSBOVUxMIGhlcmUuCisKPiArCWRwX2Nvbm4gPSB0b19kcF9jb25uZWN0 b3IoY29ubmVjdG9yKTsKPiArCWRwID0gZHBfY29ubi0+ZHBfZGlzcGxheTsKCllvdSBjYW4gbW92 ZSB0aGVzZSB0byB0aGUgZGVjbGFyYXRpb24uCgo+ICsJZHBfbW9kZSA9IGt6YWxsb2Moc2l6ZW9m KCpkcF9tb2RlKSwgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFkcF9tb2RlKQo+ICsJCXJldHVybiAw OwoKUmV0dXJuIDAgb24gLUVOT01FTT8KCj4gKwo+ICsJLyogcGx1Z2dhYmxlIGNhc2UgYXNzdW1l cyBFRElEIGlzIHJlYWQgd2hlbiBIUEQgKi8KPiArCWlmIChkcC0+aXNfY29ubmVjdGVkKSB7Cj4g KwkJcmMgPSBkcC0+Z2V0X21vZGVzKGRwLCBkcF9tb2RlKTsKPiArCQlpZiAoIXJjKQo+ICsJCQlw cl9lcnIoImZhaWxlZCB0byBnZXQgRFAgc2luayBtb2RlcywgcmM9JWRcbiIsIHJjKTsKPiArCgpE byB5b3Ugd25hdCB0byBrZWVwIGdvaW5nIGhlcmUgZXZlbiBpZiB0aGUgZ2V0X21vZGVzIGZhaWxl ZD8KCj4gKwkJaWYgKGRwX21vZGUtPnRpbWluZy5waXhlbF9jbGtfa2h6KSB7IC8qIHZhbGlkIERQ IG1vZGUgKi8KPiArCQkJbWVtc2V0KCZkcm1fbW9kZSwgMHgwLCBzaXplb2YoZHJtX21vZGUpKTsK PiArCQkJY29udmVydF90b19kcm1fbW9kZShkcF9tb2RlLCAmZHJtX21vZGUpOwo+ICsJCQltID0g ZHJtX21vZGVfZHVwbGljYXRlKGNvbm5lY3Rvci0+ZGV2LCAmZHJtX21vZGUpOwo+ICsJCQlpZiAo IW0pIHsKPiArCQkJCXByX2VycigiZmFpbGVkIHRvIGFkZCBtb2RlICV1eCV1XG4iLAo+ICsJCQkJ ICAgICAgIGRybV9tb2RlLmhkaXNwbGF5LAo+ICsJCQkJICAgICAgIGRybV9tb2RlLnZkaXNwbGF5 KTsKPiArCQkJCWtmcmVlKGRwX21vZGUpOwo+ICsJCQkJcmV0dXJuIDA7Cj4gKwkJCX0KPiArCQkJ bS0+d2lkdGhfbW0gPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby53aWR0aF9tbTsKPiArCQkJbS0+ aGVpZ2h0X21tID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVpZ2h0X21tOwo+ICsJCQlkcm1f bW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbSk7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlw cl9lcnIoIk5vIHNpbmsgY29ubmVjdGVkXG4iKTsKPiArCX0KPiArCWtmcmVlKGRwX21vZGUpOwoK SG93IGJpZyBpcyBkcF9tb2RlPyBZb3UgY2FuJ3QgcHV0IGl0IG9uIHRoZSBzdGFjaz8KPiArCj4g KwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK2ludCBkcF9kcm1fYnJpZGdlX2luaXQodm9pZCAqZGF0 YSwgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJ c3RydWN0IGRwX2JyaWRnZSAqZHBfYnJpZGdlOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldjsK PiArCXN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkgPSBkYXRhOwo+ICsJc3RydWN0IG1zbV9kcm1f cHJpdmF0ZSAqcHJpdiA9IE5VTEw7Cj4gKwo+ICsJZHBfYnJpZGdlID0ga3phbGxvYyhzaXplb2Yo KmRwX2JyaWRnZSksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFkcF9icmlkZ2UpIHsKPiArCQlyYyA9 IC1FTk9NRU07CgpKdXN0IHJldHVybiAtRU5PTUVNOwoKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ ICsKPiArCWRldiA9IGRwX2Rpc3BsYXktPmRybV9kZXY7Cj4gKwlkcF9icmlkZ2UtPmRpc3BsYXkg PSBkcF9kaXNwbGF5Owo+ICsJZHBfYnJpZGdlLT5iYXNlLmZ1bmNzID0gJmRwX2JyaWRnZV9vcHM7 Cj4gKwlkcF9icmlkZ2UtPmJhc2UuZW5jb2RlciA9IGVuY29kZXI7Cj4gKwo+ICsJcHJpdiA9IGRl di0+ZGV2X3ByaXZhdGU7Cj4gKwo+ICsJcmMgPSBkcm1fYnJpZGdlX2F0dGFjaChlbmNvZGVyLCAm ZHBfYnJpZGdlLT5iYXNlLCBOVUxMKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigiZmFpbGVk IHRvIGF0dGFjaCBicmlkZ2UsIHJjPSVkXG4iLCByYyk7Cj4gKwkJZ290byBlcnJvcl9mcmVlX2Jy aWRnZTsKPiArCX0KPiArCj4gKwlyYyA9IGRwX2Rpc3BsYXktPnJlcXVlc3RfaXJxKGRwX2Rpc3Bs YXkpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJyZXF1ZXN0X2lycSBmYWlsZWQsIHJjPSVk XG4iLCByYyk7Cj4gKwkJZ290byBlcnJvcl9mcmVlX2JyaWRnZTsKPiArCX0KPiArCj4gKwllbmNv ZGVyLT5icmlkZ2UgPSAmZHBfYnJpZGdlLT5iYXNlOwo+ICsJZHBfZGlzcGxheS0+ZHBfYnJpZGdl ID0gZHBfYnJpZGdlOwo+ICsJZHBfZGlzcGxheS0+YnJpZGdlID0gJmRwX2JyaWRnZS0+YmFzZTsK PiArCj4gKwlyZXR1cm4gMDsKPiArZXJyb3JfZnJlZV9icmlkZ2U6Cj4gKwlrZnJlZShkcF9icmlk Z2UpOwo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArdm9pZCBkcF9kcm1fYnJp ZGdlX2RlaW5pdCh2b2lkICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RwICpkaXNwbGF5ID0g ZGF0YTsKPiArCXN0cnVjdCBkcF9icmlkZ2UgKmJyaWRnZSA9IGRpc3BsYXktPmRwX2JyaWRnZTsK PiArCj4gKwlpZiAoYnJpZGdlICYmIGJyaWRnZS0+YmFzZS5lbmNvZGVyKQo+ICsJCWJyaWRnZS0+ YmFzZS5lbmNvZGVyLT5icmlkZ2UgPSBOVUxMOwo+ICsKPiArCWtmcmVlKGJyaWRnZSk7Cj4gK30K PiArCj4gKy8qKgo+ICsgKiBkcF9jb25uZWN0b3JfbW9kZV92YWxpZCAtIGNhbGxiYWNrIHRvIGRl dGVybWluZSBpZiBzcGVjaWZpZWQgbW9kZSBpcyB2YWxpZAo+ICsgKiBAY29ubmVjdG9yOiBQb2lu dGVyIHRvIGRybSBjb25uZWN0b3Igc3RydWN0dXJlCj4gKyAqIEBtb2RlOiBQb2ludGVyIHRvIGRy bSBtb2RlIHN0cnVjdHVyZQo+ICsgKiBSZXR1cm5zOiBWYWxpZGl0eSBzdGF0dXMgZm9yIHNwZWNp ZmllZCBtb2RlCj4gKyAqLwo+ICtzdGF0aWMgZW51bSBkcm1fbW9kZV9zdGF0dXMgZHBfY29ubmVj dG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiArCQlzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJc3RydWN0IG1zbV9kcCAqZHBfZGlz cDsKPiArCXN0cnVjdCBkcF9kZWJ1ZyAqZGVidWc7Cj4gKwlzdHJ1Y3QgZHBfY29ubmVjdG9yICpk cF9jb25uOwo+ICsKPiArCWlmICghbW9kZSB8fCAhY29ubmVjdG9yKSB7Cj4gKwkJcHJfZXJyKCJp bnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuIE1PREVfRVJST1I7Cj4gKwl9Cj4gCkknbSBz dXJlIGNvbm5lY3RvciB3aWxsIGFsd2F5cyBiZSB2YWxpZCwgbm90IHN1cmUgYWJvdXQgbW9kZS4K Cj4gKwlkcF9jb25uID0gdG9fZHBfY29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gKwlkcF9kaXNwID0g ZHBfY29ubi0+ZHBfZGlzcGxheTsKPiArCWRlYnVnID0gZHBfZGlzcC0+Z2V0X2RlYnVnKGRwX2Rp c3ApOwo+ICsKPiArCW1vZGUtPnZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7Cj4g Kwo+ICsJaWYgKG1vZGUtPmNsb2NrID4gZHBfZGlzcC0+bWF4X3BjbGtfa2h6KQo+ICsJCXJldHVy biBNT0RFX0JBRDsKPiArCj4gKwlpZiAoZGVidWctPmRlYnVnX2VuICYmIChtb2RlLT5oZGlzcGxh eSAhPSBkZWJ1Zy0+aGRpc3BsYXkgfHwKPiArCQkJbW9kZS0+dmRpc3BsYXkgIT0gZGVidWctPnZk aXNwbGF5IHx8Cj4gKwkJCW1vZGUtPnZyZWZyZXNoICE9IGRlYnVnLT52cmVmcmVzaCB8fAo+ICsJ CQltb2RlLT5waWN0dXJlX2FzcGVjdF9yYXRpbyAhPSBkZWJ1Zy0+YXNwZWN0X3JhdGlvKSkKPiAr CQlyZXR1cm4gTU9ERV9CQUQ7Cj4gKwo+ICsJcmV0dXJuIGRwX2Rpc3AtPnZhbGlkYXRlX21vZGUo ZHBfZGlzcCwgbW9kZS0+Y2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9jb25uZWN0b3JfZnVuY3MgZHBfY29ubmVjdG9yX2Z1bmNzID0gewo+ICsJLmRldGVjdCA9IGRw X2Nvbm5lY3Rvcl9kZXRlY3QsCj4gKwkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2lu Z2xlX2Nvbm5lY3Rvcl9tb2RlcywKPiArCS5kZXN0cm95ID0gZHBfY29ubmVjdG9yX2Rlc3Ryb3ks Cj4gKwkucmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCj4gKwkuYXRv bWljX2R1cGxpY2F0ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kdXBsaWNh dGVfc3RhdGUsCj4gKwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfZGVzdHJveV9zdGF0ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgZHBfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsK PiArCS5nZXRfbW9kZXMgPSBkcF9jb25uZWN0b3JfZ2V0X21vZGVzLAo+ICsJLm1vZGVfdmFsaWQg PSBkcF9jb25uZWN0b3JfbW9kZV92YWxpZCwKPiArfTsKPiArCj4gKy8qIGNvbm5lY3RvciBpbml0 aWFsaXphdGlvbiAqLwo+ICtzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHBfZHJtX2Nvbm5lY3Rvcl9p bml0KHN0cnVjdCBtc21fZHAgKmRwX2Rpc3BsYXkpCj4gK3sKPiArCXN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IgPSBOVUxMOwo+ICsJc3RydWN0IGRwX2Nvbm5lY3RvciAqZHBfY29ubmVj dG9yOwo+ICsJaW50IHJldDsKPiArCj4gKwlkcF9jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZigq ZHBfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWRwX2Nvbm5lY3RvcikKPiArCQly ZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPiArCj4gKwlkcF9jb25uZWN0b3ItPmRwX2Rpc3BsYXkg PSBkcF9kaXNwbGF5Owo+ICsKPiArCWNvbm5lY3RvciA9ICZkcF9jb25uZWN0b3ItPmJhc2U7Cj4g Kwo+ICsJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGRwX2Rpc3BsYXktPmRybV9kZXYsIGNvbm5l Y3RvciwgJmRwX2Nvbm5lY3Rvcl9mdW5jcywKPiArCQkJRFJNX01PREVfQ09OTkVDVE9SX0Rpc3Bs YXlQb3J0KTsKPiArCWlmIChyZXQpCgpZb3UgYXJlIG1pc3NpbmcgYSBrZnJlZSBoZXJlLgoKPiAr CQlyZXR1cm4gRVJSX1BUUihyZXQpOwo+ICsKPiArCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChj b25uZWN0b3IsICZkcF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKPiArCj4gKwkvKgo+ICsJICog RW5hYmxlIEhQRCB0byBsZXQgaHBkIGV2ZW50IGlzIGhhbmRsZWQKPiArCSAqIHdoZW4gY2FibGUg aXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QuCj4gKwkgKi8KPiArCWNvbm5lY3Rvci0+cG9sbGVkID0g RFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKPiArCj4gKwkvKiBEaXNwbGF5IGRyaXZlciBkb2Vzbid0 IHN1cHBvcnQgaW50ZXJsYWNlIG5vdy4gKi8KPiArCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93 ZWQgPSBmYWxzZTsKPiArCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gZmFsc2U7Cj4g Kwo+ICsJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGRwX2Rpc3BsYXkt PmVuY29kZXIpOwo+ICsKPiArCXJldHVybiBjb25uZWN0b3I7Cj4gK30KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAv ZHBfZHJtLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmVmYmMxYmUK PiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uaAo+ IEBAIC0wLDAgKzEsNTIgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIFRo ZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsg KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqLwoKU1BEWCBwbGVhc2UuCgo+ICsjaWZuZGVmIF9EUF9E Uk1fSF8KPiArI2RlZmluZSBfRFBfRFJNX0hfCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMu aD4KPiArI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4K PiArI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KPiArCj4gKyNpbmNsdWRlICJtc21f ZHJ2LmgiCj4gKyNpbmNsdWRlICJkcF9kaXNwbGF5LmgiCj4gKwo+ICtzdHJ1Y3QgZHBfYnJpZGdl IHsKPiArCXN0cnVjdCBkcm1fYnJpZGdlIGJhc2U7Cj4gKwl1MzIgaWQ7Cj4gKwo+ICsJc3RydWN0 IG1zbV9kcCAqZGlzcGxheTsKPiArCXN0cnVjdCBkcF9kaXNwbGF5X21vZGUgZHBfbW9kZTsKPiAr fTsKPiArCj4gKy8qKgo+ICsgKiBkcF9jb25uZWN0b3JfcG9zdF9pbml0IC0gY2FsbGJhY2sgdG8g cGVyZm9ybSBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIHN0ZXBzCj4gKyAqIEBjb25uZWN0b3I6 IFBvaW50ZXIgdG8gZHJtIGNvbm5lY3RvciBzdHJ1Y3R1cmUKPiArICogQGRpc3BsYXk6IFBvaW50 ZXIgdG8gcHJpdmF0ZSBkaXNwbGF5IGhhbmRsZQo+ICsgKiBSZXR1cm5zOiBaZXJvIG9uIHN1Y2Nl c3MKPiArICovCj4gK2ludCBkcF9jb25uZWN0b3JfcG9zdF9pbml0KHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IsIHZvaWQgKmRpc3BsYXkpOwo+ICsKPiArdm9pZCBkcF9jb25uZWN0b3Jf c2VuZF9ocGRfZXZlbnQodm9pZCAqZGlzcGxheSk7Cj4gKwo+ICtpbnQgZHBfZHJtX2JyaWRnZV9p bml0KHZvaWQgKmRpc3BsYXksCj4gKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwo+ICsK PiArdm9pZCBkcF9kcm1fYnJpZGdlX2RlaW5pdCh2b2lkICpkaXNwbGF5KTsKPiArCj4gK3N0cnVj dCBkcm1fY29ubmVjdG9yICpkcF9kcm1fY29ubmVjdG9yX2luaXQoc3RydWN0IG1zbV9kcCAqZHBf ZGlzcGxheSk7Cj4gKwo+ICsjZW5kaWYgLyogX0RQX0RSTV9IXyAqLwo+ICsKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9leHRjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vZHAvZHBfZXh0Y29uLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAu LjYzNWMxM2IKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9k cF9leHRjb24uYwo+IEBAIC0wLDAgKzEsNDAwIEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykg MjAxMi0yMDE4LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAr ICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCj4gKyAqIG9ubHkgdmVyc2lvbiAy IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsg KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKi8KPiArCj4gKyNkZWZpbmUgcHJf Zm10KGZtdCkJIltkcm0tZHBdICVzOiAiIGZtdCwgX19mdW5jX18KPiArCj4gKyNpbmNsdWRlIDxs aW51eC9zbGFiLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxp bnV4L2V4dGNvbi5oPgo+ICsKPiArI2luY2x1ZGUgImRwX2V4dGNvbi5oIgo+ICsKPiArLyogRFAg c3BlY2lmaWMgVkRNIGNvbW1hbmRzICovCj4gKyNkZWZpbmUgRFBfVVNCUERfVkRNX1NUQVRVUwkw eDEwCj4gKyNkZWZpbmUgRFBfVVNCUERfVkRNX0NPTkZJR1VSRQkweDExCj4gKwo+ICsvKiBVU0JQ RC1UeXBlQyBzcGVjaWZpYyBNYWNyb3MgKi8KPiArI2RlZmluZSBWRE1fVkVSU0lPTgkJMHgwCj4g KyNkZWZpbmUgVVNCX0NfRFBfU0lECQkweEZGMDEKPiArCj4gK2VudW0gZHBfdXNicGRfcGluX2Fz c2lnbm1lbnQgewo+ICsJRFBfVVNCUERfUElOX0EsCj4gKwlEUF9VU0JQRF9QSU5fQiwKPiArCURQ X1VTQlBEX1BJTl9DLAo+ICsJRFBfVVNCUERfUElOX0QsCj4gKwlEUF9VU0JQRF9QSU5fRSwKPiAr CURQX1VTQlBEX1BJTl9GLAo+ICsJRFBfVVNCUERfUElOX01BWCwKPiArfTsKPiArCj4gK3N0cnVj dCBkcF91c2JwZF9jYXBhYmlsaXRpZXMgewo+ICsJZW51bSBkcF91c2JwZF9wb3J0IHBvcnQ7Cj4g Kwlib29sIHJlY2VwdGFjbGVfc3RhdGU7Cj4gKwl1OCB1bGlua19waW5fY29uZmlnOwo+ICsJdTgg ZGxpbmtfcGluX2NvbmZpZzsKPiArfTsKPiArCj4gK3N0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSB7 Cj4gKwl1MzIgdmRvOwo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0IG5vdGlmaWVy X2Jsb2NrIGV4dGNvbl9uYjsKPiArCXN0cnVjdCBleHRjb25fZGV2ICpleHRjb247Cj4gKwlzdHJ1 Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZXh0Y29uX3dxOwo+ICsJc3RydWN0IHdvcmtfc3RydWN0IGV2 ZW50X3dvcms7Cj4gKwlzdHJ1Y3QgdXNicGQgKnBkOwo+ICsJc3RydWN0IGRwX3VzYnBkX2NiICpk cF9jYjsKPiArCXN0cnVjdCBkcF91c2JwZF9jYXBhYmlsaXRpZXMgY2FwOwo+ICsJc3RydWN0IGRw X3VzYnBkIGRwX3VzYnBkOwo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKmRwX3VzYnBk X3Bpbl9uYW1lKHU4IHBpbikKPiArewo+ICsJc3dpdGNoIChwaW4pIHsKPiArCWNhc2UgRFBfVVNC UERfUElOX0E6IHJldHVybiAiRFBfVVNCUERfUElOX0FTU0lHTk1FTlRfQSI7Cj4gKwljYXNlIERQ X1VTQlBEX1BJTl9COiByZXR1cm4gIkRQX1VTQlBEX1BJTl9BU1NJR05NRU5UX0IiOwo+ICsJY2Fz ZSBEUF9VU0JQRF9QSU5fQzogcmV0dXJuICJEUF9VU0JQRF9QSU5fQVNTSUdOTUVOVF9DIjsKPiAr CWNhc2UgRFBfVVNCUERfUElOX0Q6IHJldHVybiAiRFBfVVNCUERfUElOX0FTU0lHTk1FTlRfRCI7 Cj4gKwljYXNlIERQX1VTQlBEX1BJTl9FOiByZXR1cm4gIkRQX1VTQlBEX1BJTl9BU1NJR05NRU5U X0UiOwo+ICsJY2FzZSBEUF9VU0JQRF9QSU5fRjogcmV0dXJuICJEUF9VU0JQRF9QSU5fQVNTSUdO TUVOVF9GIjsKPiArCWRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7Cj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBjaGFyICpkcF91c2JwZF9wb3J0X25hbWUoZW51bSBkcF91c2JwZF9wb3J0 IHBvcnQpCj4gK3sKPiArCXN3aXRjaCAocG9ydCkgewo+ICsJY2FzZSBEUF9VU0JQRF9QT1JUX05P TkU6IHJldHVybiAiRFBfVVNCUERfUE9SVF9OT05FIjsKPiArCWNhc2UgRFBfVVNCUERfUE9SVF9V RlBfRDogcmV0dXJuICJEUF9VU0JQRF9QT1JUX1VGUF9EIjsKPiArCWNhc2UgRFBfVVNCUERfUE9S VF9ERlBfRDogcmV0dXJuICJEUF9VU0JQRF9QT1JUX0RGUF9EIjsKPiArCWNhc2UgRFBfVVNCUERf UE9SVF9EX1VGUF9EOiByZXR1cm4gIkRQX1VTQlBEX1BPUlRfRF9VRlBfRCI7Cj4gKwlkZWZhdWx0 OiByZXR1cm4gIkRQX1VTQlBEX1BPUlRfTk9ORSI7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGRwX3VzYnBkX2luaXRfcG9ydChlbnVtIGRwX3VzYnBkX3BvcnQgKnBvcnQsIHUzMiBpbl9w b3J0KQo+ICt7Cj4gKwlzd2l0Y2ggKGluX3BvcnQpIHsKPiArCWNhc2UgMDoKPiArCQkqcG9ydCA9 IERQX1VTQlBEX1BPUlRfTk9ORTsKPiArCQlicmVhazsKPiArCWNhc2UgMToKPiArCQkqcG9ydCA9 IERQX1VTQlBEX1BPUlRfVUZQX0Q7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDI6Cj4gKwkJKnBvcnQg PSBEUF9VU0JQRF9QT1JUX0RGUF9EOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSAzOgo+ICsJCSpwb3J0 ID0gRFBfVVNCUERfUE9SVF9EX1VGUF9EOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQkq cG9ydCA9IERQX1VTQlBEX1BPUlRfTk9ORTsKPiArCX0KPiArCXByX2RlYnVnKCJwb3J0OiVzXG4i LCBkcF91c2JwZF9wb3J0X25hbWUoKnBvcnQpKTsKPiArfQo+ICsKPiArdm9pZCBkcF91c2JwZF9n ZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqcGQpCj4gK3sKPiArCXN0 cnVjdCBkcF91c2JwZF9jYXBhYmlsaXRpZXMgKmNhcCA9ICZwZC0+Y2FwOwo+ICsJdTMyIGJ1ZiA9 IHBkLT52ZG87Cj4gKwlpbnQgcG9ydCA9IGJ1ZiAmIDB4MzsKPiArCj4gKwljYXAtPnJlY2VwdGFj bGVfc3RhdGUgPSAoYnVmICYgQklUKDYpKSA/IHRydWUgOiBmYWxzZTsKPiArCWNhcC0+ZGxpbmtf cGluX2NvbmZpZyA9IChidWYgPj4gOCkgJiAweGZmOwo+ICsJY2FwLT51bGlua19waW5fY29uZmln ID0gKGJ1ZiA+PiAxNikgJiAweGZmOwo+ICsKPiArCWRwX3VzYnBkX2luaXRfcG9ydCgmY2FwLT5w b3J0LCBwb3J0KTsKPiArfQo+ICsKPiArdm9pZCBkcF91c2JwZF9nZXRfc3RhdHVzKHN0cnVjdCBk cF9leHRjb25fcHJpdmF0ZSAqcGQpCj4gK3sKPiArCXN0cnVjdCBkcF91c2JwZCAqc3RhdHVzID0g JnBkLT5kcF91c2JwZDsKPiArCXUzMiBidWYgPSBwZC0+dmRvOwo+ICsJaW50IHBvcnQgPSBidWYg JiAweDM7Cj4gKwo+ICsJc3RhdHVzLT5sb3dfcG93X3N0ICAgICA9IChidWYgJiBCSVQoMikpID8g dHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT5hZGFwdG9yX2RwX2VuICA9IChidWYgJiBCSVQoMykp ID8gdHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT5tdWx0aV9mdW5jICAgICA9IChidWYgJiBCSVQo NCkpID8gdHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT51c2JfY29uZmlnX3JlcSA9IChidWYgJiBC SVQoNSkpID8gdHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT5leGl0X2RwX21vZGUgICA9IChidWYg JiBCSVQoNikpID8gdHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT5ocGRfaGlnaCAgICAgICA9IChi dWYgJiBCSVQoNykpID8gdHJ1ZSA6IGZhbHNlOwo+ICsJc3RhdHVzLT5ocGRfaXJxICAgICAgICA9 IChidWYgJiBCSVQoOCkpID8gdHJ1ZSA6IGZhbHNlOwo+ICsKPiArCXByX2RlYnVnKCJsb3dfcG93 X3N0ID0gJWQsIGFkYXB0b3JfZHBfZW4gPSAlZCwgbXVsdGlfZnVuYyA9ICVkXG4iLAo+ICsJCQlz dGF0dXMtPmxvd19wb3dfc3QsIHN0YXR1cy0+YWRhcHRvcl9kcF9lbiwKPiArCQkJc3RhdHVzLT5t dWx0aV9mdW5jKTsKPiArCXByX2RlYnVnKCJ1c2JfY29uZmlnX3JlcSA9ICVkLCBleGl0X2RwX21v ZGUgPSAlZCwgaHBkX2hpZ2ggPSVkXG4iLAo+ICsJCQlzdGF0dXMtPnVzYl9jb25maWdfcmVxLAo+ ICsJCQlzdGF0dXMtPmV4aXRfZHBfbW9kZSwgc3RhdHVzLT5ocGRfaGlnaCk7Cj4gKwlwcl9kZWJ1 ZygiaHBkX2lycSA9ICVkXG4iLCBzdGF0dXMtPmhwZF9pcnEpOwo+ICsKPiArCWRwX3VzYnBkX2lu aXRfcG9ydCgmc3RhdHVzLT5wb3J0LCBwb3J0KTsKPiArfQo+ICsKPiArdTMyIGRwX3VzYnBkX2dl bl9jb25maWdfcGt0KHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqcGQpCj4gK3sKPiArCXU4IHBp bl9jZmcsIHBpbjsKPiArCXUzMiBjb25maWcgPSAwOwo+ICsJY29uc3QgdTMyIHVmcF9kX2NvbmZp ZyA9IDB4MiwgZHBfdmVyID0gMHgxOwo+ICsKPiArCWlmIChwZC0+Y2FwLnJlY2VwdGFjbGVfc3Rh dGUpCj4gKwkJcGluX2NmZyA9IHBkLT5jYXAudWxpbmtfcGluX2NvbmZpZzsKPiArCWVsc2UKPiAr CQlwaW5fY2ZnID0gcGQtPmNhcC5kbGlua19waW5fY29uZmlnOwo+ICsKPiArCWZvciAocGluID0g RFBfVVNCUERfUElOX0E7IHBpbiA8IERQX1VTQlBEX1BJTl9NQVg7IHBpbisrKSB7Cj4gKwkJaWYg KHBpbl9jZmcgJiBCSVQocGluKSkgewo+ICsJCQlpZiAocGQtPmRwX3VzYnBkLm11bHRpX2Z1bmMp IHsKPiArCQkJCWlmIChwaW4gPT0gRFBfVVNCUERfUElOX0QpCj4gKwkJCQkJYnJlYWs7Cj4gKwkJ CX0gZWxzZSB7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAo cGluID09IERQX1VTQlBEX1BJTl9NQVgpCj4gKwkJcGluID0gRFBfVVNCUERfUElOX0M7Cj4gKwo+ ICsJcHJfZGVidWcoInBpbiBhc3NpZ25tZW50OiAlc1xuIiwgZHBfdXNicGRfcGluX25hbWUocGlu KSk7Cj4gKwo+ICsJY29uZmlnIHw9IEJJVChwaW4pIDw8IDg7Cj4gKwo+ICsJY29uZmlnIHw9IChk cF92ZXIgPDwgMik7Cj4gKwljb25maWcgfD0gdWZwX2RfY29uZmlnOwo+ICsKPiArCXByX2RlYnVn KCJjb25maWcgPSAweCV4XG4iLCBjb25maWcpOwo+ICsJcmV0dXJuIGNvbmZpZzsKPiArfQo+ICsK PiArc3RhdGljIGludCBkcF9leHRjb25fY29ubmVjdChzdHJ1Y3QgZHBfdXNicGQgKmRwX3VzYnBk LCBib29sIGhwZCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9leHRjb25fcHJp dmF0ZSAqZXh0Y29uOwo+ICsKPiArCWlmICghZHBfdXNicGQpIHsKPiArCQlwcl9lcnIoImludmFs aWQgaW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQo+ ICsKPiArCWV4dGNvbiA9IGNvbnRhaW5lcl9vZihkcF91c2JwZCwgc3RydWN0IGRwX2V4dGNvbl9w cml2YXRlLCBkcF91c2JwZCk7Cj4gKwo+ICsJZHBfdXNicGQtPmhwZF9oaWdoID0gaHBkOwo+ICsJ ZHBfdXNicGQtPmZvcmNlZF9kaXNjb25uZWN0ID0gIWhwZDsKPiArCj4gKwlpZiAoaHBkKQo+ICsJ CWV4dGNvbi0+ZHBfY2ItPmNvbmZpZ3VyZShleHRjb24tPmRldik7Cj4gKwllbHNlCj4gKwkJZXh0 Y29uLT5kcF9jYi0+ZGlzY29ubmVjdChleHRjb24tPmRldik7Cj4gKwo+ICtlcnJvcjoKPiArCXJl dHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9leHRjb25fZ2V0X2xhbmVzKHN0cnVj dCBkcF9leHRjb25fcHJpdmF0ZSAqZXh0Y29uX3ByaXYpCj4gK3sKPiArCXVuaW9uIGV4dGNvbl9w cm9wZXJ0eV92YWx1ZSBwcm9wZXJ0eTsKPiArCXU4IGxhbmVzOwo+ICsKPiArCWlmICghZXh0Y29u X3ByaXYgfHwgIWV4dGNvbl9wcml2LT5leHRjb24pIHsKPiArCQlwcl9lcnIoIkludmFsaWQgaW5w dXQgYXJndW1lbnRzXG4iKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlleHRjb25fZ2V0 X3Byb3BlcnR5KGV4dGNvbl9wcml2LT5leHRjb24sCj4gKwkJCQkJRVhUQ09OX0RJU1BfRFAsCj4g KwkJCQkJRVhUQ09OX1BST1BfVVNCX1NTLAo+ICsJCQkJCSZwcm9wZXJ0eSk7Cj4gKwlsYW5lcyA9 ICgocHJvcGVydHkuaW50dmFsKSA/IDIgOiA0KTsKPiArCj4gKwlyZXR1cm4gbGFuZXM7Cj4gK30K PiArCj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9leHRjb25fZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19z dHJ1Y3QgKndvcmspCj4gK3sKPiArCXN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqZXh0Y29uX3By aXY7Cj4gKwlpbnQgZHBfc3RhdGUsIHJldDsKPiArCWludCBsYW5lczsKPiArCXVuaW9uIGV4dGNv bl9wcm9wZXJ0eV92YWx1ZSBwcm9wZXJ0eTsKPiArCj4gKwlleHRjb25fcHJpdiA9IGNvbnRhaW5l cl9vZih3b3JrLAo+ICsJCQlzdHJ1Y3QgZHBfZXh0Y29uX3ByaXZhdGUsIGV2ZW50X3dvcmspOwo+ ICsKPiArCWlmICghZXh0Y29uX3ByaXYgfHwgIWV4dGNvbl9wcml2LT5leHRjb24pIHsKClRoZSBy ZXN1bHQgb2YgY29udGFpbmVyX29mIGNhbiBuZXZlciBiZSBOVUxMLgoKPiArCQlwcl9lcnIoIklu dmFsaWQgZXh0Y29uIGRldmljZSBoYW5kbGVyXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ ICsJZHBfc3RhdGUgPSBleHRjb25fZ2V0X3N0YXRlKGV4dGNvbl9wcml2LT5leHRjb24sCj4gKwkJ CQkJCUVYVENPTl9ESVNQX0RQKTsKPiArCj4gKwlpZiAoZHBfc3RhdGUgPiAwKSB7Cj4gKwkJcmV0 ID0gZXh0Y29uX2dldF9wcm9wZXJ0eShleHRjb25fcHJpdi0+ZXh0Y29uLAo+ICsJCQkJCUVYVENP Tl9ESVNQX0RQLAo+ICsJCQkJCUVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWSwKPiArCQkJ CQkmcHJvcGVydHkpOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJcHJfZXJyKCJHZXQgUG9sYXJpdHkg cHJvcGVydHkgZmFpbGVkXG4iKTsKPiArCQkJcmV0dXJuOwo+ICsJCX0KPiArCQlleHRjb25fcHJp di0+ZHBfdXNicGQub3JpZW50YXRpb24gPQo+ICsJCQkoKHByb3BlcnR5LmludHZhbCkgPwo+ICsJ CQkJT1JJRU5UQVRJT05fQ0MyIDogT1JJRU5UQVRJT05fQ0MxKTsKPiArCj4gKwkJbGFuZXMgPSBk cF9leHRjb25fZ2V0X2xhbmVzKGV4dGNvbl9wcml2KTsKPiArCQlpZiAoIWxhbmVzKQo+ICsJCQly ZXR1cm47Cj4gKwkJZXh0Y29uX3ByaXYtPmRwX3VzYnBkLm11bHRpX2Z1bmMgPQo+ICsJCQkJCSgo bGFuZXMgPT0gMikgPyBmYWxzZSA6IHRydWUpOwo+ICsKPiArCQlpZiAoZXh0Y29uX3ByaXYtPmRw X2NiICYmIGV4dGNvbl9wcml2LT5kcF9jYi0+Y29uZmlndXJlKQo+ICsJCQlkcF9leHRjb25fY29u bmVjdCgmZXh0Y29uX3ByaXYtPmRwX3VzYnBkLCB0cnVlKTsKPiArCX0gZWxzZSB7Cj4gKwkJaWYg KGV4dGNvbl9wcml2LT5kcF9jYiAmJiBleHRjb25fcHJpdi0+ZHBfY2ItPmRpc2Nvbm5lY3QpCj4g KwkJCWRwX2V4dGNvbl9jb25uZWN0KCZleHRjb25fcHJpdi0+ZHBfdXNicGQsIGZhbHNlKTsKPiAr CX0KPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9leHRjb25fY3JlYXRlX3dvcmtxdWV1ZShzdHJ1 Y3QgZHBfZXh0Y29uX3ByaXZhdGUgKmV4dGNvbl9wcml2KQo+ICt7Cj4gKwlleHRjb25fcHJpdi0+ ZXh0Y29uX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRybV9kcF9leHRjb24i KTsKPiArCWlmIChJU19FUlJfT1JfTlVMTChleHRjb25fcHJpdi0+ZXh0Y29uX3dxKSkgewo+ICsJ CXByX2VycigiRXJyb3IgY3JlYXRpbmcgZXh0Y29uIHdxXG4iKTsKPiArCQlyZXR1cm4gLUVQRVJN Owo+ICsJfQo+ICsKPiArCUlOSVRfV09SSygmZXh0Y29uX3ByaXYtPmV2ZW50X3dvcmssIGRwX2V4 dGNvbl9ldmVudF93b3JrKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBkcF9leHRjb25fZXZlbnRfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCj4gKwkJ CQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnByaXYpCj4gK3sKPiArCXN0cnVjdCBkcF9l eHRjb25fcHJpdmF0ZSAqZXh0Y29uX3ByaXY7Cj4gKwo+ICsJZXh0Y29uX3ByaXYgPSBjb250YWlu ZXJfb2YobmIsIHN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSwKPiArCQkJCQkJZXh0Y29uX25iKTsK PiArCj4gKwlxdWV1ZV93b3JrKGV4dGNvbl9wcml2LT5leHRjb25fd3EsICZleHRjb25fcHJpdi0+ ZXZlbnRfd29yayk7Cj4gKwlyZXR1cm4gTk9USUZZX0RPTkU7Cj4gK30KPiArCj4gK2ludCBkcF9l eHRjb25fcmVnaXN0ZXIoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCkKPiArewo+ICsJc3RydWN0 IGRwX2V4dGNvbl9wcml2YXRlICpleHRjb25fcHJpdjsKPiArCWludCByZXQgPSAwOwo+ICsKPiAr CWlmICghZHBfdXNicGQpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJcHJfZXJyKCJTdGFy dCsrKysiKTsKCkRlYnVnIG1lc3NhZ2Ugc251Y2sgdGhyb3VnaC4KCj4gKwlleHRjb25fcHJpdiA9 IGNvbnRhaW5lcl9vZihkcF91c2JwZCwgc3RydWN0IGRwX2V4dGNvbl9wcml2YXRlLCBkcF91c2Jw ZCk7Cj4gKwo+ICsJZXh0Y29uX3ByaXYtPmV4dGNvbl9uYi5ub3RpZmllcl9jYWxsID0gZHBfZXh0 Y29uX2V2ZW50X25vdGlmeTsKPiArCXJldCA9IGRldm1fZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVy KGV4dGNvbl9wcml2LT5kZXYsIGV4dGNvbl9wcml2LT5leHRjb24sCj4gKwkJCQkJICAgIEVYVENP Tl9ESVNQX0RQLAo+ICsJCQkJCSAgICAmZXh0Y29uX3ByaXYtPmV4dGNvbl9uYik7Cj4gKwlpZiAo cmV0KSB7Cj4gKwkJZGV2X2VycihleHRjb25fcHJpdi0+ZGV2LAo+ICsJCQkicmVnaXN0ZXIgRVhU Q09OX0RJU1BfRFAgbm90aWZpZXIgZXJyXG4iKTsKClByZWZlciB0aGF0IHlvdSBkb24ndCBhYmJy ZXZpYXRlIGVyciBoZXJlLgo+ICsJCXJldCA9IC1FSU5WQUw7CgpZb3Ugc2V0IHJldCwgYnV0IHlv dSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0IC0geW91IGNvbnRpbnVlIG9uLgoKPiArCX0KPiAr Cj4gKwlyZXQgPSBkcF9leHRjb25fY3JlYXRlX3dvcmtxdWV1ZShleHRjb25fcHJpdik7Cj4gKwlp ZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7Cj4g KwkJZHBfZXh0Y29uX3VucmVnaXN0ZXIoZHBfdXNicGQpOwo+ICsJfQo+ICsKPiArCXByX2Vycigi RW5kLS0tLSIpOwoKQWxzbyBkZWJ1ZyBtZXNzYWdlLgoKPiArCXJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3ZvaWQgZHBfZXh0Y29uX3VucmVnaXN0ZXIoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCkK PiArewo+ICsJc3RydWN0IGRwX2V4dGNvbl9wcml2YXRlICpleHRjb25fcHJpdjsKPiArCj4gKwlp ZiAoIWRwX3VzYnBkKSB7Cj4gKwkJcHJfZXJyKCJJbnZhbGlkIGlucHV0XG4iKTsKCkRvZXNuJ3Qg c2VlbSB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgZG8geW91IG11Y2ggZ29vZCBoZXJlLgoK PiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcHJfZXJyKCJTdGFydCsrKysiKTsKRGVidWcgbG9n IG1lc3NhZ2UKCj4gKwlleHRjb25fcHJpdiA9IGNvbnRhaW5lcl9vZihkcF91c2JwZCwgc3RydWN0 IGRwX2V4dGNvbl9wcml2YXRlLCBkcF91c2JwZCk7Cj4gKwo+ICsJZGV2bV9leHRjb25fdW5yZWdp c3Rlcl9ub3RpZmllcihleHRjb25fcHJpdi0+ZGV2LCBleHRjb25fcHJpdi0+ZXh0Y29uLAo+ICsJ CQkJCSAgICBFWFRDT05fRElTUF9EUCwKPiArCQkJCQkgICAgJmV4dGNvbl9wcml2LT5leHRjb25f bmIpOwo+ICsKPiArCWlmIChleHRjb25fcHJpdi0+ZXh0Y29uX3dxKQo+ICsJCWRlc3Ryb3lfd29y a3F1ZXVlKGV4dGNvbl9wcml2LT5leHRjb25fd3EpOwo+ICsKPiArCXByX2VycigiRW5kLS0tLSIp OwpEZWJ1ZyBsb2cgbWVzc2FnZQoKPiArCXJldHVybjsKPiArfQo+ICsKPiArc3RydWN0IGRwX3Vz YnBkICpkcF9leHRjb25fZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX3VzYnBkX2Ni ICpjYikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAq ZHBfZXh0Y29uOwo+ICsJc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZDsKPiArCj4gKwlpZiAoIWNi KSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGNiIGRhdGFcbiIpOwoKTG9nIG1lc3NhZ2UgaXNuJ3Qg dXNlZnVsLCBqdXN0IHJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwoKPiArCQlyYyA9IC1FSU5WQUw7 Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPiArCj4gKwlwcl9lcnIoIiVzOiBTdGFydCIsIF9fZnVu Y19fKTsKCkRlYnVnIG1lc3NhZ2UuCgo+ICsJZHBfZXh0Y29uID0gZGV2bV9remFsbG9jKGRldiwg c2l6ZW9mKCpkcF9leHRjb24pLCBHRlBfS0VSTkVMKTsKPiArCWlmICghZHBfZXh0Y29uKSB7Cgpy ZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKCj4gKwkJcmMgPSAtRU5PTUVNOwo+ICsJCWdvdG8gZXJy b3I7Cj4gKwl9Cj4gKwo+ICsJZHBfZXh0Y29uLT5leHRjb24gPSBleHRjb25fZ2V0X2VkZXZfYnlf cGhhbmRsZShkZXYsIDApOwo+ICsJaWYgKCFkcF9leHRjb24tPmV4dGNvbikgewo+ICsJCXByX2Vy cigiaW52YWxpZCBleHRjb24gZGF0YVxuIik7Cj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWRldm1f a2ZyZWUoZGV2LCBkcF9leHRjb24pOwoKSnVzdCByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiAr CQlnb3RvIGVycm9yOwo+ICsgICAgICAgIH0KPiArCj4gKwlkcF9leHRjb24tPmRldiA9IGRldjsK PiArCWRwX2V4dGNvbi0+ZHBfY2IgPSBjYjsKPiArCj4gKwlkcF9leHRjb24tPmRwX3VzYnBkLmNv bm5lY3QgPSBkcF9leHRjb25fY29ubmVjdDsKPiArCWRwX3VzYnBkID0gJmRwX2V4dGNvbi0+ZHBf dXNicGQ7Cj4gKwo+ICsJcHJfZXJyKCIlczogZW5kIiwgX19mdW5jX18pOwpEZWJ1ZyBtZXNzYWdl Cgo+ICsJcmV0dXJuIGRwX3VzYnBkOwo+ICtlcnJvcjoKPiArCXJldHVybiBFUlJfUFRSKHJjKTsK PiArfQo+ICsKPiArdm9pZCBkcF9leHRjb25fcHV0KHN0cnVjdCBkcF91c2JwZCAqZHBfdXNicGQp Cj4gK3sKPiArCXN0cnVjdCBkcF9leHRjb25fcHJpdmF0ZSAqZXh0Y29uOwo+ICsKPiArCWlmICgh ZHBfdXNicGQpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWV4dGNvbiA9IGNvbnRhaW5lcl9vZihkcF91 c2JwZCwgc3RydWN0IGRwX2V4dGNvbl9wcml2YXRlLCBkcF91c2JwZCk7Cj4gKwo+ICsJZGV2bV9r ZnJlZShleHRjb24tPmRldiwgZXh0Y29uKTsKCllvdSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgZm9y IG1hbmFnZWQgbWVtb3J5LiAgVGhpcyB3aG9sZSBmdW5jdGlvbiBkb2Vzbid0IG5lZWQKdG8gZXhp c3QuCgo+ICsKPiArCXByX2VycigiJXM6IGVuZCIsIF9fZnVuY19fKTsKPiArfQo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2V4dGNvbi5oIGIvZHJpdmVycy9ncHUvZHJt L21zbS9kcC9kcF9leHRjb24uaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MC4uMWY4M2ExOAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rw L2RwX2V4dGNvbi5oCj4gQEAgLTAsMCArMSwxMTEgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChj KSAyMDEyLTIwMTgsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9u IDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4g KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqLwoKU1BEWCBwbGVhc2UKCj4g KyNpZm5kZWYgX0RQX0VYVENPTl9IXwo+ICsjZGVmaW5lIF9EUF9FWFRDT05fSF8KPiArCj4gKy8v I2luY2x1ZGUgPGxpbnV4L3VzYi91c2JwZC5oPgo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPiArCj4gKy8qKgo+ICsgKiBlbnVtIGRw X3VzYnBkX3BvcnQgLSB1c2IvZHAgcG9ydCB0eXBlCj4gKyAqIEBEUF9VU0JQRF9QT1JUX05PTkU6 IHBvcnQgbm90IGNvbmZpZ3VyZWQKPiArICogQERQX1VTQlBEX1BPUlRfVUZQX0Q6IFVwc3RyZWFt IEZhY2luZyBQb3J0IC0gRGlzcGxheVBvcnQKPiArICogQERQX1VTQlBEX1BPUlRfREZQX0Q6IERv d25zdHJlYW0gRmFjaW5nIFBvcnQgLSBEaXNwbGF5UG9ydAo+ICsgKiBARFBfVVNCUERfUE9SVF9E X1VGUF9EOiBCb3RoIFVGUCAmIERGUCAtIERpc3BsYXlQb3J0Cj4gKyAqLwo+ICsKPiArZW51bSBk cF91c2JwZF9wb3J0IHsKPiArCURQX1VTQlBEX1BPUlRfTk9ORSwKPiArCURQX1VTQlBEX1BPUlRf VUZQX0QsCj4gKwlEUF9VU0JQRF9QT1JUX0RGUF9ELAo+ICsJRFBfVVNCUERfUE9SVF9EX1VGUF9E LAo+ICt9Owo+ICsKPiArZW51bSBwbHVnX29yaWVudGF0aW9uIHsKPiArCU9SSUVOVEFUSU9OX05P TkUsCj4gKwlPUklFTlRBVElPTl9DQzEsCj4gKwlPUklFTlRBVElPTl9DQzIsCj4gK307Cj4gKwo+ ICsvKioKPiArICogc3RydWN0IGRwX3VzYnBkIC0gRGlzcGxheVBvcnQgc3RhdHVzCj4gKyAqCj4g KyAqIEBwb3J0OiBwb3J0IGNvbmZpZ3VyZWQKPiArICogb3JpZW50YXRpb246IHBsdWcgb3JpZW50 YXRpb24gY29uZmlndXJhdGlvbgo+ICsgKiBAbG93X3Bvd19zdDogbG93IHBvd2VyIHN0YXRlCj4g KyAqIEBhZGFwdG9yX2RwX2VuOiBhZGFwdG9yIGZ1bmN0aW9uYWxpdHkgZW5hYmxlZAo+ICsgKiBA bXVsdGlfZnVuYzogbXVsdGktZnVuY3Rpb24gcHJlZmVycmVkCj4gKyAqIEB1c2JfY29uZmlnX3Jl cTogcmVxdWVzdCB0byBzd2l0Y2ggdG8gdXNiCj4gKyAqIEBleGl0X2RwX21vZGU6IHJlcXVlc3Qg ZXhpdCBmcm9tIGRpc3BsYXlwb3J0IG1vZGUKPiArICogQGhwZF9oaWdoOiBIb3QgUGx1ZyBEZXRl Y3Qgc2lnbmFsIGlzIGhpZ2guCj4gKyAqIEBocGRfaXJxOiBDaGFuZ2UgaW4gdGhlIHN0YXR1cyBz aW5jZSBsYXN0IG1lc3NhZ2UKPiArICogQGFsdF9tb2RlX2NmZ19kb25lOiBib29sIHRvIHNwZWNp ZnkgYWx0IG1vZGUgc3RhdHVzCj4gKyAqIEBkZWJ1Z19lbjogYm9vbCB0byBzcGVjaWZ5IGRlYnVn IG1vZGUKPiArICogQGNvbm5lY3Q6IHNpbXVsYXRlIGRpc2Nvbm5lY3Qgb3IgY29ubmVjdCBmb3Ig ZGVidWcgbW9kZQo+ICsgKi8KPiArc3RydWN0IGRwX3VzYnBkIHsKPiArCWVudW0gZHBfdXNicGRf cG9ydCBwb3J0Owo+ICsJZW51bSBwbHVnX29yaWVudGF0aW9uIG9yaWVudGF0aW9uOwo+ICsJYm9v bCBsb3dfcG93X3N0Owo+ICsJYm9vbCBhZGFwdG9yX2RwX2VuOwo+ICsJYm9vbCBtdWx0aV9mdW5j Owo+ICsJYm9vbCB1c2JfY29uZmlnX3JlcTsKPiArCWJvb2wgZXhpdF9kcF9tb2RlOwo+ICsJYm9v bCBocGRfaGlnaDsKPiArCWJvb2wgaHBkX2lycTsKPiArCWJvb2wgYWx0X21vZGVfY2ZnX2RvbmU7 Cj4gKwlib29sIGRlYnVnX2VuOwo+ICsJYm9vbCBmb3JjZWRfZGlzY29ubmVjdDsKPiArCj4gKwlp bnQgKCpjb25uZWN0KShzdHJ1Y3QgZHBfdXNicGQgKmRwX3VzYnBkLCBib29sIGhwZCk7Cj4gK307 Cj4gKwo+ICsvKioKPiArICogc3RydWN0IGRwX3VzYnBkX2NiIC0gY2FsbGJhY2sgZnVuY3Rpb25z IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQKPiArICoKPiArICogQGNvbmZpZ3VyZTogY2FsbGVkIGJ5 IHVzYnBkIG1vZHVsZSB3aGVuIFBEIGNvbW11bmljYXRpb24gaGFzCj4gKyAqIGJlZW4gY29tcGxl dGVkIGFuZCB0aGUgdXNiIHBlcmlwaGVyYWwgaGFzIGJlZW4gY29uZmlndXJlZCBvbgo+ICsgKiBk cCBtb2RlLgo+ICsgKiBAZGlzY29ubmVjdDogbm90aWZ5IHRoZSBjYWJsZSBkaXNjb25uZWN0IGlz c3VlZCBieSB1c2IuCj4gKyAqIEBhdHRlbnRpb246IG5vdGlmeSBhbnkgYXR0ZW50aW9uIG1lc3Nh Z2UgaXNzdWVkIGJ5IHVzYi4KPiArICovCj4gK3N0cnVjdCBkcF91c2JwZF9jYiB7Cj4gKwlpbnQg KCpjb25maWd1cmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Cj4gKwlpbnQgKCpkaXNjb25uZWN0KShz dHJ1Y3QgZGV2aWNlICpkZXYpOwo+ICsJaW50ICgqYXR0ZW50aW9uKShzdHJ1Y3QgZGV2aWNlICpk ZXYpOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGRwX2V4dGNvbl9nZXQoKSAtIHNldHVwIHVzYnBk IG1vZHVsZQo+ICsgKgo+ICsgKiBAZGV2OiBkZXZpY2UgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcgo+ ICsgKiBAY2I6IHN0cnVjdCBjb250YWluaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzLgo+ ICsgKgo+ICsgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgY2xpZW50IHRvIGluaXRpYWxpemUg dGhlIHVzYnBkCj4gKyAqIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGNvbW11bmljYXRlIHdpdGgg dXNiIGRyaXZlciBhbmQKPiArICogaGFuZGxlcyB0aGUgcG93ZXIgZGVsaXZlcnkgKFBEKSBjb21t dW5pY2F0aW9uIHdpdGggdGhlCj4gKyAqIHNpbmsvdXNiIGRldmljZS4gVGhpcyBtb2R1bGUgd2ls bCBub3RpZnkgdGhlIGNsaWVudCB1c2luZwo+ICsgKiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFi b3V0IHRoZSBjb25uZWN0aW9uIGFuZCBzdGF0dXMuCj4gKyAqLwo+ICtzdHJ1Y3QgZHBfdXNicGQg KmRwX2V4dGNvbl9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHBfdXNicGRfY2IgKmNi KTsKPiArCj4gK3ZvaWQgZHBfZXh0Y29uX3B1dChzdHJ1Y3QgZHBfdXNicGQgKnBkKTsKPiArCj4g K2ludCBkcF9leHRjb25fcmVnaXN0ZXIoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCk7Cj4gK3Zv aWQgZHBfZXh0Y29uX3VucmVnaXN0ZXIoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCk7Cj4gKwo+ ICsjZW5kaWYgLyogX0RQX0VYVENPTl9IXyAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vbXNtL2RwL2RwX2xpbmsuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5jCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi41YWIxZWZjCj4gLS0tIC9kZXYv bnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5jCj4gQEAgLTAsMCAr MSwxNTQ5IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE4LCBUaGUgTGludXgg Rm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICoKPiArICogVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSB2ZXJzaW9uIDIgYW5kCj4gKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK PiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh aWxzLgo+ICsgKgo+ICsgKi8KClNQRFggcGxlYXNlLgoKPiArI2RlZmluZSBwcl9mbXQoZm10KQki W2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgImRwX2xpbmsuaCIK PiArI2luY2x1ZGUgImRwX3BhbmVsLmgiCj4gKwo+ICtlbnVtIGR5bmFtaWNfcmFuZ2Ugewo+ICsJ RFBfRFlOQU1JQ19SQU5HRV9SR0JfVkVTQSA9IDB4MDAsCj4gKwlEUF9EWU5BTUlDX1JBTkdFX1JH Ql9DRUEgPSAweDAxLAo+ICsJRFBfRFlOQU1JQ19SQU5HRV9VTktOT1dOID0gMHhGRkZGRkZGRiwK PiArfTsKPiArCj4gK2VudW0gYXVkaW9fc2FtcGxlX3JhdGUgewo+ICsJQVVESU9fU0FNUExFX1JB VEVfMzJfS0haCT0gMHgwMCwKPiArCUFVRElPX1NBTVBMRV9SQVRFXzQ0XzFfS0haCT0gMHgwMSwK PiArCUFVRElPX1NBTVBMRV9SQVRFXzQ4X0tIWgk9IDB4MDIsCj4gKwlBVURJT19TQU1QTEVfUkFU RV84OF8yX0tIWgk9IDB4MDMsCj4gKwlBVURJT19TQU1QTEVfUkFURV85Nl9LSFoJPSAweDA0LAo+ ICsJQVVESU9fU0FNUExFX1JBVEVfMTc2XzRfS0haCT0gMHgwNSwKPiArCUFVRElPX1NBTVBMRV9S QVRFXzE5Ml9LSFoJPSAweDA2LAo+ICt9Owo+ICsKPiArZW51bSBhdWRpb19wYXR0ZXJuX3R5cGUg ewo+ICsJQVVESU9fVEVTVF9QQVRURVJOX09QRVJBVE9SX0RFRklORUQJPSAweDAwLAo+ICsJQVVE SU9fVEVTVF9QQVRURVJOX1NBV1RPT1RICQk9IDB4MDEsCj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBf bGlua19yZXF1ZXN0IHsKPiArCXUzMiB0ZXN0X3JlcXVlc3RlZDsKPiArCXUzMiB0ZXN0X2xpbmtf cmF0ZTsKPiArCXUzMiB0ZXN0X2xhbmVfY291bnQ7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlu a19wcml2YXRlIHsKPiArCXUzMiBwcmV2X3NpbmtfY291bnQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gKwlzdHJ1Y3QgZHBfYXV4ICphdXg7Cj4gKwlzdHJ1Y3QgZHBfbGluayBkcF9saW5rOwo+ ICsKPiArCXN0cnVjdCBkcF9saW5rX3JlcXVlc3QgcmVxdWVzdDsKPiArCXU4IGxpbmtfc3RhdHVz W0RQX0xJTktfU1RBVFVTX1NJWkVdOwo+ICt9Owo+ICsKPiArc3RhdGljIGNoYXIgKmRwX2xpbmtf Z2V0X2F1ZGlvX3Rlc3RfcGF0dGVybih1MzIgcGF0dGVybikKPiArewo+ICsJc3dpdGNoIChwYXR0 ZXJuKSB7Cj4gKwljYXNlIEFVRElPX1RFU1RfUEFUVEVSTl9PUEVSQVRPUl9ERUZJTkVEOgo+ICsJ CXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKEFVRElPX1RFU1RfUEFUVEVSTl9PUEVSQVRPUl9ERUZJ TkVEKTsKPiArCWNhc2UgQVVESU9fVEVTVF9QQVRURVJOX1NBV1RPT1RIOgo+ICsJCXJldHVybiBE UF9MSU5LX0VOVU1fU1RSKEFVRElPX1RFU1RfUEFUVEVSTl9TQVdUT09USCk7Cj4gKwlkZWZhdWx0 Ogo+ICsJCXJldHVybiAidW5rbm93biI7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBjaGFyICpk cF9saW5rX2dldF9hdWRpb19zYW1wbGVfcmF0ZSh1MzIgcmF0ZSkKPiArewo+ICsJc3dpdGNoIChy YXRlKSB7Cj4gKwljYXNlIEFVRElPX1NBTVBMRV9SQVRFXzMyX0tIWjoKPiArCQlyZXR1cm4gRFBf TElOS19FTlVNX1NUUihBVURJT19TQU1QTEVfUkFURV8zMl9LSFopOwo+ICsJY2FzZSBBVURJT19T QU1QTEVfUkFURV80NF8xX0tIWjoKPiArCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUihBVURJT19T QU1QTEVfUkFURV80NF8xX0tIWik7Cj4gKwljYXNlIEFVRElPX1NBTVBMRV9SQVRFXzQ4X0tIWjoK PiArCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUihBVURJT19TQU1QTEVfUkFURV80OF9LSFopOwo+ ICsJY2FzZSBBVURJT19TQU1QTEVfUkFURV84OF8yX0tIWjoKPiArCQlyZXR1cm4gRFBfTElOS19F TlVNX1NUUihBVURJT19TQU1QTEVfUkFURV84OF8yX0tIWik7Cj4gKwljYXNlIEFVRElPX1NBTVBM RV9SQVRFXzk2X0tIWjoKPiArCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUihBVURJT19TQU1QTEVf UkFURV85Nl9LSFopOwo+ICsJY2FzZSBBVURJT19TQU1QTEVfUkFURV8xNzZfNF9LSFo6Cj4gKwkJ cmV0dXJuIERQX0xJTktfRU5VTV9TVFIoQVVESU9fU0FNUExFX1JBVEVfMTc2XzRfS0haKTsKPiAr CWNhc2UgQVVESU9fU0FNUExFX1JBVEVfMTkyX0tIWjoKPiArCQlyZXR1cm4gRFBfTElOS19FTlVN X1NUUihBVURJT19TQU1QTEVfUkFURV8xOTJfS0haKTsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJu ICJ1bmtub3duIjsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9saW5rX2dldF9wZXJp b2Qoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaywgaW50IGNvbnN0IGFkZHIpCj4gK3sKPiAr CWludCByZXQgPSAwOwo+ICsJdTggYnA7Cj4gKwl1OCBkYXRhOwo+ICsJdTMyIGNvbnN0IHBhcmFt X2xlbiA9IDB4MTsKPiArCXUzMiBjb25zdCBtYXhfYXVkaW9fcGVyaW9kID0gMHhBOwo+ICsKPiAr CS8qIFRFU1RfQVVESU9fUEVSSU9EX0NIX1hYICovCj4gKwlpZiAoZHJtX2RwX2RwY2RfcmVhZChs aW5rLT5hdXgtPmRybV9hdXgsIGFkZHIsICZicCwKPiArCQlwYXJhbV9sZW4pIDwgcGFyYW1fbGVu KSB7Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCB0ZXN0X2F1ZGlvX3BlcmlvZCAoMHgleClc biIsIGFkZHIpOwo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0Owo+ICsJfQo+ICsK PiArCWRhdGEgPSBicDsKPiArCj4gKwkvKiBQZXJpb2QgLSBCaXRzIDM6MCAqLwo+ICsJZGF0YSA9 IGRhdGEgJiAweEY7Cj4gKwlpZiAoKGludClkYXRhID4gbWF4X2F1ZGlvX3BlcmlvZCkgewo+ICsJ CXByX2VycigiaW52YWxpZCB0ZXN0X2F1ZGlvX3BlcmlvZF9jaF8xID0gMHgleFxuIiwgZGF0YSk7 Cj4gKwkJcmV0ID0gLUVJTlZBTDsKPiArCQlnb3RvIGV4aXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0g ZGF0YTsKPiArZXhpdDoKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBf bGlua19wYXJzZV9hdWRpb19jaGFubmVsX3BlcmlvZChzdHJ1Y3QgZHBfbGlua19wcml2YXRlICps aW5rKQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXN0cnVjdCBkcF9saW5rX3Rlc3RfYXVkaW8g KnJlcSA9ICZsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW87Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19n ZXRfcGVyaW9kKGxpbmssIERQX1RFU1RfQVVESU9fUEVSSU9EX0NIMSk7Cj4gKwlpZiAocmV0ID09 IC1FSU5WQUwpCgpZb3UgZG9uJ3QgbmVlZCB0aGUgbGFiZWwgZm9yIGFueSBvZiB0aGVzZS4KCj4g KwkJZ290byBleGl0Owo+ICsKPiArCXJlcS0+dGVzdF9hdWRpb19wZXJpb2RfY2hfMSA9IHJldDsK PiArCXByX2RlYnVnKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF8xID0gMHgleFxuIiwgcmV0KTsKPiAr Cj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJT0Rf Q0gyKTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJcmVx LT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF8yID0gcmV0Owo+ICsJcHJfZGVidWcoInRlc3RfYXVkaW9f cGVyaW9kX2NoXzIgPSAweCV4XG4iLCByZXQpOwo+ICsKPiArCS8qIFRFU1RfQVVESU9fUEVSSU9E X0NIXzMgKEJ5dGUgMHgyNzUpICovCj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywg RFBfVEVTVF9BVURJT19QRVJJT0RfQ0gzKTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQln b3RvIGV4aXQ7Cj4gKwo+ICsJcmVxLT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF8zID0gcmV0Owo+ICsJ cHJfZGVidWcoInRlc3RfYXVkaW9fcGVyaW9kX2NoXzMgPSAweCV4XG4iLCByZXQpOwo+ICsKPiAr CXJldCA9IGRwX2xpbmtfZ2V0X3BlcmlvZChsaW5rLCBEUF9URVNUX0FVRElPX1BFUklPRF9DSDQp Owo+ICsJaWYgKHJldCA9PSAtRUlOVkFMKQo+ICsJCWdvdG8gZXhpdDsKPiArCj4gKwlyZXEtPnRl c3RfYXVkaW9fcGVyaW9kX2NoXzQgPSByZXQ7Cj4gKwlwcl9kZWJ1ZygidGVzdF9hdWRpb19wZXJp b2RfY2hfNCA9IDB4JXhcbiIsIHJldCk7Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19nZXRfcGVyaW9k KGxpbmssIERQX1RFU1RfQVVESU9fUEVSSU9EX0NINSk7Cj4gKwlpZiAocmV0ID09IC1FSU5WQUwp Cj4gKwkJZ290byBleGl0Owo+ICsKPiArCXJlcS0+dGVzdF9hdWRpb19wZXJpb2RfY2hfNSA9IHJl dDsKPiArCXByX2RlYnVnKCJ0ZXN0X2F1ZGlvX3BlcmlvZF9jaF81ID0gMHgleFxuIiwgcmV0KTsK PiArCj4gKwlyZXQgPSBkcF9saW5rX2dldF9wZXJpb2QobGluaywgRFBfVEVTVF9BVURJT19QRVJJ T0RfQ0g2KTsKPiArCWlmIChyZXQgPT0gLUVJTlZBTCkKPiArCQlnb3RvIGV4aXQ7Cj4gKwo+ICsJ cmVxLT50ZXN0X2F1ZGlvX3BlcmlvZF9jaF82ID0gcmV0Owo+ICsJcHJfZGVidWcoInRlc3RfYXVk aW9fcGVyaW9kX2NoXzYgPSAweCV4XG4iLCByZXQpOwo+ICsKPiArCXJldCA9IGRwX2xpbmtfZ2V0 X3BlcmlvZChsaW5rLCBEUF9URVNUX0FVRElPX1BFUklPRF9DSDcpOwo+ICsJaWYgKHJldCA9PSAt RUlOVkFMKQo+ICsJCWdvdG8gZXhpdDsKPiArCj4gKwlyZXEtPnRlc3RfYXVkaW9fcGVyaW9kX2No XzcgPSByZXQ7Cj4gKwlwcl9kZWJ1ZygidGVzdF9hdWRpb19wZXJpb2RfY2hfNyA9IDB4JXhcbiIs IHJldCk7Cj4gKwo+ICsJcmV0ID0gZHBfbGlua19nZXRfcGVyaW9kKGxpbmssIERQX1RFU1RfQVVE SU9fUEVSSU9EX0NIOCk7Cj4gKwlpZiAocmV0ID09IC1FSU5WQUwpCj4gKwkJZ290byBleGl0Owo+ ICsKPiArCXJlcS0+dGVzdF9hdWRpb19wZXJpb2RfY2hfOCA9IHJldDsKPiArCXByX2RlYnVnKCJ0 ZXN0X2F1ZGlvX3BlcmlvZF9jaF84ID0gMHgleFxuIiwgcmV0KTsKPiArZXhpdDoKPiArCXJldHVy biByZXQ7CgpUaGlzIGlzbid0IG15IGFyZWEgb2YgZXhwZXJ0aXNlIGJ1dCBJIGNhbid0IHNoYWtl IHRoZSBmZWVsaW5nIHRoYXQgdGhpcyBjb2RlCmNvdWxkIGJlIGNvbnNvbGlkYXRlZCAtIGxpa2Ug d2h5IGFyZSB0aGVyZSBpbmRpdmlkdWFsIG1lbWJlcnMgZm9yCnJlcS0+dGVzdF9hdWRpb19wZXJp b2RfY2hfTiBhbmQgbm90IGFuIGFycmF5LiBMaWtlIEkgc2FpZCwgbm90IG15IGFyZWEsIGp1c3QK ZmVlbCBsaWtlIHRoZXJlIGlzIGNvZGUgdGhhdCBjb3VsZCBiZSBzYXZlZC4KCj4gK30KPiArCj4g K3N0YXRpYyBpbnQgZHBfbGlua19wYXJzZV9hdWRpb19wYXR0ZXJuX3R5cGUoc3RydWN0IGRwX2xp bmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwl1OCBicDsKPiArCXU4 IGRhdGE7Cj4gKwlpbnQgcmxlbjsKPiArCWludCBjb25zdCBwYXJhbV9sZW4gPSAweDE7Cj4gKwlp bnQgY29uc3QgbWF4X2F1ZGlvX3BhdHRlcm5fdHlwZSA9IDB4MTsKPiArCj4gKwlybGVuID0gZHJt X2RwX2RwY2RfcmVhZChsaW5rLT5hdXgtPmRybV9hdXgsCj4gKwkJRFBfVEVTVF9BVURJT19QQVRU RVJOX1RZUEUsICZicCwgcGFyYW1fbGVuKTsKPiArCWlmIChybGVuIDwgcGFyYW1fbGVuKSB7Cj4g KwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCBsaW5rIGF1ZGlvIG1vZGUgZGF0YVxuIik7Cmp1c3Qg cmV0dXJuIC1FSU5WQUw7Cgo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0Owo+ICsJ fQo+ICsJZGF0YSA9IGJwOwo+ICsKPiArCS8qIEF1ZGlvIFBhdHRlcm4gVHlwZSAtIEJpdHMgNzow ICovCj4gKwlpZiAoKGludClkYXRhID4gbWF4X2F1ZGlvX3BhdHRlcm5fdHlwZSkgewo+ICsJCXBy X2VycigiaW52YWxpZCBhdWRpbyBwYXR0ZXJuIHR5cGUgPSAweCV4XG4iLCBkYXRhKTsKPiArCQly ZXQgPSAtRUlOVkFMOwpqdXN0IHJldHVybiAtRUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0K PiArCj4gKwlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19wYXR0ZXJuX3R5cGUg PSBkYXRhOwo+ICsJcHJfZGVidWcoImF1ZGlvIHBhdHRlcm4gdHlwZSA9ICVzXG4iLAo+ICsJCQlk cF9saW5rX2dldF9hdWRpb190ZXN0X3BhdHRlcm4oZGF0YSkpOwo+ICtleGl0Ogo+ICsJcmV0dXJu IHJldDsKCnJldHVybiAwOwoKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9saW5rX3BhcnNlX2F1 ZGlvX21vZGUoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiArewo+ICsJaW50IHJldCA9 IDA7Cj4gKwl1OCBicDsKPiArCXU4IGRhdGE7Cj4gKwlpbnQgcmxlbjsKPiArCWludCBjb25zdCBw YXJhbV9sZW4gPSAweDE7Cj4gKwlpbnQgY29uc3QgbWF4X2F1ZGlvX3NhbXBsaW5nX3JhdGUgPSAw eDY7Cj4gKwlpbnQgY29uc3QgbWF4X2F1ZGlvX2NoYW5uZWxfY291bnQgPSAweDg7Cj4gKwlpbnQg c2FtcGxpbmdfcmF0ZSA9IDB4MDsKPiArCWludCBjaGFubmVsX2NvdW50ID0gMHgwOwo+ICsKPiAr CXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfVEVTVF9BVURJ T19NT0RFLAo+ICsJCQkmYnAsIHBhcmFtX2xlbik7Cj4gKwlpZiAocmxlbiA8IHBhcmFtX2xlbikg ewo+ICsJCXByX2VycigiZmFpbGVkIHRvIHJlYWQgbGluayBhdWRpbyBtb2RlIGRhdGFcbiIpOwo+ ICsJCXJldCA9IC1FSU5WQUw7CgpTYW1lIGFzIGFib3ZlIC0geW91IHNob3VsZCBhbG1vc3QgbmV2 ZXIgaGF2ZSBhIGp1c3QgYSByZXR1cm4gYWZ0ZXIgYSBsYWJlbC4gU2FtZQppcyB0cnVlIGZvciBt dWNoIG9mIHRoaXMgZmlsZS4KCj4gKwkJZ290byBleGl0Owo+ICsJfQo+ICsJZGF0YSA9IGJwOwo+ ICsKPiArCS8qIFNhbXBsaW5nIFJhdGUgLSBCaXRzIDM6MCAqLwo+ICsJc2FtcGxpbmdfcmF0ZSA9 IGRhdGEgJiAweEY7Cj4gKwlpZiAoc2FtcGxpbmdfcmF0ZSA+IG1heF9hdWRpb19zYW1wbGluZ19y YXRlKSB7Cj4gKwkJcHJfZXJyKCJzYW1wbGluZyByYXRlICgweCV4KSBncmVhdGVyIHRoYW4gbWF4 ICgweCV4KVxuIiwKPiArCQkJCXNhbXBsaW5nX3JhdGUsIG1heF9hdWRpb19zYW1wbGluZ19yYXRl KTsKPiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwkvKiBD aGFubmVsIENvdW50IC0gQml0cyA3OjQgKi8KPiArCWNoYW5uZWxfY291bnQgPSAoKGRhdGEgJiAw eEYwKSA+PiA0KSArIDE7Cj4gKwlpZiAoY2hhbm5lbF9jb3VudCA+IG1heF9hdWRpb19jaGFubmVs X2NvdW50KSB7Cj4gKwkJcHJfZXJyKCJjaGFubmVsX2NvdW50ICgweCV4KSBncmVhdGVyIHRoYW4g bWF4ICgweCV4KVxuIiwKPiArCQkJCWNoYW5uZWxfY291bnQsIG1heF9hdWRpb19jaGFubmVsX2Nv dW50KTsKPiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwls aW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19zYW1wbGluZ19yYXRlID0gc2FtcGxp bmdfcmF0ZTsKPiArCWxpbmstPmRwX2xpbmsudGVzdF9hdWRpby50ZXN0X2F1ZGlvX2NoYW5uZWxf Y291bnQgPSBjaGFubmVsX2NvdW50Owo+ICsJcHJfZGVidWcoInNhbXBsaW5nX3JhdGUgPSAlcywg Y2hhbm5lbF9jb3VudCA9IDB4JXhcbiIsCj4gKwkJZHBfbGlua19nZXRfYXVkaW9fc2FtcGxlX3Jh dGUoc2FtcGxpbmdfcmF0ZSksIGNoYW5uZWxfY291bnQpOwo+ICtleGl0Ogo+ICsJcmV0dXJuIHJl dDsKPiArfQoKPHNuaXA+Cgo+ICtzdGF0aWMgdm9pZCBkcF9saW5rX3NlbmRfdGVzdF9yZXNwb25z ZShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaykKPiArewo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0 ZSAqbGluayA9IE5VTEw7Cj4gKwl1MzIgY29uc3QgcmVzcG9uc2VfbGVuID0gMHgxOwo+ICsKPiAr CWlmICghZHBfbGluaykgewo+ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0 dXJuOwo+ICsJfQoKSXQgZG9lc24ndCBsb29rIHRvIG1lIGxpa2UgZHBfbGluayBjYW4gYmUgTlVM TCBoZXJlLgoKPiArCWxpbmsgPSBjb250YWluZXJfb2YoZHBfbGluaywgc3RydWN0IGRwX2xpbmtf cHJpdmF0ZSwgZHBfbGluayk7Cj4gKwo+ICsJZHJtX2RwX2RwY2Rfd3JpdGUobGluay0+YXV4LT5k cm1fYXV4LCBEUF9URVNUX1JFU1BPTlNFLAo+ICsJCQkmZHBfbGluay0+dGVzdF9yZXNwb25zZSwg cmVzcG9uc2VfbGVuKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9saW5rX3BzbV9jb25maWco c3RydWN0IGRwX2xpbmsgKmRwX2xpbmssCj4gKwkJCSAgICAgIHN0cnVjdCBkcm1fZHBfbGluayAq bGlua19pbmZvLCBib29sIGVuYWJsZSkKPiArewo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAq bGluayA9IE5VTEw7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlpZiAoIWRwX2xpbmspIHsKPiAr CQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0K PgpTYW1lLiAgSXQgc2VlbXMgdGhhdCBhbGwgb2YgdGhlc2UgZnVuY3Rpb24gcG9pbnRlcnMgaGF2 ZSBhIHZlcmlmaWVkIHZhbGlkCmRwX2xpbmsgYmVmb3JlIGNhbGxpbmcuCgo+ICsJbGluayA9IGNv bnRhaW5lcl9vZihkcF9saW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKPiAr Cj4gKwlpZiAoZW5hYmxlKQo+ICsJCXJldCA9IGRybV9kcF9saW5rX3Bvd2VyX2Rvd24obGluay0+ YXV4LT5kcm1fYXV4LCBsaW5rX2luZm8pOwo+ICsJZWxzZQo+ICsJCXJldCA9IGRybV9kcF9saW5r X3Bvd2VyX3VwKGxpbmstPmF1eC0+ZHJtX2F1eCwgbGlua19pbmZvKTsKPiArCj4gKwlpZiAocmV0 KQo+ICsJCXByX2VycigiRmFpbGVkIHRvICVzIGxvdyBwb3dlciBtb2RlXG4iLAo+ICsJCQkoZW5h YmxlID8gImVudGVyIiA6ICJleGl0IikpOwo+ICsJZWxzZQo+ICsJCWRwX2xpbmstPnBzbV9lbmFi bGVkID0gZW5hYmxlOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KCjxzbmlwPgoKPiArc3RhdGlj IGludCBkcF9saW5rX3NlbmRfcHNtX3JlcXVlc3Qoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmssIGJv b2wgcmVxKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rOwo+ICsKPiArCWlm ICghZHBfbGluaykgewo+ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJbGluayA9IGNvbnRhaW5lcl9vZihkcF9saW5rLCBzdHJ1 Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKPiArCj4gKwlyZXR1cm4gMDsKClRoaXMgZnVu Y3Rpb24gbG9va3MgbGlrZSBpdCBkb2Vzbid0IGRvIGFueXRoaW5nIG9mIHZhbHVlLgoKPiArfQo+ ICsKPiArc3RhdGljIHUzMiBkcF9saW5rX2dldF90ZXN0X2JpdHNfZGVwdGgoc3RydWN0IGRwX2xp bmsgKmRwX2xpbmssIHUzMiBicHApCj4gK3sKPiArCXUzMiB0YmQ7Cj4gKwo+ICsJLyoKPiArCSAq IEZldyBzaW1wbGlzdGljIHJ1bGVzIGFuZCBhc3N1bXB0aW9ucyBtYWRlIGhlcmU6Cj4gKwkgKiAg ICAxLiBUZXN0IGJpdCBkZXB0aCBpcyBiaXQgZGVwdGggcGVyIGNvbG9yIGNvbXBvbmVudAo+ICsJ ICogICAgMi4gQXNzdW1lIDMgY29sb3IgY29tcG9uZW50cwo+ICsJICovCj4gKwlzd2l0Y2ggKGJw cCkgewo+ICsJY2FzZSAxODoKPiArCQl0YmQgPSBEUF9URVNUX0JJVF9ERVBUSF82Owo+ICsJCWJy ZWFrOwo+ICsJY2FzZSAyNDoKPiArCQl0YmQgPSBEUF9URVNUX0JJVF9ERVBUSF84Owo+ICsJCWJy ZWFrOwo+ICsJY2FzZSAzMDoKPiArCQl0YmQgPSBEUF9URVNUX0JJVF9ERVBUSF8xMDsKPiArCQli cmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJdGJkID0gRFBfVEVTVF9CSVRfREVQVEhfVU5LTk9XTjsK PiArCQlicmVhazsKPiArCX0KPiArCj4gKwlpZiAodGJkICE9IERQX1RFU1RfQklUX0RFUFRIX1VO S05PV04pCj4gKwkJdGJkID0gKHRiZCA+PiBEUF9URVNUX0JJVF9ERVBUSF9TSElGVCk7Cj4gKwo+ ICsJcmV0dXJuIHRiZDsKPiArfQo+ICsKPiArc3RydWN0IGRwX2xpbmsgKmRwX2xpbmtfZ2V0KHN0 cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX2F1eCAqYXV4KQo+ICt7Cj4gKwlpbnQgcmMgPSAw Owo+ICsJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluazsKPiArCXN0cnVjdCBkcF9saW5rICpk cF9saW5rOwo+ICsKPiArCWlmICghZGV2IHx8ICFhdXgpIHsKPiArCQlwcl9lcnIoImludmFsaWQg aW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycm9yOwo+ICsJfQoKRGV2 IGFuZCBhdXggYm90aCBhcHBlYXIgdG8gYmUgbm9uIE5VTEwgZnJvbSB0aGUgY2xhbGVyLgoKPiAr CWxpbmsgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmxpbmspLCBHRlBfS0VSTkVMKTsKPiAr CWlmICghbGluaykgewo+ICsJCXJjID0gLUVJTlZBTDsKClRoaXMgc2hvdWxkIGJlIC1FTk9NRU0g YW5kIHlvdSBzaG91bGQganVzdCByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKCj4gKwkJZ290byBl cnJvcjsKPiArCX0KPiArCj4gKwlsaW5rLT5kZXYgICA9IGRldjsKPiArCWxpbmstPmF1eCAgID0g YXV4Owo+ICsKPiArCWRwX2xpbmsgPSAmbGluay0+ZHBfbGluazsKPiArCj4gKwlkcF9saW5rLT5w cm9jZXNzX3JlcXVlc3QgICAgICAgID0gZHBfbGlua19wcm9jZXNzX3JlcXVlc3Q7Cj4gKwlkcF9s aW5rLT5nZXRfdGVzdF9iaXRzX2RlcHRoICAgID0gZHBfbGlua19nZXRfdGVzdF9iaXRzX2RlcHRo Owo+ICsJZHBfbGluay0+Z2V0X2NvbG9yaW1ldHJ5X2NvbmZpZyA9IGRwX2xpbmtfZ2V0X2NvbG9y aW1ldHJ5X2NvbmZpZzsKPiArCWRwX2xpbmstPmFkanVzdF9sZXZlbHMgICAgICAgICAgPSBkcF9s aW5rX2FkanVzdF9sZXZlbHM7Cj4gKwlkcF9saW5rLT5zZW5kX3BzbV9yZXF1ZXN0ICAgICAgID0g ZHBfbGlua19zZW5kX3BzbV9yZXF1ZXN0Owo+ICsJZHBfbGluay0+c2VuZF90ZXN0X3Jlc3BvbnNl ICAgICA9IGRwX2xpbmtfc2VuZF90ZXN0X3Jlc3BvbnNlOwo+ICsJZHBfbGluay0+cHNtX2NvbmZp ZyAgICAgICAgICAgICA9IGRwX2xpbmtfcHNtX2NvbmZpZzsKPiArCWRwX2xpbmstPnNlbmRfZWRp ZF9jaGVja3N1bSAgICAgPSBkcF9saW5rX3NlbmRfZWRpZF9jaGVja3N1bTsKPiArCj4gKwlyZXR1 cm4gZHBfbGluazsKPiArZXJyb3I6Cj4gKwlyZXR1cm4gRVJSX1BUUihyYyk7CgpMYWJlbCBzaG91 bGQgbm90IGJlIG5lZWRlZC4KCj4gK30KPiArCj4gK3ZvaWQgZHBfbGlua19wdXQoc3RydWN0IGRw X2xpbmsgKmRwX2xpbmspCj4gK3sKPiArCXN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbms7Cj4g Kwo+ICsJaWYgKCFkcF9saW5rKQo+ICsJCXJldHVybjsKPiArCj4gKwlsaW5rID0gY29udGFpbmVy X29mKGRwX2xpbmssIHN0cnVjdCBkcF9saW5rX3ByaXZhdGUsIGRwX2xpbmspOwo+ICsKPiArCWRl dm1fa2ZyZWUobGluay0+ZGV2LCBsaW5rKTsKCllvdSBkb24ndCBuZWVkIHRvIGRlbGV0ZSBkZXZt XyBtYW5hZ2VkIG1lbW9yeS4KCj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9saW5rLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaAo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNmQ2ZWY0Mwo+IC0tLSAvZGV2L251bGwK PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaAo+IEBAIC0wLDAgKzEsMTg0 IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE4LCBUaGUgTGludXggRm91bmRh dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICog aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJz aW9uIDIgYW5kCj4gKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICog TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ ICsgKgo+ICsgKi8KClNQRFggcGxlYXNlLgoKPiArI2lmbmRlZiBfRFBfTElOS19IXwo+ICsjZGVm aW5lIF9EUF9MSU5LX0hfCj4gKwo+ICsjaW5jbHVkZSAiZHBfYXV4LmgiCj4gKwo+ICsjZGVmaW5l IERTX1BPUlRfU1RBVFVTX0NIQU5HRUQgMHgyMDAKPiArI2RlZmluZSBEUF9URVNUX0JJVF9ERVBU SF9VTktOT1dOIDB4RkZGRkZGRkYKPiArI2RlZmluZSBEUF9MSU5LX0VOVU1fU1RSKHgpCQkjeAo+ ICsKPiArZW51bSBkcF9saW5rX3ZvbHRhZ2VfbGV2ZWwgewo+ICsJRFBfTElOS19WT0xUQUdFX0xF VkVMXzAJPSAwLAo+ICsJRFBfTElOS19WT0xUQUdFX0xFVkVMXzEJPSAxLAo+ICsJRFBfTElOS19W T0xUQUdFX0xFVkVMXzIJPSAyLAo+ICsJRFBfTElOS19WT0xUQUdFX01BWAk9IERQX0xJTktfVk9M VEFHRV9MRVZFTF8yLAoKVGhlIGxhc3QgaXRlbSBpbiBhIGVudW0gd2lsbCBiZSB0aGUgdmFsdWUg b2YgdGhlIHByZXZpb3VzIGl0ZW0gcGx1cyAxIC0gd2hpY2ggaXMKcmVhbGx5IHRoZSBvbmx5IGdv b2QgcmVhc29uIHRvIHVzZSBhIGVudW0gSU1PLiAgWW91IGRvbid0IG5lZWQgdG8gYXNzaWduIGl0 CndoaWNoIGlzIGdvb2QgYmVjYXVzZSBpZiB5b3UgZXZlciBhZGRlZCBhbnl0aGluZyB0byB0aGlz IGxpc3QgaXQgd291bGQgdGFrZSB0d28KbGluZXMgb2YgY2hhbmdlIGFuZCBub3QganVzdCBvbmUu Cgo+ICt9Owo+ICsKPiArZW51bSBkcF9saW5rX3ByZWVtYXBoYXNpc19sZXZlbCB7Cj4gKwlEUF9M SU5LX1BSRV9FTVBIQVNJU19MRVZFTF8wCT0gMCwKPiArCURQX0xJTktfUFJFX0VNUEhBU0lTX0xF VkVMXzEJPSAxLAo+ICsJRFBfTElOS19QUkVfRU1QSEFTSVNfTEVWRUxfMgk9IDIsCj4gKwlEUF9M SU5LX1BSRV9FTVBIQVNJU19NQVgJPSBEUF9MSU5LX1BSRV9FTVBIQVNJU19MRVZFTF8yLAo+ICt9 OwoKU2FtZS4KCj4gKwo+ICtzdHJ1Y3QgZHBfbGlua19zaW5rX2NvdW50IHsKPiArCXUzMiBjb3Vu dDsKPiArCWJvb2wgY3BfcmVhZHk7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlua190ZXN0X3Zp ZGVvIHsKPiArCXUzMiB0ZXN0X3ZpZGVvX3BhdHRlcm47Cj4gKwl1MzIgdGVzdF9iaXRfZGVwdGg7 Cj4gKwl1MzIgdGVzdF9keW5fcmFuZ2U7Cj4gKwl1MzIgdGVzdF9oX3RvdGFsOwo+ICsJdTMyIHRl c3Rfdl90b3RhbDsKPiArCXUzMiB0ZXN0X2hfc3RhcnQ7Cj4gKwl1MzIgdGVzdF92X3N0YXJ0Owo+ ICsJdTMyIHRlc3RfaHN5bmNfcG9sOwo+ICsJdTMyIHRlc3RfaHN5bmNfd2lkdGg7Cj4gKwl1MzIg dGVzdF92c3luY19wb2w7Cj4gKwl1MzIgdGVzdF92c3luY193aWR0aDsKPiArCXUzMiB0ZXN0X2hf d2lkdGg7Cj4gKwl1MzIgdGVzdF92X2hlaWdodDsKPiArCXUzMiB0ZXN0X3JyX2Q7Cj4gKwl1MzIg dGVzdF9ycl9uOwo+ICt9Owo+ICsKPiArc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyB7Cj4gKwl1 MzIgdGVzdF9hdWRpb19zYW1wbGluZ19yYXRlOwo+ICsJdTMyIHRlc3RfYXVkaW9fY2hhbm5lbF9j b3VudDsKPiArCXUzMiB0ZXN0X2F1ZGlvX3BhdHRlcm5fdHlwZTsKPiArCXUzMiB0ZXN0X2F1ZGlv X3BlcmlvZF9jaF8xOwo+ICsJdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzI7Cj4gKwl1MzIgdGVz dF9hdWRpb19wZXJpb2RfY2hfMzsKPiArCXUzMiB0ZXN0X2F1ZGlvX3BlcmlvZF9jaF80Owo+ICsJ dTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzU7Cj4gKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hf NjsKPiArCXUzMiB0ZXN0X2F1ZGlvX3BlcmlvZF9jaF83Owo+ICsJdTMyIHRlc3RfYXVkaW9fcGVy aW9kX2NoXzg7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGlua19waHlfcGFyYW1zIHsKPiArCXUz MiBwaHlfdGVzdF9wYXR0ZXJuX3NlbDsKPiArCXU4IHZfbGV2ZWw7Cj4gKwl1OCBwX2xldmVsOwo+ ICt9Owo+ICsKPiArc3RydWN0IGRwX2xpbmtfcGFyYW1zIHsKPiArCXUzMiBsYW5lX2NvdW50Owo+ ICsJdTMyIGJ3X2NvZGU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHBfbGluayB7Cj4gKwl1MzIgc2lu a19yZXF1ZXN0Owo+ICsJdTMyIHRlc3RfcmVzcG9uc2U7Cj4gKwlib29sIHBzbV9lbmFibGVkOwo+ ICsKPiArCXN0cnVjdCBkcF9saW5rX3NpbmtfY291bnQgc2lua19jb3VudDsKPiArCXN0cnVjdCBk cF9saW5rX3Rlc3RfdmlkZW8gdGVzdF92aWRlbzsKPiArCXN0cnVjdCBkcF9saW5rX3Rlc3RfYXVk aW8gdGVzdF9hdWRpbzsKPiArCXN0cnVjdCBkcF9saW5rX3BoeV9wYXJhbXMgcGh5X3BhcmFtczsK PiArCXN0cnVjdCBkcF9saW5rX3BhcmFtcyBsaW5rX3BhcmFtczsKPiArCj4gKwl1MzIgKCpnZXRf dGVzdF9iaXRzX2RlcHRoKShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTMyIGJwcCk7Cj4gKwlp bnQgKCpwcm9jZXNzX3JlcXVlc3QpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rKTsKPiArCWludCAo KmdldF9jb2xvcmltZXRyeV9jb25maWcpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rKTsKPiArCWlu dCAoKmFkanVzdF9sZXZlbHMpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLCB1OCAqbGlua19zdGF0 dXMpOwo+ICsJaW50ICgqc2VuZF9wc21fcmVxdWVzdCkoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmss IGJvb2wgcmVxKTsKPiArCXZvaWQgKCpzZW5kX3Rlc3RfcmVzcG9uc2UpKHN0cnVjdCBkcF9saW5r ICpkcF9saW5rKTsKPiArCWludCAoKnBzbV9jb25maWcpKHN0cnVjdCBkcF9saW5rICpkcF9saW5r LAo+ICsJCXN0cnVjdCBkcm1fZHBfbGluayAqbGlua19pbmZvLCBib29sIGVuYWJsZSk7Cj4gKwl2 b2lkICgqc2VuZF9lZGlkX2NoZWNrc3VtKShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTggY2hl Y2tzdW0pOwo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSBjaGFyICpkcF9saW5rX2dldF9waHlf dGVzdF9wYXR0ZXJuKHUzMiBwaHlfdGVzdF9wYXR0ZXJuX3NlbCkKPiArewo+ICsJc3dpdGNoIChw aHlfdGVzdF9wYXR0ZXJuX3NlbCkgewo+ICsJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX05PTkU6 Cj4gKwkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoRFBfVEVTVF9QSFlfUEFUVEVSTl9OT05FKTsK PiArCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl9EMTBfMl9OT19TQ1JBTUJMSU5HOgo+ICsJCXJl dHVybiBEUF9MSU5LX0VOVU1fU1RSKAo+ICsJCQlEUF9URVNUX1BIWV9QQVRURVJOX0QxMF8yX05P X1NDUkFNQkxJTkcpOwo+ICsJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX1NZTUJPTF9FUlJfTUVB U1VSRU1FTlRfQ05UOgo+ICsJCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKAo+ICsJCQlEUF9URVNU X1BIWV9QQVRURVJOX1NZTUJPTF9FUlJfTUVBU1VSRU1FTlRfQ05UKTsKPiArCWNhc2UgRFBfVEVT VF9QSFlfUEFUVEVSTl9QUkJTNzoKPiArCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUihEUF9URVNU X1BIWV9QQVRURVJOX1BSQlM3KTsKPiArCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl84MF9CSVRf Q1VTVE9NX1BBVFRFUk46Cj4gKwkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoCj4gKwkJCURQX1RF U1RfUEhZX1BBVFRFUk5fODBfQklUX0NVU1RPTV9QQVRURVJOKTsKPiArCWNhc2UgRFBfVEVTVF9Q SFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTjoKPiArCQlyZXR1cm4gRFBfTElOS19FTlVN X1NUUigKPiArCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTik7Cj4g KwlkZWZhdWx0Ogo+ICsJCXJldHVybiAidW5rbm93biI7Cj4gKwl9Cj4gK30KClRoaXMgaXMgYSBi aXQgYmVlZnkgZm9yIGEgaW5saW5lIGZvciBteSB0YXN0ZXMuCgo+ICsKPiArLyoqCj4gKyAqIG1k c3NfZHBfdGVzdF9iaXRfZGVwdGhfdG9fYnBwKCkgLSBjb252ZXJ0IHRlc3QgYml0IGRlcHRoIHRv IGJwcAo+ICsgKiBAdGJkOiB0ZXN0IGJpdCBkZXB0aAo+ICsgKgo+ICsgKiBSZXR1cm5zIHRoZSBi aXRzIHBlciBwaXhlbCAoYnBwKSB0byBiZSB1c2VkIGNvcnJlc3BvbmRpbmcgdG8gdGhlCj4gKyAq IGdpdCBiaXQgZGVwdGggdmFsdWUuIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGJpdCBkZXB0 aCBoYXMKPiArICogYWxyZWFkeSBiZWVuIHZhbGlkYXRlZC4KPiArICovCj4gK3N0YXRpYyBpbmxp bmUgdTMyIGRwX2xpbmtfYml0X2RlcHRoX3RvX2JwcCh1MzIgdGJkKQo+ICt7Cj4gKwl1MzIgYnBw Owo+ICsKPiArCS8qCj4gKwkgKiBGZXcgc2ltcGxpc3RpYyBydWxlcyBhbmQgYXNzdW1wdGlvbnMg bWFkZSBoZXJlOgo+ICsJICogICAgMS4gQml0IGRlcHRoIGlzIHBlciBjb2xvciBjb21wb25lbnQK PiArCSAqICAgIDIuIElmIGJpdCBkZXB0aCBpcyB1bmtub3duIHJldHVybiAwCj4gKwkgKiAgICAz LiBBc3N1bWUgMyBjb2xvciBjb21wb25lbnRzCj4gKwkgKi8KPiArCXN3aXRjaCAodGJkKSB7Cj4g KwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzY6Cj4gKwkJYnBwID0gMTg7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzg6Cj4gKwkJYnBwID0gMjQ7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIERQX1RFU1RfQklUX0RFUFRIXzEwOgo+ICsJCWJwcCA9IDMwOwo+ICsJCWJyZWFrOwo+ ICsJY2FzZSBEUF9URVNUX0JJVF9ERVBUSF9VTktOT1dOOgo+ICsJZGVmYXVsdDoKPiArCQlicHAg PSAwOwo+ICsJfQo+ICsKPiArCXJldHVybiBicHA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkcF9s aW5rX2dldCgpIC0gZ2V0IHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgZHAgdGVzdCBtb2R1bGUKPiAr ICoKPiArICoKPiArICogcmV0dXJuOiBhIHBvaW50ZXIgdG8gZHBfbGluayBzdHJ1Y3QKPiArICov Cj4gK3N0cnVjdCBkcF9saW5rICpkcF9saW5rX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkcF9hdXggKmF1eCk7Cj4gKwo+ICsvKioKPiArICogZHBfbGlua19wdXQoKSAtIHJlbGVhc2Vz IHRoZSBkcCB0ZXN0IG1vZHVsZSdzIHJlc291cmNlcwo+ICsgKgo+ICsgKiBAZHBfbGluazogYW4g aW5zdGFuY2Ugb2YgZHBfbGluayBtb2R1bGUKPiArICoKPiArICovCj4gK3ZvaWQgZHBfbGlua19w dXQoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspOwo+ICsKPiArI2VuZGlmIC8qIF9EUF9MSU5LX0hf ICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMC4uZTQ5N2I0NAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX3BhbmVsLmMKPiBAQCAtMCwwICsxLDYyNCBAQAo+ICsvKgo+ICsgKiBD b3B5cmlnaHQgKGMpIDIwMTItMjAxOCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMg cmVzZXJ2ZWQuCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAo+ICsgKiBv bmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bi4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPiArICogR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICovCgpTUERY IHBsZWFzZS4gIAoKPiArI2RlZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBf X2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgImRwX3BhbmVsLmgiCj4gKwo+ICsjaW5jbHVkZSA8ZHJt L2RybV9jb25uZWN0b3IuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fZWRpZC5oPgo+ICsKPiArI2Rl ZmluZSBEUF9QQU5FTF9ERUZBVUxUX0JQUCAyNAo+ICsjZGVmaW5lIERQX01BWF9EU19QT1JUX0NP VU5UIDEKPiArCj4gK2VudW0gewo+ICsJRFBfTElOS19SQVRFX01VTFRJUExJRVIgPSAyNzAwMDAw MCwKPiArfTsKCkFuIGVudW0gb2YgMSBpcyBuZXZlciB1c2VmdWwuCgo+ICsKPiArc3RydWN0IGRw X3BhbmVsX3ByaXZhdGUgewo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0IGRwX3Bh bmVsIGRwX3BhbmVsOwo+ICsJc3RydWN0IGRwX2F1eCAqYXV4Owo+ICsJc3RydWN0IGRwX2xpbmsg Kmxpbms7Cj4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqY2F0YWxvZzsKPiArCWJvb2wgcGFu ZWxfb247Cj4gKwlib29sIGF1eF9jZmdfdXBkYXRlX2RvbmU7Cj4gK307Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRwX3BhbmVsX2luZm8gZmFpbF9zYWZlID0gewo+ICsJLmhfYWN0aXZlID0g NjQwLAo+ICsJLnZfYWN0aXZlID0gNDgwLAo+ICsJLmhfYmFja19wb3JjaCA9IDQ4LAo+ICsJLmhf ZnJvbnRfcG9yY2ggPSAxNiwKPiArCS5oX3N5bmNfd2lkdGggPSA5NiwKPiArCS5oX2FjdGl2ZV9s b3cgPSAwLAo+ICsJLnZfYmFja19wb3JjaCA9IDMzLAo+ICsJLnZfZnJvbnRfcG9yY2ggPSAxMCwK PiArCS52X3N5bmNfd2lkdGggPSAyLAo+ICsJLnZfYWN0aXZlX2xvdyA9IDAsCj4gKwkuaF9za2V3 ID0gMCwKPiArCS5yZWZyZXNoX3JhdGUgPSA2MCwKPiArCS5waXhlbF9jbGtfa2h6ID0gMjUyMDAs Cj4gKwkuYnBwID0gMjQsCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3BhbmVsX3JlYWRfZHBj ZChzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQo+ICt7Cj4gKwlpbnQgcmxlbiwgcmMgPSAwOwo+ ICsJc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOwo+ICsJc3RydWN0IGRybV9kcF9saW5r ICpsaW5rX2luZm87Cj4gKwl1OCAqZHBjZCwgbWFqb3IgPSAwLCBtaW5vciA9IDA7Cj4gKwl1MzIg ZGZwX2NvdW50ID0gMDsKPiArCXVuc2lnbmVkIGxvbmcgY2FwcyA9IERQX0xJTktfQ0FQX0VOSEFO Q0VEX0ZSQU1JTkc7Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkgewo+ICsJCXByX2VycigiaW52YWxp ZCBpbnB1dFxuIik7Cj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZW5kOwo+ICsJfQo+Ckl0 IGFwcGVhcnMgdGhhdCBkcF9wYW5lbCB3aWxsIGFsd2F5cyBiZSB2YWxpZCBhdCBldmVyeSBjYWxs IHBvaW50LgoKPiArCWRwY2QgPSBkcF9wYW5lbC0+ZHBjZDsKPiArCj4gKwlwYW5lbCA9IGNvbnRh aW5lcl9vZihkcF9wYW5lbCwgc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUsIGRwX3BhbmVsKTsKPiAr CWxpbmtfaW5mbyA9ICZkcF9wYW5lbC0+bGlua19pbmZvOwo+ICsKPiArCXJsZW4gPSBkcm1fZHBf ZHBjZF9yZWFkKHBhbmVsLT5hdXgtPmRybV9hdXgsIERQX0RQQ0RfUkVWLAo+ICsJCWRwY2QsIChE UF9SRUNFSVZFUl9DQVBfU0laRSArIDEpKTsKPiArCWlmIChybGVuIDwgKERQX1JFQ0VJVkVSX0NB UF9TSVpFICsgMSkpIHsKPiArCQlwcl9lcnIoImRwY2QgcmVhZCBmYWlsZWQsIHJsZW49JWRcbiIs IHJsZW4pOwoKSnVzdCByZXR1cm4gLUVOVkFMIGhlcmUgYW5kIGV2ZXJ5d2hlcmUgZWxzZSBlbmQ6 IGlzIHVzZWQuCgo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVuZDsKPiArCX0KPiArCj4g KwlsaW5rX2luZm8tPnJldmlzaW9uID0gZHBfcGFuZWwtPmRwY2RbRFBfRFBDRF9SRVZdOwo+ICsK PiArCW1ham9yID0gKGxpbmtfaW5mby0+cmV2aXNpb24gPj4gNCkgJiAweDBmOwo+ICsJbWlub3Ig PSBsaW5rX2luZm8tPnJldmlzaW9uICYgMHgwZjsKPiArCXByX2RlYnVnKCJ2ZXJzaW9uOiAlZC4l ZFxuIiwgbWFqb3IsIG1pbm9yKTsKPiArCj4gKwlsaW5rX2luZm8tPnJhdGUgPQo+ICsJCWRybV9k cF9id19jb2RlX3RvX2xpbmtfcmF0ZShkcF9wYW5lbC0+ZHBjZFtEUF9NQVhfTElOS19SQVRFXSk7 Cj4gKwlwcl9kZWJ1ZygibGlua19yYXRlPSVkXG4iLCBsaW5rX2luZm8tPnJhdGUpOwo+ICsKPiAr CWxpbmtfaW5mby0+bnVtX2xhbmVzID0gZHBfcGFuZWwtPmRwY2RbRFBfTUFYX0xBTkVfQ09VTlRd ICYKPiArCQkJCURQX01BWF9MQU5FX0NPVU5UX01BU0s7Cj4gKwo+ICsJcHJfZGVidWcoImxhbmVf Y291bnQ9JWRcbiIsIGxpbmtfaW5mby0+bnVtX2xhbmVzKTsKPiArCj4gKwlpZiAoZHJtX2RwX2Vu aGFuY2VkX2ZyYW1lX2NhcChkcGNkKSkKPiArCQlsaW5rX2luZm8tPmNhcGFiaWxpdGllcyB8PSBj YXBzOwo+ICsKPiArCWRmcF9jb3VudCA9IGRwY2RbRFBfRE9XTl9TVFJFQU1fUE9SVF9DT1VOVF0g Jgo+ICsJCQkJCQlEUF9ET1dOX1NUUkVBTV9QT1JUX0NPVU5UOwo+ICsKPiArCWlmICgoZHBjZFtE UF9ET1dOU1RSRUFNUE9SVF9QUkVTRU5UXSAmIERQX0RXTl9TVFJNX1BPUlRfUFJFU0VOVCkKPiAr CQkmJiAoZHBjZFtEUF9EUENEX1JFVl0gPiAweDEwKSkgewo+ICsJCXJsZW4gPSBkcm1fZHBfZHBj ZF9yZWFkKHBhbmVsLT5hdXgtPmRybV9hdXgsCj4gKwkJCURQX0RPV05TVFJFQU1fUE9SVF8wLCBk cF9wYW5lbC0+ZHNfcG9ydHMsCj4gKwkJCURQX01BWF9ET1dOU1RSRUFNX1BPUlRTKTsKPiArCQlp ZiAocmxlbiA8IERQX01BWF9ET1dOU1RSRUFNX1BPUlRTKSB7Cj4gKwkJCXByX2VycigiZHMgcG9y dCBzdGF0dXMgZmFpbGVkLCBybGVuPSVkXG4iLCBybGVuKTsKPiArCQkJcmMgPSAtRUlOVkFMOwo+ ICsJCQlnb3RvIGVuZDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKGRmcF9jb3VudCA+IERQX01B WF9EU19QT1JUX0NPVU5UKQo+ICsJCXByX2RlYnVnKCJEUyBwb3J0IGNvdW50ICVkIGdyZWF0ZXIg dGhhdCBtYXggKCVkKSBzdXBwb3J0ZWRcbiIsCj4gKwkJCWRmcF9jb3VudCwgRFBfTUFYX0RTX1BP UlRfQ09VTlQpOwo+ICsKPiArZW5kOgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGRwX3BhbmVsX3NldF9kZWZhdWx0X2xpbmtfcGFyYW1zKHN0cnVjdCBkcF9wYW5lbCAqZHBf cGFuZWwpCj4gK3sKPiArCXN0cnVjdCBkcm1fZHBfbGluayAqbGlua19pbmZvOwo+ICsJY29uc3Qg aW50IGRlZmF1bHRfYndfY29kZSA9IDE2MjAwMDsKPiArCWNvbnN0IGludCBkZWZhdWx0X251bV9s YW5lcyA9IDE7Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkgewo+ICsJCXByX2VycigiaW52YWxpZCBp bnB1dFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9CgpkcF9wYW5lbCB3aWxsIGFsd2F5 cyBiZSB2YWxpZC4KCj4gKwlsaW5rX2luZm8gPSAmZHBfcGFuZWwtPmxpbmtfaW5mbzsKPiArCWxp bmtfaW5mby0+cmF0ZSA9IGRlZmF1bHRfYndfY29kZTsKPiArCWxpbmtfaW5mby0+bnVtX2xhbmVz ID0gZGVmYXVsdF9udW1fbGFuZXM7CgpJbnN0ZWFkIG9mIHVzaW50IGNvbnN0IHZhcmlhYmxlcyBq dXN0IHNldCB0aGUgdmFyaWFibGVzIGRpcmVjdGx5LgoKPiArCXByX2RlYnVnKCJsaW5rX3JhdGU9 JWQgbnVtX2xhbmVzPSVkXG4iLAo+ICsJCWxpbmtfaW5mby0+cmF0ZSwgbGlua19pbmZvLT5udW1f bGFuZXMpOwo+ICsJcmV0dXJuIDA7CgpJdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHJldHVybiB2YWx1 ZSBpcyBuZWVkZWQgaGVyZS4KCkFuZCBtYXliZSB0aGlzIGZ1bmN0aW9uIGlzbid0IG5lZWRlZCBh dCBhbGw/ICBUaGlzIGNvdWxkIGFsbCBoYXBwZW4gaW5saW5lIHdoZXJlCnRoaXMgZnVuY3Rpb24g aXMgY2FsbGVkLgoKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wYW5lbF9yZWFkX2VkaWQoc3Ry dWN0IGRwX3BhbmVsICpkcF9wYW5lbCwKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IpCj4gK3sKPiArCWludCByZXRyeV9jbnQgPSAwOwo+ICsJY29uc3QgaW50IG1heF9yZXRyeSA9 IDEwOwo+ICsJc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOwo+ICsKPiArCWlmICghZHBf cGFuZWwpIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsJfQoKZHBfcGFuZWwgd2lsbCBhbHdheXMgYmUgdmFsaWQuCgo+ICsJcGFuZWwgPSBj b250YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7 Cj4gKwo+ICsJZG8gewo+ICsJCWtmcmVlKGRwX3BhbmVsLT5lZGlkKTsKPiArCQlkcF9wYW5lbC0+ ZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsCj4gKwkJCQkJICAgICAgJnBhbmVsLT5hdXgt PmRybV9hdXgtPmRkYyk7Cj4gKwkJaWYgKCFkcF9wYW5lbC0+ZWRpZCkgewo+ICsJCQlwcl9lcnIo IkVESUQgcmVhZCBmYWlsZWRcbiIpOwoKWW91IGRvbid0IG5lZWQgYW4gZXJyb3IgaGVyZSBiZWNh dXNlIHRoZSBlcnJvciBwcmludHMgYW4gZXJyb3Igb24geW91ciBiZWhhbGYKYW5kIHlvdSBjZXJ0 YWlubHkgZG9uJ3Qgd2FudCB0byBwcmludCAxMCBlcnJvcnMgd2l0aG91dCBtb3JlIGRldGFpbHMg YWJvdXQgd2hhdAp0aGUgZmFpbHVyZSBhY3R1YWxseSB3YXMuCgo+ICsJCQlyZXRyeV9jbnQrKzsK PiArCQkJcGFuZWwtPmF1eC0+cmVjb25maWcocGFuZWwtPmF1eCk7Cj4gKwkJCXBhbmVsLT5hdXhf Y2ZnX3VwZGF0ZV9kb25lID0gdHJ1ZTsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXR1cm4gMDsKPiAr CQl9Cj4gKwl9IHdoaWxlIChyZXRyeV9jbnQgPCBtYXhfcmV0cnkpOwoKTXkgZWRpZCBwYXJzaW5n IGRheXMgd2VyZSBvdmVyIGJhY2sgd2hlbiBEVkkgd2FzIG5ldyBhbmQgaW50ZXJlc3RpbmcgYnV0 IGFzCmp1c3QgYSBrZXJuZWwgZGV2ZWxvcGVyIHRoaXMgc2VlbXMgb2RkLiBJJ2xsIGxlYXZlIGl0 IHRvIHRoZSBleHBlcnRzLgoKQnV0IGF0IGxlYXN0IEkgd291bGQgdXNlIGEgdmFsaWQgZm9yKCkg bG9vcDoKCmZvcihyZXRyeV9jbnQgPSAwOyByZXRyeV9jbnQgPCAxMDsgcmV0cnlfY250KyspIHsK ICAgICAuLgp9CgoKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRw X3BhbmVsX3JlYWRfc2lua19jYXBzKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwlzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3Ry dWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOwo+ICsKPiArCWlmICghZHBfcGFuZWwgfHwgIWNv bm5lY3Rvcikgewo+ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4gKwl9CgpMb29rcyBsaWtlIGJvdGggb2YgdGhlc2UgYXJlIHZhbGlkIGZyb20gdGhl IGNhbGxlci4KCgo+ICsJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9w YW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwo+ICsJcmMgPSBkcF9wYW5lbF9yZWFkX2RwY2Qo ZHBfcGFuZWwpOwo+ICsJaWYgKHJjIHx8ICFpc19saW5rX3JhdGVfdmFsaWQoZHJtX2RwX2xpbmtf cmF0ZV90b19id19jb2RlKAo+ICsJCWRwX3BhbmVsLT5saW5rX2luZm8ucmF0ZSkpIHx8ICFpc19s YW5lX2NvdW50X3ZhbGlkKAo+ICsJCWRwX3BhbmVsLT5saW5rX2luZm8ubnVtX2xhbmVzKSB8fAo+ ICsJCSgoZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGRwX3BhbmVsLT5saW5rX2luZm8ucmF0 ZSkpID4KPiArCQlkcF9wYW5lbC0+bWF4X2J3X2NvZGUpKSB7Cj4gKwkJaWYgKChyYyA9PSAtRVRJ TUVET1VUKSB8fCAocmMgPT0gLUVOT0RFVikpIHsKPiArCQkJcHJfZXJyKCJEUENEIHJlYWQgZmFp bGVkLCByZXR1cm4gZWFybHlcbiIpOwo+ICsJCQlyZXR1cm4gcmM7Cj4gKwkJfQo+ICsJCXByX2Vy cigicGFuZWwgZHBjZCByZWFkIGZhaWxlZC9pbmNvcnJlY3QsIHNldCBkZWZhdWx0IHBhcmFtc1xu Iik7Cj4gKwkJZHBfcGFuZWxfc2V0X2RlZmF1bHRfbGlua19wYXJhbXMoZHBfcGFuZWwpOwo+ICsJ fQo+ICsKPiArCXJjID0gZHBfcGFuZWxfcmVhZF9lZGlkKGRwX3BhbmVsLCBjb25uZWN0b3IpOwo+ ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJwYW5lbCBlZGlkIHJlYWQgZmFpbGVkLCBzZXQgZmFp bHNhZmUgbW9kZVxuIik7Cj4gKwkJcmV0dXJuIHJjOwo+ICsJfQo+ICsKPiArCWlmIChwYW5lbC0+ YXV4X2NmZ191cGRhdGVfZG9uZSkgewo+ICsJCXByX2RlYnVnKCJyZWFkIERQQ0Qgd2l0aCB1cGRh dGVkIEFVWCBjb25maWdcbiIpOwo+ICsJCWRwX3BhbmVsX3JlYWRfZHBjZChkcF9wYW5lbCk7Cj4g KwkJcGFuZWwtPmF1eF9jZmdfdXBkYXRlX2RvbmUgPSBmYWxzZTsKPiArCX0KPiArCj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHUzMiBkcF9wYW5lbF9nZXRfc3VwcG9ydGVkX2JwcChz dHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsLAo+ICsJCXUzMiBtb2RlX2VkaWRfYnBwLCB1MzIgbW9k ZV9wY2xrX2toeikKPiArewo+ICsJc3RydWN0IGRybV9kcF9saW5rICpsaW5rX2luZm87Cj4gKwlj b25zdCB1MzIgbWF4X3N1cHBvcnRlZF9icHAgPSAzMCwgbWluX3N1cHBvcnRlZF9icHAgPSAxODsK PiArCXUzMiBicHAgPSAwLCBkYXRhX3JhdGVfa2h6ID0gMDsKPiArCj4gKwlicHAgPSBtaW5fdCh1 MzIsIG1vZGVfZWRpZF9icHAsIG1heF9zdXBwb3J0ZWRfYnBwKTsKPiArCj4gKwlsaW5rX2luZm8g PSAmZHBfcGFuZWwtPmxpbmtfaW5mbzsKPiArCWRhdGFfcmF0ZV9raHogPSBsaW5rX2luZm8tPm51 bV9sYW5lcyAqIGxpbmtfaW5mby0+cmF0ZSAqIDg7Cj4gKwo+ICsJd2hpbGUgKGJwcCA+IG1pbl9z dXBwb3J0ZWRfYnBwKSB7Cj4gKwkJaWYgKG1vZGVfcGNsa19raHogKiBicHAgPD0gZGF0YV9yYXRl X2toeikKPiArCQkJYnJlYWs7Cj4gKwkJYnBwIC09IDY7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGJw cDsKPiArfQo+ICsKPiArc3RhdGljIHUzMiBkcF9wYW5lbF9nZXRfbW9kZV9icHAoc3RydWN0IGRw X3BhbmVsICpkcF9wYW5lbCwKPiArCQl1MzIgbW9kZV9lZGlkX2JwcCwgdTMyIG1vZGVfcGNsa19r aHopCj4gK3sKPiArCXN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbDsKPiArCXUzMiBicHAg PSBtb2RlX2VkaWRfYnBwOwo+ICsKPiArCWlmICghZHBfcGFuZWwgfHwgIW1vZGVfZWRpZF9icHAg fHwgIW1vZGVfcGNsa19raHopIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJ CXJldHVybiAwOwo+ICsJfQo+CmRwX3BhbmVsIGFuZCBtb2RlX2VkaWRfYnBwIGFyZSB2YWxpZCBm cm9tIHRoZSBjYWxsZXIsIG5vdCBzdXJlIGFib3V0Cm1vZGVfcGNrbGtfaHouICBNaWdodCB3YW50 IHRvIHVzZSBhIFdBUk5fT04gZm9yIHRoYXQgb25lLgoKPiArCXBhbmVsID0gY29udGFpbmVyX29m KGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwo+ICsKPiArCWlm IChkcF9wYW5lbC0+dmlkZW9fdGVzdCkKPiArCQlicHAgPSBkcF9saW5rX2JpdF9kZXB0aF90b19i cHAoCj4gKwkJCQlwYW5lbC0+bGluay0+dGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCk7Cj4gKwll bHNlCj4gKwkJYnBwID0gZHBfcGFuZWxfZ2V0X3N1cHBvcnRlZF9icHAoZHBfcGFuZWwsIG1vZGVf ZWRpZF9icHAsCj4gKwkJCQltb2RlX3BjbGtfa2h6KTsKPiArCj4gKwlyZXR1cm4gYnBwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9wYW5lbF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkcF9wYW5l bF9wcml2YXRlICpwYW5lbCwKPiArCQlzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICptb2RlKQo+ICt7 Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfaW5mbyAqcGluZm8gPSBOVUxMOwo+ICsJc3RydWN0IGRwX2xp bmtfdGVzdF92aWRlbyAqdGVzdF9pbmZvID0gTlVMTDsKPiArCj4gKwlpZiAoIXBhbmVsKSB7Cj4g KwkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtc1xuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ClBhbmVs IHdpbGwgYWx3YXlzIGJlIHZhbGlkLgoKPiArCXBpbmZvID0gJm1vZGUtPnRpbWluZzsKPiArCXRl c3RfaW5mbyA9ICZwYW5lbC0+bGluay0+dGVzdF92aWRlbzsKPiArCj4gKwlwaW5mby0+aF9hY3Rp dmUgPSB0ZXN0X2luZm8tPnRlc3RfaF93aWR0aDsKPiArCXBpbmZvLT5oX3N5bmNfd2lkdGggPSB0 ZXN0X2luZm8tPnRlc3RfaHN5bmNfd2lkdGg7Cj4gKwlwaW5mby0+aF9iYWNrX3BvcmNoID0gdGVz dF9pbmZvLT50ZXN0X2hfc3RhcnQgLQo+ICsJCXRlc3RfaW5mby0+dGVzdF9oc3luY193aWR0aDsK PiArCXBpbmZvLT5oX2Zyb250X3BvcmNoID0gdGVzdF9pbmZvLT50ZXN0X2hfdG90YWwgLQo+ICsJ CSh0ZXN0X2luZm8tPnRlc3RfaF9zdGFydCArIHRlc3RfaW5mby0+dGVzdF9oX3dpZHRoKTsKPiAr Cj4gKwlwaW5mby0+dl9hY3RpdmUgPSB0ZXN0X2luZm8tPnRlc3Rfdl9oZWlnaHQ7Cj4gKwlwaW5m by0+dl9zeW5jX3dpZHRoID0gdGVzdF9pbmZvLT50ZXN0X3ZzeW5jX3dpZHRoOwo+ICsJcGluZm8t PnZfYmFja19wb3JjaCA9IHRlc3RfaW5mby0+dGVzdF92X3N0YXJ0IC0KPiArCQl0ZXN0X2luZm8t PnRlc3RfdnN5bmNfd2lkdGg7Cj4gKwlwaW5mby0+dl9mcm9udF9wb3JjaCA9IHRlc3RfaW5mby0+ dGVzdF92X3RvdGFsIC0KPiArCQkodGVzdF9pbmZvLT50ZXN0X3Zfc3RhcnQgKyB0ZXN0X2luZm8t PnRlc3Rfdl9oZWlnaHQpOwo+ICsKPiArCXBpbmZvLT5icHAgPSBkcF9saW5rX2JpdF9kZXB0aF90 b19icHAodGVzdF9pbmZvLT50ZXN0X2JpdF9kZXB0aCk7Cj4gKwlwaW5mby0+aF9hY3RpdmVfbG93 ID0gdGVzdF9pbmZvLT50ZXN0X2hzeW5jX3BvbDsKPiArCXBpbmZvLT52X2FjdGl2ZV9sb3cgPSB0 ZXN0X2luZm8tPnRlc3RfdnN5bmNfcG9sOwo+ICsKPiArCXBpbmZvLT5yZWZyZXNoX3JhdGUgPSB0 ZXN0X2luZm8tPnRlc3RfcnJfbjsKPiArCXBpbmZvLT5waXhlbF9jbGtfa2h6ID0gdGVzdF9pbmZv LT50ZXN0X2hfdG90YWwgKgo+ICsJCXRlc3RfaW5mby0+dGVzdF92X3RvdGFsICogcGluZm8tPnJl ZnJlc2hfcmF0ZTsKPiArCj4gKwlpZiAodGVzdF9pbmZvLT50ZXN0X3JyX2QgPT0gMCkKPiArCQlw aW5mby0+cGl4ZWxfY2xrX2toeiAvPSAxMDAwOwo+ICsJZWxzZQo+ICsJCXBpbmZvLT5waXhlbF9j bGtfa2h6IC89IDEwMDE7Cj4gKwo+ICsJaWYgKHRlc3RfaW5mby0+dGVzdF9oX3dpZHRoID09IDY0 MCkKPiArCQlwaW5mby0+cGl4ZWxfY2xrX2toeiA9IDI1MTcwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGRwX3BhbmVsX3VwZGF0ZV9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y LAo+ICsJc3RydWN0IGVkaWQgKmVkaWQpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwo+ICsJcHJf ZGVidWcoIiVzICsiLCBfX2Z1bmNfXyk7Cj4gKwlpZiAoZWRpZCkgewo+ICsJCWRybV9jb25uZWN0 b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLAo+ICsJCQllZGlkKTsKPiArCQlyYyA9 IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOwo+ICsJCXByX2RlYnVnKCIlcyAt IiwgX19mdW5jX18pOwo+ICsJCXJldHVybiByYzsKPiArCX0KPiArCj4gKwlkcm1fY29ubmVjdG9y X3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgTlVMTCk7Cj4gKwlwcl9kZWJ1ZygiJXMg bnVsbCBlZGlkIC0iLCBfX2Z1bmNfXyk7Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgZHBfcGFuZWxfZ2V0X21vZGVzKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwlz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICpt b2RlKQo+ICt7Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSAqcGFuZWw7Cj4gKwo+ICsJaWYg KCFkcF9wYW5lbCkgewo+ICsJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gKwl9Cj4KcGFuZWwgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZC4KCj4gKwlwYW5l bCA9IGNvbnRhaW5lcl9vZihkcF9wYW5lbCwgc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUsIGRwX3Bh bmVsKTsKPiArCj4gKwlpZiAoZHBfcGFuZWwtPnZpZGVvX3Rlc3QpIHsKPiArCQlkcF9wYW5lbF9z ZXRfdGVzdF9tb2RlKHBhbmVsLCBtb2RlKTsKPiArCQlyZXR1cm4gMTsKCldoYXQgaXMgdGhlIHZh bGlkIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uPyBJcyBpdCBzdXBwb3NlZCB0byBiZSBib29sZWFu PwoKPiArCX0gZWxzZSBpZiAoZHBfcGFuZWwtPmVkaWQpIHsKPiArCSAgcmV0dXJuIGRwX3BhbmVs X3VwZGF0ZV9tb2Rlcyhjb25uZWN0b3IsIGRwX3BhbmVsLT5lZGlkKTsKCkluZGVudGF0aW9uIGlz IHN1c3BlY3QgaGVyZS4KCj4gKwl9Cj4gKwo+ICsJLyogZmFpbC1zYWZlIG1vZGUgKi8KPiArCW1l bWNweSgmbW9kZS0+dGltaW5nLCAmZmFpbF9zYWZlLAo+ICsJCXNpemVvZihmYWlsX3NhZmUpKTsK PiArCXJldHVybiAxOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTggZHBfcGFuZWxfZ2V0X2VkaWRfY2hl Y2tzdW0oc3RydWN0IGVkaWQgKmVkaWQpCj4gK3sKPiArCXN0cnVjdCBlZGlkICpsYXN0X2Jsb2Nr ID0gTlVMTDsKPiArCXU4ICpyYXdfZWRpZCA9IE5VTEw7Cj4gKwo+ICsJaWYgKCFlZGlkKSB7Cj4g KwkJcHJfZXJyKCJpbnZhbGlkIGVkaWQgaW5wdXRcbiIpOwpZb3UgZG9uJ3QgbmVlZCBhIGxvZyBt ZXNzYWdlIGhlcmUuICBNYXliZSBhIFdBUk5fT04uCgo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsK PiArCXJhd19lZGlkID0gKHU4ICopZWRpZDsKPiArCXJhd19lZGlkICs9IChlZGlkLT5leHRlbnNp b25zICogRURJRF9MRU5HVEgpOwo+ICsJbGFzdF9ibG9jayA9IChzdHJ1Y3QgZWRpZCAqKXJhd19l ZGlkOwo+ICsKPiArCWlmIChsYXN0X2Jsb2NrKQo+ICsJCXJldHVybiBsYXN0X2Jsb2NrLT5jaGVj a3N1bTsKPiArCj4gKwlwcl9lcnIoIkludmFsaWQgYmxvY2ssIG5vIGNoZWNrc3VtXG4iKTsKPiAr CXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9wYW5lbF9oYW5kbGVfc2lua19y ZXF1ZXN0KHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpCj4gK3sKPiArCXN0cnVjdCBkcF9wYW5l bF9wcml2YXRlICpwYW5lbDsKPiArCj4gKwlpZiAoIWRwX3BhbmVsKSB7Cj4gKwkJcHJfZXJyKCJp bnZhbGlkIGlucHV0XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4KUGFuZWwgY2FuJ3QgYmUgTlVM TCBoZXJlLgoKPiArCXBhbmVsID0gY29udGFpbmVyX29mKGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFu ZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwo+ICsKPiArCWlmIChwYW5lbC0+bGluay0+c2lua19yZXF1 ZXN0ICYgRFBfVEVTVF9MSU5LX0VESURfUkVBRCkgewo+ICsJCXU4IGNoZWNrc3VtID0gZHBfcGFu ZWxfZ2V0X2VkaWRfY2hlY2tzdW0oZHBfcGFuZWwtPmVkaWQpOwo+ICsKPiArCQlwYW5lbC0+bGlu ay0+c2VuZF9lZGlkX2NoZWNrc3VtKHBhbmVsLT5saW5rLCBjaGVja3N1bSk7Cj4gKwkJcGFuZWwt PmxpbmstPnNlbmRfdGVzdF9yZXNwb25zZShwYW5lbC0+bGluayk7Cj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIGRwX3BhbmVsX3RwZ19jb25maWcoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5l bCwgYm9vbCBlbmFibGUpCj4gK3sKPiArCXUzMiBoc3luY19zdGFydF94LCBoc3luY19lbmRfeDsK PiArCXN0cnVjdCBkcF9jYXRhbG9nX3BhbmVsICpjYXRhbG9nOwo+ICsJc3RydWN0IGRwX3BhbmVs X3ByaXZhdGUgKnBhbmVsOwo+ICsJc3RydWN0IGRwX3BhbmVsX2luZm8gKnBpbmZvOwo+ICsKPiAr CWlmICghZHBfcGFuZWwpIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJl dHVybjsKPiArCX0KClRoaXMgbGlrZWx5IGNhbid0IGJlIE5VTEwuCgo+ICsJcGFuZWwgPSBjb250 YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4g KwljYXRhbG9nID0gcGFuZWwtPmNhdGFsb2c7Cj4gKwlwaW5mbyA9ICZwYW5lbC0+ZHBfcGFuZWwu cGluZm87Cj4gKwo+ICsJaWYgKCFwYW5lbC0+cGFuZWxfb24pIHsKPiArCQlwcl9kZWJ1ZygiRFAg cGFuZWwgbm90IGVuYWJsZWQsIGhhbmRsZSBUUEcgb24gbmV4dCBwYW5lbCBvblxuIik7Cj4gKwkJ cmV0dXJuOwo+ICsJfQo+ICsKPiArCWlmICghZW5hYmxlKSB7Cj4gKwkJcGFuZWwtPmNhdGFsb2ct PnRwZ19jb25maWcoY2F0YWxvZywgZmFsc2UpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwkv KiBUUEcgY29uZmlnICovCj4gKwljYXRhbG9nLT5oc3luY19wZXJpb2QgPSBwaW5mby0+aF9zeW5j X3dpZHRoICsgcGluZm8tPmhfYmFja19wb3JjaCArCj4gKwkJCXBpbmZvLT5oX2FjdGl2ZSArIHBp bmZvLT5oX2Zyb250X3BvcmNoOwo+ICsJY2F0YWxvZy0+dnN5bmNfcGVyaW9kID0gcGluZm8tPnZf c3luY193aWR0aCArIHBpbmZvLT52X2JhY2tfcG9yY2ggKwo+ICsJCQlwaW5mby0+dl9hY3RpdmUg KyBwaW5mby0+dl9mcm9udF9wb3JjaDsKPiArCj4gKwljYXRhbG9nLT5kaXNwbGF5X3Zfc3RhcnQg PSAoKHBpbmZvLT52X3N5bmNfd2lkdGggKwo+ICsJCQlwaW5mby0+dl9iYWNrX3BvcmNoKSAqIGNh dGFsb2ctPmhzeW5jX3BlcmlvZCk7Cj4gKwljYXRhbG9nLT5kaXNwbGF5X3ZfZW5kID0gKChjYXRh bG9nLT52c3luY19wZXJpb2QgLQo+ICsJCQlwaW5mby0+dl9mcm9udF9wb3JjaCkgKiBjYXRhbG9n LT5oc3luY19wZXJpb2QpIC0gMTsKPiArCj4gKwljYXRhbG9nLT5kaXNwbGF5X3Zfc3RhcnQgKz0g cGluZm8tPmhfc3luY193aWR0aCArIHBpbmZvLT5oX2JhY2tfcG9yY2g7Cj4gKwljYXRhbG9nLT5k aXNwbGF5X3ZfZW5kIC09IHBpbmZvLT5oX2Zyb250X3BvcmNoOwo+ICsKPiArCWhzeW5jX3N0YXJ0 X3ggPSBwaW5mby0+aF9iYWNrX3BvcmNoICsgcGluZm8tPmhfc3luY193aWR0aDsKPiArCWhzeW5j X2VuZF94ID0gY2F0YWxvZy0+aHN5bmNfcGVyaW9kIC0gcGluZm8tPmhfZnJvbnRfcG9yY2ggLSAx Owo+ICsKPiArCWNhdGFsb2ctPnZfc3luY193aWR0aCA9IHBpbmZvLT52X3N5bmNfd2lkdGg7Cj4g Kwo+ICsJY2F0YWxvZy0+aHN5bmNfY3RsID0gKGNhdGFsb2ctPmhzeW5jX3BlcmlvZCA8PCAxNikg fAo+ICsJCQlwaW5mby0+aF9zeW5jX3dpZHRoOwo+ICsJY2F0YWxvZy0+ZGlzcGxheV9oY3RsID0g KGhzeW5jX2VuZF94IDw8IDE2KSB8IGhzeW5jX3N0YXJ0X3g7Cj4gKwo+ICsJcHJfZXJyKCIlczog Y2FsbGluZyBjYXRhbG9nIHRwZ19jb25maWdcbiIsIF9fZnVuY19fKTsKPiArCXBhbmVsLT5jYXRh bG9nLT50cGdfY29uZmlnKGNhdGFsb2csIHRydWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRw X3BhbmVsX3RpbWluZ19jZmcoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCkKPiArewo+ICsJaW50 IHJjID0gMDsKPiArCXUzMiBkYXRhLCB0b3RhbF92ZXIsIHRvdGFsX2hvcjsKPiArCXN0cnVjdCBk cF9jYXRhbG9nX3BhbmVsICpjYXRhbG9nOwo+ICsJc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBh bmVsOwo+ICsJc3RydWN0IGRwX3BhbmVsX2luZm8gKnBpbmZvOwo+ICsKPiArCWlmICghZHBfcGFu ZWwpIHsKPiArCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsK PiArCQlnb3RvIGVuZDsKPiArCX0KPgpUaGlzIGxpa2VseSBjYW4ndCBiZSBOVUxMLgoKPiArCXBh bmVsID0gY29udGFpbmVyX29mKGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBf cGFuZWwpOwo+ICsJY2F0YWxvZyA9IHBhbmVsLT5jYXRhbG9nOwo+ICsJcGluZm8gPSAmcGFuZWwt PmRwX3BhbmVsLnBpbmZvOwo+ICsKPiArCXByX2RlYnVnKCJ3aWR0aD0lZCBocG9yY2g9ICVkICVk ICVkXG4iLAo+ICsJCXBpbmZvLT5oX2FjdGl2ZSwgcGluZm8tPmhfYmFja19wb3JjaCwKPiArCQlw aW5mby0+aF9mcm9udF9wb3JjaCwgcGluZm8tPmhfc3luY193aWR0aCk7Cj4gKwo+ICsJcHJfZGVi dWcoImhlaWdodD0lZCB2cG9yY2g9ICVkICVkICVkXG4iLAo+ICsJCXBpbmZvLT52X2FjdGl2ZSwg cGluZm8tPnZfYmFja19wb3JjaCwKPiArCQlwaW5mby0+dl9mcm9udF9wb3JjaCwgcGluZm8tPnZf c3luY193aWR0aCk7Cj4gKwo+ICsJdG90YWxfaG9yID0gcGluZm8tPmhfYWN0aXZlICsgcGluZm8t PmhfYmFja19wb3JjaCArCj4gKwkJcGluZm8tPmhfZnJvbnRfcG9yY2ggKyBwaW5mby0+aF9zeW5j X3dpZHRoOwo+ICsKPiArCXRvdGFsX3ZlciA9IHBpbmZvLT52X2FjdGl2ZSArIHBpbmZvLT52X2Jh Y2tfcG9yY2ggKwo+ICsJCQlwaW5mby0+dl9mcm9udF9wb3JjaCArIHBpbmZvLT52X3N5bmNfd2lk dGg7Cj4gKwo+ICsJZGF0YSA9IHRvdGFsX3ZlcjsKPiArCWRhdGEgPDw9IDE2Owo+ICsJZGF0YSB8 PSB0b3RhbF9ob3I7Cj4gKwo+ICsJY2F0YWxvZy0+dG90YWwgPSBkYXRhOwo+ICsKPiArCWRhdGEg PSAocGluZm8tPnZfYmFja19wb3JjaCArIHBpbmZvLT52X3N5bmNfd2lkdGgpOwo+ICsJZGF0YSA8 PD0gMTY7Cj4gKwlkYXRhIHw9IChwaW5mby0+aF9iYWNrX3BvcmNoICsgcGluZm8tPmhfc3luY193 aWR0aCk7Cj4gKwo+ICsJY2F0YWxvZy0+c3luY19zdGFydCA9IGRhdGE7Cj4gKwo+ICsJZGF0YSA9 IHBpbmZvLT52X3N5bmNfd2lkdGg7Cj4gKwlkYXRhIDw8PSAxNjsKPiArCWRhdGEgfD0gKHBpbmZv LT52X2FjdGl2ZV9sb3cgPDwgMzEpOwo+ICsJZGF0YSB8PSBwaW5mby0+aF9zeW5jX3dpZHRoOwo+ ICsJZGF0YSB8PSAocGluZm8tPmhfYWN0aXZlX2xvdyA8PCAxNSk7Cj4gKwo+ICsJY2F0YWxvZy0+ d2lkdGhfYmxhbmtpbmcgPSBkYXRhOwo+ICsKPiArCWRhdGEgPSBwaW5mby0+dl9hY3RpdmU7Cj4g KwlkYXRhIDw8PSAxNjsKPiArCWRhdGEgfD0gcGluZm8tPmhfYWN0aXZlOwo+ICsKPiArCWNhdGFs b2ctPmRwX2FjdGl2ZSA9IGRhdGE7Cj4gKwo+ICsJcGFuZWwtPmNhdGFsb2ctPnRpbWluZ19jZmco Y2F0YWxvZyk7Cj4gKwlwYW5lbC0+cGFuZWxfb24gPSB0cnVlOwo+ICtlbmQ6Cj4gKwlyZXR1cm4g cmM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcGFuZWxfaW5pdF9wYW5lbF9pbmZvKHN0cnVj dCBkcF9wYW5lbCAqZHBfcGFuZWwpCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBf cGFuZWxfaW5mbyAqcGluZm87Cj4gKwo+ICsJaWYgKCFkcF9wYW5lbCkgewo+ICsJCXByX2Vycigi aW52YWxpZCBpbnB1dFxuIik7Cj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZW5kOwo+ICsJ fQo+CmRwX3BhbmVsIGNhbid0IGJlIE5VTEwuCgo+ICsJcGluZm8gPSAmZHBfcGFuZWwtPnBpbmZv Owo+ICsKPiArCS8qCj4gKwkgKiBwcmludCByZXNvbHV0aW9uIGluZm8gYXMgdGhpcyBpcyBhIHJl c3VsdAo+ICsJICogb2YgdXNlciBpbml0aWF0ZWQgYWN0aW9uIG9mIGNhYmxlIGNvbm5lY3Rpb24K PiArCSAqLwo+ICsJcHJfaW5mbygiU0VUIE5FVyBSRVNPTFVUSU9OOlxuIik7Cj4gKwlwcl9pbmZv KCIlZHglZEAlZGZwc1xuIiwgcGluZm8tPmhfYWN0aXZlLAo+ICsJCXBpbmZvLT52X2FjdGl2ZSwg cGluZm8tPnJlZnJlc2hfcmF0ZSk7Cj4gKwlwcl9pbmZvKCJoX3BvcmNoZXMoYmFja3xmcm9udHx3 aWR0aCkgPSAoJWR8JWR8JWQpXG4iLAo+ICsJCQlwaW5mby0+aF9iYWNrX3BvcmNoLAo+ICsJCQlw aW5mby0+aF9mcm9udF9wb3JjaCwKPiArCQkJcGluZm8tPmhfc3luY193aWR0aCk7Cj4gKwlwcl9p bmZvKCJ2X3BvcmNoZXMoYmFja3xmcm9udHx3aWR0aCkgPSAoJWR8JWR8JWQpXG4iLAo+ICsJCQlw aW5mby0+dl9iYWNrX3BvcmNoLAo+ICsJCQlwaW5mby0+dl9mcm9udF9wb3JjaCwKPiArCQkJcGlu Zm8tPnZfc3luY193aWR0aCk7Cj4gKwlwcl9pbmZvKCJwaXhlbCBjbG9jayAoS0h6KT0oJWQpXG4i LCBwaW5mby0+cGl4ZWxfY2xrX2toeik7Cj4gKwlwcl9pbmZvKCJicHAgPSAlZFxuIiwgcGluZm8t PmJwcCk7Cj4gKwlwcl9pbmZvKCJhY3RpdmUgbG93IChofHYpPSglZHwlZClcbiIsIHBpbmZvLT5o X2FjdGl2ZV9sb3csCj4gKwkJcGluZm8tPnZfYWN0aXZlX2xvdyk7Cj4gKwo+ICsJcGluZm8tPmJw cCA9IG1heF90KHUzMiwgMTgsIG1pbl90KHUzMiwgcGluZm8tPmJwcCwgMzApKTsKPiArCXByX2lu Zm8oInVwZGF0ZWQgYnBwID0gJWRcbiIsIHBpbmZvLT5icHApOwo+ICtlbmQ6Cj4gKwlyZXR1cm4g cmM7CgpJdCBkb2Vzbid0IHNlZW0gbGlrZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW55 dGhpbmcuCgo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIGRwX3BhbmVsX2dldF9taW5fcmVxX2xpbmtf cmF0ZShzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQo+ICt7Cj4gKwljb25zdCB1MzIgZW5jb2Rp bmdfZmFjdHgxMCA9IDg7Cj4gKwl1MzIgbWluX2xpbmtfcmF0ZV9raHogPSAwLCBsYW5lX2NudDsK PiArCXN0cnVjdCBkcF9wYW5lbF9pbmZvICpwaW5mbzsKPiArCj4gKwlpZiAoIWRwX3BhbmVsKSB7 Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlnb3RvIGVuZDsKPiArCX0KCmRw X3BhbmVsX2Nhbid0IGJlIE5VTEwuCgo+ICsJbGFuZV9jbnQgPSBkcF9wYW5lbC0+bGlua19pbmZv Lm51bV9sYW5lczsKPiArCXBpbmZvID0gJmRwX3BhbmVsLT5waW5mbzsKPiArCj4gKwkvKiBudW1f bGFuZXMgKiBsYW5lX2NvdW50ICogOCA+PSBwY2xrICogYnBwICogMTAgKi8KPiArCW1pbl9saW5r X3JhdGVfa2h6ID0gcGluZm8tPnBpeGVsX2Nsa19raHogLwo+ICsJCQkJKGxhbmVfY250ICogZW5j b2RpbmdfZmFjdHgxMCk7Cj4gKwltaW5fbGlua19yYXRlX2toeiAqPSBwaW5mby0+YnBwOwo+ICsK PiArCXByX2RlYnVnKCJtaW4gbGNsayByZXE9JWQga2h6IGZvciBwY2xrPSVkIGtoeiwgbGFuZXM9 JWQsIGJwcD0lZFxuIiwKPiArCQltaW5fbGlua19yYXRlX2toeiwgcGluZm8tPnBpeGVsX2Nsa19r aHosIGxhbmVfY250LAo+ICsJCXBpbmZvLT5icHApOwo+ICtlbmQ6Cj4gKwlyZXR1cm4gbWluX2xp bmtfcmF0ZV9raHo7Cj4gK30KPiArCj4gK3N0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWxfZ2V0KHN0 cnVjdCBkcF9wYW5lbF9pbiAqaW4pCj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZHBf cGFuZWxfcHJpdmF0ZSAqcGFuZWw7Cj4gKwlzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsOwo+ICsK PiArCWlmICghaW4tPmRldiB8fCAhaW4tPmNhdGFsb2cgfHwgIWluLT5hdXggfHwgIWluLT5saW5r KSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4g KwkJZ290byBlcnJvcjsKPiArCX0KCkl0IGxvb2tzIGxpa2Ugbm9uZSBvZiB0aGVzZSBhcmUgbGlr ZWx5IHRvIGJlIE5VTEw7Cj4KPiArCXBhbmVsID0gZGV2bV9remFsbG9jKGluLT5kZXYsIHNpemVv ZigqcGFuZWwpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcGFuZWwpIHsKCnJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwoKPiArCQlyYyA9IC1FTk9NRU07Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KPiAr Cj4gKwlwYW5lbC0+ZGV2ID0gaW4tPmRldjsKPiArCXBhbmVsLT5hdXggPSBpbi0+YXV4Owo+ICsJ cGFuZWwtPmNhdGFsb2cgPSBpbi0+Y2F0YWxvZzsKPiArCXBhbmVsLT5saW5rID0gaW4tPmxpbms7 Cj4gKwo+ICsJZHBfcGFuZWwgPSAmcGFuZWwtPmRwX3BhbmVsOwo+ICsJZHBfcGFuZWwtPm1heF9i d19jb2RlID0gRFBfTElOS19CV184XzE7Cj4gKwlwYW5lbC0+YXV4X2NmZ191cGRhdGVfZG9uZSA9 IGZhbHNlOwo+ICsKPiArCWRwX3BhbmVsLT5pbml0X2luZm8gPSBkcF9wYW5lbF9pbml0X3BhbmVs X2luZm87Cj4gKwlkcF9wYW5lbC0+dGltaW5nX2NmZyA9IGRwX3BhbmVsX3RpbWluZ19jZmc7Cj4g KwlkcF9wYW5lbC0+cmVhZF9zaW5rX2NhcHMgPSBkcF9wYW5lbF9yZWFkX3NpbmtfY2FwczsKPiAr CWRwX3BhbmVsLT5nZXRfbWluX3JlcV9saW5rX3JhdGUgPSBkcF9wYW5lbF9nZXRfbWluX3JlcV9s aW5rX3JhdGU7Cj4gKwlkcF9wYW5lbC0+Z2V0X21vZGVfYnBwID0gZHBfcGFuZWxfZ2V0X21vZGVf YnBwOwo+ICsJZHBfcGFuZWwtPmdldF9tb2RlcyA9IGRwX3BhbmVsX2dldF9tb2RlczsKPiArCWRw X3BhbmVsLT5oYW5kbGVfc2lua19yZXF1ZXN0ID0gZHBfcGFuZWxfaGFuZGxlX3NpbmtfcmVxdWVz dDsKPiArCWRwX3BhbmVsLT50cGdfY29uZmlnID0gZHBfcGFuZWxfdHBnX2NvbmZpZzsKPiArCj4g KwlyZXR1cm4gZHBfcGFuZWw7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIEVSUl9QVFIocmMpOwo+ICt9 Cj4gKwo+ICt2b2lkIGRwX3BhbmVsX3B1dChzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQo+ICt7 Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSAqcGFuZWw7Cj4gKwo+ICsJaWYgKCFkcF9wYW5l bCkKPiArCQlyZXR1cm47Cj4gKwo+ICsJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWwsIHN0 cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7Cj4gKwo+ICsJa2ZyZWUoZHBfcGFuZWwt PmVkaWQpOwo+ICsJZHBfcGFuZWwtPmVkaWQgPSBOVUxMOwo+ICsJZGV2bV9rZnJlZShwYW5lbC0+ ZGV2LCBwYW5lbCk7CgpZb3UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzIGZvciBkZXZtIG1hbmFnZWQg bWVtb3J5LgoKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bh bmVsLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhbmVsLmgKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmJmODAyZGYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5oCj4gQEAgLTAsMCArMSwxMjEgQEAKPiAr LyoKPiArICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTgsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBB bGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBh bmQKPiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4g KyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqCj4g KyAqLwoKU1BEWCBwbGVhc2UuCgo+ICsjaWZuZGVmIF9EUF9QQU5FTF9IXwo+ICsjZGVmaW5lIF9E UF9QQU5FTF9IXwo+ICsKPiArI2luY2x1ZGUgPGRybS9tc21fZHJtLmg+Cj4gKwo+ICsjaW5jbHVk ZSAiZHBfYXV4LmgiCj4gKyNpbmNsdWRlICJkcF9saW5rLmgiCj4gKyNpbmNsdWRlICJkcF9leHRj b24uaCIKPiArCj4gK3N0cnVjdCBlZGlkOwo+ICsKPiArZW51bSBkcF9sYW5lX2NvdW50IHsKPiAr CURQX0xBTkVfQ09VTlRfMQk9IDEsCj4gKwlEUF9MQU5FX0NPVU5UXzIJPSAyLAo+ICsJRFBfTEFO RV9DT1VOVF80CT0gNCwKPiArfTsKPiArCj4gKyNkZWZpbmUgRFBfTUFYX0RPV05TVFJFQU1fUE9S VFMgMHgxMAo+ICsKPiArc3RydWN0IGRwX3BhbmVsX2luZm8gewo+ICsJdTMyIGhfYWN0aXZlOwo+ ICsJdTMyIHZfYWN0aXZlOwo+ICsJdTMyIGhfYmFja19wb3JjaDsKPiArCXUzMiBoX2Zyb250X3Bv cmNoOwo+ICsJdTMyIGhfc3luY193aWR0aDsKPiArCXUzMiBoX2FjdGl2ZV9sb3c7Cj4gKwl1MzIg dl9iYWNrX3BvcmNoOwo+ICsJdTMyIHZfZnJvbnRfcG9yY2g7Cj4gKwl1MzIgdl9zeW5jX3dpZHRo Owo+ICsJdTMyIHZfYWN0aXZlX2xvdzsKPiArCXUzMiBoX3NrZXc7Cj4gKwl1MzIgcmVmcmVzaF9y YXRlOwo+ICsJdTMyIHBpeGVsX2Nsa19raHo7Cj4gKwl1MzIgYnBwOwo+ICt9Owo+ICsKPiArc3Ry dWN0IGRwX2Rpc3BsYXlfbW9kZSB7Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfaW5mbyB0aW1pbmc7Cj4g Kwl1MzIgY2FwYWJpbGl0aWVzOwo+ICt9Owo+ICsKPiArc3RydWN0IGRwX3BhbmVsX2luIHsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCXN0cnVjdCBkcF9hdXggKmF1eDsKPiArCXN0cnVjdCBk cF9saW5rICpsaW5rOwo+ICsJc3RydWN0IGRwX2NhdGFsb2dfcGFuZWwgKmNhdGFsb2c7Cj4gK307 Cj4gKwo+ICtzdHJ1Y3QgZHBfcGFuZWwgewo+ICsJLyogZHBjZCByYXcgZGF0YSAqLwo+ICsJdTgg ZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRSArIDFdOwo+ICsJdTggZHNfcG9ydHNbRFBfTUFYX0RP V05TVFJFQU1fUE9SVFNdOwo+ICsKPiArCXN0cnVjdCBkcm1fZHBfbGluayBsaW5rX2luZm87Cj4g KwlzdHJ1Y3QgZWRpZCAqZWRpZDsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7 Cj4gKwlzdHJ1Y3QgZHBfcGFuZWxfaW5mbyBwaW5mbzsKPiArCWJvb2wgdmlkZW9fdGVzdDsKPiAr Cj4gKwl1MzIgdmljOwo+ICsJdTMyIG1heF9wY2xrX2toejsKPiArCj4gKwl1MzIgbWF4X2J3X2Nv ZGU7Cj4gKwlpbnQgKCppbml0X2luZm8pKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpOwo+ICsJ aW50ICgqZGVpbml0KShzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKTsKPiArCWludCAoKnRpbWlu Z19jZmcpKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpOwo+ICsJaW50ICgqcmVhZF9zaW5rX2Nh cHMpKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwkJc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3Rvcik7Cj4gKwl1MzIgKCpnZXRfbWluX3JlcV9saW5rX3JhdGUpKHN0cnVjdCBkcF9w YW5lbCAqZHBfcGFuZWwpOwo+ICsJdTMyICgqZ2V0X21vZGVfYnBwKShzdHJ1Y3QgZHBfcGFuZWwg KmRwX3BhbmVsLCB1MzIgbW9kZV9tYXhfYnBwLAo+ICsJCQl1MzIgbW9kZV9wY2xrX2toeik7Cj4g KwlpbnQgKCpnZXRfbW9kZXMpKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwsCj4gKwkJc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSAqbW9kZSk7 Cj4gKwl2b2lkICgqaGFuZGxlX3NpbmtfcmVxdWVzdCkoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5l bCk7Cj4gKwl2b2lkICgqdHBnX2NvbmZpZykoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCwgYm9v bCBlbmFibGUpOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGlzX2xpbmtfcmF0ZV92YWxpZCgpIC0g dmFsaWRhdGVzIHRoZSBsaW5rIHJhdGUKPiArICogQGxhbmVfcmF0ZTogbGluayByYXRlIHJlcXVl c3RlZCBieSB0aGUgc2luawo+ICsgKgo+ICsgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3Rl ZCBsaW5rIHJhdGUgaXMgc3VwcG9ydGVkLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSBib29sIGlz X2xpbmtfcmF0ZV92YWxpZCh1MzIgYndfY29kZSkKPiArewo+ICsJcmV0dXJuICgoYndfY29kZSA9 PSBEUF9MSU5LX0JXXzFfNjIpIHx8Cj4gKwkJKGJ3X2NvZGUgPT0gRFBfTElOS19CV18yXzcpIHx8 Cj4gKwkJKGJ3X2NvZGUgPT0gRFBfTElOS19CV181XzQpIHx8Cj4gKwkJKGJ3X2NvZGUgPT0gRFBf TElOS19CV184XzEpKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRwX2xpbmtfaXNfbGFuZV9jb3Vu dF92YWxpZCgpIC0gdmFsaWRhdGVzIHRoZSBsYW5lIGNvdW50Cj4gKyAqIEBsYW5lX2NvdW50OiBs YW5lIGNvdW50IHJlcXVlc3RlZCBieSB0aGUgc2luawo+ICsgKgo+ICsgKiBSZXR1cm5zIHRydWUg aWYgdGhlIHJlcXVlc3RlZCBsYW5lIGNvdW50IGlzIHN1cHBvcnRlZC4KPiArICovCj4gK3N0YXRp YyBpbmxpbmUgYm9vbCBpc19sYW5lX2NvdW50X3ZhbGlkKHUzMiBsYW5lX2NvdW50KQo+ICt7Cj4g KwlyZXR1cm4gKGxhbmVfY291bnQgPT0gRFBfTEFORV9DT1VOVF8xKSB8fAo+ICsJCShsYW5lX2Nv dW50ID09IERQX0xBTkVfQ09VTlRfMikgfHwKPiArCQkobGFuZV9jb3VudCA9PSBEUF9MQU5FX0NP VU5UXzQpOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsX2dldChzdHJ1Y3Qg ZHBfcGFuZWxfaW4gKmluKTsKPiArdm9pZCBkcF9wYW5lbF9wdXQoc3RydWN0IGRwX3BhbmVsICpk cF9wYW5lbCk7Cj4gKyNlbmRpZiAvKiBfRFBfUEFORUxfSF8gKi8KCkFuZCBJJ2xsIGVuZCBoZXJl IGZvciBmb3Igbm93LgoKSm9yZGFuCgotLSAKVGhlIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVy LCBJbmMuIGlzIGEgbWVtYmVyIG9mIENvZGUgQXVyb3JhIEZvcnVtLAphIExpbnV4IEZvdW5kYXRp b24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkZyZWVkcmVubyBtYWlsaW5nIGxpc3QKRnJlZWRyZW5vQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2ZyZWVkcmVubwo=