From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hyun Kwon Subject: [PATCH v8 3/5] drm: xlnx: DRM KMS driver for Xilinx ZynqMP DP subsystem display Date: Sat, 7 Jul 2018 19:05:36 -0700 Message-ID: <1531015538-32268-4-git-send-email-hyun.kwon@xilinx.com> References: <1531015538-32268-1-git-send-email-hyun.kwon@xilinx.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1531015538-32268-1-git-send-email-hyun.kwon@xilinx.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, Laurent Pinchart Cc: Daniel Vetter , Rob Herring , Michal Simek , Hyun Kwon List-Id: devicetree@vger.kernel.org WGlsaW54IFp5bnFNUCBoYXMgYSBoYXJkZW5lZCBkaXNwbGF5IHBpcGVsaW5lLiBUaGUgcGlwZWxp bmUgY2FuCmJlIGxvZ2ljYWxseSBwYXJ0aXRpb25lZCBpbnRvIDIgcGFydHM6IGRpc3BsYXkgY29u dHJvbGxlciBhbmQKRGlzcGxheVBvcnQgZW5jb2RlciAvIHRyYW5zbWl0dGVyLiBUaGlzIGRyaXZl ciBoYW5kbGVzIHRoZSBkaXNwbGF5CmNvbnRyb2xsZXIgcGFydCBvZiB0aGUgcGlwZWxpbmUgdGhh dCBoYW5kbGVzIGJ1ZmZlciBtYW5hZ2VtZW50IGFuZApibGVuZGluZy4KClNpZ25lZC1vZmYtYnk6 IEh5dW4gS3dvbiA8aHl1bi5rd29uQHhpbGlueC5jb20+CkFja2VkLWJ5OiBEYW5pZWwgVmV0dGVy IDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPgotLS0KdjgKLSBBZGRlZCBhIG1vZHVsZSBwYXJhbSB0 byBzcGVjaWZ5IHRoZSBpbml0aWFsIGZvcm1hdCBmb3IgZmJkZXYKLSBEb24ndCB1cGRhdGUgdGhl IHBsYW5lIGZvciB0aGUgc2FtZSBmYgp2NwotIERpc2FibGUgYSBwbGFuZSB3aGVuIHRoZSBmYiBm b3JtYXQgY2hhbmdlcwotIFVwZGF0ZSBwbGFuZXMgYXN5bmNocm9ub3VzbHkgaW4gdGhlIGxlZ2Fj eSBzZXQgcGxhbmUgZW50cnkKdjYKLSBVc2UgdGhlIG5ldyBjcnRjIG9wIHN0cnVjdAotIENsZWFu IHVwIHRoZSBkdXBsaWNhdGVkIGxpY2Vuc2UgcGFyYWdyYXBocwotIERlY2xhcmUgZnVuY3Rpb24g cG9pbnRlciBzdHJ1Y3R1cmVzIGFzIHN0YXRpYyBjb25zdAotIERvIGNvbXBsZXRlIGZvcndhcmQg ZGVjbGFyYXRpb24gaW4gaGVhZGVycwp2NAotIFVzZSBkcm1fY3J0Y19mdW5jcyBmb3IgdmJsYW5r Ci0gUmVtb3ZlIGNoaWxkIG5vZGVzIGZvciBsYXllcgp2MwotIEZpeCBhIHNtYWxsIHR5cG8KdjIK LSBVc2UgZHJtX2ZiX2NtYV9nZXRfZ2VtX2FkZHIoKQotIFVzZSBkcm1fY3J0Y19hcm1fdmJsYW5r X2V2ZW50KCkKLSBTcGxpdCBkcm0gcHJvcGVydGllcyBpbnRvIGEgc2VwYXJhdGUgcGF0Y2gKLSBS ZW1vdmUgZHVtbXkgZnVuY3MKLSBEb24ndCBhZGQgb2Zmc2V0IGFzIGl0J3MgYWxyZWFkeSBkb25l IGJ5IGEgbmV3IGhlbHBlcgotIENoYW5nZSB0aGUgU1BEWCBpZGVudGlmaWVyIGZvcm1hdAotIE1p bm9yIGNoYW5nZSBvZiBhIGNvbW1pdCBtZXNzYWdlCi0tLQotLS0KIGRyaXZlcnMvZ3B1L2RybS94 bG54L3p5bnFtcF9kaXNwLmMgfCAyNzc3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaCB8ICAgMjkgKwogMiBmaWxl cyBjaGFuZ2VkLCAyODA2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0veGxueC96eW5xbXBfZGlzcC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS94 bG54L3p5bnFtcF9kaXNwLmMgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZGlzcC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNWM0YTIKLS0tIC9kZXYvbnVsbAor KysgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZGlzcC5jCkBAIC0wLDAgKzEsMjc3NyBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBaeW5xTVAgRGlz cGxheSBDb250cm9sbGVyIERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTcgLSAyMDE4 IFhpbGlueCwgSW5jLgorICoKKyAqICBBdXRob3I6IEh5dW4gV29vIEt3b24gPGh5dW4ua3dvbkB4 aWxpbnguY29tPgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9k cm1fYXRvbWljLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVyLmg+CisjaW5jbHVk ZSA8ZHJtL2RybV9jcnRjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgorI2lu Y2x1ZGUgPGRybS9kcm1fZmJfY21hX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZm91cmNj Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wbGFuZV9oZWxwZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4 L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVu Z2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ly cXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1 bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+Cisj aW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNl Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5s b2NrLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAieGxueF9jcnRj LmgiCisjaW5jbHVkZSAieGxueF9mYi5oIgorI2luY2x1ZGUgInp5bnFtcF9kaXNwLmgiCisjaW5j bHVkZSAienlucW1wX2RwLmgiCisjaW5jbHVkZSAienlucW1wX2Rwc3ViLmgiCisKKy8qCisgKiBP dmVydmlldworICogLS0tLS0tLS0KKyAqCisgKiBUaGUgZGlzcGxheSBwYXJ0IG9mIFp5bnFNUCBE UCBzdWJzeXN0ZW0uIEludGVybmFsbHksIHRoZSBkZXZpY2UKKyAqIGlzIHBhcnRpdGlvbmVkIGlu dG8gMyBibG9ja3M6IEFWIGJ1ZmZlciBtYW5hZ2VyLCBCbGVuZGVyLCBBdWRpby4KKyAqIFRoZSBk cml2ZXIgY3JlYXRlcyB0aGUgRFJNIGNydGMgYW5kIHBsYW5lIG9iamVjdGVzIGFuZCBtYXBzIHRo ZSBEUk0KKyAqIGludGVyZmFjZSBpbnRvIHRob3NlIDMgYmxvY2tzLiBJbiBoaWdoIGxldmVsLCB0 aGUgZHJpdmVyIGlzIGxheWVyZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICoKKyAqIHp5 bnFtcF9kaXNwX2NydGMgJiB6eW5xbXBfZGlzcF9wbGFuZQorICogfC0+enlucW1wX2Rpc3AKKyAq CXwtPnp5bnFtcF9kaXNwX2F1ZAorICoJfC0+enlucW1wX2Rpc3BfYmxlbmQKKyAqCXwtPnp5bnFt cF9kaXNwX2F2X2J1ZgorICoKKyAqIFRoZSBkcml2ZXIgQVBJcyBhcmUgdXNlZCBleHRlcm5hbGx5 IGJ5CisgKiAtIHp5bnFtcF9kcHN1YjogVG9wIGxldmVsIFp5bnFNUCBEUCBzdWJzeXN0ZW0gZHJp dmVyCisgKiAtIHp5bnFtcF9kcDogWnlucU1QIERQIGRyaXZlcgorICogLSB4bG54X2NydGM6IFhp bGlueCBEUk0gc3BlY2lmaWMgY3J0YyBmdW5jdGlvbnMKKyAqLworCisvKiBUaGUgZGVmYXVsdCB2 YWx1ZSBpcyBaWU5RTVBfRElTUF9BVl9CVUZfR0ZYX0ZNVF9SR0I1NjUgKi8KK3N0YXRpYyB1aW50 IHp5bnFtcF9kaXNwX2dmeF9pbml0X2ZtdDsKK21vZHVsZV9wYXJhbV9uYW1lZChnZnhfaW5pdF9m bXQsIHp5bnFtcF9kaXNwX2dmeF9pbml0X2ZtdCwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9E RVNDKGdmeF9pbml0X2ZtdCwgIlRoZSBpbml0aWFsIGZvcm1hdCBvZiB0aGUgZ3JhcGhpY3MgbGF5 ZXJcbiIKKwkJCSAgICAgICAiXHRcdDAgPSByZ2I1NjUgKGRlZmF1bHQpXG4iCisJCQkgICAgICAg Ilx0XHQxID0gcmdiODg4XG4iCisJCQkgICAgICAgIlx0XHQyID0gYXJnYjg4ODhcbiIpOworLyog VGhlc2UgdmFsdWUgc2hvdWxkIGJlIG1hcHBlZCB0byBpbmRleCBvZiBhdl9idWZfZ2Z4X2ZtdHNb XSAqLworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfR0ZYX0ZNVF9SR0I1NjUJCTEwCisjZGVm aW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9HRlhfRk1UX1JHQjg4OAkJNQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfR0ZYX0ZNVF9BUkdCODg4OAkJMQorc3RhdGljIGNvbnN0IHUzMiB6eW5xbXBf ZGlzcF9nZnhfaW5pdF9mbXRzW10gPSB7CisJWllOUU1QX0RJU1BfQVZfQlVGX0dGWF9GTVRfUkdC NTY1LAorCVpZTlFNUF9ESVNQX0FWX0JVRl9HRlhfRk1UX1JHQjg4OCwKKwlaWU5RTVBfRElTUF9B Vl9CVUZfR0ZYX0ZNVF9BUkdCODg4OCwKK307CisKKy8qIEJsZW5kZXIgcmVnaXN0ZXJzICovCisj ZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQkdfQ0xSXzAJCQkweDAKKyNkZWZpbmUgWllOUU1Q X0RJU1BfVl9CTEVORF9CR19DTFJfMQkJCTB4NAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5E X0JHX0NMUl8yCQkJMHg4CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQkdfTUFYCQkJMHhm ZmYKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9TRVRfR0xPQkFMX0FMUEhBCQkweGMKKyNk ZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9TRVRfR0xPQkFMX0FMUEhBX01BU0sJMHgxZmUKKyNk ZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9TRVRfR0xPQkFMX0FMUEhBX01BWAkweGZmCisjZGVm aW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVQJCTB4MTQKKyNkZWZpbmUgWllO UU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9SR0IJCTB4MAorI2RlZmluZSBaWU5RTVBf RElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1lDQkNSNDQ0CTB4MQorI2RlZmluZSBaWU5RTVBf RElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1lDQkNSNDIyCTB4MgorI2RlZmluZSBaWU5RTVBf RElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1lPTkxZCTB4MworI2RlZmluZSBaWU5RTVBfRElT UF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1hWWUNDCTB4NAorI2RlZmluZSBaWU5RTVBfRElTUF9W X0JMRU5EX09VVFBVVF9FTl9ET1dOU0FNUExFCUJJVCg0KQorI2RlZmluZSBaWU5RTVBfRElTUF9W X0JMRU5EX0xBWUVSX0NPTlRST0wJCTB4MTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9M QVlFUl9DT05UUk9MX0VOX1VTCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9M QVlFUl9DT05UUk9MX1JHQgkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTEFZ RVJfQ09OVFJPTF9CWVBBU1MJQklUKDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTlVN X0NPRUZGCQkJOQorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX1JHQjJZQ0JDUl9DT0VGRjAJ CTB4MjAKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9SR0IyWUNCQ1JfQ09FRkYxCQkweDI0 CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfUkdCMllDQkNSX0NPRUZGMgkJMHgyOAorI2Rl ZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX1JHQjJZQ0JDUl9DT0VGRjMJCTB4MmMKKyNkZWZpbmUg WllOUU1QX0RJU1BfVl9CTEVORF9SR0IyWUNCQ1JfQ09FRkY0CQkweDMwCisjZGVmaW5lIFpZTlFN UF9ESVNQX1ZfQkxFTkRfUkdCMllDQkNSX0NPRUZGNQkJMHgzNAorI2RlZmluZSBaWU5RTVBfRElT UF9WX0JMRU5EX1JHQjJZQ0JDUl9DT0VGRjYJCTB4MzgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9C TEVORF9SR0IyWUNCQ1JfQ09FRkY3CQkweDNjCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRf UkdCMllDQkNSX0NPRUZGOAkJMHg0MAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMUNT Q19DT0VGRjAJCTB4NDQKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjFDU0NfQ09FRkYx CQkweDQ4CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGMgkJMHg0Ywor I2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMUNTQ19DT0VGRjMJCTB4NTAKKyNkZWZpbmUg WllOUU1QX0RJU1BfVl9CTEVORF9JTjFDU0NfQ09FRkY0CQkweDU0CisjZGVmaW5lIFpZTlFNUF9E SVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGNQkJMHg1OAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JM RU5EX0lOMUNTQ19DT0VGRjYJCTB4NWMKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjFD U0NfQ09FRkY3CQkweDYwCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZG OAkJMHg2NAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX05VTV9PRkZTRVQJCQkzCisjZGVm aW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVNQV9JTjFDU0NfT0ZGU0VUCQkweDY4CisjZGVmaW5l IFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ1JfSU4xQ1NDX09GRlNFVAkJMHg2YworI2RlZmluZSBaWU5R TVBfRElTUF9WX0JMRU5EX0NCX0lOMUNTQ19PRkZTRVQJCTB4NzAKKyNkZWZpbmUgWllOUU1QX0RJ U1BfVl9CTEVORF9MVU1BX09VVENTQ19PRkZTRVQJCTB4NzQKKyNkZWZpbmUgWllOUU1QX0RJU1Bf Vl9CTEVORF9DUl9PVVRDU0NfT0ZGU0VUCQkweDc4CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxF TkRfQ0JfT1VUQ1NDX09GRlNFVAkJMHg3YworI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lO MkNTQ19DT0VGRjAJCTB4ODAKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjJDU0NfQ09F RkYxCQkweDg0CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGMgkJMHg4 OAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMkNTQ19DT0VGRjMJCTB4OGMKKyNkZWZp bmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjJDU0NfQ09FRkY0CQkweDkwCisjZGVmaW5lIFpZTlFN UF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGNQkJMHg5NAorI2RlZmluZSBaWU5RTVBfRElTUF9W X0JMRU5EX0lOMkNTQ19DT0VGRjYJCTB4OTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9J TjJDU0NfQ09FRkY3CQkweDljCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NP RUZGOAkJMHhhMAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0xVTUFfSU4yQ1NDX09GRlNF VAkJMHhhNAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0NSX0lOMkNTQ19PRkZTRVQJCTB4 YTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9DQl9JTjJDU0NfT0ZGU0VUCQkweGFjCisj ZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ0hST01BX0tFWV9FTkFCTEUJCTB4MWQwCisjZGVm aW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ0hST01BX0tFWV9DT01QMQkJMHgxZDQKKyNkZWZpbmUg WllOUU1QX0RJU1BfVl9CTEVORF9DSFJPTUFfS0VZX0NPTVAyCQkweDFkOAorI2RlZmluZSBaWU5R TVBfRElTUF9WX0JMRU5EX0NIUk9NQV9LRVlfQ09NUDMJCTB4MWRjCisKKy8qIEFWIGJ1ZmZlciBt YW5hZ2VyIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UCQkJCTB4 MAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9TSElGVAkJMAorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9NQVNLCQkoMHgxZiA8PCAwKQorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9VWVZZCQkoMCA8PCAwKQorI2RlZmluZSBa WU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9WWVVZCQkoMSA8PCAwKQorI2RlZmluZSBaWU5R TVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVllVCQkoMiA8PCAwKQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVVlWCQkoMyA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2CQkoNCA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfRk1UX05MX1ZJRF9ZVjI0CQkoNSA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9C VUZfRk1UX05MX1ZJRF9ZVjE2Q0kJCSg2IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9GTVRfTkxfVklEX01PTk8JCSg3IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfVklEX1lWMTZDSTIJCSg4IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfVklEX1lVVjQ0NAkJKDkgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9WSURfUkdCODg4CQkoMTAgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9WSURfUkdCQTg4ODAJCSgxMSA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf Rk1UX05MX1ZJRF9SR0I4ODhfMTAJCSgxMiA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9C VUZfRk1UX05MX1ZJRF9ZVVY0NDRfMTAJCSgxMyA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0kyXzEwCSgxNCA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0lfMTAJCSgxNSA8PCAwKQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2XzEwCQkoMTYgPDwgMCkKKyNkZWZpbmUgWllOUU1Q X0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYyNF8xMAkJKDE3IDw8IDApCisjZGVmaW5lIFpZTlFN UF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lPTkxZXzEwCQkoMTggPDwgMCkKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNl80MjAJCSgxOSA8PCAwKQorI2RlZmluZSBa WU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0lfNDIwCSgyMCA8PCAwKQorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0kyXzQyMAkoMjEgPDwgMCkKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNl80MjBfMTAJKDIyIDw8IDAp CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMTZDSV80MjBfMTAJKDIz IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMTZDSTJfNDIw XzEwCSgyNCA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9TSElG VAkJOAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9NQVNLCQkoMHhmIDw8 IDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQkE4ODg4CQkoMCA8 PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9BQkdSODg4OAkJKDEg PDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCODg4CQkoMiA8 PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9CR1I4ODgJCSgzIDw8 IDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQkE1NTUxCQkoNCA8 PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBNDQ0NAkJKDUg PDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCNTY1CQkoNiA8 PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF84QlBQCQkoNyA8PCA4 KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF80QlBQCQkoOCA8PCA4KQor I2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF8yQlBQCQkoOSA8PCA4KQorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF8xQlBQCQkoMTAgPDwgOCkKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGX05PTl9MSVZFX0xBVEVOQ1kJCTB4OAorI2RlZmluZSBaWU5R TVBfRElTUF9BVl9CVUZfQ0hCVUYJCQkweDEwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9D SEJVRl9FTgkJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfRkxVU0gJ CQlCSVQoMSkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGX0JVUlNUX0xFTl9TSElG VAkyCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9CVVJTVF9MRU5fTUFTSwkJKDB4 ZiA8PCAyKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfQlVSU1RfTEVOX01BWAkJ MHhmCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9CVVJTVF9MRU5fQVVEX01BWAkw eDMKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQVRVUwkJCTB4MjgKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVZfQlVGX1NUQ19DVFJMCQkJMHgyYworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9C VUZfU1RDX0NUUkxfRU4JCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19D VFJMX0VWRU5UX1NISUZUCQkxCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfQ1RSTF9F VkVOVF9FWF9WU1lOQwkwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfQ1RSTF9FVkVO VF9FWF9WSUQJMQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX0NUUkxfRVZFTlRfRVhf QVVECTIKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19DVFJMX0VWRU5UX0lOVF9WU1lO QwkzCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfSU5JVF9WQUxVRTAJCTB4MzAKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19JTklUX1ZBTFVFMQkJMHgzNAorI2RlZmluZSBa WU5RTVBfRElTUF9BVl9CVUZfU1RDX0FESgkJCTB4MzgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX1NUQ19WSURfVlNZTkNfVFMwCQkweDNjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9T VENfVklEX1ZTWU5DX1RTMQkJMHg0MAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX0VY VF9WU1lOQ19UUzAJCTB4NDQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19FWFRfVlNZ TkNfVFMxCQkweDQ4CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfQ1VTVE9NX0VWRU5U X1RTMAkJMHg0YworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX0NVU1RPTV9FVkVOVF9U UzEJCTB4NTAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19DVVNUT01fRVZFTlQyX1RT MAkweDU0CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfQ1VTVE9NX0VWRU5UMl9UUzEJ MHg1OAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX1NOQVBTSE9UMAkJMHg2MAorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX1NOQVBTSE9UMQkJMHg2NAorI2RlZmluZSBaWU5R TVBfRElTUF9BVl9CVUZfT1VUUFVUCQkJMHg3MAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf T1VUUFVUX1ZJRDFfU0hJRlQJCTAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9W SUQxX01BU0sJCSgweDMgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9W SUQxX0xJVkUJCSgwIDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklE MV9NRU0JCSgxIDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMV9Q QVRURVJOCQkoMiA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDFf Tk9ORQkJKDMgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQyX1NI SUZUCQkyCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMl9NQVNLCQkoMHgz IDw8IDIpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMl9ESVNBQkxFCQko MCA8PCAyKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDJfTUVNCQkoMSA8 PCAyKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDJfTElWRQkJKDIgPDwg MikKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQyX05PTkUJCSgzIDw8IDIp CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVEMV9TSElGVAkJNAorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfTUFTSwkJKDB4MyA8PCA0KQorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfUEwJCSgwIDw8IDQpCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVEMV9NRU0JCSgxIDw8IDQpCisjZGVmaW5lIFpZTlFN UF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVEMV9QQVRURVJOCQkoMiA8PCA0KQorI2RlZmluZSBaWU5R TVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfRElTQUJMRQkJKDMgPDwgNCkKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVZfQlVGX09VVFBVVF9BVUQyX0VOCQlCSVQoNikKKyNkZWZpbmUgWllOUU1QX0RJ U1BfQVZfQlVGX0hDT1VOVF9WQ09VTlRfSU5UMAkJMHg3NAorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfSENPVU5UX1ZDT1VOVF9JTlQxCQkweDc4CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9QQVRURVJOX0dFTl9TRUxFQ1QJCTB4MTAwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9D TEtfU1JDCQkJMHgxMjAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfVklEX0ZS T01fUFMJCUJJVCgwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQ19BVURfRlJP TV9QUwkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDX1ZJRF9JTlRF Uk5BTF9USU1JTkcJQklUKDIpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TUlNUX1JFRwkJ CTB4MTI0CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TUlNUX1JFR19WSURfUlNUCQlCSVQo MSkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0FVRElPX0NIX0NPTkZJRwkJMHgxMmMKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0dGWF9DT01QMF9TRgkJCTB4MjAwCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FWX0JVRl9HRlhfQ09NUDFfU0YJCQkweDIwNAorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfR0ZYX0NPTVAyX1NGCQkJMHgyMDgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVG X1ZJRF9DT01QMF9TRgkJCTB4MjBjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9WSURfQ09N UDFfU0YJCQkweDIxMAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfVklEX0NPTVAyX1NGCQkJ MHgyMTQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfVklEX0NPTVAwX1NGCQkweDIx OAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9WSURfQ09NUDFfU0YJCTB4MjFjCisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX1ZJRF9DT01QMl9TRgkJMHgyMjAKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfVklEX0NPTkZJRwkJMHgyMjQKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVZfQlVGX0xJVkVfR0ZYX0NPTVAwX1NGCQkweDIyOAorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfTElWRV9HRlhfQ09NUDFfU0YJCTB4MjJjCisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FWX0JVRl9MSVZFX0dGWF9DT01QMl9TRgkJMHgyMzAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX0xJVkVfR0ZYX0NPTkZJRwkJMHgyMzQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGXzRC SVRfU0YJCQkweDExMTExCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl81QklUX1NGCQkJMHgx MDg0MgorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfNkJJVF9TRgkJCTB4MTA0MTAKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YJCQkweDEwMTAxCisjZGVmaW5lIFpZTlFNUF9E SVNQX0FWX0JVRl8xMEJJVF9TRgkJCTB4MTAwNDAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVG X05VTExfU0YJCQkwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fU0YJCQkzCisjZGVm aW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfNgkJMHgwCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfOAkJMHgxCisjZGVmaW5lIFpZTlFNUF9E SVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfMTAJCTB4MgorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfTElWRV9DT05GSUdfQlBDXzEyCQkweDMKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVG X0xJVkVfQ09ORklHX0JQQ19NQVNLCQlHRU5NQVNLKDIsIDApCisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FWX0JVRl9MSVZFX0NPTkZJR19GTVRfUkdCCQkweDAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX0xJVkVfQ09ORklHX0ZNVF9ZVVY0NDQJMHgxCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9MSVZFX0NPTkZJR19GTVRfWVVWNDIyCTB4MgorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf TElWRV9DT05GSUdfRk1UX1lPTkxZCTB4MworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElW RV9DT05GSUdfRk1UX01BU0sJCUdFTk1BU0soNSwgNCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX0xJVkVfQ09ORklHX0NCX0ZJUlNUCQlCSVQoOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX1BBTEVUVEVfTUVNT1JZCQkweDQwMAorCisvKiBBdWRpbyByZWdpc3RlcnMgKi8KKyNkZWZp bmUgWllOUU1QX0RJU1BfQVVEX01JWEVSX1ZPTFVNRQkJCTB4MAorI2RlZmluZSBaWU5RTVBfRElT UF9BVURfTUlYRVJfVk9MVU1FX05PX1NDQUxFCQkweDIwMDAyMDAwCisjZGVmaW5lIFpZTlFNUF9E SVNQX0FVRF9NSVhFUl9NRVRBX0RBVEEJCQkweDQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NI X1NUQVRVUzAJCQkweDgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX1NUQVRVUzEJCQkweGMK KyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX1NUQVRVUzIJCQkweDEwCisjZGVmaW5lIFpZTlFN UF9ESVNQX0FVRF9DSF9TVEFUVVMzCQkJMHgxNAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hf U1RBVFVTNAkJCTB4MTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX1NUQVRVUzUJCQkweDFj CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9BX0RBVEEwCQkJMHgyMAorI2RlZmluZSBaWU5R TVBfRElTUF9BVURfQ0hfQV9EQVRBMQkJCTB4MjQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NI X0FfREFUQTIJCQkweDI4CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9BX0RBVEEzCQkJMHgy YworI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfQV9EQVRBNAkJCTB4MzAKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVVEX0NIX0FfREFUQTUJCQkweDM0CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9D SF9CX0RBVEEwCQkJMHgzOAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfQl9EQVRBMQkJCTB4 M2MKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX0JfREFUQTIJCQkweDQwCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FVRF9DSF9CX0RBVEEzCQkJMHg0NAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURf Q0hfQl9EQVRBNAkJCTB4NDgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX0JfREFUQTUJCQkw eDRjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9TT0ZUX1JFU0VUCQkJMHhjMDAKKyNkZWZpbmUg WllOUU1QX0RJU1BfQVVEX1NPRlRfUkVTRVRfQVVEX1NSU1QJCUJJVCgwKQorCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FWX0JVRl9OVU1fVklEX0dGWF9CVUZGRVJTCQk0CisjZGVmaW5lIFpZTlFNUF9E SVNQX0FWX0JVRl9OVU1fQlVGRkVSUwkJCTYKKworI2RlZmluZSBaWU5RTVBfRElTUF9OVU1fTEFZ RVJTCQkJCTIKKyNkZWZpbmUgWllOUU1QX0RJU1BfTUFYX05VTV9TVUJfUExBTkVTCQkJMworLyoK KyAqIDM4NDB4MjE2MCBpcyBhZHZlcnRpc2VkIG1heCByZXNvbHV0aW9uLCBidXQgYWxtb3N0IGFu eSByZXNvbHV0aW9ucyB1bmRlcgorICogMzAwTWh6IHBpeGVsIHJhdGUgd291bGQgd29yay4gVGh1 cyBwdXQgNDA5NiBhcyBtYXhpbXVtIHdpZHRoIGFuZCBoZWlnaHQuCisgKi8KKyNkZWZpbmUgWllO UU1QX0RJU1BfTUFYX1dJRFRICQkJCTQwOTYKKyNkZWZpbmUgWllOUU1QX0RJU1BfTUFYX0hFSUdI VAkJCQk0MDk2CisvKiA0NCBiaXQgYWRkcmVzc2luZy4gVGhpcyBpcyBhY3V0YWxseSBEUERNQSBs aW1pdGF0aW9uICovCisjZGVmaW5lIFpZTlFNUF9ESVNQX01BWF9ETUFfQklUCQkJCTQ0CisKKy8q KgorICogZW51bSB6eW5xbXBfZGlzcF9sYXllcl90eXBlIC0gTGF5ZXIgdHlwZSAoY2FuIGJlIHVz ZWQgZm9yIGh3IElEKQorICogQFpZTlFNUF9ESVNQX0xBWUVSX1ZJRDogVmlkZW8gbGF5ZXIKKyAq IEBaWU5RTVBfRElTUF9MQVlFUl9HRlg6IEdyYXBoaWNzIGxheWVyCisgKi8KK2VudW0genlucW1w X2Rpc3BfbGF5ZXJfdHlwZSB7CisJWllOUU1QX0RJU1BfTEFZRVJfVklELAorCVpZTlFNUF9ESVNQ X0xBWUVSX0dGWAorfTsKKworLyoqCisgKiBlbnVtIHp5bnFtcF9kaXNwX2xheWVyX21vZGUgLSBM YXllciBtb2RlCisgKiBAWllOUU1QX0RJU1BfTEFZRVJfTk9OTElWRTogbm9uLWxpdmUgKG1lbW9y eSkgbW9kZQorICogQFpZTlFNUF9ESVNQX0xBWUVSX0xJVkU6IGxpdmUgKHN0cmVhbSkgbW9kZQor ICovCitlbnVtIHp5bnFtcF9kaXNwX2xheWVyX21vZGUgeworCVpZTlFNUF9ESVNQX0xBWUVSX05P TkxJVkUsCisJWllOUU1QX0RJU1BfTEFZRVJfTElWRQorfTsKKworLyoqCisgKiBzdHJ1Y3Qgenlu cW1wX2Rpc3BfbGF5ZXJfZG1hIC0gc3RydWN0IGZvciBETUEgZW5naW5lCisgKiBAY2hhbjogRE1B IGNoYW5uZWwKKyAqIEBpc19hY3RpdmU6IGZsYWcgaWYgdGhlIERNQSBpcyBhY3RpdmUKKyAqIEB4 dDogSW50ZXJsZWF2ZWQgZGVzYyBjb25maWcgY29udGFpbmVyCisgKiBAc2dsOiBEYXRhIGNodW5r IGZvciBkbWFfaW50ZXJsZWF2ZWRfdGVtcGxhdGUKKyAqLworc3RydWN0IHp5bnFtcF9kaXNwX2xh eWVyX2RtYSB7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWJvb2wgaXNfYWN0aXZlOworCXN0 cnVjdCBkbWFfaW50ZXJsZWF2ZWRfdGVtcGxhdGUgeHQ7CisJc3RydWN0IGRhdGFfY2h1bmsgc2ds WzFdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgLSBEaXNwbGF5IHN1 YnN5c3RlbSBsYXllcgorICogQHBsYW5lOiBEUk0gcGxhbmUKKyAqIEBvZl9ub2RlOiBkZXZpY2Ug bm9kZQorICogQGRtYTogc3RydWN0IGZvciBETUEgZW5naW5lCisgKiBAbnVtX2NoYW46IE51bWJl ciBvZiBETUEgY2hhbm5lbAorICogQGlkOiBMYXllciBJRAorICogQG9mZnNldDogTGF5ZXIgb2Zm c2V0IGluIHRoZSByZWdpc3RlciBzcGFjZQorICogQGVuYWJsZWQ6IGZsYWcgaWYgZW5hYmxlZAor ICogQGZtdDogQ3VycmVudCBmb3JtYXQgZGVzY3JpcHRvcgorICogQGRybV9mbXRzOiBBcnJheSBv ZiBzdXBwb3J0ZWQgRFJNIGZvcm1hdHMKKyAqIEBudW1fZm10czogTnVtYmVyIG9mIHN1cHBvcnRl ZCBEUk0gZm9ybWF0cworICogQGJ1c19mbXRzOiBBcnJheSBvZiBzdXBwb3J0ZWQgYnVzIGZvcm1h dHMKKyAqIEBudW1fYnVzX2ZtdHM6IE51bWJlciBvZiBzdXBwb3J0ZWQgYnVzIGZvcm1hdHMKKyAq IEB3OiBXaWR0aAorICogQGg6IEhlaWdodAorICogQG1vZGU6IHRoZSBvcGVyYXRpb24gbW9kZQor ICogQG90aGVyOiBvdGhlciBsYXllcgorICogQGRpc3A6IGJhY2sgcG9pbnRlciB0byBzdHJ1Y3Qg enlucW1wX2Rpc3AKKyAqLworc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyIHsKKwlzdHJ1Y3QgZHJt X3BsYW5lIHBsYW5lOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKKwlzdHJ1Y3Qgenlu cW1wX2Rpc3BfbGF5ZXJfZG1hIGRtYVtaWU5RTVBfRElTUF9NQVhfTlVNX1NVQl9QTEFORVNdOwor CXVuc2lnbmVkIGludCBudW1fY2hhbjsKKwllbnVtIHp5bnFtcF9kaXNwX2xheWVyX3R5cGUgaWQ7 CisJdTMyIG9mZnNldDsKKwl1OCBlbmFibGVkOworCWNvbnN0IHN0cnVjdCB6eW5xbXBfZGlzcF9m bXQgKmZtdDsKKwl1MzIgKmRybV9mbXRzOworCXVuc2lnbmVkIGludCBudW1fZm10czsKKwl1MzIg KmJ1c19mbXRzOworCXVuc2lnbmVkIGludCBudW1fYnVzX2ZtdHM7CisJdTMyIHc7CisJdTMyIGg7 CisJZW51bSB6eW5xbXBfZGlzcF9sYXllcl9tb2RlIG1vZGU7CisJc3RydWN0IHp5bnFtcF9kaXNw X2xheWVyICpvdGhlcjsKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3A7Cit9OworCisvKioKKyAq IHN0cnVjdCB6eW5xbXBfZGlzcF9ibGVuZCAtIEJsZW5kZXIKKyAqIEBiYXNlOiBCYXNlIGFkZHJl c3Mgb2Zmc2V0CisgKi8KK3N0cnVjdCB6eW5xbXBfZGlzcF9ibGVuZCB7CisJdm9pZCBfX2lvbWVt ICpiYXNlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmIC0gQVYgYnVm ZmVyIG1hbmFnZXIKKyAqIEBiYXNlOiBCYXNlIGFkZHJlc3Mgb2Zmc2V0CisgKi8KK3N0cnVjdCB6 eW5xbXBfZGlzcF9hdl9idWYgeworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKy8qKgorICog c3RydWN0IHp5bnFtcF9kaXNwX2F1ZCAtIEF1ZGlvCisgKiBAYmFzZTogQmFzZSBhZGRyZXNzIG9m ZnNldAorICovCitzdHJ1Y3QgenlucW1wX2Rpc3BfYXVkIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7 Cit9OworCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZGlzcCAtIERpc3BsYXkgc3Vic3lzdGVtCisg KiBAeGxueF9jcnRjOiBYaWxpbnggRFJNIGNydGMKKyAqIEBkZXY6IGRldmljZSBzdHJ1Y3R1cmUK KyAqIEBkcHN1YjogRGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBkcm06IERSTSBjb3JlCisgKiBAZW5h YmxlZDogZmxhZyBpZiBlbmFibGVkCisgKiBAYmxlbmQ6IEJsZW5kZXIgYmxvY2sKKyAqIEBhdl9i dWY6IEFWIGJ1ZmZlciBtYW5hZ2VyIGJsb2NrCisgKiBAYXVkOkF1ZGlvIGJsb2NrCisgKiBAbGF5 ZXJzOiBsYXllcnMKKyAqIEBhbHBoYTogY3VycmVudCBnbG9iYWwgYWxwaGEgdmFsdWUKKyAqIEBh bHBoYV9lbjogZmxhZyBpZiB0aGUgZ2xvYmFsIGFscGhhIGlzIGVuYWJsZWQKKyAqIEBjb2xvcjog Y3VycmVudCBvdXRwdXQgY29sb3IgdmFsdWUKKyAqIEBiZ19jMDogY3VycmVudCB2YWx1ZSBvZiAx c3QgYmFja2dyb3VuZCBjb2xvciBjb21wb25lbnQKKyAqIEBiZ19jMTogY3VycmVudCB2YWx1ZSBv ZiAybmQgYmFja2dyb3VuZCBjb2xvciBjb21wb25lbnQKKyAqIEBiZ19jMjogY3VycmVudCB2YWx1 ZSBvZiAzcmQgYmFja2dyb3VuZCBjb2xvciBjb21wb25lbnQKKyAqIEB0cGdfb246IGN1cnJlbnQg VFBHIG1vZGUgc3RhdGUKKyAqIEBldmVudDogcGVuZGluZyB2YmxhbmsgZXZlbnQgcmVxdWVzdAor ICogQF9wc19wY2xrOiBQaXhlbCBjbG9jayBmcm9tIFBTCisgKiBAX3BsX3BjbGs6IFBpeGVsIGNs b2NrIGZyb20gUEwKKyAqIEBwY2xrOiBQaXhlbCBjbG9jaworICogQHBjbGtfZW46IEZsYWcgaWYg dGhlIHBpeGVsIGNsb2NrIGlzIGVuYWJsZWQKKyAqIEBfcHNfYXVkY2xrOiBBdWRpbyBjbG9jayBm cm9tIFBTCisgKiBAX3BsX2F1ZGNsazogQXVkaW8gY2xvY2sgZnJvbSBQTAorICogQGF1ZGNsazog QXVkaW8gY2xvY2sKKyAqIEBhdWRjbGtfZW46IEZsYWcgaWYgdGhlIGF1ZGlvIGNsb2NrIGlzIGVu YWJsZWQKKyAqIEBhY2xrOiBBUEIgY2xvY2sKKyAqIEBhY2xrX2VuOiBGbGFnIGlmIHRoZSBBUEIg Y2xvY2sgaXMgZW5hYmxlZAorICovCitzdHJ1Y3QgenlucW1wX2Rpc3AgeworCXN0cnVjdCB4bG54 X2NydGMgeGxueF9jcnRjOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgenlucW1wX2Rw c3ViICpkcHN1YjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOworCWJvb2wgZW5hYmxlZDsKKwlz dHJ1Y3QgenlucW1wX2Rpc3BfYmxlbmQgYmxlbmQ7CisJc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1 ZiBhdl9idWY7CisJc3RydWN0IHp5bnFtcF9kaXNwX2F1ZCBhdWQ7CisJc3RydWN0IHp5bnFtcF9k aXNwX2xheWVyIGxheWVyc1taWU5RTVBfRElTUF9OVU1fTEFZRVJTXTsKKwl1MzIgYWxwaGE7CisJ Ym9vbCBhbHBoYV9lbjsKKwl1bnNpZ25lZCBpbnQgY29sb3I7CisJdTMyIGJnX2MwOworCXUzMiBi Z19jMTsKKwl1MzIgYmdfYzI7CisJYm9vbCB0cGdfb247CisJc3RydWN0IGRybV9wZW5kaW5nX3Zi bGFua19ldmVudCAqZXZlbnQ7CisJLyogRG9uJ3Qgb3BlcmF0ZSBkaXJlY3RseSBvbiBfcHNfICov CisJc3RydWN0IGNsayAqX3BzX3BjbGs7CisJc3RydWN0IGNsayAqX3BsX3BjbGs7CisJc3RydWN0 IGNsayAqcGNsazsKKwlib29sIHBjbGtfZW47CisJc3RydWN0IGNsayAqX3BzX2F1ZGNsazsKKwlz dHJ1Y3QgY2xrICpfcGxfYXVkY2xrOworCXN0cnVjdCBjbGsgKmF1ZGNsazsKKwlib29sIGF1ZGNs a19lbjsKKwlzdHJ1Y3QgY2xrICphY2xrOworCWJvb2wgYWNsa19lbjsKK307CisKKy8qKgorICog c3RydWN0IHp5bnFtcF9kaXNwX2ZtdCAtIERpc3BsYXkgc3Vic3lzdGVtIGZvcm1hdCBtYXBwaW5n CisgKiBAZHJtX2ZtdDogZHJtIGZvcm1hdAorICogQGRpc3BfZm10OiBEaXNwbGF5IHN1YnN5c3Rl bSBmb3JtYXQKKyAqIEBidXNfZm10OiBCdXMgZm9ybWF0cyAobGl2ZSBmb3JtYXRzKQorICogQHJn YjogZmxhZyBmb3IgUkdCIGZvcm1hdHMKKyAqIEBzd2FwOiBmbGFnIHRvIHN3YXAgciAmIGIgZm9y IHJnYiBmb3JtYXRzLCBhbmQgdSAmIHYgZm9yIHl1diBmb3JtYXRzCisgKiBAY2hyb21hX3N1Yjog ZmxhZyBmb3IgY2hyb21hIHN1YnNhbXBsZWQgZm9ybWF0cworICogQHNmOiBzY2FsaW5nIGZhY3Rv cnMgZm9yIHVwdG8gMyBjb2xvciBjb21wb25lbnRzCisgKi8KK3N0cnVjdCB6eW5xbXBfZGlzcF9m bXQgeworCXUzMiBkcm1fZm10OworCXUzMiBkaXNwX2ZtdDsKKwl1MzIgYnVzX2ZtdDsKKwlib29s IHJnYjsKKwlib29sIHN3YXA7CisJYm9vbCBjaHJvbWFfc3ViOworCXUzMiBzZlszXTsKK307CisK K3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IG9m ZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBiYXNlICsgb2Zmc2V0KTsKK30KKworc3Rh dGljIHUzMiB6eW5xbXBfZGlzcF9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IG9mZnNldCkK K3sKKwlyZXR1cm4gcmVhZGwoYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFt cF9kaXNwX2Nscih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBvZmZzZXQsIHUzMiBjbHIpCit7CisJ enlucW1wX2Rpc3Bfd3JpdGUoYmFzZSwgb2Zmc2V0LCB6eW5xbXBfZGlzcF9yZWFkKGJhc2UsIG9m ZnNldCkgJiB+Y2xyKTsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2Rpc3Bfc2V0KHZvaWQgX19p b21lbSAqYmFzZSwgaW50IG9mZnNldCwgdTMyIHNldCkKK3sKKwl6eW5xbXBfZGlzcF93cml0ZShi YXNlLCBvZmZzZXQsIHp5bnFtcF9kaXNwX3JlYWQoYmFzZSwgb2Zmc2V0KSB8IHNldCk7Cit9CisK Ky8qCisgKiBDbG9jayBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHp5bnFtcF9kaXNwX2Nsa19l bmFibGUgLSBFbmFibGUgdGhlIGNsb2NrIGlmIG5lZWRlZAorICogQGNsazogY2xrIGRldmljZQor ICogQGZsYWc6IGZsYWcgaWYgdGhlIGNsb2NrIGlzIGVuYWJsZWQKKyAqCisgKiBFbmFibGUgdGhl IGNsb2NrIG9ubHkgaWYgaXQncyBub3QgZW5hYmxlZCBAZmxhZy4KKyAqCisgKiBSZXR1cm46IHZh bHVlIGZyb20gY2xrX3ByZXBhcmVfZW5hYmxlKCkuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rp c3BfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGJvb2wgKmZsYWcpCit7CisJaW50IHJldCA9 IDA7CisKKwlpZiAoISpmbGFnKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjbGspOwor CQlpZiAoIXJldCkKKwkJCSpmbGFnID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisv KioKKyAqIHp5bnFtcF9kaXNwX2Nsa19lbmFibGUgLSBFbmFibGUgdGhlIGNsb2NrIGlmIG5lZWRl ZAorICogQGNsazogY2xrIGRldmljZQorICogQGZsYWc6IGZsYWcgaWYgdGhlIGNsb2NrIGlzIGVu YWJsZWQKKyAqCisgKiBEaXNhYmxlIHRoZSBjbG9jayBvbmx5IGlmIGl0J3MgZW5hYmxlZCBAZmxh Zy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAq Y2xrLCBib29sICpmbGFnKQoreworCWlmICgqZmxhZykgeworCQljbGtfZGlzYWJsZV91bnByZXBh cmUoY2xrKTsKKwkJKmZsYWcgPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogenlucW1wX2Rpc3Bf Y2xrX2VuYWJsZSAtIEVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY2xvY2sKKyAqIEBjbGs6IGNsayBk ZXZpY2UKKyAqIEBmbGFnOiBmbGFnIGlmIHRoZSBjbG9jayBpcyBlbmFibGVkCisgKgorICogVGhp cyBpcyB0byBlbnN1cmUgdGhlIGNsb2NrIGlzIGRpc2FibGVkLiBUaGUgaW5pdGlhbCBoYXJkd2Fy ZSBzdGF0ZSBpcworICogdW5rbm93biwgYW5kIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjbG9j ayBpcyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm46IHZhbHVlIGZyb20gY2xrX3ByZXBhcmVfZW5h YmxlKCkuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfY2xrX2VuYWJsZV9kaXNhYmxlKHN0 cnVjdCBjbGsgKmNsaywgYm9vbCAqZmxhZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKmZs YWcpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CisJCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShjbGspOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBCbGVuZGVyIGZ1 bmN0aW9ucworICovCisKKy8qKgorICogenlucW1wX2Rpc3BfYmxlbmRfc2V0X291dHB1dF9mbXQg LSBTZXQgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGJsZW5kCisgKiBAYmxlbmQ6IGJsZW5kIG9i amVjdAorICogQGZtdDogb3V0cHV0IGZvcm1hdAorICoKKyAqIFNldCB0aGUgb3V0cHV0IGZvcm1h dCB0byBAZm10LgorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYmxlbmRfc2V0X291dHB1 dF9mbXQoc3RydWN0IHp5bnFtcF9kaXNwX2JsZW5kICpibGVuZCwgdTMyIGZtdCkKK3sKKwl1MTYg cmVzZXRfY29lZmZzW10gPSB7IDB4MTAwMCwgMHgwLCAweDAsCisJCQkgICAgICAgMHgwLCAweDEw MDAsIDB4MCwKKwkJCSAgICAgICAweDAsIDB4MCwgMHgxMDAwIH07CisJdTMyIHJlc2V0X29mZnNl dHNbXSA9IHsgMHgwLCAweDAsIDB4MCB9OworCXUxNiBzZHR2X2NvZWZmc1tdID0geyAweDRjOSwg MHg4NjQsIDB4MWQzLAorCQkJICAgICAgMHg3ZDRkLCAweDdhYjMsIDB4ODAwLAorCQkJICAgICAg MHg4MDAsIDB4Nzk0ZCwgMHg3ZWIzIH07CisJdTMyIGZ1bGxfcmFuZ2Vfb2Zmc2V0c1tdID0geyAw eDAsIDB4ODAwMDAwMCwgMHg4MDAwMDAwIH07CisJdTE2ICpjb2VmZnM7CisJdTMyICpvZmZzZXRz OworCXUzMiBvZmZzZXQsIGk7CisKKwl6eW5xbXBfZGlzcF93cml0ZShibGVuZC0+YmFzZSwgWllO UU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVCwgZm10KTsKKwlpZiAoZm10ID09IFpZTlFN UF9ESVNQX1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVRfUkdCKSB7CisJCWNvZWZmcyA9IHJlc2V0X2Nv ZWZmczsKKwkJb2Zmc2V0cyA9IHJlc2V0X29mZnNldHM7CisJfSBlbHNlIHsKKwkJLyogSGFyZGNv ZGUgRnVsbC1yYW5nZSBTRFRWIHZhbHVlcy4gQ2FuIGJlIHJ1bnRpbWUgY29uZmlnICovCisJCWNv ZWZmcyA9IHNkdHZfY29lZmZzOworCQlvZmZzZXRzID0gZnVsbF9yYW5nZV9vZmZzZXRzOworCX0K KworCW9mZnNldCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfUkdCMllDQkNSX0NPRUZGMDsKKwlmb3Ig KGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfVl9CTEVORF9OVU1fQ09FRkY7IGkrKykKKwkJenlucW1w X2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2UsIG9mZnNldCArIGkgKiA0LCBjb2VmZnNbaV0pOworCisJ b2Zmc2V0ID0gWllOUU1QX0RJU1BfVl9CTEVORF9MVU1BX09VVENTQ19PRkZTRVQ7CisJZm9yIChp ID0gMDsgaSA8IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTlVNX09GRlNFVDsgaSsrKQorCQl6eW5xbXBf ZGlzcF93cml0ZShibGVuZC0+YmFzZSwgb2Zmc2V0ICsgaSAqIDQsIG9mZnNldHNbaV0pOworfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX2JsZW5kX2xheWVyX2VuYWJsZSAtIEVuYWJsZSBhIGxheWVy CisgKiBAYmxlbmQ6IGJsZW5kIG9iamVjdAorICogQGxheWVyOiBsYXllciB0byBlbmFibGUKKyAq CisgKiBFbmFibGUgYSBsYXllciBAbGF5ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNw X2JsZW5kX2xheWVyX2VuYWJsZShzdHJ1Y3QgenlucW1wX2Rpc3BfYmxlbmQgKmJsZW5kLAorCQkJ CQkgICBzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxheWVyKQoreworCXUzMiByZWcsIG9mZnNl dCwgaSwgczAsIHMxOworCXUxNiBzZHR2X2NvZWZmc1tdID0geyAweDEwMDAsIDB4MTY2ZiwgMHgw LAorCQkJICAgICAgMHgxMDAwLCAweDc0ODMsIDB4N2E3ZiwKKwkJCSAgICAgIDB4MTAwMCwgMHgw LCAweDFjNWEgfTsKKwl1MTYgc3dhcF9jb2VmZnNbXSA9IHsgMHgxMDAwLCAweDAsIDB4MCwKKwkJ CSAgICAgIDB4MCwgMHgxMDAwLCAweDAsCisJCQkgICAgICAweDAsIDB4MCwgMHgxMDAwIH07CisJ dTE2ICpjb2VmZnM7CisJdTMyIG9mZnNldHNbXSA9IHsgMHgwLCAweDE4MDAsIDB4MTgwMCB9Owor CisJcmVnID0gbGF5ZXItPmZtdC0+cmdiID8gWllOUU1QX0RJU1BfVl9CTEVORF9MQVlFUl9DT05U Uk9MX1JHQiA6IDA7CisJcmVnIHw9IGxheWVyLT5mbXQtPmNocm9tYV9zdWIgPworCSAgICAgICBa WU5RTVBfRElTUF9WX0JMRU5EX0xBWUVSX0NPTlRST0xfRU5fVVMgOiAwOworCisJenlucW1wX2Rp c3Bfd3JpdGUoYmxlbmQtPmJhc2UsCisJCQkgIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTEFZRVJfQ09O VFJPTCArIGxheWVyLT5vZmZzZXQsCisJCQkgIHJlZyk7CisKKwlpZiAobGF5ZXItPmlkID09IFpZ TlFNUF9ESVNQX0xBWUVSX1ZJRCkKKwkJb2Zmc2V0ID0gWllOUU1QX0RJU1BfVl9CTEVORF9JTjFD U0NfQ09FRkYwOworCWVsc2UKKwkJb2Zmc2V0ID0gWllOUU1QX0RJU1BfVl9CTEVORF9JTjJDU0Nf Q09FRkYwOworCisJaWYgKCFsYXllci0+Zm10LT5yZ2IpIHsKKwkJY29lZmZzID0gc2R0dl9jb2Vm ZnM7CisJCXMwID0gMTsKKwkJczEgPSAyOworCX0gZWxzZSB7CisJCWNvZWZmcyA9IHN3YXBfY29l ZmZzOworCQlzMCA9IDA7CisJCXMxID0gMjsKKworCQkvKiBObyBvZmZzZXQgZm9yIFJHQiBmb3Jt YXRzICovCisJCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBfRElTUF9WX0JMRU5EX05VTV9PRkZTRVQ7 IGkrKykKKwkJCW9mZnNldHNbaV0gPSAwOworCX0KKworCWlmIChsYXllci0+Zm10LT5zd2FwKSB7 CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWNvZWZmc1tpICogMyArIHMwXSBePSBj b2VmZnNbaSAqIDMgKyBzMV07CisJCQljb2VmZnNbaSAqIDMgKyBzMV0gXj0gY29lZmZzW2kgKiAz ICsgczBdOworCQkJY29lZmZzW2kgKiAzICsgczBdIF49IGNvZWZmc1tpICogMyArIHMxXTsKKwkJ fQorCX0KKworCS8qIFByb2dyYW0gY29lZmZpY2llbnRzLiBDYW4gYmUgcnVudGltZSBjb25maWd1 cmFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfVl9CTEVORF9OVU1fQ09FRkY7 IGkrKykKKwkJenlucW1wX2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2UsIG9mZnNldCArIGkgKiA0LCBj b2VmZnNbaV0pOworCisJaWYgKGxheWVyLT5pZCA9PSBaWU5RTVBfRElTUF9MQVlFUl9WSUQpCisJ CW9mZnNldCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVNQV9JTjFDU0NfT0ZGU0VUOworCWVsc2UK KwkJb2Zmc2V0ID0gWllOUU1QX0RJU1BfVl9CTEVORF9MVU1BX0lOMkNTQ19PRkZTRVQ7CisKKwkv KiBQcm9ncmFtIG9mZnNldHMuIENhbiBiZSBydW50aW1lIGNvbmZpZ3VyYWJsZSAqLworCWZvciAo aSA9IDA7IGkgPCBaWU5RTVBfRElTUF9WX0JMRU5EX05VTV9PRkZTRVQ7IGkrKykKKwkJenlucW1w X2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2UsIG9mZnNldCArIGkgKiA0LCBvZmZzZXRzW2ldKTsKK30K KworLyoqCisgKiB6eW5xbXBfZGlzcF9ibGVuZF9sYXllcl9kaXNhYmxlIC0gRGlzYWJsZSBhIGxh eWVyCisgKiBAYmxlbmQ6IGJsZW5kIG9iamVjdAorICogQGxheWVyOiBsYXllciB0byBkaXNhYmxl CisgKgorICogRGlzYWJsZSBhIGxheWVyIEBsYXllci4KKyAqLworc3RhdGljIHZvaWQgenlucW1w X2Rpc3BfYmxlbmRfbGF5ZXJfZGlzYWJsZShzdHJ1Y3QgenlucW1wX2Rpc3BfYmxlbmQgKmJsZW5k LAorCQkJCQkgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllcikKK3sKKwl1MzIgb2Zm c2V0OworCXVuc2lnbmVkIGludCBpOworCisJenlucW1wX2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2Us CisJCQkgIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTEFZRVJfQ09OVFJPTCArIGxheWVyLT5vZmZzZXQs IDApOworCisJaWYgKGxheWVyLT5pZCA9PSBaWU5RTVBfRElTUF9MQVlFUl9WSUQpCisJCW9mZnNl dCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGMDsKKwllbHNlCisJCW9mZnNldCA9 IFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGMDsKKwlmb3IgKGkgPSAwOyBpIDwgWllO UU1QX0RJU1BfVl9CTEVORF9OVU1fQ09FRkY7IGkrKykKKwkJenlucW1wX2Rpc3Bfd3JpdGUoYmxl bmQtPmJhc2UsIG9mZnNldCArIGkgKiA0LCAwKTsKKworCWlmIChsYXllci0+aWQgPT0gWllOUU1Q X0RJU1BfTEFZRVJfVklEKQorCQlvZmZzZXQgPSBaWU5RTVBfRElTUF9WX0JMRU5EX0xVTUFfSU4x Q1NDX09GRlNFVDsKKwllbHNlCisJCW9mZnNldCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVNQV9J TjJDU0NfT0ZGU0VUOworCisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTlVN X09GRlNFVDsgaSsrKQorCQl6eW5xbXBfZGlzcF93cml0ZShibGVuZC0+YmFzZSwgb2Zmc2V0ICsg aSAqIDQsIDApOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2JsZW5kX3NldF9iZ19jb2xvciAt IFNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgorICogQGJsZW5kOiBibGVuZCBvYmplY3QKKyAqIEBj MDogY29sb3IgY29tcG9uZW50IDAKKyAqIEBjMTogY29sb3IgY29tcG9uZW50IDEKKyAqIEBjMjog Y29sb3IgY29tcG9uZW50IDIKKyAqCisgKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IuCisgKi8K K3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2JsZW5kX3NldF9iZ19jb2xvcihzdHJ1Y3QgenlucW1w X2Rpc3BfYmxlbmQgKmJsZW5kLAorCQkJCQkgICB1MzIgYzAsIHUzMiBjMSwgdTMyIGMyKQorewor CXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5iYXNlLCBaWU5RTVBfRElTUF9WX0JMRU5EX0JHX0NM Ul8wLCBjMCk7CisJenlucW1wX2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2UsIFpZTlFNUF9ESVNQX1Zf QkxFTkRfQkdfQ0xSXzEsIGMxKTsKKwl6eW5xbXBfZGlzcF93cml0ZShibGVuZC0+YmFzZSwgWllO UU1QX0RJU1BfVl9CTEVORF9CR19DTFJfMiwgYzIpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNw X2JsZW5kX3NldF9hbHBoYSAtIFNldCB0aGUgYWxwaGEgZm9yIGJsZW5kaW5nCisgKiBAYmxlbmQ6 IGJsZW5kIG9iamVjdAorICogQGFscGhhOiBhbHBoYSB2YWx1ZSB0byBiZSB1c2VkCisgKgorICog U2V0IHRoZSBhbHBoYSBmb3IgYmxlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlz cF9ibGVuZF9zZXRfYWxwaGEoc3RydWN0IHp5bnFtcF9kaXNwX2JsZW5kICpibGVuZCwgdTMyIGFs cGhhKQoreworCXUzMiByZWc7CisKKwlyZWcgPSB6eW5xbXBfZGlzcF9yZWFkKGJsZW5kLT5iYXNl LAorCQkJICAgICAgIFpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VUX0dMT0JBTF9BTFBIQSk7CisJcmVn ICY9IH5aWU5RTVBfRElTUF9WX0JMRU5EX1NFVF9HTE9CQUxfQUxQSEFfTUFTSzsKKwlyZWcgfD0g YWxwaGEgPDwgMTsKKwl6eW5xbXBfZGlzcF93cml0ZShibGVuZC0+YmFzZSwgWllOUU1QX0RJU1Bf Vl9CTEVORF9TRVRfR0xPQkFMX0FMUEhBLAorCQkJICByZWcpOworfQorCisvKioKKyAqIHp5bnFt cF9kaXNwX2JsZW5kX2VuYWJsZV9hbHBoYSAtIEVuYWJsZS9kaXNhYmxlIHRoZSBnbG9iYWwgYWxw aGEKKyAqIEBibGVuZDogYmxlbmQgb2JqZWN0CisgKiBAZW5hYmxlOiBmbGFnIHRvIGVuYWJsZSBv ciBkaXNhYmxlIGFscGhhIGJsZW5kaW5nCisgKgorICogRW5hYmxlL2Rpc2FibGUgdGhlIGdsb2Jh bCBhbHBoYSBibGVuZGluZyBiYXNlZCBvbiBAZW5hYmxlLgorICovCitzdGF0aWMgdm9pZAorenlu cW1wX2Rpc3BfYmxlbmRfZW5hYmxlX2FscGhhKHN0cnVjdCB6eW5xbXBfZGlzcF9ibGVuZCAqYmxl bmQsIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCXp5bnFtcF9kaXNwX3NldChibGVu ZC0+YmFzZSwKKwkJCQlaWU5RTVBfRElTUF9WX0JMRU5EX1NFVF9HTE9CQUxfQUxQSEEsIEJJVCgw KSk7CisJZWxzZQorCQl6eW5xbXBfZGlzcF9jbHIoYmxlbmQtPmJhc2UsCisJCQkJWllOUU1QX0RJ U1BfVl9CTEVORF9TRVRfR0xPQkFMX0FMUEhBLCBCSVQoMCkpOworfQorCisvKiBMaXN0IG9mIGJs ZW5kIG91dHB1dCBmb3JtYXRzICovCisvKiBUaGUgaWQgLyBvcmRlciBzaG91bGQgYmUgYWxpZ25l ZCB3aXRoIHp5bnFtcF9kaXNwX2NvbG9yX2VudW0gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgenlu cW1wX2Rpc3BfZm10IGJsZW5kX291dHB1dF9mbXRzW10gPSB7CisJeworCQkuZGlzcF9mbXQJPSBa WU5RTVBfRElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1JHQiwKKwl9LCB7CisJCS5kaXNwX2Zt dAk9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVRfWUNCQ1I0NDQsCisJfSwgewor CQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1lDQkNSNDIy LAorCX0sIHsKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZN VF9ZT05MWSwKKwl9Cit9OworCisvKgorICogQVYgYnVmZmVyIG1hbmFnZXIgZnVuY3Rpb25zCisg Ki8KKworLyogTGlzdCBvZiB2aWRlbyBsYXllciBmb3JtYXRzICovCisjZGVmaW5lIFpZTlFNUF9E SVNQX0FWX0JVRl9WSURfRk1UX1lVWVYJMgorc3RhdGljIGNvbnN0IHN0cnVjdCB6eW5xbXBfZGlz cF9mbXQgYXZfYnVmX3ZpZF9mbXRzW10gPSB7CisJeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRf VllVWSwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfVllVWSwK KwkJLnJnYgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSB0cnVl LAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1VZVlksCisJCS5kaXNw X2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1ZZVVksCisJCS5yZ2IJCT0gZmFs c2UsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJ fSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWVVZViwKKwkJLmRpc3BfZm10CT0gWllOUU1Q X0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVVZViwKKwkJLnJnYgkJPSBmYWxzZSwKKwkJLnN3YXAJ CT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQ X0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0Ys CisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1f Zm10CT0gRFJNX0ZPUk1BVF9ZVllVLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZf Rk1UX05MX1ZJRF9ZVVlWLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJPSB0cnVlLAorCQku Y2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9T RiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0g WllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JN QVRfWVVWNDIyLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9Z VjE2LAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJ PSB0cnVlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsx XQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQ X0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1lWVTQyMiwK KwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNiwKKwkJLnJn YgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSB0cnVlLAorCQku c2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBf RElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklU X1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1lVVjQ0NCwKKwkJLmRpc3BfZm10 CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYyNCwKKwkJLnJnYgkJPSBmYWxzZSwK KwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwg eworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWVZVNDQ0LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBf RElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjI0LAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJ PSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1Bf QVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwK KwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9m bXQJPSBEUk1fRk9STUFUX05WMTYsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfVklEX1lWMTZDSSwKKwkJLnJnYgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJ CS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklU X1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZP Uk1BVF9OVjYxLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9Z VjE2Q0ksCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJvbWFfc3Vi CT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2Zb MV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElT UF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9CR1I4ODgs CisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQjg4OCwKKwkJ LnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwK KwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllO UU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZf OEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9SR0I4ODgsCisJCS5kaXNw X2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQjg4OCwKKwkJLnJnYgkJPSB0 cnVlLAorCQkuc3dhcAkJPSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQkuc2ZbMF0J CT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9B Vl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAor CX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1hCR1I4ODg4LAorCQkuZGlzcF9mbXQJPSBa WU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9SR0JBODg4MCwKKwkJLnJnYgkJPSB0cnVlLAor CQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVG XzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7 CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJLmRpc3BfZm10CT0gWllOUU1Q X0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfUkdCQTg4ODAsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3 YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRf U0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5k cm1fZm10CT0gRFJNX0ZPUk1BVF9YQkdSMjEwMTAxMCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJ U1BfQVZfQlVGX0ZNVF9OTF9WSURfUkdCODg4XzEwLAorCQkucmdiCQk9IHRydWUsCisJCS5zd2Fw CQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzEwQklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzEwQklU X1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzEwQklUX1NGLAorCX0sIHsKKwkJ LmRybV9mbXQJPSBEUk1fRk9STUFUX1hSR0IyMTAxMDEwLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBf RElTUF9BVl9CVUZfRk1UX05MX1ZJRF9SR0I4ODhfMTAsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3 YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl8xMEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl8xMEJJ VF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl8xMEJJVF9TRiwKKwl9LCB7CisJ CS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9ZVVY0MjAsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQ X0FWX0JVRl9GTVRfTkxfVklEX1lWMTZfNDIwLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJ PSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSB0cnVlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1Bf QVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwK KwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9m bXQJPSBEUk1fRk9STUFUX1lWVTQyMCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVG X0ZNVF9OTF9WSURfWVYxNl80MjAsCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IHRydWUs CisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84 QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsy XQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJN X0ZPUk1BVF9OVjEyLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJ RF9ZVjE2Q0lfNDIwLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNo cm9tYV9zdWIJPSB0cnVlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0Ys CisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFU X05WMjEsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMTZD SV80MjAsCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJvbWFfc3Vi CT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2Zb MV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElT UF9BVl9CVUZfOEJJVF9TRiwKKwl9Cit9OworCisvKiBMaXN0IG9mIGdyYXBoaWNzIGxheWVyIGZv cm1hdHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10IGF2X2J1Zl9nZnhf Zm10c1tdID0geworCXsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX0FCR1I4ODg4LAorCQkuZGlz cF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBODg4OCwKKwkJLnJnYgkJ PSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNm WzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9T RiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9BUkdCODg4OCwKKwkJLmRpc3BfZm10 CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCQTg4ODgsCisJCS5yZ2IJCT0gdHJ1 ZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9 IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZf QlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9 LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9SR0JBODg4OCwKKwkJLmRpc3BfZm10CT0gWllO UU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfQUJHUjg4ODgsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJ LnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5R TVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84 QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgewor CQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfQkdSQTg4ODgsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9E SVNQX0FWX0JVRl9GTVRfTkxfR0ZYX0FCR1I4ODg4LAorCQkucmdiCQk9IHRydWUsCisJCS5zd2Fw CQk9IHRydWUsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElT UF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NG LAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJt X2ZtdAk9IERSTV9GT1JNQVRfQkdSODg4LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9C VUZfRk1UX05MX0dGWF9SR0I4ODgsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2Us CisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZf OEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2Zb Ml0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERS TV9GT1JNQVRfUkdCODg4LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05M X0dGWF9CR1I4ODgsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJv bWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwK KwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllO UU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRf UkdCQTU1NTEsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JH QkE1NTUxLAorCQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1 Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJCS5z ZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNUJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl81QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX0JHUkE1 NTUxLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBNTU1 MSwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZh bHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJCS5zZlsxXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfNUJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl81QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1JHQkE0NDQ0LAor CQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBNDQ0NCwKKwkJ LnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwK KwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl80QklUX1NGLAorCQkuc2ZbMV0JCT0gWllO UU1QX0RJU1BfQVZfQlVGXzRCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZf NEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9CR1JBNDQ0NCwKKwkJLmRp c3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCQTQ0NDQsCisJCS5yZ2IJ CT0gdHJ1ZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNm WzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl80QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzRCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNEJJVF9T RiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9SR0I1NjUsCisJCS5kaXNwX2ZtdAk9 IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQjU2NSwKKwkJLnJnYgkJPSB0cnVlLAor CQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl81QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVG XzZCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNUJJVF9TRiwKKwl9LCB7 CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9CR1I1NjUsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9E SVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQjU2NSwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJ PSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1Bf QVZfQlVGXzVCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNkJJVF9TRiwK KwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl81QklUX1NGLAorCX0KK307CisKKy8qIExp c3Qgb2YgbGl2ZSBmb3JtYXRzICovCisvKiBGb3JtYXQgY2FuIGJlIGNvbWJpbmF0aW9uIG9mIGNv bG9yLCBicGMsIGFuZCBjYi1jciBvcmRlci4KKyAqIC0gQ29sb3I6IFJHQiAvIFlVVjQ0NCAvIFlV VjQyMiAvIFkgb25seQorICogLSBCUEM6IDYsIDgsIDEwLCAxMgorICogLSBTd2FwOiBDYiBhbmQg Q3Igc3dhcAorICogd2hpY2ggY2FuIGJlIDMyIGJ1cyBmb3JtYXRzLiBPbmx5IGxpc3QgdGhlIHN1 YnNldCBvZiB0aG9zZSBmb3Igbm93LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHp5bnFtcF9k aXNwX2ZtdCBhdl9idWZfbGl2ZV9mbXRzW10gPSB7CisJeworCQkuYnVzX2ZtdAk9IE1FRElBX0JV U19GTVRfUkdCNjY2XzFYMTgsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZF X0NPTkZJR19CUENfNiB8fAorCQkJCSAgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0ZN VF9SR0IsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3Vi CT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNkJJVF9TRiwKKwkJLnNm WzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl82QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzZCSVRfU0YsCisJfSwgeworCQkuYnVzX2ZtdAk9IE1FRElBX0JVU19GTVRfUkJH ODg4XzFYMjQsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19C UENfOCB8fAorCQkJCSAgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0ZNVF9SR0IsCisJ CS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2Us CisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVG XzhCSVRfU0YsCisJfSwgeworCQkuYnVzX2ZtdAk9IE1FRElBX0JVU19GTVRfVVlWWThfMVgxNiwK KwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0JQQ184IHx8CisJ CQkJICBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfRk1UX1lVVjQyMiwKKwkJLnJnYgkJ PSBmYWxzZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNm WzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9T RiwKKwl9LCB7CisJCS5idXNfZm10CT0gTUVESUFfQlVTX0ZNVF9WVVk4XzFYMjQsCisJCS5kaXNw X2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfOCB8fAorCQkJCSAgWllO UU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0ZNVF9ZVVY0NDQsCisJCS5yZ2IJCT0gZmFsc2Us CisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0g WllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9C VUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCX0s IHsKKwkJLmJ1c19mbXQJPSBNRURJQV9CVVNfRk1UX1VZVlkxMF8xWDIwLAorCQkuZGlzcF9mbXQJ PSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfQlBDXzEwIHx8CisJCQkJICBaWU5RTVBf RElTUF9BVl9CVUZfTElWRV9DT05GSUdfRk1UX1lVVjQyMiwKKwkJLnJnYgkJPSBmYWxzZSwKKwkJ LnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFN UF9ESVNQX0FWX0JVRl8xMEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl8x MEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl8xMEJJVF9TRiwKKwl9Cit9 OworCisvKioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfZm10IC0gU2V0IHRoZSBpbnB1dCBm b3JtYXRzCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICogQGZtdDogZm9ybWF0cwor ICoKKyAqIFNldCB0aGUgYXYgYnVmZmVyIG1hbmFnZXIgZm9ybWF0IHRvIEBmbXQuIEBmbXQgc2hv dWxkIGhhdmUgdmFsaWQgdmFsdWVzCisgKiBmb3IgYm90aCB2aWRlbyBhbmQgZ3JhcGhpY3MgbGF5 ZXIuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9idWZfc2V0X2ZtdChzdHJ1Y3Qg enlucW1wX2Rpc3BfYXZfYnVmICphdl9idWYsIHUzMiBmbXQpCit7CisJenlucW1wX2Rpc3Bfd3Jp dGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfRk1ULCBmbXQpOworfQorCisvKioK KyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9nZXRfZm10IC0gR2V0IHRoZSBpbnB1dCBmb3JtYXRzCisg KiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICoKKyAqIEdldCB0aGUgaW5wdXQgZm9ybWF0 cyAod2hpY2ggaW5jbHVkZSB2aWRlbyBhbmQgZ3JhcGhpY3MpIG9mCisgKiBhdiBidWZmZXIgbWFu YWdlci4KKyAqCisgKiBSZXR1cm46IHZhbHVlIG9mIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVQgcmVn aXN0ZXIuCisgKi8KK3N0YXRpYyB1MzIKK3p5bnFtcF9kaXNwX2F2X2J1Zl9nZXRfZm10KHN0cnVj dCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZikKK3sKKwlyZXR1cm4genlucW1wX2Rpc3BfcmVh ZChhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVQpOworfQorCisvKioKKyAqIHp5 bnFtcF9kaXNwX2F2X2J1Zl9zZXRfdmlkX2Nsb2NrX3NyYyAtIFNldCB0aGUgdmlkZW8gY2xvY2sg c291cmNlCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICogQGZyb21fcHM6IGZsYWcg aWYgdGhlIHZpZGVvIGNsb2NrIGlzIGZyb20gcHMKKyAqCisgKiBTZXQgdGhlIHZpZGVvIGNsb2Nr IHNvdXJjZSBiYXNlZCBvbiBAZnJvbV9wcy4gSXQgY2FuIGNvbWUgZnJvbSBlaXRoZXIgUFMgb3IK KyAqIFBMLgorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYXZfYnVmX3NldF92aWRfY2xv Y2tfc3JjKHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwKKwkJCQkgICAgIGJvb2wg ZnJvbV9wcykKK3sKKwl1MzIgcmVnID0genlucW1wX2Rpc3BfcmVhZChhdl9idWYtPmJhc2UsIFpZ TlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDKTsKKworCWlmIChmcm9tX3BzKQorCQlyZWcgfD0gWllO UU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfVklEX0ZST01fUFM7CisJZWxzZQorCQlyZWcgJj0gflpZ TlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDX1ZJRF9GUk9NX1BTOworCXp5bnFtcF9kaXNwX3dyaXRl KGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkMsIHJlZyk7Cit9CisKKy8q KgorICogenlucW1wX2Rpc3BfYXZfYnVmX3NldF92aWRfdGltaW5nX3NyYyAtIFNldCB0aGUgdmlk ZW8gdGltaW5nIHNvdXJjZQorICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqIEBpbnRl cm5hbDogZmxhZyBpZiB0aGUgdmlkZW8gdGltaW5nIGlzIGdlbmVyYXRlZCBpbnRlcm5hbGx5Cisg KgorICogU2V0IHRoZSB2aWRlbyB0aW1pbmcgc291cmNlIGJhc2VkIG9uIEBpbnRlcm5hbC4gSXQg Y2FuIGNvbWUgZXh0ZXJuYWxseSBvcgorICogYmUgZ2VuZXJhdGVkIGludGVybmFsbHkuCisgKi8K K3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9idWZfc2V0X3ZpZF90aW1pbmdfc3JjKHN0cnVj dCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwKKwkJCQkgICAgICBib29sIGludGVybmFsKQor eworCXUzMiByZWcgPSB6eW5xbXBfZGlzcF9yZWFkKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1Bf QVZfQlVGX0NMS19TUkMpOworCisJaWYgKGludGVybmFsKQorCQlyZWcgfD0gWllOUU1QX0RJU1Bf QVZfQlVGX0NMS19TUkNfVklEX0lOVEVSTkFMX1RJTUlORzsKKwllbHNlCisJCXJlZyAmPSB+WllO UU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfVklEX0lOVEVSTkFMX1RJTUlORzsKKwl6eW5xbXBfZGlz cF93cml0ZShhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDLCByZWcpOwor fQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfYXVkX2Nsb2NrX3NyYyAtIFNldCB0 aGUgYXVkaW8gY2xvY2sgc291cmNlCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICog QGZyb21fcHM6IGZsYWcgaWYgdGhlIHZpZGVvIGNsb2NrIGlzIGZyb20gcHMKKyAqCisgKiBTZXQg dGhlIGF1ZGlvIGNsb2NrIHNvdXJjZSBiYXNlZCBvbiBAZnJvbV9wcy4gSXQgY2FuIGNvbWUgZnJv bSBlaXRoZXIgUFMgb3IKKyAqIFBMLgorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYXZf YnVmX3NldF9hdWRfY2xvY2tfc3JjKHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwK KwkJCQkgICAgIGJvb2wgZnJvbV9wcykKK3sKKwl1MzIgcmVnID0genlucW1wX2Rpc3BfcmVhZChh dl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDKTsKKworCWlmIChmcm9tX3Bz KQorCQlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfQVVEX0ZST01fUFM7CisJZWxz ZQorCQlyZWcgJj0gflpZTlFNUF9ESVNQX0FWX0JVRl9DTEtfU1JDX0FVRF9GUk9NX1BTOworCXp5 bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkMs IHJlZyk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX2VuYWJsZV9idWYgLSBFbmFi bGUgYnVmZmVycworICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqCisgKiBFbmFibGUg YWxsICh2aWRlbyBhbmQgYXVkaW8pIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBf ZGlzcF9hdl9idWZfZW5hYmxlX2J1ZihzdHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmICphdl9idWYp Cit7CisJdTMyIHJlZywgaTsKKworCXJlZyA9IFpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9FTjsK KwlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGX0JVUlNUX0xFTl9NQVggPDwKKwkgICAg ICAgWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGX0JVUlNUX0xFTl9TSElGVDsKKworCWZvciAoaSA9 IDA7IGkgPCBaWU5RTVBfRElTUF9BVl9CVUZfTlVNX1ZJRF9HRlhfQlVGRkVSUzsgaSsrKQorCQl6 eW5xbXBfZGlzcF93cml0ZShhdl9idWYtPmJhc2UsCisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZf Q0hCVUYgKyBpICogNCwgcmVnKTsKKworCXJlZyA9IFpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9F TjsKKwlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGX0JVUlNUX0xFTl9BVURfTUFYIDw8 CisJICAgICAgIFpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9CVVJTVF9MRU5fU0hJRlQ7CisKKwlm b3IgKDsgaSA8IFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fQlVGRkVSUzsgaSsrKQorCQl6eW5xbXBf ZGlzcF93cml0ZShhdl9idWYtPmJhc2UsCisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUYg KyBpICogNCwgcmVnKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZV9i dWYgLSBEaXNhYmxlIGJ1ZmZlcnMKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKgor ICogRGlzYWJsZSBhbGwgKHZpZGVvIGFuZCBhdWRpbykgYnVmZmVycy4KKyAqLworc3RhdGljIHZv aWQKK3p5bnFtcF9kaXNwX2F2X2J1Zl9kaXNhYmxlX2J1ZihzdHJ1Y3QgenlucW1wX2Rpc3BfYXZf YnVmICphdl9idWYpCit7CisJdTMyIHJlZywgaTsKKworCXJlZyA9IFpZTlFNUF9ESVNQX0FWX0JV Rl9DSEJVRl9GTFVTSCAmIH5aWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfRU47CisJZm9yIChpID0g MDsgaSA8IFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fQlVGRkVSUzsgaSsrKQorCQl6eW5xbXBfZGlz cF93cml0ZShhdl9idWYtPmJhc2UsCisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUYgKyBp ICogNCwgcmVnKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxlX2F1ZCAt IEVuYWJsZSBhdWRpbworICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqCisgKiBFbmFi bGUgYWxsIGF1ZGlvIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9i dWZfZW5hYmxlX2F1ZChzdHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmICphdl9idWYpCit7CisJdTMy IHJlZzsKKworCXJlZyA9IHp5bnFtcF9kaXNwX3JlYWQoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElT UF9BVl9CVUZfT1VUUFVUKTsKKwlyZWcgJj0gflpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVE MV9NQVNLOworCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfTUVNOworCXJl ZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDJfRU47CisJenlucW1wX2Rpc3Bfd3Jp dGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVULCByZWcpOworfQorCisv KioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGUgLSBFbmFibGUgdGhlIHZpZGVvIHBpcGUK KyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKgorICogRGUtYXNzZXJ0IHRoZSB2aWRl byBwaXBlIHJlc2V0CisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxl KHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZikKK3sKKwl6eW5xbXBfZGlzcF93cml0 ZShhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9TUlNUX1JFRywgMCk7Cit9CisKKy8q KgorICogenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGUgLSBEaXNhYmxlIHRoZSB2aWRlbyBwaXBl CisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICoKKyAqIEFzc2VydCB0aGUgdmlkZW8g cGlwZSByZXNldAorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGUo c3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmKQoreworCXp5bnFtcF9kaXNwX3dyaXRl KGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX1NSU1RfUkVHLAorCQkJICBaWU5RTVBf RElTUF9BVl9CVUZfU1JTVF9SRUdfVklEX1JTVCk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3Bf YXZfYnVmX2Rpc2FibGVfYXVkIC0gRGlzYWJsZSBhdWRpbworICogQGF2X2J1ZjogYXYgYnVmZmVy IG1hbmFnZXIKKyAqCisgKiBEaXNhYmxlIGFsbCBhdWRpbyBidWZmZXJzLgorICovCitzdGF0aWMg dm9pZAorenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGVfYXVkKHN0cnVjdCB6eW5xbXBfZGlzcF9h dl9idWYgKmF2X2J1ZikKK3sKKwl1MzIgcmVnOworCisJcmVnID0genlucW1wX2Rpc3BfcmVhZChh dl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQpOworCXJlZyAmPSB+WllOUU1Q X0RJU1BfQVZfQlVGX09VVFBVVF9BVUQxX01BU0s7CisJcmVnIHw9IFpZTlFNUF9ESVNQX0FWX0JV Rl9PVVRQVVRfQVVEMV9ESVNBQkxFOworCXJlZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVGX09VVFBV VF9BVUQyX0VOOworCXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1Bf QVZfQlVGX09VVFBVVCwgcmVnKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfc2V0 X3RwZyAtIFNldCBUUEcgbW9kZQorICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqIEB0 cGdfb246IGlmIFRQRyBzaG91bGQgYmUgb24KKyAqCisgKiBTZXQgdGhlIFRQRyBtb2RlIGJhc2Vk IG9uIEB0cGdfb24uCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfdHBn KHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwKKwkJCQkgICAgICAgYm9vbCB0cGdf b24pCit7CisJdTMyIHJlZzsKKworCXJlZyA9IHp5bnFtcF9kaXNwX3JlYWQoYXZfYnVmLT5iYXNl LCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUKTsKKwlyZWcgJj0gflpZTlFNUF9ESVNQX0FWX0JV Rl9PVVRQVVRfVklEMV9NQVNLOworCWlmICh0cGdfb24pCisJCXJlZyB8PSBaWU5RTVBfRElTUF9B Vl9CVUZfT1VUUFVUX1ZJRDFfUEFUVEVSTjsKKwllbHNlCisJCXJlZyAmPSB+WllOUU1QX0RJU1Bf QVZfQlVGX09VVFBVVF9WSUQxX1BBVFRFUk47CisJenlucW1wX2Rpc3Bfd3JpdGUoYXZfYnVmLT5i YXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVULCByZWcpOworfQorCisvKioKKyAqIHp5bnFt cF9kaXNwX2F2X2J1Zl9lbmFibGVfdmlkIC0gRW5hYmxlIHRoZSB2aWRlbyBsYXllciBidWZmZXIK KyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKiBAbGF5ZXI6IGxheWVyIHRvIGVuYWJs ZQorICogQG1vZGU6IG9wZXJhdGlvbiBtb2RlIG9mIGxheWVyCisgKgorICogRW5hYmxlIHRoZSB2 aWRlby9ncmFwaGljcyBidWZmZXIgZm9yIEBsYXllci4KKyAqLworc3RhdGljIHZvaWQgenlucW1w X2Rpc3BfYXZfYnVmX2VuYWJsZV92aWQoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVm LAorCQkJCQkgIHN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqbGF5ZXIsCisJCQkJCSAgZW51bSB6 eW5xbXBfZGlzcF9sYXllcl9tb2RlIG1vZGUpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IHp5bnFt cF9kaXNwX3JlYWQoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUKTsKKwlp ZiAobGF5ZXItPmlkID09IFpZTlFNUF9ESVNQX0xBWUVSX1ZJRCkgeworCQlyZWcgJj0gflpZTlFN UF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMV9NQVNLOworCQlpZiAobW9kZSA9PSBaWU5RTVBfRElT UF9MQVlFUl9OT05MSVZFKQorCQkJcmVnIHw9IFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklE MV9NRU07CisJCWVsc2UKKwkJCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDFf TElWRTsKKwl9IGVsc2UgeworCQlyZWcgJj0gflpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklE Ml9NQVNLOworCQlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQyX01FTTsKKwkJ aWYgKG1vZGUgPT0gWllOUU1QX0RJU1BfTEFZRVJfTk9OTElWRSkKKwkJCXJlZyB8PSBaWU5RTVBf RElTUF9BVl9CVUZfT1VUUFVUX1ZJRDJfTUVNOworCQllbHNlCisJCQlyZWcgfD0gWllOUU1QX0RJ U1BfQVZfQlVGX09VVFBVVF9WSUQyX0xJVkU7CisJfQorCXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1 Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVCwgcmVnKTsKK30KKworLyoqCisgKiB6 eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZV92aWQgLSBEaXNhYmxlIHRoZSB2aWRlbyBsYXllciBi dWZmZXIKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKiBAbGF5ZXI6IGxheWVyIHRv IGRpc2FibGUKKyAqCisgKiBEaXNhYmxlIHRoZSB2aWRlby9ncmFwaGljcyBidWZmZXIgZm9yIEBs YXllci4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2F2X2J1Zl9kaXNhYmxlX3ZpZChz dHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmICphdl9idWYsCisJCQkgICAgICAgc3RydWN0IHp5bnFt cF9kaXNwX2xheWVyICpsYXllcikKK3sKKwl1MzIgcmVnOworCisJcmVnID0genlucW1wX2Rpc3Bf cmVhZChhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQpOworCWlmIChsYXll ci0+aWQgPT0gWllOUU1QX0RJU1BfTEFZRVJfVklEKSB7CisJCXJlZyAmPSB+WllOUU1QX0RJU1Bf QVZfQlVGX09VVFBVVF9WSUQxX01BU0s7CisJCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VU UFVUX1ZJRDFfTk9ORTsKKwl9IGVsc2UgeworCQlyZWcgJj0gflpZTlFNUF9ESVNQX0FWX0JVRl9P VVRQVVRfVklEMl9NQVNLOworCQlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQy X0RJU0FCTEU7CisJfQorCXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJ U1BfQVZfQlVGX09VVFBVVCwgcmVnKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZf aW5pdF9zZiAtIEluaXRpYWxpemUgc2NhbGluZyBmYWN0b3JzCisgKiBAYXZfYnVmOiBhdiBidWZm ZXIgbWFuYWdlcgorICogQHZpZF9mbXQ6IHZpZGVvIGZvcm1hdCBkZXNjcmlwdG9yCisgKiBAZ2Z4 X2ZtdDogZ3JhcGhpY3MgZm9ybWF0IGRlc2NyaXB0b3IKKyAqCisgKiBJbml0aWFsaXplIHNjYWxp bmcgZmFjdG9ycyBmb3IgYm90aCB2aWRlbyBhbmQgZ3JhcGhpY3MgbGF5ZXJzLgorICogSWYgdGhl IGZvcm1hdCBkZXNjcmlwdG9yIGlzIE5VTEwsIHRoZSBmdW5jdGlvbiBza2lwcyB0aGUgcHJvZ3Jh bW1pbmcuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2F2X2J1Zl9pbml0X3NmKHN0cnVj dCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHp5 bnFtcF9kaXNwX2ZtdCAqdmlkX2ZtdCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHp5bnFtcF9k aXNwX2ZtdCAqZ2Z4X2ZtdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgb2Zmc2V0OworCisJ aWYgKGdmeF9mbXQpIHsKKwkJb2Zmc2V0ID0gWllOUU1QX0RJU1BfQVZfQlVGX0dGWF9DT01QMF9T RjsKKwkJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fU0Y7IGkrKykKKwkJ CXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgb2Zmc2V0ICsgaSAqIDQsCisJCQkJCSAg Z2Z4X2ZtdC0+c2ZbaV0pOworCX0KKworCWlmICh2aWRfZm10KSB7CisJCW9mZnNldCA9IFpZTlFN UF9ESVNQX0FWX0JVRl9WSURfQ09NUDBfU0Y7CisJCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBfRElT UF9BVl9CVUZfTlVNX1NGOyBpKyspCisJCQl6eW5xbXBfZGlzcF93cml0ZShhdl9idWYtPmJhc2Us IG9mZnNldCArIGkgKiA0LAorCQkJCQkgIHZpZF9mbXQtPnNmW2ldKTsKKwl9Cit9CisKKy8qCisg KiBBdWRpbyBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHp5bnFtcF9kaXNwX2F1ZF9pbml0IC0g SW5pdGlhbGl6ZSB0aGUgYXVkaW8KKyAqIEBhdWQ6IGF1ZGlvCisgKgorICogSW5pdGlhbGl6ZSB0 aGUgYXVkaW8gd2l0aCBkZWZhdWx0IG1peGVyIHZvbHVtZS4gVGhlIGRlLWFzc2VydGlvbiB3aWxs CisgKiBpbml0aWFsaXplIHRoZSBhdWRpbyBzdGF0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFt cF9kaXNwX2F1ZF9pbml0KHN0cnVjdCB6eW5xbXBfZGlzcF9hdWQgKmF1ZCkKK3sKKwkvKiBDbGVh ciB0aGUgYXVkaW8gc29mdCByZXNldCByZWdpc3RlciBhcyBpdCdzIGFuIG5vbi1yZXNldCBmbG9w ICovCisJenlucW1wX2Rpc3Bfd3JpdGUoYXVkLT5iYXNlLCBaWU5RTVBfRElTUF9BVURfU09GVF9S RVNFVCwgMCk7CisJenlucW1wX2Rpc3Bfd3JpdGUoYXVkLT5iYXNlLCBaWU5RTVBfRElTUF9BVURf TUlYRVJfVk9MVU1FLAorCQkJICBaWU5RTVBfRElTUF9BVURfTUlYRVJfVk9MVU1FX05PX1NDQUxF KTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdWRfZGVpbml0IC0gRGUtaW5pdGlhbGl6ZSB0 aGUgYXVkaW8KKyAqIEBhdWQ6IGF1ZGlvCisgKgorICogUHV0IHRoZSBhdWRpbyBpbiByZXNldC4K KyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfYXVkX2RlaW5pdChzdHJ1Y3QgenlucW1wX2Rp c3BfYXVkICphdWQpCit7CisJenlucW1wX2Rpc3Bfc2V0KGF1ZC0+YmFzZSwgWllOUU1QX0RJU1Bf QVVEX1NPRlRfUkVTRVQsCisJCQlaWU5RTVBfRElTUF9BVURfU09GVF9SRVNFVF9BVURfU1JTVCk7 Cit9CisKKy8qCisgKiBaeW5xTVAgRGlzcGxheSBsYXllciBmdW5jdGlvbnMKKyAqLworCisvKioK KyAqIHp5bnFtcF9kaXNwX2xheWVyX2NoZWNrX3NpemUgLSBWZXJpZnkgd2lkdGggYW5kIGhlaWdo dCBmb3IgdGhlIGxheWVyCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBsYXllcjog bGF5ZXIKKyAqIEB3aWR0aDogd2lkdGgKKyAqIEBoZWlnaHQ6IGhlaWdodAorICoKKyAqIFRoZSBE aXNwbGF5IHN1YnN5c3RlbSBoYXMgdGhlIGxpbWl0YXRpb24gdGhhdCBib3RoIGxheWVycyBzaG91 bGQgaGF2ZQorICogaWRlbnRpY2FsIHNpemUuIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHdpZHRoIGFu ZCBoZWlnaHQgb2YgQGxheWVyLCBhbmQgdmVyaWZpZXMKKyAqIGlmIHRoZSBzaXplICh3aWR0aCBh bmQgaGVpZ2h0KSBpcyB2YWxpZC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgLUVJ TlZBTCBpZiB3aWR0aCBvci9hbmQgaGVpZ2h0IGlzIGludmFsaWQuCisgKi8KK3N0YXRpYyBpbnQg enlucW1wX2Rpc3BfbGF5ZXJfY2hlY2tfc2l6ZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AsCisJ CQkJCXN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqbGF5ZXIsCisJCQkJCXUzMiB3aWR0aCwgdTMy IGhlaWdodCkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKm90aGVyID0gbGF5ZXItPm90 aGVyOworCisJaWYgKG90aGVyLT5lbmFibGVkICYmIChvdGhlci0+dyAhPSB3aWR0aCB8fCBvdGhl ci0+aCAhPSBoZWlnaHQpKSB7CisJCWRldl9lcnIoZGlzcC0+ZGV2LCAiTGF5ZXIgd2lkdGg6aGVp Z2h0IG11c3QgYmUgJWQ6JWRcbiIsCisJCQlvdGhlci0+dywgb3RoZXItPmgpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlsYXllci0+dyA9IHdpZHRoOworCWxheWVyLT5oID0gaGVpZ2h0Owor CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfbWFwX2ZtdCAtIEZpbmQgdGhl IERpc3BsYXkgc3Vic3lzdGVtIGZvcm1hdCBmb3IgZ2l2ZW4gZHJtIGZvcm1hdAorICogQGZtdHM6 IGZvcm1hdCB0YWJsZSB0byBsb29rIHVwCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgdGFibGUgQGZt dHMKKyAqIEBkcm1fZm10OiBEUk0gZm9ybWF0IHRvIHNlYXJjaAorICoKKyAqIFNlYXJjaCBhIERp c3BsYXkgc3Vic3lzdGVtIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBEUk0gZm9y bWF0CisgKiBAZHJtX2ZtdCwgYW5kIHJldHVybiB0aGUgZm9ybWF0IGRlc2NyaXB0b3Igd2hpY2gg Y29udGFpbnMgdGhlIERpc3BsYXkKKyAqIHN1YnN5c3RlbSBmb3JtYXQgdmFsdWUuCisgKgorICog UmV0dXJuOiBhIERpc3BsYXkgc3Vic3lzdGVtIGZvcm1hdCBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3Ms IG9yIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10ICoKK3p5 bnFtcF9kaXNwX21hcF9mbXQoY29uc3Qgc3RydWN0IHp5bnFtcF9kaXNwX2ZtdCBmbXRzW10sCisJ CSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdWludDMyX3QgZHJtX2ZtdCkKK3sKKwl1bnNpZ25lZCBp bnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWlmIChmbXRzW2ldLmRybV9m bXQgPT0gZHJtX2ZtdCkKKwkJCXJldHVybiAmZm10c1tpXTsKKworCXJldHVybiBOVUxMOworfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX3NldF9mbXQgLSBTZXQgdGhlIGZvcm1hdCBvZiB0aGUgbGF5 ZXIKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICogQGxheWVyOiBsYXllciB0byBzZXQg dGhlIGZvcm1hdAorICogQGRybV9mbXQ6IERSTSBmb3JtYXQgdG8gc2V0CisgKgorICogU2V0IHRo ZSBmb3JtYXQgb2YgdGhlIGdpdmVuIGxheWVyIHRvIEBkcm1fZm10LgorICoKKyAqIFJldHVybjog MCBvbiBzdWNjZXNzLiAtRUlOVkFMIGlmIEBkcm1fZm10IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhl IGxheWVyLgorICovCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2xheWVyX3NldF9mbXQoc3RydWN0 IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJCSAgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICps YXllciwKKwkJCQkgICAgIHVpbnQzMl90IGRybV9mbXQpCit7CisJY29uc3Qgc3RydWN0IHp5bnFt cF9kaXNwX2ZtdCAqZm10OworCWNvbnN0IHN0cnVjdCB6eW5xbXBfZGlzcF9mbXQgKnZpZF9mbXQg PSBOVUxMLCAqZ2Z4X2ZtdCA9IE5VTEw7CisJdTMyIHNpemUsIGZtdHMsIG1hc2s7CisKKwlpZiAo bGF5ZXItPmlkID09IFpZTlFNUF9ESVNQX0xBWUVSX1ZJRCkgeworCQlzaXplID0gQVJSQVlfU0la RShhdl9idWZfdmlkX2ZtdHMpOworCQltYXNrID0gflpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxf VklEX01BU0s7CisJCWZtdCA9IHp5bnFtcF9kaXNwX21hcF9mbXQoYXZfYnVmX3ZpZF9mbXRzLCBz aXplLCBkcm1fZm10KTsKKwkJdmlkX2ZtdCA9IGZtdDsKKwl9IGVsc2UgeworCQlzaXplID0gQVJS QVlfU0laRShhdl9idWZfZ2Z4X2ZtdHMpOworCQltYXNrID0gflpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfR0ZYX01BU0s7CisJCWZtdCA9IHp5bnFtcF9kaXNwX21hcF9mbXQoYXZfYnVmX2dmeF9m bXRzLCBzaXplLCBkcm1fZm10KTsKKwkJZ2Z4X2ZtdCA9IGZtdDsKKwl9CisKKwlpZiAoIWZtdCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbXRzID0genlucW1wX2Rpc3BfYXZfYnVmX2dldF9mbXQo JmRpc3AtPmF2X2J1Zik7CisJZm10cyAmPSBtYXNrOworCWZtdHMgfD0gZm10LT5kaXNwX2ZtdDsK Kwl6eW5xbXBfZGlzcF9hdl9idWZfc2V0X2ZtdCgmZGlzcC0+YXZfYnVmLCBmbXRzKTsKKwl6eW5x bXBfZGlzcF9hdl9idWZfaW5pdF9zZigmZGlzcC0+YXZfYnVmLCB2aWRfZm10LCBnZnhfZm10KTsK KwlsYXllci0+Zm10ID0gZm10OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2Rp c3Bfc2V0X3RwZyAtIEVuYWJsZSBvciBkaXNhYmxlIFRQRworICogQGRpc3A6IERpc3BsYXkgc3Vi c3lzdGVtCisgKiBAbGF5ZXI6IFZpZGVvIGxheWVyCisgKiBAdHBnX29uOiBmbGFnIGlmIFRQRyBu ZWVkcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgKgorICogRW5hYmxlIC8gZGlzYWJsZSB0 aGUgVFBHIG1vZGUgb24gdGhlIHZpZGVvIGxheWVyIEBsYXllciBkZXBlbmRpbmcgb24KKyAqIEB0 cGdfb24uIFRoZSB2aWRlbyBsYXllciBzaG91bGQgYmUgZGlzYWJsZWQgcHJpb3IgdG8gZW5hYmxl IHJlcXVlc3QuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuIC1FTk9ERVYgaWYgaXQncyBu b3QgdmlkZW8gbGF5ZXIuIC1FSU8gaWYKKyAqIHRoZSB2aWRlbyBsYXllciBpcyBlbmFibGVkLgor ICovCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2xheWVyX3NldF90cGcoc3RydWN0IHp5bnFtcF9k aXNwICpkaXNwLAorCQkJCSAgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciwKKwkJ CQkgICAgIGJvb2wgdHBnX29uKQoreworCWlmIChsYXllci0+aWQgIT0gWllOUU1QX0RJU1BfTEFZ RVJfVklEKSB7CisJCWRldl9lcnIoZGlzcC0+ZGV2LAorCQkJIm9ubHkgdGhlIHZpZGVvIGxheWVy IGhhcyB0aGUgdHBnIG1vZGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobGF5 ZXItPmVuYWJsZWQpIHsKKwkJZGV2X2VycihkaXNwLT5kZXYsCisJCQkidGhlIHZpZGVvIGxheWVy IHNob3VsZCBiZSBkaXNhYmxlZCBmb3IgdHBnIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9 CisKKwl6eW5xbXBfZGlzcF9hdl9idWZfc2V0X3RwZygmZGlzcC0+YXZfYnVmLCB0cGdfb24pOwor CWRpc3AtPnRwZ19vbiA9IHRwZ19vbjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFt cF9kaXNwX2dldF9mbXQgLSBHZXQgdGhlIHN1cHBvcnRlZCBEUk0gZm9ybWF0cyBvZiB0aGUgbGF5 ZXIKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICogQGxheWVyOiBsYXllciB0byBnZXQg dGhlIGZvcm1hdHMKKyAqIEBkcm1fZm10czogcG9pbnRlciB0byBhcnJheSBvZiBEUk0gZm9ybWF0 IHN0cmluZ3MKKyAqIEBudW1fZm10czogcG9pbnRlciB0byBudW1iZXIgb2YgcmV0dXJuZWQgRFJN IGZvcm1hdHMKKyAqCisgKiBHZXQgdGhlIHN1cHBvcnRlZCBEUk0gZm9ybWF0cyBvZiB0aGUgZ2l2 ZW4gbGF5ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2xheWVyX2dldF9mbXRzKHN0 cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwKKwkJCQkgICAgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xh eWVyICpsYXllciwKKwkJCQkgICAgICAgdTMyICoqZHJtX2ZtdHMsIHVuc2lnbmVkIGludCAqbnVt X2ZtdHMpCit7CisJKmRybV9mbXRzID0gbGF5ZXItPmRybV9mbXRzOworCSpudW1fZm10cyA9IGxh eWVyLT5udW1fZm10czsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9lbmFibGUgLSBF bmFibGUgdGhlIGxheWVyCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBsYXllcjog bGF5ZXIgdG8gZXNhYmxlCisgKiBAbW9kZTogb3BlcmF0aW9uIG1vZGUKKyAqCisgKiBFbmFibGUg dGhlIGxheWVyIEBsYXllci4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNl IGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfbGF5ZXJfZW5hYmxlKHN0 cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwKKwkJCQkgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVy ICpsYXllciwKKwkJCQkgICAgZW51bSB6eW5xbXBfZGlzcF9sYXllcl9tb2RlIG1vZGUpCit7CisJ c3RydWN0IGRldmljZSAqZGV2ID0gZGlzcC0+ZGV2OworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVz Y3JpcHRvciAqZGVzYzsKKwllbnVtIGRtYV9jdHJsX2ZsYWdzIGZsYWdzOworCXVuc2lnbmVkIGlu dCBpOworCisJaWYgKGxheWVyLT5lbmFibGVkICYmIGxheWVyLT5tb2RlICE9IG1vZGUpIHsKKwkJ ZGV2X2VycihkZXYsICJsYXllciBpcyBhbHJlYWR5IGVuYWJsZWQgaW4gZGlmZmVyZW50IG1vZGVc biIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXp5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGVf dmlkKCZkaXNwLT5hdl9idWYsIGxheWVyLCBtb2RlKTsKKwl6eW5xbXBfZGlzcF9ibGVuZF9sYXll cl9lbmFibGUoJmRpc3AtPmJsZW5kLCBsYXllcik7CisKKwlsYXllci0+ZW5hYmxlZCA9IHRydWU7 CisJbGF5ZXItPm1vZGUgPSBtb2RlOworCisJaWYgKG1vZGUgPT0gWllOUU1QX0RJU1BfTEFZRVJf TElWRSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTUFYX05V TV9TVUJfUExBTkVTOyBpKyspIHsKKwkJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyX2RtYSAqZG1h ID0gJmxheWVyLT5kbWFbaV07CisKKwkJaWYgKGRtYS0+Y2hhbiAmJiBkbWEtPmlzX2FjdGl2ZSkg eworCQkJZmxhZ3MgPSBETUFfQ1RSTF9BQ0sgfCBETUFfUFJFUF9JTlRFUlJVUFQ7CisJCQlkZXNj ID0gZG1hZW5naW5lX3ByZXBfaW50ZXJsZWF2ZWRfZG1hKGRtYS0+Y2hhbiwKKwkJCQkJCQkgICAg ICAmZG1hLT54dCwgZmxhZ3MpOworCQkJaWYgKCFkZXNjKSB7CisJCQkJZGV2X2VycihkZXYsICJm YWlsZWQgdG8gcHJlcCBETUEgZGVzY3JpcHRvclxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJ CQl9CisKKwkJCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisJCQlkbWFfYXN5bmNfaXNzdWVfcGVu ZGluZyhkbWEtPmNoYW4pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlu cW1wX2Rpc3BfbGF5ZXJfZGlzYWJsZSAtIERpc2FibGUgdGhlIGxheWVyCisgKiBAZGlzcDogRGlz cGxheSBzdWJzeXN0ZW0KKyAqIEBsYXllcjogbGF5ZXIgdG8gZGlzYWJsZQorICogQG1vZGU6IG9w ZXJhdGlvbiBtb2RlCisgKgorICogRGlzYWJsZSB0aGUgbGF5ZXIgQGxheWVyLgorICoKKyAqIFJl dHVybjogMCBvbiBzdWNjZXNzLCBvciAtRUJVU1kgaWYgdGhlIGxheWVyIGlzIGluIGRpZmZlcmVu dCBtb2RlLgorICovCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2xheWVyX2Rpc2FibGUoc3RydWN0 IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJCSAgICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICps YXllciwKKwkJCQkgICAgIGVudW0genlucW1wX2Rpc3BfbGF5ZXJfbW9kZSBtb2RlKQoreworCXN0 cnVjdCBkZXZpY2UgKmRldiA9IGRpc3AtPmRldjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChs YXllci0+bW9kZSAhPSBtb2RlKSB7CisJCWRldl9lcnIoZGV2LCAidGhlIGxheWVyIGlzIG9wZXJh dGluZyBpbiBkaWZmZXJlbnQgbW9kZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZm9y IChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX01BWF9OVU1fU1VCX1BMQU5FUzsgaSsrKQorCQlpZiAo bGF5ZXItPmRtYVtpXS5jaGFuICYmIGxheWVyLT5kbWFbaV0uaXNfYWN0aXZlKQorCQkJZG1hZW5n aW5lX3Rlcm1pbmF0ZV9zeW5jKGxheWVyLT5kbWFbaV0uY2hhbik7CisKKwl6eW5xbXBfZGlzcF9h dl9idWZfZGlzYWJsZV92aWQoJmRpc3AtPmF2X2J1ZiwgbGF5ZXIpOworCXp5bnFtcF9kaXNwX2Js ZW5kX2xheWVyX2Rpc2FibGUoJmRpc3AtPmJsZW5kLCBsYXllcik7CisJbGF5ZXItPmVuYWJsZWQg PSBmYWxzZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2xheWVyX3Jl cXVlc3RfZG1hIC0gUmVxdWVzdCBETUEgY2hhbm5lbHMgZm9yIGEgbGF5ZXIKKyAqIEBkaXNwOiBE aXNwbGF5IHN1YnN5c3RlbQorICogQGxheWVyOiBsYXllciB0byByZXF1ZXN0IERNQSBjaGFubmVs cworICogQG5hbWU6IGlkZW50aWZpZXIgc3RyaW5nIGZvciBsYXllciB0eXBlCisgKgorICogUmVx dWVzdCBETUEgZW5naW5lIGNoYW5uZWxzIGZvciBjb3JyZXNwb25kaW5nIGxheWVyLgorICoKKyAq IFJldHVybjogMCBvbiBzdWNjZXNzLCBvciBlcnIgdmFsdWUgZnJvbSBvZl9kbWFfcmVxdWVzdF9z bGF2ZV9jaGFubmVsKCkuCisgKi8KK3N0YXRpYyBpbnQKK3p5bnFtcF9kaXNwX2xheWVyX3JlcXVl c3RfZG1hKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwKKwkJCSAgICAgIHN0cnVjdCB6eW5xbXBf ZGlzcF9sYXllciAqbGF5ZXIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHp5bnFtcF9k aXNwX2xheWVyX2RtYSAqZG1hOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3Ig KGkgPSAwOyBpIDwgbGF5ZXItPm51bV9jaGFuOyBpKyspIHsKKwkJY2hhciB0ZW1wWzE2XTsKKwor CQlkbWEgPSAmbGF5ZXItPmRtYVtpXTsKKwkJc25wcmludGYodGVtcCwgc2l6ZW9mKHRlbXApLCAi JXMlZCIsIG5hbWUsIGkpOworCQlkbWEtPmNoYW4gPSBvZl9kbWFfcmVxdWVzdF9zbGF2ZV9jaGFu bmVsKGxheWVyLT5vZl9ub2RlLAorCQkJCQkJCSB0ZW1wKTsKKwkJaWYgKElTX0VSUihkbWEtPmNo YW4pKSB7CisJCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGRtYSBjaGFu bmVsXG4iKTsKKwkJCXJldCA9IFBUUl9FUlIoZG1hLT5jaGFuKTsKKwkJCWRtYS0+Y2hhbiA9IE5V TEw7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICog enlucW1wX2Rpc3BfbGF5ZXJfcmVsZWFzZV9kbWEgLSBSZWxlYXNlIERNQSBjaGFubmVscyBmb3Ig YSBsYXllcgorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAbGF5ZXI6IGxheWVyIHRv IHJlbGVhc2UgRE1BIGNoYW5uZWxzCisgKgorICogUmVsZWFzZSB0aGUgZG1hIGNoYW5uZWxzIGFz c29jaWF0ZWQgd2l0aCBAbGF5ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2xheWVy X3JlbGVhc2VfZG1hKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwKKwkJCQkJICBzdHJ1Y3Qgenlu cW1wX2Rpc3BfbGF5ZXIgKmxheWVyKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0g MDsgaSA8IGxheWVyLT5udW1fY2hhbjsgaSsrKSB7CisJCWlmIChsYXllci0+ZG1hW2ldLmNoYW4p IHsKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBpcyB0ZXJtaW5hdGVkIGJlZm9yZSByZWxl YXNlICovCisJCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChsYXllci0+ZG1hW2ldLmNoYW4pOwor CQkJZG1hX3JlbGVhc2VfY2hhbm5lbChsYXllci0+ZG1hW2ldLmNoYW4pOworCQl9CisJfQorfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX2xheWVyX2lzX2xpdmUgLSBpZiBhbnkgbGF5ZXIgaXMgbGl2 ZQorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGFu eSBsYXllciBpcyBsaXZlCisgKi8KK3N0YXRpYyBib29sIHp5bnFtcF9kaXNwX2xheWVyX2lzX2xp dmUoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9y IChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX05VTV9MQVlFUlM7IGkrKykgeworCQlpZiAoZGlzcC0+ bGF5ZXJzW2ldLmVuYWJsZWQgJiYKKwkJICAgIGRpc3AtPmxheWVyc1tpXS5tb2RlID09IFpZTlFN UF9ESVNQX0xBWUVSX0xJVkUpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7 Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfbGF5ZXJfaXNfZW5hYmxlZCAtIGlmIGFueSBsYXll ciBpcyBlbmFibGVkCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1cm46 IHRydWUgaWYgYW55IGxheWVyIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGJvb2wgenlucW1wX2Rp c3BfbGF5ZXJfaXNfZW5hYmxlZChzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJdW5zaWdu ZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTlVNX0xBWUVSUzsgaSsr KQorCQlpZiAoZGlzcC0+bGF5ZXJzW2ldLmVuYWJsZWQpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJl dHVybiBmYWxzZTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9kZXN0cm95IC0gRGVz dHJveSBhbGwgbGF5ZXJzCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBEZXN0 cm95IGFsbCBsYXllcnMuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2xheWVyX2Rlc3Ry b3koc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9y IChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX05VTV9MQVlFUlM7IGkrKykgeworCQl6eW5xbXBfZGlz cF9sYXllcl9yZWxlYXNlX2RtYShkaXNwLCAmZGlzcC0+bGF5ZXJzW2ldKTsKKwkJaWYgKGRpc3At PmxheWVyc1tpXS5vZl9ub2RlKQorCQkJb2Zfbm9kZV9wdXQoZGlzcC0+bGF5ZXJzW2ldLm9mX25v ZGUpOworCX0KK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9jcmVhdGUgLSBDcmVhdGUg YWxsIGxheWVycworICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogQ3JlYXRlIGFs bCBsYXllcnMuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBj b2RlIGZyb20gZmFpbGVkIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfbGF5 ZXJfY3JlYXRlKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rp c3BfbGF5ZXIgKmxheWVyOworCXVuc2lnbmVkIGludCBpOworCWludCBudW1fY2hhbnNbWllOUU1Q X0RJU1BfTlVNX0xBWUVSU10gPSB7IDMsIDEgfTsKKwljb25zdCBjaGFyICogY29uc3QgZG1hX25h bWVbXSA9IHsgInZpZCIsICJnZngiIH07CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBa WU5RTVBfRElTUF9OVU1fTEFZRVJTOyBpKyspIHsKKwkJbGF5ZXIgPSAmZGlzcC0+bGF5ZXJzW2ld OworCQlsYXllci0+aWQgPSBpOworCQlsYXllci0+b2Zmc2V0ID0gaSAqIDQ7CisJCWxheWVyLT5v dGhlciA9ICZkaXNwLT5sYXllcnNbIWldOworCQlsYXllci0+bnVtX2NoYW4gPSBudW1fY2hhbnNb aV07CisJCWxheWVyLT5vZl9ub2RlID0gZGlzcC0+ZGV2LT5vZl9ub2RlOworCQlyZXQgPSB6eW5x bXBfZGlzcF9sYXllcl9yZXF1ZXN0X2RtYShkaXNwLCBsYXllciwgZG1hX25hbWVbaV0pOworCQlp ZiAocmV0KQorCQkJZ290byBlcnI7CisJCWxheWVyLT5kaXNwID0gZGlzcDsKKwl9CisKKwlyZXR1 cm4gMDsKKworZXJyOgorCXp5bnFtcF9kaXNwX2xheWVyX2Rlc3Ryb3koZGlzcCk7CisJcmV0dXJu IHJldDsKK30KKworLyoKKyAqIFp5bnFNUCBEaXNwbGF5IGludGVybmFsIGZ1bmN0aW9ucworICov CisKKy8qCisgKiBPdXRwdXQgZm9ybWF0IGVudW1lcmF0aW9uLgorICogVGhlIElEIHNob3VsZCBi ZSBhbGlnbmVkIHdpdGggYmxlbmRfb3V0cHV0X2ZtdHMuCisgKiBUaGUgc3RyaW5nIHNob3VsZCBi ZSBhbGlnbmVkIHdpdGggaG93IHp5bnFtcF9kcF9zZXRfY29sb3IoKSBkZWNvZGVzLgorICovCitz dGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCB6eW5xbXBfZGlzcF9jb2xvcl9lbnVtW10g PSB7CisJeyAwLCAicmdiIiB9LAorCXsgMSwgInljcmNiNDQ0IiB9LAorCXsgMiwgInljcmNiNDIy IiB9LAorCXsgMywgInlvbmx5IiB9LAorfTsKKworLyoqCisgKiB6eW5xbXBfZGlzcF9zZXRfb3V0 cHV0X2ZtdCAtIFNldCB0aGUgb3V0cHV0IGZvcm1hdAorICogQGRpc3A6IERpc3BsYXkgc3Vic3lz dGVtCisgKiBAaWQ6IHRoZSBmb3JtYXQgSUQuIFJlZmVyIHRvIHp5bnFtcF9kaXNwX2NvbG9yX2Vu dW1bXS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhl IGRpc3BsYXkgLyBibGVuZGVyIGFzIHdlbGwgYXMKKyAqIHRoZSBmb3JtYXQgb2YgRFAgY29udHJv bGxlci4gVGhlIEBpZCBzaG91bGQgYmUgYWxpZ25lZCB3aXRoCisgKiB6eW5xbXBfZGlzcF9jb2xv cl9lbnVtLgorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3Bfc2V0X291dHB1dF9mbXQoc3Ry dWN0IHp5bnFtcF9kaXNwICpkaXNwLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJY29uc3Qgc3RydWN0 IHp5bnFtcF9kaXNwX2ZtdCAqZm10ID0gJmJsZW5kX291dHB1dF9mbXRzW2lkXTsKKworCXp5bnFt cF9kcF9zZXRfY29sb3IoZGlzcC0+ZHBzdWItPmRwLCB6eW5xbXBfZGlzcF9jb2xvcl9lbnVtW2lk XS5uYW1lKTsKKwl6eW5xbXBfZGlzcF9ibGVuZF9zZXRfb3V0cHV0X2ZtdCgmZGlzcC0+YmxlbmQs IGZtdC0+ZGlzcF9mbXQpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX3NldF9iZ19jb2xvciAt IFNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisg KiBAYzA6IGNvbG9yIGNvbXBvbmVudCAwCisgKiBAYzE6IGNvbG9yIGNvbXBvbmVudCAxCisgKiBA YzI6IGNvbG9yIGNvbXBvbmVudCAyCisgKgorICogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdp dGggZ2l2ZW4gY29sb3IgY29tcG9uZW50cyAoQGMwLCBAYzEsIEBjMikuCisgKi8KK3N0YXRpYyB2 b2lkIHp5bnFtcF9kaXNwX3NldF9iZ19jb2xvcihzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AsCisJ CQkJICAgICB1MzIgYzAsIHUzMiBjMSwgdTMyIGMyKQoreworCXp5bnFtcF9kaXNwX2JsZW5kX3Nl dF9iZ19jb2xvcigmZGlzcC0+YmxlbmQsIGMwLCBjMSwgYzIpOworfQorCisvKioKKyAqIHp5bnFt cF9kaXNwX3NldF9hbHBoYSAtIFNldCB0aGUgYWxwaGEgdmFsdWUKKyAqIEBkaXNwOiBEaXNwbGF5 IHN1YnN5c3RlbQorICogQGFscGhhOiBhbHBoYSB2YWx1ZSB0byBzZXQKKyAqCisgKiBTZXQgdGhl IGFscGhhIHZhbHVlIGZvciBibGVuZGluZy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3Bf c2V0X2FscGhhKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwgdTMyIGFscGhhKQoreworCWRpc3At PmFscGhhID0gYWxwaGE7CisJenlucW1wX2Rpc3BfYmxlbmRfc2V0X2FscGhhKCZkaXNwLT5ibGVu ZCwgYWxwaGEpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX3NldF9nX2FscGhhIC0gRW5hYmxl L2Rpc2FibGUgdGhlIGdsb2JhbCBhbHBoYSBibGVuZGluZworICogQGRpc3A6IERpc3BsYXkgc3Vi c3lzdGVtCisgKiBAZW5hYmxlOiBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGFscGhhIGJsZW5k aW5nCisgKgorICogU2V0IHRoZSBhbHBoYSB2YWx1ZSBmb3IgYmxlbmRpbmcuCisgKi8KK3N0YXRp YyB2b2lkIHp5bnFtcF9kaXNwX3NldF9nX2FscGhhKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCwg Ym9vbCBlbmFibGUpCit7CisJZGlzcC0+YWxwaGFfZW4gPSBlbmFibGU7CisJenlucW1wX2Rpc3Bf YmxlbmRfZW5hYmxlX2FscGhhKCZkaXNwLT5ibGVuZCwgZW5hYmxlKTsKK30KKworLyoqCisgKiB6 eW5xbXBfZGlzcF9lbmFibGUgLSBFbmFibGUgdGhlIERpc3BsYXkgc3Vic3lzdGVtCisgKiBAZGlz cDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBFbmFibGUgdGhlIERpc3BsYXkgc3Vic3lzdGVt LgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9lbmFibGUoc3RydWN0IHp5bnFtcF9kaXNw ICpkaXNwKQoreworCWJvb2wgbGl2ZTsKKworCWlmIChkaXNwLT5lbmFibGVkKQorCQlyZXR1cm47 CisKKwl6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxlKCZkaXNwLT5hdl9idWYpOworCS8qIENob29z ZSBjbG9jayBzb3VyY2UgYmFzZWQgb24gdGhlIERUIGNsb2NrIGhhbmRsZSAqLworCXp5bnFtcF9k aXNwX2F2X2J1Zl9zZXRfdmlkX2Nsb2NrX3NyYygmZGlzcC0+YXZfYnVmLCAhIWRpc3AtPl9wc19w Y2xrKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfc2V0X2F1ZF9jbG9ja19zcmMoJmRpc3AtPmF2X2J1 ZiwgISFkaXNwLT5fcHNfYXVkY2xrKTsKKwlsaXZlID0genlucW1wX2Rpc3BfbGF5ZXJfaXNfbGl2 ZShkaXNwKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfc2V0X3ZpZF90aW1pbmdfc3JjKCZkaXNwLT5h dl9idWYsICFsaXZlKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxlX2J1ZigmZGlzcC0+YXZf YnVmKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxlX2F1ZCgmZGlzcC0+YXZfYnVmKTsKKwl6 eW5xbXBfZGlzcF9hdWRfaW5pdCgmZGlzcC0+YXVkKTsKKwlkaXNwLT5lbmFibGVkID0gdHJ1ZTsK K30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgRGlzcGxheSBz dWJzeXN0ZW0KKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICogQGZvcmNlOiBmbGFnIHRv IGRpc2FibGUgZm9yY2VmdWxseQorICoKKyAqIERpc2FibGUgdGhlIERpc3BsYXkgc3Vic3lzdGVt LgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9kaXNhYmxlKHN0cnVjdCB6eW5xbXBfZGlz cCAqZGlzcCwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmZGlzcC0+ eGxueF9jcnRjLmNydGM7CisKKwlpZiAoIWZvcmNlICYmICghZGlzcC0+ZW5hYmxlZCB8fCB6eW5x bXBfZGlzcF9sYXllcl9pc19lbmFibGVkKGRpc3ApKSkKKwkJcmV0dXJuOworCisJenlucW1wX2Rp c3BfYXVkX2RlaW5pdCgmZGlzcC0+YXVkKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZV9h dWQoJmRpc3AtPmF2X2J1Zik7CisJenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGVfYnVmKCZkaXNw LT5hdl9idWYpOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9kaXNhYmxlKCZkaXNwLT5hdl9idWYpOwor CisJLyogTWFyayB0aGUgZmxpcCBpcyBkb25lIGFzIGNydGMgaXMgZGlzYWJsZWQgYW55d2F5ICov CisJaWYgKGNydGMtPnN0YXRlLT5ldmVudCkgeworCQljb21wbGV0ZV9hbGwoY3J0Yy0+c3RhdGUt PmV2ZW50LT5iYXNlLmNvbXBsZXRpb24pOworCQljcnRjLT5zdGF0ZS0+ZXZlbnQgPSBOVUxMOwor CX0KKworCWRpc3AtPmVuYWJsZWQgPSBmYWxzZTsKK30KKworLyoKKyAqIFp5bnFNUCBEaXNwbGF5 IGV4dGVybmFsIGZ1bmN0aW9ucyBmb3IgenlucW1wX2RwCisgKi8KKworLyoqCisgKiB6eW5xbXBf ZGlzcF9oYW5kbGVfdmJsYW5rIC0gSGFuZGxlIHRoZSB2YmxhbmsgZXZlbnQKKyAqIEBkaXNwOiBE aXNwbGF5IHN1YnN5c3RlbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdmJsYW5r IGludGVycnVwdCwgYW5kIHNlbmRzIGFuIGV2ZW50IHRvCisgKiBDUlRDIG9iamVjdC4gVGhpcyB3 aWxsIGJlIGNhbGxlZCBieSB0aGUgRFAgdmJsYW5rIGludGVycnVwdCBoYW5kbGVyLgorICovCit2 b2lkIHp5bnFtcF9kaXNwX2hhbmRsZV92Ymxhbmsoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQor eworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZkaXNwLT54bG54X2NydGMuY3J0YzsKKworCWRy bV9jcnRjX2hhbmRsZV92YmxhbmsoY3J0Yyk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfZ2V0 X2FwYl9jbGtfcmF0ZSAtIEdldCB0aGUgY3VycmVudCBBUEIgY2xvY2sgcmF0ZQorICogQGRpc3A6 IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogUmV0dXJuOiB0aGUgY3VycmVudCBBUEIgY2xvY2sg cmF0ZS4KKyAqLwordW5zaWduZWQgaW50IHp5bnFtcF9kaXNwX2dldF9hcGJfY2xrX3JhdGUoc3Ry dWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoZGlzcC0+YWNs ayk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYXVkX2VuYWJsZWQgLSBJZiB0aGUgYXVkaW8g aXMgZW5hYmxlZAorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogUmV0dXJuIGlm IHRoZSBhdWRpbyBpcyBlbmFibGVkIGRlcGVuZGluZyBvbiB0aGUgYXVkaW8gY2xvY2suCisgKgor ICogUmV0dXJuOiB0cnVlIGlmIGF1ZGlvIGlzIGVuYWJsZWQsIG9yIGZhbHNlLgorICovCitib29s IHp5bnFtcF9kaXNwX2F1ZF9lbmFibGVkKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwly ZXR1cm4gISFkaXNwLT5hdWRjbGs7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfZ2V0X2F1ZF9j bGtfcmF0ZSAtIEdldCB0aGUgY3VycmVudCBhdWRpbyBjbG9jayByYXRlCisgKiBAZGlzcDogRGlz cGxheSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1cm46IHRoZSBjdXJyZW50IGF1ZGlvIGNsb2NrIHJh dGUuCisgKi8KK3Vuc2lnbmVkIGludCB6eW5xbXBfZGlzcF9nZXRfYXVkX2Nsa19yYXRlKHN0cnVj dCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlpZiAoenlucW1wX2Rpc3BfYXVkX2VuYWJsZWQoZGlz cCkpCisJCXJldHVybiAwOworCXJldHVybiBjbGtfZ2V0X3JhdGUoZGlzcC0+YWNsayk7Cit9CisK Ky8qKgorICogenlucW1wX2Rpc3BfZ2V0X2NydGNfbWFzayAtIFJldHVybiB0aGUgQ1JUQyBiaXQg bWFzaworICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogUmV0dXJuOiB0aGUgY3J0 YyBtYXNrIG9mIHRoZSB6eXFubXBfZGlzcCBDUlRDLgorICovCit1aW50MzJfdCB6eW5xbXBfZGlz cF9nZXRfY3J0Y19tYXNrKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlyZXR1cm4gZHJt X2NydGNfbWFzaygmZGlzcC0+eGxueF9jcnRjLmNydGMpOworfQorCisvKgorICogRFJNIHBsYW5l IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVy ICpwbGFuZV90b19sYXllcihzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlyZXR1cm4gY29u dGFpbmVyX29mKHBsYW5lLCBzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIsIHBsYW5lKTsKK30KKwor c3RhdGljIGludCB6eW5xbXBfZGlzcF9wbGFuZV9lbmFibGUoc3RydWN0IGRybV9wbGFuZSAqcGxh bmUpCit7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciA9IHBsYW5lX3RvX2xheWVy KHBsYW5lKTsKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AgPSBsYXllci0+ZGlzcDsKKwlpbnQg cmV0OworCisJenlucW1wX2Rpc3Bfc2V0X2dfYWxwaGEoZGlzcCwgZGlzcC0+YWxwaGFfZW4pOwor CXp5bnFtcF9kaXNwX3NldF9hbHBoYShkaXNwLCBkaXNwLT5hbHBoYSk7CisJcmV0ID0genlucW1w X2Rpc3BfbGF5ZXJfZW5hYmxlKGxheWVyLT5kaXNwLCBsYXllciwKKwkJCQkgICAgICAgWllOUU1Q X0RJU1BfTEFZRVJfTk9OTElWRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChs YXllci0+aWQgPT0gWllOUU1QX0RJU1BfTEFZRVJfR0ZYICYmIGRpc3AtPnRwZ19vbikgeworCQls YXllciA9ICZkaXNwLT5sYXllcnNbWllOUU1QX0RJU1BfTEFZRVJfVklEXTsKKwkJenlucW1wX2Rp c3BfbGF5ZXJfc2V0X3RwZyhkaXNwLCBsYXllciwgZGlzcC0+dHBnX29uKTsKKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCB6eW5xbXBfZGlzcF9wbGFuZV9kaXNhYmxlKHN0cnVjdCBk cm1fcGxhbmUgKnBsYW5lKQoreworCXN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqbGF5ZXIgPSBw bGFuZV90b19sYXllcihwbGFuZSk7CisJc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwID0gbGF5ZXIt PmRpc3A7CisKKwl6eW5xbXBfZGlzcF9sYXllcl9kaXNhYmxlKGRpc3AsIGxheWVyLCBaWU5RTVBf RElTUF9MQVlFUl9OT05MSVZFKTsKKwlpZiAobGF5ZXItPmlkID09IFpZTlFNUF9ESVNQX0xBWUVS X1ZJRCAmJiBkaXNwLT50cGdfb24pCisJCXp5bnFtcF9kaXNwX2xheWVyX3NldF90cGcoZGlzcCwg bGF5ZXIsIGRpc3AtPnRwZ19vbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6eW5x bXBfZGlzcF9wbGFuZV9tb2RlX3NldChzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJCQkgICAg ICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgICBpbnQgY3J0Y194LCBpbnQg Y3J0Y195LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjcnRjX3csIHVuc2lnbmVkIGludCBjcnRj X2gsCisJCQkJICAgICAgdTMyIHNyY194LCB1MzIgc3JjX3ksCisJCQkJICAgICAgdTMyIHNyY193 LCB1MzIgc3JjX2gpCit7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciA9IHBsYW5l X3RvX2xheWVyKHBsYW5lKTsKKwljb25zdCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICppbmZvID0g ZmItPmZvcm1hdDsKKwlzdHJ1Y3QgZHJtX2Zvcm1hdF9uYW1lX2J1ZiBmb3JtYXRfbmFtZTsKKwlz dHJ1Y3QgZGV2aWNlICpkZXYgPSBsYXllci0+ZGlzcC0+ZGV2OworCWRtYV9hZGRyX3QgcGFkZHI7 CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmICghaW5mbykgeworCQlkZXZfZXJy KGRldiwgInVuc3VwcG9ydGVkIGZyYW1lYnVmZmVyIGZvcm1hdCAlc1xuIiwKKwkJCWRybV9nZXRf Zm9ybWF0X25hbWUoaW5mby0+Zm9ybWF0LCAmZm9ybWF0X25hbWUpKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCisJcmV0ID0genlucW1wX2Rpc3BfbGF5ZXJfY2hlY2tfc2l6ZShsYXllci0+ZGlz cCwgbGF5ZXIsIHNyY193LCBzcmNfaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZv ciAoaSA9IDA7IGkgPCBpbmZvLT5udW1fcGxhbmVzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHdp ZHRoID0gc3JjX3cgLyAoaSA/IGluZm8tPmhzdWIgOiAxKTsKKwkJdW5zaWduZWQgaW50IGhlaWdo dCA9IHNyY19oIC8gKGkgPyBpbmZvLT52c3ViIDogMSk7CisKKwkJcGFkZHIgPSBkcm1fZmJfY21h X2dldF9nZW1fYWRkcihmYiwgcGxhbmUtPnN0YXRlLCBpKTsKKwkJaWYgKCFwYWRkcikgeworCQkJ ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGEgcGFkZHJcbiIpOworCQkJcmV0dXJuIC1FSU5W QUw7CisJCX0KKworCQlsYXllci0+ZG1hW2ldLnh0Lm51bWYgPSBoZWlnaHQ7CisJCWxheWVyLT5k bWFbaV0uc2dsWzBdLnNpemUgPSB3aWR0aCAqIGluZm8tPmNwcFtpXTsKKwkJbGF5ZXItPmRtYVtp XS5zZ2xbMF0uaWNnID0gZmItPnBpdGNoZXNbaV0gLQorCQkJCQkgICBsYXllci0+ZG1hW2ldLnNn bFswXS5zaXplOworCQlsYXllci0+ZG1hW2ldLnh0LnNyY19zdGFydCA9IHBhZGRyOworCQlsYXll ci0+ZG1hW2ldLnh0LmZyYW1lX3NpemUgPSAxOworCQlsYXllci0+ZG1hW2ldLnh0LmRpciA9IERN QV9NRU1fVE9fREVWOworCQlsYXllci0+ZG1hW2ldLnh0LnNyY19zZ2wgPSB0cnVlOworCQlsYXll ci0+ZG1hW2ldLnh0LmRzdF9zZ2wgPSBmYWxzZTsKKwkJbGF5ZXItPmRtYVtpXS5pc19hY3RpdmUg PSB0cnVlOworCX0KKworCWZvciAoOyBpIDwgWllOUU1QX0RJU1BfTUFYX05VTV9TVUJfUExBTkVT OyBpKyspCisJCWxheWVyLT5kbWFbaV0uaXNfYWN0aXZlID0gZmFsc2U7CisKKwlyZXQgPSB6eW5x bXBfZGlzcF9sYXllcl9zZXRfZm10KGxheWVyLT5kaXNwLCAgbGF5ZXIsIGluZm8tPmZvcm1hdCk7 CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IGRwX3N1YiBsYXllciBm bXRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfcGxh bmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlkcm1fcGxhbmVfY2xlYW51 cChwbGFuZSk7Cit9CisKK3N0YXRpYyBpbnQKK3p5bnFtcF9kaXNwX3BsYW5lX2F0b21pY191cGRh dGVfcGxhbmUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCisJCQkJICAgICAgc3RydWN0IGRybV9j cnRjICpjcnRjLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAg ICAgIGludCBjcnRjX3gsIGludCBjcnRjX3ksCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNydGNf dywgdW5zaWduZWQgaW50IGNydGNfaCwKKwkJCQkgICAgICB1MzIgc3JjX3gsIHUzMiBzcmNfeSwK KwkJCQkgICAgICB1MzIgc3JjX3csIHUzMiBzcmNfaCwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX21v ZGVzZXRfYWNxdWlyZV9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3Rh dGU7CisJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGU7CisJaW50IHJldDsKKwor CXN0YXRlID0gZHJtX2F0b21pY19zdGF0ZV9hbGxvYyhwbGFuZS0+ZGV2KTsKKwlpZiAoIXN0YXRl KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLT5hY3F1aXJlX2N0eCA9IGN0eDsKKwlwbGFu ZV9zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X3BsYW5lX3N0YXRlKHN0YXRlLCBwbGFuZSk7CisJaWYg KElTX0VSUihwbGFuZV9zdGF0ZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwbGFuZV9zdGF0ZSk7CisJ CWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBkcm1fYXRvbWljX3NldF9jcnRjX2Zvcl9wbGFuZShw bGFuZV9zdGF0ZSwgY3J0Yyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCWRybV9hdG9taWNf c2V0X2ZiX2Zvcl9wbGFuZShwbGFuZV9zdGF0ZSwgZmIpOworCXBsYW5lX3N0YXRlLT5jcnRjX3gg PSBjcnRjX3g7CisJcGxhbmVfc3RhdGUtPmNydGNfeSA9IGNydGNfeTsKKwlwbGFuZV9zdGF0ZS0+ Y3J0Y193ID0gY3J0Y193OworCXBsYW5lX3N0YXRlLT5jcnRjX2ggPSBjcnRjX2g7CisJcGxhbmVf c3RhdGUtPnNyY194ID0gc3JjX3g7CisJcGxhbmVfc3RhdGUtPnNyY195ID0gc3JjX3k7CisJcGxh bmVfc3RhdGUtPnNyY193ID0gc3JjX3c7CisJcGxhbmVfc3RhdGUtPnNyY19oID0gc3JjX2g7CisK KwlpZiAocGxhbmUgPT0gY3J0Yy0+Y3Vyc29yKQorCQlzdGF0ZS0+bGVnYWN5X2N1cnNvcl91cGRh dGUgPSB0cnVlOworCisJLyogRG8gYXN5bmMtdXBkYXRlIGlmIHBvc3NpYmxlICovCisJc3RhdGUt PmFzeW5jX3VwZGF0ZSA9ICFkcm1fYXRvbWljX2hlbHBlcl9hc3luY19jaGVjayhwbGFuZS0+ZGV2 LCBzdGF0ZSk7CisJcmV0ID0gZHJtX2F0b21pY19jb21taXQoc3RhdGUpOworZmFpbDoKKwlkcm1f YXRvbWljX3N0YXRlX3B1dChzdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0 IHN0cnVjdCBkcm1fcGxhbmVfZnVuY3MgenlucW1wX2Rpc3BfcGxhbmVfZnVuY3MgPSB7CisJLnVw ZGF0ZV9wbGFuZQkJPSB6eW5xbXBfZGlzcF9wbGFuZV9hdG9taWNfdXBkYXRlX3BsYW5lLAorCS5k aXNhYmxlX3BsYW5lCQk9IGRybV9hdG9taWNfaGVscGVyX2Rpc2FibGVfcGxhbmUsCisJLmRlc3Ry b3kJCT0genlucW1wX2Rpc3BfcGxhbmVfZGVzdHJveSwKKwkucmVzZXQJCQk9IGRybV9hdG9taWNf aGVscGVyX3BsYW5lX3Jlc2V0LAorCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlCT0gZHJtX2F0b21p Y19oZWxwZXJfcGxhbmVfZHVwbGljYXRlX3N0YXRlLAorCS5hdG9taWNfZGVzdHJveV9zdGF0ZQk9 IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2Rlc3Ryb3lfc3RhdGUsCit9OworCitzdGF0aWMgdm9p ZAorenlucW1wX2Rpc3BfcGxhbmVfYXRvbWljX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFu ZSwKKwkJCQlzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCit7CisJaW50IHJldDsK KworCWlmICghcGxhbmUtPnN0YXRlLT5jcnRjIHx8ICFwbGFuZS0+c3RhdGUtPmZiKQorCQlyZXR1 cm47CisKKwlpZiAob2xkX3N0YXRlLT5mYiAmJgorCSAgICBvbGRfc3RhdGUtPmZiLT5mb3JtYXQt PmZvcm1hdCAhPSBwbGFuZS0+c3RhdGUtPmZiLT5mb3JtYXQtPmZvcm1hdCkKKwkJenlucW1wX2Rp c3BfcGxhbmVfZGlzYWJsZShwbGFuZSk7CisKKwlyZXQgPSB6eW5xbXBfZGlzcF9wbGFuZV9tb2Rl X3NldChwbGFuZSwgcGxhbmUtPnN0YXRlLT5mYiwKKwkJCQkJIHBsYW5lLT5zdGF0ZS0+Y3J0Y194 LAorCQkJCQkgcGxhbmUtPnN0YXRlLT5jcnRjX3ksCisJCQkJCSBwbGFuZS0+c3RhdGUtPmNydGNf dywKKwkJCQkJIHBsYW5lLT5zdGF0ZS0+Y3J0Y19oLAorCQkJCQkgcGxhbmUtPnN0YXRlLT5zcmNf eCA+PiAxNiwKKwkJCQkJIHBsYW5lLT5zdGF0ZS0+c3JjX3kgPj4gMTYsCisJCQkJCSBwbGFuZS0+ c3RhdGUtPnNyY193ID4+IDE2LAorCQkJCQkgcGxhbmUtPnN0YXRlLT5zcmNfaCA+PiAxNik7CisJ aWYgKHJldCkKKwkJcmV0dXJuOworCisJenlucW1wX2Rpc3BfcGxhbmVfZW5hYmxlKHBsYW5lKTsK K30KKworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX3BsYW5lX2F0b21pY19kaXNhYmxlKHN0cnVj dCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCSBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3Rh dGUpCit7CisJenlucW1wX2Rpc3BfcGxhbmVfZGlzYWJsZShwbGFuZSk7Cit9CisKK3N0YXRpYyBp bnQgenlucW1wX2Rpc3BfcGxhbmVfYXRvbWljX2FzeW5jX2NoZWNrKHN0cnVjdCBkcm1fcGxhbmUg KnBsYW5lLAorCQkJCQkJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9wbGFuZV9hdG9taWNfYXN5bmNfdXBk YXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fcGxhbmVf c3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUg PQorCQlkcm1fYXRvbWljX2dldF9vbGRfcGxhbmVfc3RhdGUobmV3X3N0YXRlLT5zdGF0ZSwgcGxh bmUpOworCisJaWYgKHBsYW5lLT5zdGF0ZS0+ZmIgPT0gbmV3X3N0YXRlLT5mYikKKwkJcmV0dXJu OworCisJIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIG5ldyBjb25maWd1cmF0aW9u cyAqLworCWRybV9hdG9taWNfc2V0X2ZiX2Zvcl9wbGFuZShwbGFuZS0+c3RhdGUsIG5ld19zdGF0 ZS0+ZmIpOworCXBsYW5lLT5zdGF0ZS0+Y3J0YyA9IG5ld19zdGF0ZS0+Y3J0YzsKKwlwbGFuZS0+ c3RhdGUtPmNydGNfeCA9IG5ld19zdGF0ZS0+Y3J0Y194OworCXBsYW5lLT5zdGF0ZS0+Y3J0Y195 ID0gbmV3X3N0YXRlLT5jcnRjX3k7CisJcGxhbmUtPnN0YXRlLT5jcnRjX3cgPSBuZXdfc3RhdGUt PmNydGNfdzsKKwlwbGFuZS0+c3RhdGUtPmNydGNfaCA9IG5ld19zdGF0ZS0+Y3J0Y19oOworCXBs YW5lLT5zdGF0ZS0+c3JjX3ggPSBuZXdfc3RhdGUtPnNyY194OworCXBsYW5lLT5zdGF0ZS0+c3Jj X3kgPSBuZXdfc3RhdGUtPnNyY195OworCXBsYW5lLT5zdGF0ZS0+c3JjX3cgPSBuZXdfc3RhdGUt PnNyY193OworCXBsYW5lLT5zdGF0ZS0+c3JjX2ggPSBuZXdfc3RhdGUtPnNyY19oOworCXBsYW5l LT5zdGF0ZS0+c3RhdGUgPSBuZXdfc3RhdGUtPnN0YXRlOworCisJenlucW1wX2Rpc3BfcGxhbmVf YXRvbWljX3VwZGF0ZShwbGFuZSwgb2xkX3N0YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIHp5bnFtcF9kaXNwX3BsYW5lX2hlbHBlcl9mdW5jcyA9 IHsKKwkuYXRvbWljX3VwZGF0ZQkJPSB6eW5xbXBfZGlzcF9wbGFuZV9hdG9taWNfdXBkYXRlLAor CS5hdG9taWNfZGlzYWJsZQkJPSB6eW5xbXBfZGlzcF9wbGFuZV9hdG9taWNfZGlzYWJsZSwKKwku YXRvbWljX2FzeW5jX2NoZWNrCT0genlucW1wX2Rpc3BfcGxhbmVfYXRvbWljX2FzeW5jX2NoZWNr LAorCS5hdG9taWNfYXN5bmNfdXBkYXRlCT0genlucW1wX2Rpc3BfcGxhbmVfYXRvbWljX2FzeW5j X3VwZGF0ZSwKK307CisKK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfY3JlYXRlX3BsYW5lKHN0cnVj dCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxheWVy OworCXVuc2lnbmVkIGludCBpOworCXUzMiAqZm10cyA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51 bV9mbXRzID0gMDsKKwllbnVtIGRybV9wbGFuZV90eXBlIHR5cGU7CisJaW50IHJldDsKKworCS8q IGdyYXBoaWNzIGxheWVyIGlzIHByaW1hcnksIGFuZCB2aWRlbyBsYXllciBpcyBvdmVyYWx5ICov CisJdHlwZSA9IERSTV9QTEFORV9UWVBFX09WRVJMQVk7CisJZm9yIChpID0gMDsgaSA8IFpZTlFN UF9ESVNQX05VTV9MQVlFUlM7IGkrKykgeworCQlsYXllciA9ICZkaXNwLT5sYXllcnNbaV07CisJ CXp5bnFtcF9kaXNwX2xheWVyX2dldF9mbXRzKGRpc3AsIGxheWVyLCAmZm10cywgJm51bV9mbXRz KTsKKwkJcmV0ID0gZHJtX3VuaXZlcnNhbF9wbGFuZV9pbml0KGRpc3AtPmRybSwgJmxheWVyLT5w bGFuZSwgMCwKKwkJCQkJICAgICAgICZ6eW5xbXBfZGlzcF9wbGFuZV9mdW5jcywgZm10cywKKwkJ CQkJICAgICAgIG51bV9mbXRzLCBOVUxMLCB0eXBlLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCWdv dG8gZXJyX3BsYW5lOworCQlkcm1fcGxhbmVfaGVscGVyX2FkZCgmbGF5ZXItPnBsYW5lLAorCQkJ CSAgICAgJnp5bnFtcF9kaXNwX3BsYW5lX2hlbHBlcl9mdW5jcyk7CisJCXR5cGUgPSBEUk1fUExB TkVfVFlQRV9QUklNQVJZOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycl9wbGFuZToKKwlpZiAo aSkKKwkJZHJtX3BsYW5lX2NsZWFudXAoJmRpc3AtPmxheWVyc1swXS5wbGFuZSk7CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfZGVzdHJveV9wbGFuZShzdHJ1Y3Qg enlucW1wX2Rpc3AgKmRpc3ApCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgWllOUU1QX0RJU1BfTlVNX0xBWUVSUzsgaSsrKQorCQl6eW5xbXBfZGlzcF9wbGFuZV9kZXN0 cm95KCZkaXNwLT5sYXllcnNbaV0ucGxhbmUpOworfQorCisvKgorICogWGxueCBjcnRjIGZ1bmN0 aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHp5bnFtcF9kaXNwICp4bG54X2NydGNf dG9fZGlzcChzdHJ1Y3QgeGxueF9jcnRjICp4bG54X2NydGMpCit7CisJcmV0dXJuIGNvbnRhaW5l cl9vZih4bG54X2NydGMsIHN0cnVjdCB6eW5xbXBfZGlzcCwgeGxueF9jcnRjKTsKK30KKworc3Rh dGljIGludCB6eW5xbXBfZGlzcF9nZXRfbWF4X3dpZHRoKHN0cnVjdCB4bG54X2NydGMgKnhsbnhf Y3J0YykKK3sKKwlyZXR1cm4gWllOUU1QX0RJU1BfTUFYX1dJRFRIOworfQorCitzdGF0aWMgaW50 IHp5bnFtcF9kaXNwX2dldF9tYXhfaGVpZ2h0KHN0cnVjdCB4bG54X2NydGMgKnhsbnhfY3J0YykK K3sKKwlyZXR1cm4gWllOUU1QX0RJU1BfTUFYX0hFSUdIVDsKK30KKworc3RhdGljIHVpbnQzMl90 IHp5bnFtcF9kaXNwX2dldF9mb3JtYXQoc3RydWN0IHhsbnhfY3J0YyAqeGxueF9jcnRjKQorewor CXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IHhsbnhfY3J0Y190b19kaXNwKHhsbnhfY3J0Yyk7 CisKKwlyZXR1cm4gZGlzcC0+bGF5ZXJzW1pZTlFNUF9ESVNQX0xBWUVSX0dGWF0uZm10LT5kcm1f Zm10OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHp5bnFtcF9kaXNwX2dldF9hbGlnbihzdHJ1 Y3QgeGxueF9jcnRjICp4bG54X2NydGMpCit7CisJc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwID0g eGxueF9jcnRjX3RvX2Rpc3AoeGxueF9jcnRjKTsKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIg KmxheWVyID0gJmRpc3AtPmxheWVyc1taWU5RTVBfRElTUF9MQVlFUl9WSURdOworCisJcmV0dXJu IDEgPDwgbGF5ZXItPmRtYS0+Y2hhbi0+ZGV2aWNlLT5jb3B5X2FsaWduOworfQorCitzdGF0aWMg dTY0IHp5bnFtcF9kaXNwX2dldF9kbWFfbWFzayhzdHJ1Y3QgeGxueF9jcnRjICp4bG54X2NydGMp Cit7CisJcmV0dXJuIERNQV9CSVRfTUFTSyhaWU5RTVBfRElTUF9NQVhfRE1BX0JJVCk7Cit9CisK Ky8qCisgKiBEUk0gY3J0YyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6 eW5xbXBfZGlzcCAqY3J0Y190b19kaXNwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1 Y3QgeGxueF9jcnRjICp4bG54X2NydGMgPSB0b194bG54X2NydGMoY3J0Yyk7CisKKwlyZXR1cm4g eGxueF9jcnRjX3RvX2Rpc3AoeGxueF9jcnRjKTsKK30KKworc3RhdGljIGludCB6eW5xbXBfZGlz cF9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgIHN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUg KmFkanVzdGVkX21vZGUsCisJCQkJICAgICBpbnQgeCwgaW50IHksCisJCQkJICAgICBzdHJ1Y3Qg ZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwID0g Y3J0Y190b19kaXNwKGNydGMpOworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlsb25nIGRpZmY7CisJ aW50IHJldDsKKworCXp5bnFtcF9kaXNwX2Nsa19kaXNhYmxlKGRpc3AtPnBjbGssICZkaXNwLT5w Y2xrX2VuKTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoZGlzcC0+cGNsaywgYWRqdXN0ZWRfbW9kZS0+ Y2xvY2sgKiAxMDAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGlzcC0+ZGV2LCAiZmFpbGVk IHRvIHNldCBhIHBpeGVsIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlID0g Y2xrX2dldF9yYXRlKGRpc3AtPnBjbGspOworCWRpZmYgPSByYXRlIC0gYWRqdXN0ZWRfbW9kZS0+ Y2xvY2sgKiAxMDAwOworCWlmIChhYnMoZGlmZikgPiAoYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgKiAx MDAwKSAvIDIwKSB7CisJCWRldl9pbmZvKGRpc3AtPmRldiwgInJlcXVlc3QgcGl4ZWwgcmF0ZTog JWQgYWN0dWFsIHJhdGU6ICVsdVxuIiwKKwkJCSBhZGp1c3RlZF9tb2RlLT5jbG9jaywgcmF0ZSk7 CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhkaXNwLT5kZXYsICJyZXF1ZXN0IHBpeGVsIHJhdGU6ICVk IGFjdHVhbCByYXRlOiAlbHVcbiIsCisJCQlhZGp1c3RlZF9tb2RlLT5jbG9jaywgcmF0ZSk7CisJ fQorCisJLyogVGhlIHRpbWluZyByZWdpc3RlciBzaG91bGQgYmUgcHJvZ3JhbW1lZCBhbHdheXMg Ki8KKwl6eW5xbXBfZHBfZW5jb2Rlcl9tb2RlX3NldF9zdHJlYW0oZGlzcC0+ZHBzdWItPmRwLCBh ZGp1c3RlZF9tb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorenlucW1wX2Rp c3BfY3J0Y19hdG9taWNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICAgICBz dHJ1Y3QgZHJtX2NydGNfc3RhdGUgKm9sZF9jcnRjX3N0YXRlKQoreworCXN0cnVjdCB6eW5xbXBf ZGlzcCAqZGlzcCA9IGNydGNfdG9fZGlzcChjcnRjKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqYWRqdXN0ZWRfbW9kZSA9ICZjcnRjLT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKKwlpbnQgcmV0 LCB2cmVmcmVzaDsKKworCXp5bnFtcF9kaXNwX2NydGNfbW9kZV9zZXQoY3J0YywgJmNydGMtPnN0 YXRlLT5tb2RlLAorCQkJCSAgYWRqdXN0ZWRfbW9kZSwgY3J0Yy0+eCwgY3J0Yy0+eSwgTlVMTCk7 CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRpc3AtPmRldik7CisJcmV0ID0genlucW1wX2Rpc3Bf Y2xrX2VuYWJsZShkaXNwLT5wY2xrLCAmZGlzcC0+cGNsa19lbik7CisJaWYgKHJldCkgeworCQlk ZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBlbmFibGUgYSBwaXhlbCBjbG9ja1xuIik7CisJ CXJldHVybjsKKwl9CisJenlucW1wX2Rpc3Bfc2V0X291dHB1dF9mbXQoZGlzcCwgZGlzcC0+Y29s b3IpOworCXp5bnFtcF9kaXNwX3NldF9iZ19jb2xvcihkaXNwLCBkaXNwLT5iZ19jMCwgZGlzcC0+ YmdfYzEsIGRpc3AtPmJnX2MyKTsKKwl6eW5xbXBfZGlzcF9lbmFibGUoZGlzcCk7CisJLyogRGVs YXkgb2YgMyB2YmxhbmsgaW50ZXJ2YWxzIGZvciB0aW1pbmcgZ2VuIHRvIGJlIHN0YWJsZSAqLwor CXZyZWZyZXNoID0gKGFkanVzdGVkX21vZGUtPmNsb2NrICogMTAwMCkgLworCQkgICAoYWRqdXN0 ZWRfbW9kZS0+dnRvdGFsICogYWRqdXN0ZWRfbW9kZS0+aHRvdGFsKTsKKwltc2xlZXAoMyAqIDEw MDAgLyB2cmVmcmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9jcnRjX2F0b21p Y19kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQlzdHJ1Y3QgZHJtX2NydGNfc3Rh dGUgKm9sZF9jcnRjX3N0YXRlKQoreworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGNydGNf dG9fZGlzcChjcnRjKTsKKworCXp5bnFtcF9kaXNwX2Nsa19kaXNhYmxlKGRpc3AtPnBjbGssICZk aXNwLT5wY2xrX2VuKTsKKwl6eW5xbXBfZGlzcF9wbGFuZV9kaXNhYmxlKGNydGMtPnByaW1hcnkp OworCXp5bnFtcF9kaXNwX2Rpc2FibGUoZGlzcCwgdHJ1ZSk7CisJcG1fcnVudGltZV9wdXRfc3lu YyhkaXNwLT5kZXYpOworfQorCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2NydGNfYXRvbWljX2No ZWNrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkJIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAq c3RhdGUpCit7CisJcmV0dXJuIGRybV9hdG9taWNfYWRkX2FmZmVjdGVkX3BsYW5lcyhzdGF0ZS0+ c3RhdGUsIGNydGMpOworfQorCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfY3J0Y19hdG9taWNf YmVnaW4oc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgICAgc3RydWN0IGRybV9jcnRjX3N0 YXRlICpvbGRfY3J0Y19zdGF0ZSkKK3sKKwkvKiBEb24ndCByZWx5IG9uIHZibGFuayB3aGVuIGRp c2FibGluZyBjcnRjICovCisJc3Bpbl9sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrKTsK KwlpZiAoY3J0Yy0+cHJpbWFyeS0+c3RhdGUtPmZiICYmIGNydGMtPnN0YXRlLT5ldmVudCkgewor CQkvKiBDb25zdW1lIHRoZSBmbGlwX2RvbmUgZXZlbnQgZnJvbSBhdG9taWMgaGVscGVyICovCisJ CWNydGMtPnN0YXRlLT5ldmVudC0+cGlwZSA9IGRybV9jcnRjX2luZGV4KGNydGMpOworCQlXQVJO X09OKGRybV9jcnRjX3ZibGFua19nZXQoY3J0YykgIT0gMCk7CisJCWRybV9jcnRjX2FybV92Ymxh bmtfZXZlbnQoY3J0YywgY3J0Yy0+c3RhdGUtPmV2ZW50KTsKKwkJY3J0Yy0+c3RhdGUtPmV2ZW50 ID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2spOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyB6eW5xbXBfZGlz cF9jcnRjX2hlbHBlcl9mdW5jcyA9IHsKKwkuYXRvbWljX2VuYWJsZQk9IHp5bnFtcF9kaXNwX2Ny dGNfYXRvbWljX2VuYWJsZSwKKwkuYXRvbWljX2Rpc2FibGUJPSB6eW5xbXBfZGlzcF9jcnRjX2F0 b21pY19kaXNhYmxlLAorCS5hdG9taWNfY2hlY2sJPSB6eW5xbXBfZGlzcF9jcnRjX2F0b21pY19j aGVjaywKKwkuYXRvbWljX2JlZ2luCT0genlucW1wX2Rpc3BfY3J0Y19hdG9taWNfYmVnaW4sCit9 OworCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRj ICpjcnRjKQoreworCXp5bnFtcF9kaXNwX2NydGNfYXRvbWljX2Rpc2FibGUoY3J0YywgTlVMTCk7 CisJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKK30KKworc3RhdGljIGludCB6eW5xbXBfZGlzcF9j cnRjX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCB6eW5x bXBfZGlzcCAqZGlzcCA9IGNydGNfdG9fZGlzcChjcnRjKTsKKworCXp5bnFtcF9kcF9lbmFibGVf dmJsYW5rKGRpc3AtPmRwc3ViLT5kcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg enlucW1wX2Rpc3BfY3J0Y19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7 CisJc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwID0gY3J0Y190b19kaXNwKGNydGMpOworCisJenlu cW1wX2RwX2Rpc2FibGVfdmJsYW5rKGRpc3AtPmRwc3ViLT5kcCk7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgenlucW1wX2Rpc3BfY3J0Y19mdW5jcyA9IHsKKwkuZGVz dHJveQkJPSB6eW5xbXBfZGlzcF9jcnRjX2Rlc3Ryb3ksCisJLnNldF9jb25maWcJCT0gZHJtX2F0 b21pY19oZWxwZXJfc2V0X2NvbmZpZywKKwkucGFnZV9mbGlwCQk9IGRybV9hdG9taWNfaGVscGVy X3BhZ2VfZmxpcCwKKwkucmVzZXQJCQk9IGRybV9hdG9taWNfaGVscGVyX2NydGNfcmVzZXQsCisJ LmF0b21pY19kdXBsaWNhdGVfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9jcnRjX2R1cGxpY2F0 ZV9zdGF0ZSwKKwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9jcnRj X2Rlc3Ryb3lfc3RhdGUsCisJLmVuYWJsZV92YmxhbmsJCT0genlucW1wX2Rpc3BfY3J0Y19lbmFi bGVfdmJsYW5rLAorCS5kaXNhYmxlX3ZibGFuawkJPSB6eW5xbXBfZGlzcF9jcnRjX2Rpc2FibGVf dmJsYW5rLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4bG54X2NydGNfb3BzIHp5bnFtcF9k aXNwX3hsbnhfY3J0Y19vcHMgPSB7CisJLmdldF9tYXhfd2lkdGgJPSAmenlucW1wX2Rpc3BfZ2V0 X21heF93aWR0aCwKKwkuZ2V0X21heF9oZWlnaHQJPSAmenlucW1wX2Rpc3BfZ2V0X21heF9oZWln aHQsCisJLmdldF9mb3JtYXQJPSAmenlucW1wX2Rpc3BfZ2V0X2Zvcm1hdCwKKwkuZ2V0X2FsaWdu CT0gJnp5bnFtcF9kaXNwX2dldF9hbGlnbiwKKwkuZ2V0X2RtYV9tYXNrCT0gJnp5bnFtcF9kaXNw X2dldF9kbWFfbWFzaywKK307CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2NyZWF0ZV9jcnRj KHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSA9 ICZkaXNwLT5sYXllcnNbWllOUU1QX0RJU1BfTEFZRVJfR0ZYXS5wbGFuZTsKKwlpbnQgcmV0Owor CisJcmV0ID0gZHJtX2NydGNfaW5pdF93aXRoX3BsYW5lcyhkaXNwLT5kcm0sICZkaXNwLT54bG54 X2NydGMuY3J0YywgcGxhbmUsCisJCQkJCU5VTEwsICZ6eW5xbXBfZGlzcF9jcnRjX2Z1bmNzLCBO VUxMKTsKKwlkcm1fY3J0Y19oZWxwZXJfYWRkKCZkaXNwLT54bG54X2NydGMuY3J0YywKKwkJCSAg ICAmenlucW1wX2Rpc3BfY3J0Y19oZWxwZXJfZnVuY3MpOworCisJZGlzcC0+eGxueF9jcnRjLm9w cyA9ICZ6eW5xbXBfZGlzcF94bG54X2NydGNfb3BzOworCXhsbnhfY3J0Y19yZWdpc3RlcihkaXNw LT5kcm0sICZkaXNwLT54bG54X2NydGMpOworfQorCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9k ZXN0cm95X2NydGMoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXhsbnhfY3J0Y191bnJl Z2lzdGVyKGRpc3AtPmRybSwgJmRpc3AtPnhsbnhfY3J0Yyk7CisJenlucW1wX2Rpc3BfY3J0Y19k ZXN0cm95KCZkaXNwLT54bG54X2NydGMuY3J0Yyk7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9k aXNwX21hcF9jcnRjX3RvX3BsYW5lKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwl1MzIg cG9zc2libGVfY3J0Y3MgPSBkcm1fY3J0Y19tYXNrKCZkaXNwLT54bG54X2NydGMuY3J0Yyk7CisJ dW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTlVNX0xBWUVS UzsgaSsrKQorCQlkaXNwLT5sYXllcnNbaV0ucGxhbmUucG9zc2libGVfY3J0Y3MgPSBwb3NzaWJs ZV9jcnRjczsKK30KKworLyoKKyAqIENvbXBvbmVudCBmdW5jdGlvbnMKKyAqLworCitpbnQgenlu cW1wX2Rpc3BfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwg dm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1YiA9IGRldl9nZXRfZHJ2 ZGF0YShkZXYpOworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGRwc3ViLT5kaXNwOworCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCWludCByZXQ7CisKKwlkaXNwLT5kcm0gPSBk cm07CisKKwlyZXQgPSB6eW5xbXBfZGlzcF9jcmVhdGVfcGxhbmUoZGlzcCk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKwl6eW5xbXBfZGlzcF9jcmVhdGVfY3J0YyhkaXNwKTsKKwl6eW5xbXBf ZGlzcF9tYXBfY3J0Y190b19wbGFuZShkaXNwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHp5 bnFtcF9kaXNwX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rl ciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1YiA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGRwc3ViLT5kaXNwOwor CisJenlucW1wX2Rpc3BfZGVzdHJveV9jcnRjKGRpc3ApOworCXp5bnFtcF9kaXNwX2Rlc3Ryb3lf cGxhbmUoZGlzcCk7Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBpbml0aWFsaXphdGlvbiBmdW5jdGlv bnMKKyAqLworCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2VudW1lcmF0ZV9mbXRzKHN0cnVjdCB6 eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxheWVyOwor CXUzMiAqYnVzX2ZtdHM7CisJdTMyIGksIHNpemUsIG51bV9idXNfZm10czsKKwl1MzIgZ2Z4X2Zt dCA9IFpZTlFNUF9ESVNQX0FWX0JVRl9HRlhfRk1UX1JHQjU2NTsKKworCW51bV9idXNfZm10cyA9 IEFSUkFZX1NJWkUoYXZfYnVmX2xpdmVfZm10cyk7CisJYnVzX2ZtdHMgPSBkZXZtX2t6YWxsb2Mo ZGlzcC0+ZGV2LCBzaXplb2YoKmJ1c19mbXRzKSAqIG51bV9idXNfZm10cywKKwkJCQlHRlBfS0VS TkVMKTsKKwlpZiAoIWJ1c19mbXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX2J1c19mbXRzOyBpKyspCisJCWJ1c19mbXRzW2ldID0gYXZfYnVmX2xpdmVfZm10c1tp XS5idXNfZm10OworCisJbGF5ZXIgPSAmZGlzcC0+bGF5ZXJzW1pZTlFNUF9ESVNQX0xBWUVSX1ZJ RF07CisJbGF5ZXItPm51bV9idXNfZm10cyA9IG51bV9idXNfZm10czsKKwlsYXllci0+YnVzX2Zt dHMgPSBidXNfZm10czsKKwlzaXplID0gQVJSQVlfU0laRShhdl9idWZfdmlkX2ZtdHMpOworCWxh eWVyLT5udW1fZm10cyA9IHNpemU7CisJbGF5ZXItPmRybV9mbXRzID0gZGV2bV9remFsbG9jKGRp c3AtPmRldiwKKwkJCQkgICAgICAgc2l6ZW9mKCpsYXllci0+ZHJtX2ZtdHMpICogc2l6ZSwKKwkJ CQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFsYXllci0+ZHJtX2ZtdHMpCisJCXJldHVybiAt RU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBsYXllci0+bnVtX2ZtdHM7IGkrKykKKwkJbGF5ZXIt PmRybV9mbXRzW2ldID0gYXZfYnVmX3ZpZF9mbXRzW2ldLmRybV9mbXQ7CisJbGF5ZXItPmZtdCA9 ICZhdl9idWZfdmlkX2ZtdHNbWllOUU1QX0RJU1BfQVZfQlVGX1ZJRF9GTVRfWVVZVl07CisKKwls YXllciA9ICZkaXNwLT5sYXllcnNbWllOUU1QX0RJU1BfTEFZRVJfR0ZYXTsKKwlsYXllci0+bnVt X2J1c19mbXRzID0gbnVtX2J1c19mbXRzOworCWxheWVyLT5idXNfZm10cyA9IGJ1c19mbXRzOwor CXNpemUgPSBBUlJBWV9TSVpFKGF2X2J1Zl9nZnhfZm10cyk7CisJbGF5ZXItPm51bV9mbXRzID0g c2l6ZTsKKwlsYXllci0+ZHJtX2ZtdHMgPSBkZXZtX2t6YWxsb2MoZGlzcC0+ZGV2LAorCQkJCSAg ICAgICBzaXplb2YoKmxheWVyLT5kcm1fZm10cykgKiBzaXplLAorCQkJCSAgICAgICBHRlBfS0VS TkVMKTsKKwlpZiAoIWxheWVyLT5kcm1fZm10cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3Ig KGkgPSAwOyBpIDwgbGF5ZXItPm51bV9mbXRzOyBpKyspCisJCWxheWVyLT5kcm1fZm10c1tpXSA9 IGF2X2J1Zl9nZnhfZm10c1tpXS5kcm1fZm10OworCWlmICh6eW5xbXBfZGlzcF9nZnhfaW5pdF9m bXQgPCBBUlJBWV9TSVpFKHp5bnFtcF9kaXNwX2dmeF9pbml0X2ZtdHMpKQorCQlnZnhfZm10ID0g enlucW1wX2Rpc3BfZ2Z4X2luaXRfZm10c1t6eW5xbXBfZGlzcF9nZnhfaW5pdF9mbXRdOworCWxh eWVyLT5mbXQgPSAmYXZfYnVmX2dmeF9mbXRzW2dmeF9mbXRdOworCisJcmV0dXJuIDA7Cit9CisK K2ludCB6eW5xbXBfZGlzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorewor CXN0cnVjdCB6eW5xbXBfZHBzdWIgKmRwc3ViOworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcDsK KwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJZGlzcCA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKmRpc3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpc3ApCisJ CXJldHVybiAtRU5PTUVNOworCWRpc3AtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXMgPSBwbGF0 Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiYmxlbmQiKTsK KwlkaXNwLT5ibGVuZC5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJl cyk7CisJaWYgKElTX0VSUihkaXNwLT5ibGVuZC5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlz cC0+YmxlbmQuYmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBk ZXYsIElPUkVTT1VSQ0VfTUVNLCAiYXZfYnVmIik7CisJZGlzcC0+YXZfYnVmLmJhc2UgPSBkZXZt X2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRpc3AtPmF2 X2J1Zi5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcC0+YXZfYnVmLmJhc2UpOworCisJcmVz ID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImF1 ZCIpOworCWRpc3AtPmF1ZC5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYs IHJlcyk7CisJaWYgKElTX0VSUihkaXNwLT5hdWQuYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGRp c3AtPmF1ZC5iYXNlKTsKKworCWRwc3ViID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJ ZHBzdWItPmRpc3AgPSBkaXNwOworCWRpc3AtPmRwc3ViID0gZHBzdWI7CisKKwlyZXQgPSB6eW5x bXBfZGlzcF9lbnVtZXJhdGVfZm10cyhkaXNwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJLyogVHJ5IHRoZSBsaXZlIFBMIHZpZGVvIGNsb2NrICovCisJZGlzcC0+X3BsX3BjbGsgPSBk ZXZtX2Nsa19nZXQoZGlzcC0+ZGV2LCAiZHBfbGl2ZV92aWRlb19pbl9jbGsiKTsKKwlpZiAoIUlT X0VSUihkaXNwLT5fcGxfcGNsaykpIHsKKwkJZGlzcC0+cGNsayA9IGRpc3AtPl9wbF9wY2xrOwor CQlyZXQgPSB6eW5xbXBfZGlzcF9jbGtfZW5hYmxlX2Rpc2FibGUoZGlzcC0+cGNsaywKKwkJCQkJ CSAgICAgJmRpc3AtPnBjbGtfZW4pOworCQlpZiAocmV0KQorCQkJZGlzcC0+cGNsayA9IE5VTEw7 CisJfSBlbHNlIGlmIChQVFJfRVJSKGRpc3AtPl9wbF9wY2xrKSA9PSAtRVBST0JFX0RFRkVSKSB7 CisJCXJldHVybiBQVFJfRVJSKGRpc3AtPl9wbF9wY2xrKTsKKwl9CisKKwkvKiBJZiB0aGUgbGl2 ZSBQTCB2aWRlbyBjbG9jayBpcyBub3QgdmFsaWQsIGZhbGwgYmFjayB0byBQUyBjbG9jayAqLwor CWlmICghZGlzcC0+cGNsaykgeworCQlkaXNwLT5fcHNfcGNsayA9IGRldm1fY2xrX2dldChkaXNw LT5kZXYsICJkcF92dGNfcGl4ZWxfY2xrX2luIik7CisJCWlmIChJU19FUlIoZGlzcC0+X3BzX3Bj bGspKSB7CisJCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBpbml0IGFueSB2aWRlbyBj bG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihkaXNwLT5fcHNfcGNsayk7CisJCX0KKwkJZGlz cC0+cGNsayA9IGRpc3AtPl9wc19wY2xrOworCQlyZXQgPSB6eW5xbXBfZGlzcF9jbGtfZW5hYmxl X2Rpc2FibGUoZGlzcC0+cGNsaywKKwkJCQkJCSAgICAgJmRpc3AtPnBjbGtfZW4pOworCQlpZiAo cmV0KSB7CisJCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBpbml0IGFueSB2aWRlbyBj bG9ja1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZGlzcC0+YWNsayA9IGRldm1f Y2xrX2dldChkaXNwLT5kZXYsICJkcF9hcGJfY2xrIik7CisJaWYgKElTX0VSUihkaXNwLT5hY2xr KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcC0+YWNsayk7CisJcmV0ID0genlucW1wX2Rpc3BfY2xr X2VuYWJsZShkaXNwLT5hY2xrLCAmZGlzcC0+YWNsa19lbik7CisJaWYgKHJldCkgeworCQlkZXZf ZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBlbmFibGUgdGhlIEFQQiBjbGtcbiIpOworCQlyZXR1 cm4gcmV0OworCX0KKworCS8qIFRyeSB0aGUgbGl2ZSBQTCBhdWRpbyBjbG9jayAqLworCWRpc3At Pl9wbF9hdWRjbGsgPSBkZXZtX2Nsa19nZXQoZGlzcC0+ZGV2LCAiZHBfbGl2ZV9hdWRpb19hY2xr Iik7CisJaWYgKCFJU19FUlIoZGlzcC0+X3BsX2F1ZGNsaykpIHsKKwkJZGlzcC0+YXVkY2xrID0g ZGlzcC0+X3BsX2F1ZGNsazsKKwkJcmV0ID0genlucW1wX2Rpc3BfY2xrX2VuYWJsZV9kaXNhYmxl KGRpc3AtPmF1ZGNsaywKKwkJCQkJCSAgICAgJmRpc3AtPmF1ZGNsa19lbik7CisJCWlmIChyZXQp CisJCQlkaXNwLT5hdWRjbGsgPSBOVUxMOworCX0KKworCS8qIElmIHRoZSBsaXZlIFBMIGF1ZGlv IGNsb2NrIGlzIG5vdCB2YWxpZCwgZmFsbCBiYWNrIHRvIFBTIGNsb2NrICovCisJaWYgKCFkaXNw LT5hdWRjbGspIHsKKwkJZGlzcC0+X3BzX2F1ZGNsayA9IGRldm1fY2xrX2dldChkaXNwLT5kZXYs ICJkcF9hdWRfY2xrIik7CisJCWlmICghSVNfRVJSKGRpc3AtPl9wc19hdWRjbGspKSB7CisJCQlk aXNwLT5hdWRjbGsgPSBkaXNwLT5fcHNfYXVkY2xrOworCQkJcmV0ID0genlucW1wX2Rpc3BfY2xr X2VuYWJsZV9kaXNhYmxlKGRpc3AtPmF1ZGNsaywKKwkJCQkJCQkgICAgICZkaXNwLT5hdWRjbGtf ZW4pOworCQkJaWYgKHJldCkKKwkJCQlkaXNwLT5hdWRjbGsgPSBOVUxMOworCQl9CisKKwkJaWYg KCFkaXNwLT5hdWRjbGspIHsKKwkJCWRldl9lcnIoZGlzcC0+ZGV2LAorCQkJCSJhdWRpbyBpcyBk aXNhYmxlZCBkdWUgdG8gY2xvY2sgZmFpbHVyZVxuIik7CisJCX0KKwl9CisKKwlyZXQgPSB6eW5x bXBfZGlzcF9sYXllcl9jcmVhdGUoZGlzcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9hY2xr OworCisJcmV0dXJuIDA7CisKK2Vycm9yX2FjbGs6CisJenlucW1wX2Rpc3BfY2xrX2Rpc2FibGUo ZGlzcC0+YWNsaywgJmRpc3AtPmFjbGtfZW4pOworCXJldHVybiByZXQ7Cit9CisKK2ludCB6eW5x bXBfZGlzcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qg enlucW1wX2Rwc3ViICpkcHN1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVj dCB6eW5xbXBfZGlzcCAqZGlzcCA9IGRwc3ViLT5kaXNwOworCisJenlucW1wX2Rpc3BfbGF5ZXJf ZGVzdHJveShkaXNwKTsKKwlpZiAoZGlzcC0+YXVkY2xrKQorCQl6eW5xbXBfZGlzcF9jbGtfZGlz YWJsZShkaXNwLT5hdWRjbGssICZkaXNwLT5hdWRjbGtfZW4pOworCXp5bnFtcF9kaXNwX2Nsa19k aXNhYmxlKGRpc3AtPmFjbGssICZkaXNwLT5hY2xrX2VuKTsKKwl6eW5xbXBfZGlzcF9jbGtfZGlz YWJsZShkaXNwLT5wY2xrLCAmZGlzcC0+cGNsa19lbik7CisJZHBzdWItPmRpc3AgPSBOVUxMOwor CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBf ZGlzcC5oIGIvZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRjYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaApAQCAtMCwwICsxLDI5IEBACisvLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIFp5bnFNUCBEaXNwbGF5IERyaXZlcgor ICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTcgLSAyMDE4IFhpbGlueCwgSW5jLgorICoKKyAqICBB dXRob3I6IEh5dW4gV29vIEt3b24gPGh5dW4ua3dvbkB4aWxpbnguY29tPgorICovCisKKyNpZm5k ZWYgX1pZTlFNUF9ESVNQX0hfCisjZGVmaW5lIF9aWU5RTVBfRElTUF9IXworCitzdHJ1Y3QgZGV2 aWNlOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKK3N0cnVjdCB6eW5xbXBfZGlzcDsKKwordm9p ZCB6eW5xbXBfZGlzcF9oYW5kbGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCk7Cit1 bnNpZ25lZCBpbnQgenlucW1wX2Rpc3BfZ2V0X2FwYl9jbGtfcmF0ZShzdHJ1Y3QgenlucW1wX2Rp c3AgKmRpc3ApOworYm9vbCB6eW5xbXBfZGlzcF9hdWRfZW5hYmxlZChzdHJ1Y3QgenlucW1wX2Rp c3AgKmRpc3ApOwordW5zaWduZWQgaW50IHp5bnFtcF9kaXNwX2dldF9hdWRfY2xrX3JhdGUoc3Ry dWN0IHp5bnFtcF9kaXNwICpkaXNwKTsKK3VpbnQzMl90IHp5bnFtcF9kaXNwX2dldF9jcnRjX21h c2soc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKTsKKworaW50IHp5bnFtcF9kaXNwX2JpbmQoc3Ry dWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpOwordm9p ZCB6eW5xbXBfZGlzcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpt YXN0ZXIsIHZvaWQgKmRhdGEpOworCitpbnQgenlucW1wX2Rpc3BfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldik7CitpbnQgenlucW1wX2Rpc3BfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpOworCisjZW5kaWYgLyogX1pZTlFNUF9ESVNQX0hfICovCi0tIAoyLjcu NAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==