From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH v5 4/5] ALSA: x86: hdmi: Add audio support for BYT and CHT Date: Wed, 25 Jan 2017 04:27:52 +0530 Message-ID: <20170124225753.9045-5-jerome.anand@intel.com> References: <20170124225753.9045-1-jerome.anand@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170124225753.9045-1-jerome.anand@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org, alsa-devel@alsa-project.org Cc: tiwai@suse.de, broonie@kernel.org, rakesh.a.ughreja@intel.com List-Id: alsa-devel@alsa-project.org SGRtaSBhdWRpbyBkcml2ZXIgYmFzZWQgb24gdGhlIGNoaWxkIHBsYXRmb3JtIGRldmljZQpjcmVh dGVkIGJ5IGdmeCBkcml2ZXIgaXMgaW1wbGVtZW50ZWQuClRoaXMgYXVkaW8gZHJpdmVyIGlzIGRl cml2ZWQgZnJvbSBsZWdhY3kgaW50ZWwKaGRtaSBhdWRpbyBkcml2ZXIuCgpUaGUgaW50ZXJmYWNl cyBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBnZnggYW5kIGF1ZGlvCmFyZSB1cGRhdGVkIGFuZCB0 aGUgZHJpdmVyIGltcGxlbWVudGF0aW9uIHVwZGF0ZWQgdG8KZGVyaXZlIGludGVycnVwdHMgaW4g aXRzIG93biBhZGRyZXNzIHNwYWNlIGJhc2VkIG9uCmlycSBjaGlwIGZyYW1ld29yawoKVGhlIGNo YW5nZXMgdG8gY2FsY3VsYXRlIHN1Yi1wZXJpb2QgcG9zaXRpb25zIHdhcyB0cmlnZ2VyZWQKYnkg RGF2aWQgSGVubmluZ3Nzb24gPGRhdmlkLmhlbm5pbmdzc29uQGNhbm9uaWNhbC5jb20+IGFuZCBp cwphY2NvbW9kYXRlZCBpbiB0aGlzIHBhdGNoCgpTaWduZWQtb2ZmLWJ5OiBQaWVycmUtTG91aXMg Qm9zc2FydCA8cGllcnJlLWxvdWlzLmJvc3NhcnRAbGludXguaW50ZWwuY29tPgpTaWduZWQtb2Zm LWJ5OiBKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFuZEBpbnRlbC5jb20+Ci0tLQogc291bmQveDg2 L01ha2VmaWxlICAgICAgICAgICAgICAgfCAgICAyICsKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1 ZGlvLmMgICAgIHwgMTg1NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog c291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uaCAgICAgfCAgMTk3ICsrKysKIHNvdW5kL3g4Ni9p bnRlbF9oZG1pX2F1ZGlvX2lmLmMgIHwgIDU1MSArKysrKysrKysrKwogc291bmQveDg2L2ludGVs X2hkbWlfbHBlX2F1ZGlvLmMgfCAgIDE1ICstCiA1IGZpbGVzIGNoYW5nZWQsIDI2MTQgaW5zZXJ0 aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94ODYvaW50 ZWxfaGRtaV9hdWRpby5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQveDg2L2ludGVsX2hkbWlf YXVkaW8uaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvX2lm LmMKCmRpZmYgLS1naXQgYS9zb3VuZC94ODYvTWFrZWZpbGUgYi9zb3VuZC94ODYvTWFrZWZpbGUK aW5kZXggOWI4NzM4NC4uODVlYTIyYSAxMDA2NDQKLS0tIGEvc291bmQveDg2L01ha2VmaWxlCisr KyBiL3NvdW5kL3g4Ni9NYWtlZmlsZQpAQCAtMSw0ICsxLDYgQEAKIHNuZC1oZG1pLWxwZS1hdWRp by1vYmpzICs9IFwKKwlpbnRlbF9oZG1pX2F1ZGlvLm8gXAorCWludGVsX2hkbWlfYXVkaW9faWYu byBcCiAJaW50ZWxfaGRtaV9scGVfYXVkaW8ubwogCiBvYmotJChDT05GSUdfSERNSV9MUEVfQVVE SU8pICs9IHNuZC1oZG1pLWxwZS1hdWRpby5vCmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxf aGRtaV9hdWRpby5jIGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjk1MjFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQv eDg2L2ludGVsX2hkbWlfYXVkaW8uYwpAQCAtMCwwICsxLDE4NTUgQEAKKy8qCisgKiAgIGludGVs X2hkbWlfYXVkaW8uYyAtIEludGVsIEhETUkgYXVkaW8gZHJpdmVyCisgKgorICogIENvcHlyaWdo dCAoQykgMjAxNiBJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkg PHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYJPHJh bWVzaC5iYWJ1QGludGVsLmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndh bEBpbnRlbC5jb20+CisgKgkJSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgor ICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn4KKyAqIEFMU0EgZHJpdmVyIGZvciBJbnRlbCBIRE1JIGF1ZGlvCisgKi8KKworI2RlZmlu ZSBwcl9mbXQoZm10KQkiaGFkOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2 aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cisj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1 ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8 c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxz b3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNv dW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlICJpbnRlbF9oZG1pX2F1ZGlvLmgiCisKK3N0YXRpYyBE RUZJTkVfTVVURVgoaGFkX211dGV4KTsKKworLypzdGFuZGFyZCBtb2R1bGUgb3B0aW9ucyBmb3Ig QUxTQS4gVGhpcyBtb2R1bGUgc3VwcG9ydHMgb25seSBvbmUgY2FyZCovCitzdGF0aWMgaW50IGhk bWlfY2FyZF9pbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsKK3N0YXRpYyBjaGFyICpoZG1pX2Nh cmRfaWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7CitzdGF0aWMgc3RydWN0IHNuZF9pbnRlbGhhZCAq aGFkX2RhdGE7CisKK21vZHVsZV9wYXJhbV9uYW1lZChpbmRleCwgaGRtaV9jYXJkX2luZGV4LCBp bnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwKKwkJIkluZGV4IHZhbHVlIGZvciBJ TlRFTCBJbnRlbCBIRE1JIEF1ZGlvIGNvbnRyb2xsZXIuIik7Cittb2R1bGVfcGFyYW1fbmFtZWQo aWQsIGhkbWlfY2FyZF9pZCwgY2hhcnAsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwKKwkJ IklEIHN0cmluZyBmb3IgSU5URUwgSW50ZWwgSERNSSBBdWRpbyBjb250cm9sbGVyLiIpOworCisv KgorICogRUxEIFNBIGJpdHMgaW4gdGhlIENFQSBTcGVha2VyIEFsbG9jYXRpb24gZGF0YSBibG9j aworICovCitzdGF0aWMgaW50IGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0c1tdID0geworCVsw XSA9IEZMIHwgRlIsCisJWzFdID0gTEZFLAorCVsyXSA9IEZDLAorCVszXSA9IFJMIHwgUlIsCisJ WzRdID0gUkMsCisJWzVdID0gRkxDIHwgRlJDLAorCVs2XSA9IFJMQyB8IFJSQywKKwkvKiB0aGUg Zm9sbG93aW5nIGFyZSBub3QgZGVmaW5lZCBpbiBFTEQgeWV0ICovCisJWzddID0gMCwKK307CisK Ky8qCisgKiBUaGlzIGlzIGFuIG9yZGVyZWQgbGlzdCEKKyAqCisgKiBUaGUgcHJlY2VkaW5nIG9u ZXMgaGF2ZSBiZXR0ZXIgY2hhbmNlcyB0byBiZSBzZWxlY3RlZCBieQorICogaGRtaV9jaGFubmVs X2FsbG9jYXRpb24oKS4KKyAqLworc3RhdGljIHN0cnVjdCBjZWFfY2hhbm5lbF9zcGVha2VyX2Fs bG9jYXRpb24gY2hhbm5lbF9hbGxvY2F0aW9uc1tdID0geworLyogICAgICAgICAgICAgICAgICAg ICAgICBjaGFubmVsOiAgIDcgICAgIDYgICAgNSAgICA0ICAgIDMgICAgIDIgICAgMSAgICAwICAq LworeyAuY2FfaW5kZXggPSAweDAwLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAw LCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiAyLjEgKi8KK3sgLmNhX2luZGV4ID0g MHgwMSwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgTEZFLCAgRlIs ICBGTCB9IH0sCisJCQkJLyogRG9sYnkgU3Vycm91bmQgKi8KK3sgLmNhX2luZGV4ID0gMHgwMiwg IC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICAgMCwgIEZDLCAgICAwLCAgRlIsICBGTCB9 IH0sCisJCQkJLyogc3Vycm91bmQ0MCAqLworeyAuY2FfaW5kZXggPSAweDA4LCAgLnNwZWFrZXJz ID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkv KiBzdXJyb3VuZDQxICovCit7IC5jYV9pbmRleCA9IDB4MDksICAuc3BlYWtlcnMgPSB7ICAgMCwg ICAgMCwgIFJSLCAgUkwsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5k NTAgKi8KK3sgLmNhX2luZGV4ID0gMHgwYSwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIs ICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ1MSAqLworeyAu Y2FfaW5kZXggPSAweDBiLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMs ICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiA2LjEgKi8KK3sgLmNhX2luZGV4ID0gMHgwZiwg IC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9 IH0sCisJCQkJLyogc3Vycm91bmQ3MSAqLworeyAuY2FfaW5kZXggPSAweDEzLCAgLnNwZWFrZXJz ID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKKworeyAu Y2FfaW5kZXggPSAweDAzLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAwLCAgRkMs ICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNCwgIC5zcGVha2VycyA9IHsg ICAwLCAgICAwLCAgIDAsICBSQywgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRl eCA9IDB4MDUsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICAgMCwgIExGRSwg IEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDA2LCAgLnNwZWFrZXJzID0geyAgIDAsICAg IDAsICAgMCwgIFJDLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgw NywgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICBSQywgIEZDLCAgTEZFLCAgRlIsICBG TCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MGMsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJS LCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBkLCAgLnNw ZWFrZXJzID0geyAgIDAsICAgUkMsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwK K3sgLmNhX2luZGV4ID0gMHgwZSwgIC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwg IEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTAsICAuc3BlYWtlcnMg PSB7IFJSQywgIFJMQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2Ff aW5kZXggPSAweDExLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICBM RkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxMiwgIC5zcGVha2VycyA9IHsgUlJD LCAgUkxDLCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MTQsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICAgMCwgICAgMCwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE1LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMs ICAgMCwgICAwLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNiwg IC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICAgMCwgIEZDLCAgICAwLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MTcsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAg IDAsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE4LCAgLnNwZWFr ZXJzID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgxOSwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgICAw LCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWEsICAuc3BlYWtlcnMgPSB7 IEZSQywgIEZMQywgICAwLCAgUkMsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDFiLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgRkMsICBMRkUs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxYywgIC5zcGVha2VycyA9IHsgRlJDLCAg RkxDLCAgUlIsICBSTCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MWQsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICAgMCwgIExGRSwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDFlLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBS UiwgIFJMLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZiwgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0s Cit9OworCitzdGF0aWMgc3RydWN0IGNoYW5uZWxfbWFwX3RhYmxlIG1hcF90YWJsZXNbXSA9IHsK Kwl7IFNORFJWX0NITUFQX0ZMLCAgICAgICAweDAwLCAgIEZMIH0sCisJeyBTTkRSVl9DSE1BUF9G UiwgICAgICAgMHgwMSwgICBGUiB9LAorCXsgU05EUlZfQ0hNQVBfUkwsICAgICAgIDB4MDQsICAg UkwgfSwKKwl7IFNORFJWX0NITUFQX1JSLCAgICAgICAweDA1LCAgIFJSIH0sCisJeyBTTkRSVl9D SE1BUF9MRkUsICAgICAgMHgwMiwgICBMRkUgfSwKKwl7IFNORFJWX0NITUFQX0ZDLCAgICAgICAw eDAzLCAgIEZDIH0sCisJeyBTTkRSVl9DSE1BUF9STEMsICAgICAgMHgwNiwgICBSTEMgfSwKKwl7 IFNORFJWX0NITUFQX1JSQywgICAgICAweDA3LCAgIFJSQyB9LAorCXt9IC8qIHRlcm1pbmF0b3Ig Ki8KK307CisKKy8qIGhhcmR3YXJlIGNhcGFiaWxpdHkgc3RydWN0dXJlICovCitzdGF0aWMgY29u c3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ludGVsX2hhZHN0cmVhbSA9IHsKKwkuaW5m byA9CShTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCVNORFJWX1BDTV9JTkZPX0RPVUJM RSB8CisJCVNORFJWX1BDTV9JTkZPX01NQVB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQg fAorCQlTTkRSVl9QQ01fSU5GT19CQVRDSCksCisJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJ VF9TMjQgfAorCQlTTkRSVl9QQ01fRk1UQklUX1UyNCksCisJLnJhdGVzID0gU05EUlZfUENNX1JB VEVfMzIwMDAgfAorCQlTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCVNORFJWX1BDTV9SQVRFXzQ4 MDAwIHwKKwkJU05EUlZfUENNX1JBVEVfODgyMDAgfAorCQlTTkRSVl9QQ01fUkFURV85NjAwMCB8 CisJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8CisJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwku cmF0ZV9taW4gPSBIQURfTUlOX1JBVEUsCisJLnJhdGVfbWF4ID0gSEFEX01BWF9SQVRFLAorCS5j aGFubmVsc19taW4gPSBIQURfTUlOX0NIQU5ORUwsCisJLmNoYW5uZWxzX21heCA9IEhBRF9NQVhf Q0hBTk5FTCwKKwkuYnVmZmVyX2J5dGVzX21heCA9IEhBRF9NQVhfQlVGRkVSLAorCS5wZXJpb2Rf Ynl0ZXNfbWluID0gSEFEX01JTl9QRVJJT0RfQllURVMsCisJLnBlcmlvZF9ieXRlc19tYXggPSBI QURfTUFYX1BFUklPRF9CWVRFUywKKwkucGVyaW9kc19taW4gPSBIQURfTUlOX1BFUklPRFMsCisJ LnBlcmlvZHNfbWF4ID0gSEFEX01BWF9QRVJJT0RTLAorCS5maWZvX3NpemUgPSBIQURfRklGT19T SVpFLAorfTsKKworLyogUmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworCitpbnQgaGFkX2dl dF9od3N0YXRlKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwkvKiBDaGVj ayBmb3IgZGV2aWNlIHByZXNlbmNlIC1TVyBzdGF0ZSAqLworCWlmIChpbnRlbGhhZGRhdGEtPmRy dl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIiVzOkRldmlj ZSBub3QgY29ubmVjdGVkOiVkXG4iLCBfX2Z1bmNfXywKKwkJCQlpbnRlbGhhZGRhdGEtPmRydl9z dGF0dXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhh ZF9nZXRfY2FwcyhlbnVtIGhhZF9jYXBzX2xpc3QgcXVlcnksIHZvaWQgKmNhcHMpCit7CisJaW50 IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsK KworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFs KQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnF1ZXJ5X29wcy5oZG1pX2F1ZGlvX2dldF9jYXBz KHF1ZXJ5LAorCQkJCWNhcHMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhhZF9zZXRf Y2FwcyhlbnVtIGhhZF9jYXBzX2xpc3Qgc2V0X2VsZW1lbnQsIHZvaWQgKmNhcHMpCit7CisJaW50 IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsK KworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFs KQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnF1ZXJ5X29wcy5oZG1pX2F1ZGlvX3NldF9jYXBz KAorCQkJCXNldF9lbGVtZW50LCBjYXBzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBo YWRfcmVhZF9yZWdpc3Rlcih1MzIgb2Zmc2V0LCB1MzIgKmRhdGEpCit7CisJaW50IHJldHZhbDsK KwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZh bCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2 YWwgPSBpbnRlbGhhZGRhdGEtPnJlZ19vcHMuaGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVyKAorCQkJ CW9mZnNldCArIGludGVsaGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCwgZGF0YSk7CisKKwlyZXR1 cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3dyaXRlX3JlZ2lzdGVyKHUzMiBvZmZzZXQsIHUzMiBk YXRhKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh ID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsK KwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVk aW9fd3JpdGVfcmVnaXN0ZXIoCisJCQkJb2Zmc2V0ICsgaW50ZWxoYWRkYXRhLT5hdWRpb19jZmdf b2Zmc2V0LCBkYXRhKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBoYWRfcmVhZF9tb2Rp ZnkodTMyIG9mZnNldCwgdTMyIGRhdGEsIHUzMiBtYXNrKQoreworCWludCByZXR2YWw7CisJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBo YWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0g aW50ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9fcmVhZF9tb2RpZnkoCisJCQkJb2Zmc2V0 ICsgaW50ZWxoYWRkYXRhLT5hdWRpb19jZmdfb2Zmc2V0LAorCQkJCWRhdGEsIG1hc2spOworCisJ cmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogZnVuY3Rpb24gdG8gcmVhZC1tb2RpZnkKKyAqIEFV RF9DT05GSUcgcmVnaXN0ZXIgb24gVkxWMi5UaGUgaGFkX3JlYWRfbW9kaWZ5KCkgZnVuY3Rpb24g c2hvdWxkIG5vdAorICogZGlyZWN0bHkgYmUgdXNlZCBvbiBWTFYyIGZvciB1cGRhdGluZyBBVURf Q09ORklHIHJlZ2lzdGVyLgorICogVGhpcyBpcyBiZWNhdXNlOgorICogQml0NiBvZiBBVURfQ09O RklHIHJlZ2lzdGVyIGlzIHdyaXRlb25seSBkdWUgdG8gYSBzaWxpY29uIGJ1ZyBvbiBWTFYyCisg KiBIRE1JIElQLiBBcyBhIHJlc3VsdCBhIHJlYWQtbW9kaWZ5IG9mIEFVRF9DT05GSUcgcmVnaXRl ciB3aWxsIGFsd2F5cworICogY2xlYXIgYml0Ni4gQVVEX0NPTkZJR1s2OjRdIHJlcHJlc2VudHMg dGhlICJjaGFubmVscyIgZmllbGQgb2YgdGhlCisgKiByZWdpc3Rlci4gVGhpcyBmaWVsZCBzaG91 bGQgYmUgMXh5IGJpbmFyeSBmb3IgY29uZmlndXJhdGlvbiB3aXRoIDYgb3IKKyAqIG1vcmUgY2hh bm5lbHMuIFJlYWQtbW9kaWZ5IG9mIEFVRF9DT05GSUcgKEVnLiBmb3IgZW5hYmxpbmcgYXVkaW8p CisgKiBjYXVzZXMgdGhlICJjaGFubmVscyIgZmllbGQgdG8gYmUgdXBkYXRlZCBhcyAweHkgYmlu YXJ5IHJlc3VsdGluZyBpbgorICogYmFkIGF1ZGlvLiBUaGUgZml4IGlzIHRvIGFsd2F5cyB3cml0 ZSB0aGUgQVVEX0NPTkZJR1s2OjRdIHdpdGgKKyAqIGFwcHJvcHJpYXRlIHZhbHVlIHdoZW4gZG9p bmcgcmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJRyByZWdpc3Rlci4KKyAqCisgKiBAc3Vic3RyZWFt OiB0aGUgY3VycmVudCBzdWJzdHJlYW0gb3IgTlVMTCBpZiBubyBhY3RpdmUgc3Vic3RyZWFtCisg KiBAZGF0YSA6IGRhdGEgdG8gYmUgd3JpdHRlbgorICogQG1hc2sgOiBtYXNrCisgKgorICovCitz dGF0aWMgaW50IGhhZF9yZWFkX21vZGlmeV9hdWRfY29uZmlnX3YyKHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQl1MzIgZGF0YSwgdTMyIG1hc2spCit7CisJdW5pb24g YXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJdTggY2hhbm5lbHM7CisKKwkv KgorCSAqIElmIHN1YnN0cmVhbSBpcyBOVUxMLCB0aGVyZSBpcyBubyBhY3RpdmUgc3RyZWFtLgor CSAqIEluIHRoaXMgY2FzZSBqdXN0IHNldCBjaGFubmVscyB0byAyCisJICovCisJaWYgKHN1YnN0 cmVhbSkKKwkJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWVsc2UK KwkJY2hhbm5lbHMgPSAyOworCWNmZ192YWwuY2ZnX3JlZ3hfdjIubnVtX2NoID0gY2hhbm5lbHMg LSAyOworCisJZGF0YSA9IGRhdGEgfCBjZmdfdmFsLmNmZ19yZWd2YWw7CisJbWFzayA9IG1hc2sg fCBBVURfQ09ORklHX0NIX01BU0tfVjI7CisKKwlwcl9kZWJ1ZygiJXMgOiBkYXRhID0gJXgsIG1h c2sgPSV4XG4iLCBfX2Z1bmNfXywgZGF0YSwgbWFzayk7CisKKwlyZXR1cm4gaGFkX3JlYWRfbW9k aWZ5KEFVRF9DT05GSUcsIGRhdGEsIG1hc2spOworfQorCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxo YWRfZW5hYmxlX2F1ZGlvX3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAor CQkJCQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGVuYWJsZSwg QklUKDApKTsKK30KKworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX2VuYWJsZV9hdWRpb192Mihz dHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJdTggZW5hYmxlKQorewor CWhhZF9yZWFkX21vZGlmeV9hdWRfY29uZmlnX3YyKHN1YnN0cmVhbSwgZW5hYmxlLCBCSVQoMCkp OworfQorCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjEodTggcmVzZXQp Cit7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgcmVzZXQpOworfQorCitz dGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjIodTggcmVzZXQpCit7CisJaGFk X3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVU192MiwgcmVzZXQpOworfQorCisvKioKKyAq IGluaXRpYWxpemUgYXVkaW8gY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXJzCisgKiBUaGlzIGZ1bmN0 aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjaworICovCitzdGF0aWMgaW50IGhh ZF9wcm9nX3N0YXR1c19yZWcoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJ CQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdW5pb24gYXVkX2NmZyBj ZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2NoX3N0YXR1c18wIGNoX3N0 YXQwID0gey5zdGF0dXNfMF9yZWd2YWwgPSAwfTsKKwl1bmlvbiBhdWRfY2hfc3RhdHVzXzEgY2hf c3RhdDEgPSB7LnN0YXR1c18xX3JlZ3ZhbCA9IDB9OworCWludCBmb3JtYXQ7CisKKwlwcl9kZWJ1 ZygiRW50cnkgJXNcbiIsIF9fZnVuY19fKTsKKworCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3gubHBj bV9pZCA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzICYKKwkJCQkJCUlFQzk1OF9BRVMwX05PTkFV RElPKT4+MTsKKwljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LmNsa19hY2MgPSAoaW50ZWxoYWRkYXRh LT5hZXNfYml0cyAmCisJCQkJCQlJRUM5NThfQUVTM19DT05fQ0xPQ0spPj40OworCWNmZ192YWwu Y2ZnX3JlZ3gudmFsX2JpdCA9IGNoX3N0YXQwLnN0YXR1c18wX3JlZ3gubHBjbV9pZDsKKworCXN3 aXRjaCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSBBVURfU0FNUExFX1JBVEVf MzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8z MktIWjsKKwkJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV80NF8xOgorCQljaF9zdGF0 MC5zdGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDRLSFo7CisJCWJyZWFr OworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4OgorCQljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LnNh bXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgQVVEX1NBTVBM RV9SQVRFXzg4XzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RB VFVTX01BUF84OEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfOTY6CisJCWNo X3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF85NktIWjsKKwkJ YnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTc2XzQ6CisJCWNoX3N0YXQwLnN0YXR1c18w X3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8xNzZLSFo7CisJCWJyZWFrOworCWNhc2Ug QVVEX1NBTVBMRV9SQVRFXzE5MjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEg PSBDSF9TVEFUVVNfTUFQXzE5MktIWjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBjb250 cm9sIHNob3VsZCBuZXZlciBjb21lIGhlcmUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7 CisKKwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DSF9TVEFUVVNfMCwgY2hfc3RhdDAuc3Rh dHVzXzBfcmVndmFsKTsKKworCWZvcm1hdCA9IHN1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0Owor CisJaWYgKGZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgeworCQljaF9zdGF0MS5z dGF0dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gTUFYX1NNUExfV0lEVEhfMjA7CisJCWNoX3N0YXQx LnN0YXR1c18xX3JlZ3gud3JkX2xlbiA9IFNNUExfV0lEVEhfMTZCSVRTOworCX0gZWxzZSBpZiAo Zm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB7CisJCWNoX3N0YXQxLnN0YXR1c18x X3JlZ3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8yNDsKKwkJY2hfc3RhdDEuc3RhdHVz XzFfcmVneC53cmRfbGVuID0gU01QTF9XSURUSF8yNEJJVFM7CisJfSBlbHNlIHsKKwkJY2hfc3Rh dDEuc3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IDA7CisJCWNoX3N0YXQxLnN0YXR1c18xX3Jl Z3gud3JkX2xlbiA9IDA7CisJfQorCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ0hfU1RBVFVTXzEs IGNoX3N0YXQxLnN0YXR1c18xX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnVu Y3Rpb24gdG8gaW5pdGlhbGl6ZSBhdWRpbworICogcmVnaXN0ZXJzIGFuZCBidWZmZXIgY29uZmdp dXJhdGlvbiByZWdpc3RlcnMKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVw YXJlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3Ry bF92MihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXVuaW9uIGF1ZF9jZmcgY2ZnX3ZhbCA9IHsu Y2ZnX3JlZ3ZhbCA9IDB9OworCXVuaW9uIGF1ZF9idWZfY29uZmlnIGJ1Zl9jZmcgPSB7LmJ1Zl9j Zmd2YWwgPSAwfTsKKwl1OCBjaGFubmVsczsKKworCWhhZF9wcm9nX3N0YXR1c19yZWcoc3Vic3Ry ZWFtLCBpbnRlbGhhZGRhdGEpOworCisJYnVmX2NmZy5idWZfY2ZnX3JlZ3hfdjIuYXVkaW9fZmlm b193YXRlcm1hcmsgPSBGSUZPX1RIUkVTSE9MRDsKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneF92Mi5k bWFfZmlmb193YXRlcm1hcmsgPSBETUFfRklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5idWZfY2Zn X3JlZ3hfdjIuYXVkX2RlbGF5ID0gMDsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DT05G SUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGlt ZS0+Y2hhbm5lbHM7CisJY2ZnX3ZhbC5jZmdfcmVneF92Mi5udW1fY2ggPSBjaGFubmVscyAtIDI7 CisJaWYgKGNoYW5uZWxzIDw9IDIpCisJCWNmZ192YWwuY2ZnX3JlZ3hfdjIubGF5b3V0ID0gTEFZ T1VUMDsKKwllbHNlCisJCWNmZ192YWwuY2ZnX3JlZ3hfdjIubGF5b3V0ID0gTEFZT1VUMTsKKwor CWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCBjZmdfdmFsLmNmZ19yZWd2YWwpOworCXJl dHVybiAwOworfQorCisvKioKKyAqIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYXVkaW8KKyAqIHJl Z2lzdGVycyBhbmQgYnVmZmVyIGNvbmZnaXVyYXRpb24gcmVnaXN0ZXJzCisgKiBUaGlzIGZ1bmN0 aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNu ZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjEoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpz dWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1 bmlvbiBhdWRfY2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlvbiBhdWRfYnVm X2NvbmZpZyBidWZfY2ZnID0gey5idWZfY2ZndmFsID0gMH07CisJdTggY2hhbm5lbHM7CisKKwlo YWRfcHJvZ19zdGF0dXNfcmVnKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKworCWJ1Zl9jZmcu YnVmX2NmZ19yZWd4LmZpZm9fd2lkdGggPSBGSUZPX1RIUkVTSE9MRDsKKwlidWZfY2ZnLmJ1Zl9j ZmdfcmVneC5hdWRfZGVsYXkgPSAwOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQlVGX0NPTkZJ RywgYnVmX2NmZy5idWZfY2ZndmFsKTsKKworCWNoYW5uZWxzID0gc3Vic3RyZWFtLT5ydW50aW1l LT5jaGFubmVsczsKKworCXN3aXRjaCAoY2hhbm5lbHMpIHsKKwljYXNlIDE6CisJY2FzZSAyOgor CQljZmdfdmFsLmNmZ19yZWd4Lm51bV9jaCA9IENIX1NURVJFTzsKKwkJY2ZnX3ZhbC5jZmdfcmVn eC5sYXlvdXQgPSBMQVlPVVQwOworCWJyZWFrOworCisJY2FzZSAzOgorCWNhc2UgNDoKKwkJY2Zn X3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9USFJFRV9GT1VSOworCQljZmdfdmFsLmNmZ19yZWd4 LmxheW91dCA9IExBWU9VVDE7CisJYnJlYWs7CisKKwljYXNlIDU6CisJY2FzZSA2OgorCQljZmdf dmFsLmNmZ19yZWd4Lm51bV9jaCA9IENIX0ZJVkVfU0lYOworCQljZmdfdmFsLmNmZ19yZWd4Lmxh eW91dCA9IExBWU9VVDE7CisJYnJlYWs7CisKKwljYXNlIDc6CisJY2FzZSA4OgorCQljZmdfdmFs LmNmZ19yZWd4Lm51bV9jaCA9IENIX1NFVkVOX0VJR0hUOworCQljZmdfdmFsLmNmZ19yZWd4Lmxh eW91dCA9IExBWU9VVDE7CisJYnJlYWs7CisKKwl9CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVE X0NPTkZJRywgY2ZnX3ZhbC5jZmdfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENv bXB1dGUgZGVyaXZlZCB2YWx1ZXMgaW4gY2hhbm5lbF9hbGxvY2F0aW9uc1tdLgorICovCitzdGF0 aWMgdm9pZCBpbml0X2NoYW5uZWxfYWxsb2NhdGlvbnModm9pZCkKK3sKKwlpbnQgaSwgajsKKwlz dHJ1Y3QgY2VhX2NoYW5uZWxfc3BlYWtlcl9hbGxvY2F0aW9uICpwOworCisJcHJfZGVidWcoIiVz OiBFbnRlclxuIiwgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hh bm5lbF9hbGxvY2F0aW9ucyk7IGkrKykgeworCQlwID0gY2hhbm5lbF9hbGxvY2F0aW9ucyArIGk7 CisJCXAtPmNoYW5uZWxzID0gMDsKKwkJcC0+c3BrX21hc2sgPSAwOworCQlmb3IgKGogPSAwOyBq IDwgQVJSQVlfU0laRShwLT5zcGVha2Vycyk7IGorKykKKwkJCWlmIChwLT5zcGVha2Vyc1tqXSkg eworCQkJCXAtPmNoYW5uZWxzKys7CisJCQkJcC0+c3BrX21hc2sgfD0gcC0+c3BlYWtlcnNbal07 CisJCQl9CisJfQorfQorCisvKgorICogVGhlIHRyYW5zZm9ybWF0aW9uIHRha2VzIHR3byBzdGVw czoKKyAqCisgKiAgICAgIGVsZC0+c3BrX2FsbG9jID0+IChlbGRfc3BlYWtlcl9hbGxvY2F0aW9u X2JpdHNbXSkgPT4gc3BrX21hc2sKKyAqICAgICAgICAgICAgc3BrX21hc2sgPT4gKGNoYW5uZWxf YWxsb2NhdGlvbnNbXSkgICAgICAgICA9PiBhaS0+Q0EKKyAqCisgKiBUT0RPOiBpdCBjb3VsZCBz ZWxlY3QgdGhlIHdyb25nIENBIGZyb20gbXVsdGlwbGUgY2FuZGlkYXRlcy4KKyAqLworc3RhdGlj IGludCBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKHN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSwKKwkJCQkJaW50IGNoYW5uZWxzKQoreworCWludCBpOworCWludCBjYSA9 IDA7CisJaW50IHNwa19tYXNrID0gMDsKKworCS8qCisJICogQ0EgZGVmYXVsdHMgdG8gMCBmb3Ig YmFzaWMgc3RlcmVvIGF1ZGlvCisJICovCisJaWYgKGNoYW5uZWxzIDw9IDIpCisJCXJldHVybiAw OworCisJLyoKKwkgKiBleHBhbmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKKwkgKgor CSAqIEVMRCB0ZWxscyB0aGUgc3BlYWtlciBtYXNrIGluIGEgY29tcGFjdChwYWlyZWQpIGZvcm0s CisJICogZXhwYW5kIEVMRCdzIG5vdGlvbnMgdG8gbWF0Y2ggdGhlIG9uZXMgdXNlZCBieSBBdWRp byBJbmZvRnJhbWUuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbGRfc3Bl YWtlcl9hbGxvY2F0aW9uX2JpdHMpOyBpKyspIHsKKwkJaWYgKGludGVsaGFkZGF0YS0+ZWVsZC5z cGVha2VyX2FsbG9jYXRpb25fYmxvY2sgJiAoMSA8PCBpKSkKKwkJCXNwa19tYXNrIHw9IGVsZF9z cGVha2VyX2FsbG9jYXRpb25fYml0c1tpXTsKKwl9CisKKwkvKiBzZWFyY2ggZm9yIHRoZSBmaXJz dCB3b3JraW5nIG1hdGNoIGluIHRoZSBDQSB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMpOyBpKyspIHsKKwkJaWYgKGNoYW5uZWxzID09IGNo YW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5lbHMgJiYKKwkJKHNwa19tYXNrICYgY2hhbm5lbF9h bGxvY2F0aW9uc1tpXS5zcGtfbWFzaykgPT0KKwkJCQljaGFubmVsX2FsbG9jYXRpb25zW2ldLnNw a19tYXNrKSB7CisJCQljYSA9IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2FfaW5kZXg7CisJCQli cmVhazsKKwkJfQorCX0KKworCXByX2RlYnVnKCJIRE1JOiBzZWxlY3QgQ0EgMHgleCBmb3IgJWRc biIsIGNhLCBjaGFubmVscyk7CisKKwlyZXR1cm4gY2E7Cit9CisKKy8qIGZyb20gc3BlYWtlciBi aXQgbWFzayB0byBBTFNBIEFQSSBjaGFubmVsIHBvc2l0aW9uICovCitzdGF0aWMgaW50IHNwa190 b19jaG1hcChpbnQgc3BrKQoreworCXN0cnVjdCBjaGFubmVsX21hcF90YWJsZSAqdCA9IG1hcF90 YWJsZXM7CisKKwlmb3IgKDsgdC0+bWFwOyB0KyspIHsKKwkJaWYgKHQtPnNwa19tYXNrID09IHNw aykKKwkJCXJldHVybiB0LT5tYXA7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGhhZF9idWls ZF9jaGFubmVsX2FsbG9jYXRpb25fbWFwKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YSkKK3sKKwlpbnQgaSA9IDAsIGMgPSAwOworCWludCBzcGtfbWFzayA9IDA7CisJc3RydWN0IHNu ZF9wY21fY2htYXBfZWxlbSAqY2htYXA7CisJdTggZWxkX2hpZ2gsIGVsZF9oaWdoX21hc2sgPSAw eEYwOworCXU4IGhpZ2hfbXNiOworCisJY2htYXAgPSBremFsbG9jKHNpemVvZigqY2htYXApLCBH RlBfS0VSTkVMKTsKKwlpZiAoY2htYXAgPT0gTlVMTCkgeworCQlpbnRlbGhhZGRhdGEtPmNobWFw LT5jaG1hcCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFEX0dFVF9F TEQsICZpbnRlbGhhZGRhdGEtPmVlbGQpOworCisJcHJfZGVidWcoImVlbGQuc3BlYWtlcl9hbGxv Y2F0aW9uX2Jsb2NrID0gJXhcbiIsCisJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxv Y2F0aW9uX2Jsb2NrKTsKKworCS8qIFdBOiBGaXggdGhlIG1heCBjaGFubmVsIHN1cHBvcnRlZCB0 byA4ICovCisKKwkvKgorCSAqIFNpbmsgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIDggY2hhbm5lbHMs IGlmIGVsZF9oaWdoIGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgYml0IHNldC4gU09DIHN1cHBvcnRz IG1heCA4IGNoYW5uZWxzLgorCSAqIFJlZmVyIGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cywg Zm9yIHNpbmsgc3BlYWtlciBhbGxvY2F0aW9uCisJICovCisKKwkvKiBpZiAweDJGIDwgZWxkIDwg MHg0RiBmYWxsIGJhY2sgdG8gMHgyZiwgZWxzZSBmYWxsIGJhY2sgdG8gMHg0RiAqLworCWVsZF9o aWdoID0gaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmIGVsZF9o aWdoX21hc2s7CisJaWYgKChlbGRfaGlnaCAmIChlbGRfaGlnaC0xKSkgJiYgKGVsZF9oaWdoID4g MHgxRikpIHsKKwkJLyogZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSk6IGlmIG1vcmUgdGhhbiAxIGJp dCBzZXQgKi8KKwkJLyogMHgxRjogNyBjaGFubmVscyAqLworCQlmb3IgKGkgPSAxOyBpIDwgNDsg aSsrKSB7CisJCQloaWdoX21zYiA9IGVsZF9oaWdoICYgKDB4ODAgPj4gaSk7CisJCQlpZiAoaGln aF9tc2IpIHsKKwkJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr ICY9CisJCQkJCWhpZ2hfbXNiIHwgMHhGOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzKTsg aSsrKSB7CisJCWlmIChpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr ICYgKDEgPDwgaSkpCisJCQlzcGtfbWFzayB8PSBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHNb aV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0aW9u cyk7IGkrKykgeworCQlpZiAoc3BrX21hc2sgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5zcGtf bWFzaykgeworCQkJZm9yIChjID0gMDsgYyA8IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5l bHM7IGMrKykgeworCQkJCWNobWFwLT5tYXBbY10gPSBzcGtfdG9fY2htYXAoCisJCQkJCWNoYW5u ZWxfYWxsb2NhdGlvbnNbaV0uc3BlYWtlcnNbCisJCQkJCQkoTUFYX1NQRUFLRVJTIC0gMSktY10p OworCQkJfQorCQkJY2htYXAtPmNoYW5uZWxzID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5jaGFu bmVsczsKKwkJCWludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gY2htYXA7CisJCQlicmVhazsK KwkJfQorCX0KKwlpZiAoaSA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMpKSB7CisJ CWludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwkJa2ZyZWUoY2htYXApOworCX0K K30KKworLyoKKyAqIEFMU0EgQVBJIGNoYW5uZWwtbWFwIGNvbnRyb2wgY2FsbGJhY2tzCisgKi8K K3N0YXRpYyBpbnQgaGFkX2NobWFwX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250 cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHNu ZF9wY21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0 IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaW5mby0+cHJpdmF0ZV9kYXRhOworCisJaWYg KGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0 dXJuIC1FTk9ERVY7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7 CisJdWluZm8tPmNvdW50ID0gSEFEX01BWF9DSEFOTkVMOworCXVpbmZvLT52YWx1ZS5pbnRlZ2Vy Lm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU05EUlZfQ0hNQVBfTEFTVDsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWRfY2htYXBfY3RsX2dldChzdHJ1Y3Qgc25k X2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29u dHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlw KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5w cml2YXRlX2RhdGE7CisJaW50IGkgPSAwOworCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2NobWFwX2Vs ZW0gKmNobWFwOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJ U0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGludGVsaGFkZGF0YS0+Y2htYXAt PmNobWFwID09ICBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJY2htYXAgPSBpbnRlbGhhZGRh dGEtPmNobWFwLT5jaG1hcDsKKwlmb3IgKGkgPSAwOyBpIDwgY2htYXAtPmNoYW5uZWxzOyBpKysp IHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSBjaG1hcC0+bWFwW2ldOwor CQlwcl9kZWJ1ZygiY2htYXAtPm1hcFslZF0gPSAlZFxuIiwgaSwgY2htYXAtPm1hcFtpXSk7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX3JlZ2lzdGVyX2NobWFwX2N0bHMo c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQkJc3RydWN0IHNuZF9wY20g KnBjbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IHNuZF9wY21fYWRkX2NobWFwX2N0bHMo cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJTlVMTCwgMCwgKHVuc2lnbmVkIGxv bmcpaW50ZWxoYWRkYXRhLAorCQkJJmludGVsaGFkZGF0YS0+Y2htYXApOworCWlmIChlcnIgPCAw KQorCQlyZXR1cm4gZXJyOworCisJaW50ZWxoYWRkYXRhLT5jaG1hcC0+cHJpdmF0ZV9kYXRhID0g aW50ZWxoYWRkYXRhOworCWludGVsaGFkZGF0YS0+a2N0bCA9IGludGVsaGFkZGF0YS0+Y2htYXAt PmtjdGw7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5pbmZvID0gaGFkX2NobWFwX2N0bF9pbmZvOwor CWludGVsaGFkZGF0YS0+a2N0bC0+Z2V0ID0gaGFkX2NobWFwX2N0bF9nZXQ7CisJaW50ZWxoYWRk YXRhLT5jaG1hcC0+Y2htYXAgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9p bnRlbGhhZF9wcm9nX2RpcF92MSAtIHRvIGluaXRpYWxpemUgRGF0YSBJc2xhbmQgUGFja2V0cyBy ZWdpc3RlcnMKKyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBh cmUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRl IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxs YmFjaworICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjEoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKQoreworCWludCBpOworCXVuaW9uIGF1ZF9jdHJsX3N0IGN0cmxfc3RhdGUgPSB7 LmN0cmxfdmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUyIGZyYW1lMiA9IHsuZnIyX3Zh bCA9IDB9OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMyBmcmFtZTMgPSB7LmZyM192YWwgPSAwfTsK Kwl1OCBjaGVja3N1bSA9IDA7CisJaW50IGNoYW5uZWxzOworCisJY2hhbm5lbHMgPSBzdWJzdHJl YW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DTlRMX1NU LCBjdHJsX3N0YXRlLmN0cmxfdmFsKTsKKworCWZyYW1lMi5mcjJfcmVneC5jaG5sX2NudCA9IHN1 YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMgLSAxOworCisJZnJhbWUzLmZyM19yZWd4LmNobmxf YWxsb2MgPSBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKAorCQkJCQlpbnRlbGhhZGRh dGEsIGNoYW5uZWxzKTsKKworCS8qQ2FsY3VsdGUgdGhlIGJ5dGUgd2lkZSBjaGVja3N1bSBmb3Ig YWxsIHZhbGlkIERJUCB3b3JkcyovCisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBp KyspCisJCWNoZWNrc3VtICs9IChJTkZPX0ZSQU1FX1dPUkQxID4+IGkqQklUU19QRVJfQllURSkg JiBNQVNLX0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQlj aGVja3N1bSArPSAoZnJhbWUyLmZyMl92YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllU RTA7CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9 IChmcmFtZTMuZnIzX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKworCWZy YW1lMi5mcjJfcmVneC5jaGtzdW0gPSAtKGNoZWNrc3VtKTsKKworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfSERNSVdfSU5GT0ZSLCBJTkZPX0ZSQU1FX1dPUkQxKTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0hETUlXX0lORk9GUiwgZnJhbWUyLmZyMl92YWwpOworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfSERNSVdfSU5GT0ZSLCBmcmFtZTMuZnIzX3ZhbCk7CisKKwkvKiBwcm9ncmFtIHJlbWFp bmluZyBESVAgd29yZHMgd2l0aCB6ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEhBRF9NQVhfRElQ X1dPUkRTLVZBTElEX0RJUF9XT1JEUzsgaSsrKQorCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hE TUlXX0lORk9GUiwgMHgwKTsKKworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9mcmVxID0gMTsK KwljdHJsX3N0YXRlLmN0cmxfcmVneC5kaXBfZW5fc3RhID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworfQorCisvKioKKyAqIHNuZF9p bnRlbGhhZF9wcm9nX2RpcF92MiAtIHRvIGluaXRpYWxpemUgRGF0YSBJc2xhbmQgUGFja2V0cyBy ZWdpc3RlcnMKKyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBh cmUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRl IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxs YmFjaworICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjIoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKQoreworCWludCBpOworCXVuaW9uIGF1ZF9jdHJsX3N0IGN0cmxfc3RhdGUgPSB7 LmN0cmxfdmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUyIGZyYW1lMiA9IHsuZnIyX3Zh bCA9IDB9OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMyBmcmFtZTMgPSB7LmZyM192YWwgPSAwfTsK Kwl1OCBjaGVja3N1bSA9IDA7CisJaW50IGNoYW5uZWxzOworCisJY2hhbm5lbHMgPSBzdWJzdHJl YW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DTlRMX1NU LCBjdHJsX3N0YXRlLmN0cmxfdmFsKTsKKworCWZyYW1lMi5mcjJfcmVneC5jaG5sX2NudCA9IHN1 YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMgLSAxOworCisJZnJhbWUzLmZyM19yZWd4LmNobmxf YWxsb2MgPSBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKAorCQkJCQlpbnRlbGhhZGRh dGEsIGNoYW5uZWxzKTsKKworCS8qQ2FsY3VsdGUgdGhlIGJ5dGUgd2lkZSBjaGVja3N1bSBmb3Ig YWxsIHZhbGlkIERJUCB3b3JkcyovCisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBp KyspCisJCWNoZWNrc3VtICs9IChJTkZPX0ZSQU1FX1dPUkQxID4+IGkqQklUU19QRVJfQllURSkg JiBNQVNLX0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQlj aGVja3N1bSArPSAoZnJhbWUyLmZyMl92YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllU RTA7CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9 IChmcmFtZTMuZnIzX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKworCWZy YW1lMi5mcjJfcmVneC5jaGtzdW0gPSAtKGNoZWNrc3VtKTsKKworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfSERNSVdfSU5GT0ZSX3YyLCBJTkZPX0ZSQU1FX1dPUkQxKTsKKwloYWRfd3JpdGVfcmVn aXN0ZXIoQVVEX0hETUlXX0lORk9GUl92MiwgZnJhbWUyLmZyMl92YWwpOworCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSX3YyLCBmcmFtZTMuZnIzX3ZhbCk7CisKKwkvKiBwcm9n cmFtIHJlbWFpbmluZyBESVAgd29yZHMgd2l0aCB6ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEhB RF9NQVhfRElQX1dPUkRTLVZBTElEX0RJUF9XT1JEUzsgaSsrKQorCQloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0hETUlXX0lORk9GUl92MiwgMHgwKTsKKworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRp cF9mcmVxID0gMTsKKwljdHJsX3N0YXRlLmN0cmxfcmVneC5kaXBfZW5fc3RhID0gMTsKKwloYWRf d3JpdGVfcmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworfQorCisv KioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2J1ZmZlciAtIHByb2dyYW1zIGJ1ZmZlcgorICogYWRk cmVzcyBhbmQgbGVuZ3RoIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZv ciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6 c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvZ3JhbXMgcmlu ZyBidWZmZXIgYWRkcmVzcyBhbmQgbGVuZ3RoIGludG8gcmVnaXN0ZXJzLgorICovCitpbnQgc25k X2ludGVsaGFkX3Byb2dfYnVmZmVyKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwK KwkJCQkJaW50IHN0YXJ0LCBpbnQgZW5kKQoreworCXUzMiByaW5nX2J1Zl9hZGRyLCByaW5nX2J1 Zl9zaXplLCBwZXJpb2RfYnl0ZXM7CisJdTggaSwgbnVtX3BlcmlvZHM7CisJc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisKKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0 cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaWYgKCFzdWJzdHJlYW0pIHsKKwkJcHJfZXJyKCJz dWJzdHJlYW0gaXMgTlVMTFxuIik7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIDA7CisJfQor CisJcmluZ19idWZfYWRkciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisJcmluZ19i dWZfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8ucmluZ19idWZfc2l6ZSA9IHJpbmdfYnVmX3NpemU7CisJcGVyaW9k X2J5dGVzID0gZnJhbWVzX3RvX2J5dGVzKHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQlzdWJzdHJl YW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwludW1fcGVyaW9kcyA9IHN1YnN0cmVhbS0+cnVu dGltZS0+cGVyaW9kczsKKworCS8qCisJICogYnVmZmVyIGFkZHIgc2hvdWxkICBiZSA2NCBieXRl IGFsaWduZWQsIHBlcmlvZCBieXRlcworCSAqIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgYWRk ciBvZmZzZXQKKwkgKi8KKwlwZXJpb2RfYnl0ZXMgJj0gfjB4M0Y7CisKKwkvKiBIYXJkd2FyZSBz dXBwb3J0cyBNQVhfUEVSSU9EUyBidWZmZXJzICovCisJaWYgKGVuZCA+PSBIQURfTUFYX1BFUklP RFMpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKysp IHsKKwkJLyogUHJvZ3JhbSB0aGUgYnVmIHJlZ2lzdGVycyB3aXRoIGFkZHIgYW5kIGxlbiAqLwor CQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9hZGRyID0gcmluZ19idWZfYWRkciArCisJ CQkJCQkJIChpICogcGVyaW9kX2J5dGVzKTsKKwkJaWYgKGkgPCBudW1fcGVyaW9kcy0xKQorCQkJ aW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5idWZfc2l6ZSA9IHBlcmlvZF9ieXRlczsKKwkJZWxz ZQorCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5idWZfc2l6ZSA9IHJpbmdfYnVmX3NpemUg LQorCQkJCQkJCShwZXJpb2RfYnl0ZXMqaSk7CisKKwkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9C VUZfQV9BRERSICsgKGkgKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJaW50ZWxoYWRkYXRhLT5idWZf aW5mb1tpXS5idWZfYWRkciB8CisJCQkJCUJJVCgwKSB8IEJJVCgxKSk7CisJCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfQlVGX0FfTEVOR1RIICsgKGkgKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJcGVy aW9kX2J5dGVzKTsKKwkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5pc192YWxpZCA9IHRydWU7 CisJfQorCXByX2RlYnVnKCIlczpidWZbJWQtJWRdIGFkZHI9JSN4ICBhbmQgc2l6ZT0lZFxuIiwg X19mdW5jX18sIHN0YXJ0LCBlbmQsCisJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW3N0YXJ0XS5i dWZfYWRkciwKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bc3RhcnRdLmJ1Zl9zaXplKTsKKwlp bnRlbGhhZGRhdGEtPnZhbGlkX2J1Zl9jbnQgPSBudW1fcGVyaW9kczsKKwlyZXR1cm4gMDsKK30K KworaW50IHNuZF9pbnRlbGhhZF9yZWFkX2xlbihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisJdTMyIGxlbls0XTsKKworCWZvciAoaSA9 IDA7IGkgPCA0IDsgaSsrKSB7CisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEgg KyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuW2ldKTsKKwkJaWYgKCFsZW5baV0pCisJ CQlyZXR2YWwrKzsKKwl9CisJaWYgKHJldHZhbCAhPSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0 IDsgaSsrKQorCQkJcHJfZGVidWcoImJ1ZlslZF0gc2l6ZT0lZFxuIiwgaSwgbGVuW2ldKTsKKwl9 CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2N0c192 MSAtIFByb2dyYW0gSERNSSBhdWRpbyBDVFMgdmFsdWUKKyAqCisgKiBAYXVkX3NhbXBfZnJlcTog c2FtcGxpbmcgZnJlcXVlbmN5IG9mIGF1ZGlvIGRhdGEKKyAqIEB0bWRzOiBzYW1wbGluZyBmcmVx dWVuY3kgb2YgdGhlIGRpc3BsYXkgZGF0YQorICogQG5fcGFyYW06IE4gdmFsdWUsIGRlcGVuZHMg b24gYXVkX3NhbXBfZnJlcQorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRh CisgKgorICogUHJvZ3JhbSBDVFMgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGF1ZGlvIGFuZCBkaXNw bGF5IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJv Z19jdHNfdjEodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJCQlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGN0c192YWw7CisJdTY0 IGRpdmlkZW5kLCBkaXZpc29yOworCisJLyogQ2FsY3VsYXRlIENUUyBhY2NvcmRpbmcgdG8gSERN SSAxLjNhIHNwZWMqLworCWRpdmlkZW5kID0gKHU2NCl0bWRzICogbl9wYXJhbSoxMDAwOworCWRp dmlzb3IgPSAxMjggKiBhdWRfc2FtcF9mcmVxOworCWN0c192YWwgPSBkaXY2NF91NjQoZGl2aWRl bmQsIGRpdmlzb3IpOworCXByX2RlYnVnKCJUTURTIHZhbHVlPSVkLCBOIHZhbHVlPSVkLCBDVFMg VmFsdWU9JWRcbiIsCisJCQl0bWRzLCBuX3BhcmFtLCBjdHNfdmFsKTsKKwloYWRfd3JpdGVfcmVn aXN0ZXIoQVVEX0hETUlfQ1RTLCAoQklUKDIwKSB8IGN0c192YWwpKTsKK30KKworLyoqCisgKiBz bmRfaW50ZWxoYWRfcHJvZ19jdHNfdjIgLSBQcm9ncmFtIEhETUkgYXVkaW8gQ1RTIHZhbHVlCisg KgorICogQGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisg KiBAdG1kczogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIHRoZSBkaXNwbGF5IGRhdGEKKyAqIEBuX3Bh cmFtOiBOIHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBpbnRlbGhhZGRhdGE6 c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFByb2dyYW0gQ1RTIHJlZ2lzdGVyIGJhc2Vk IG9uIHRoZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGlj IHZvaWQgc25kX2ludGVsaGFkX3Byb2dfY3RzX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1k cywgdTMyIG5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCXUzMiBjdHNfdmFsOworCXU2NCBkaXZpZGVuZCwgZGl2aXNvcjsKKworCS8qIENhbGN1bGF0 ZSBDVFMgYWNjb3JkaW5nIHRvIEhETUkgMS4zYSBzcGVjKi8KKwlkaXZpZGVuZCA9ICh1NjQpdG1k cyAqIG5fcGFyYW0qMTAwMDsKKwlkaXZpc29yID0gMTI4ICogYXVkX3NhbXBfZnJlcTsKKwljdHNf dmFsID0gZGl2NjRfdTY0KGRpdmlkZW5kLCBkaXZpc29yKTsKKwlwcl9kZWJ1ZygiVE1EUyB2YWx1 ZT0lZCwgTiB2YWx1ZT0lZCwgQ1RTIFZhbHVlPSVkXG4iLAorCQkJdG1kcywgbl9wYXJhbSwgY3Rz X3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX0NUUywgKEJJVCgyNCkgfCBjdHNf dmFsKSk7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKHUzMiBhdWRfc2Ft cF9mcmVxKQoreworCXMzMiBuX3ZhbDsKKworCS8qIFNlbGVjdCBOIGFjY29yZGluZyB0byBIRE1J IDEuM2Egc3BlYyovCisJc3dpdGNoIChhdWRfc2FtcF9mcmVxKSB7CisJY2FzZSBBVURfU0FNUExF X1JBVEVfMzI6CisJCW5fdmFsID0gNDA5NjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9S QVRFXzQ0XzE6CisJCW5fdmFsID0gNjI3MjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9S QVRFXzQ4OgorCQluX3ZhbCA9IDYxNDQ7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFU RV84OF8yOgorCQluX3ZhbCA9IDEyNTQ0OworCWJyZWFrOworCisJY2FzZSBBVURfU0FNUExFX1JB VEVfOTY6CisJCW5fdmFsID0gMTIyODg7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFU RV8xNzZfNDoKKwkJbl92YWwgPSAyNTA4ODsKKwlicmVhazsKKworCWNhc2UgSEFEX01BWF9SQVRF OgorCQluX3ZhbCA9IDI0NTc2OworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbl92YWwgPSAtRUlO VkFMOworCWJyZWFrOworCX0KKwlyZXR1cm4gbl92YWw7Cit9CisKKy8qKgorICogc25kX2ludGVs aGFkX3Byb2dfbl92MSAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisgKgorICogQGF1ZF9z YW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAbl9wYXJhbTog TiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0 cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUg cHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQg ZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRf cHJvZ19uX3YxKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQkJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKworCW5fdmFsID0JaGFk X2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5fdmFsIDwgMCkKKwkJ cmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VOQUJMRSwgKEJJVCgy MCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgor ICogc25kX2ludGVsaGFkX3Byb2dfbl92MiAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisg KgorICogQGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisg KiBAbl9wYXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxo YWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNh bGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRo ZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfcHJvZ19uX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJ CQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKwor CW5fdmFsID0JaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5f dmFsIDwgMCkKKwkJcmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VO QUJMRSwgKEJJVCgyNCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YxKHN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIgaGRtaV9zdGF0dXMsIGkgPSAwOworCisJ LyogSGFuZGxlIFVuZGVycnVuIGludGVycnVwdCB3aXRoaW4gQXVkaW8gVW5pdCAqLworCWhhZF93 cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCAwKTsKKwkvKiBSZXNldCBidWZmZXIgcG9pbnRlcnMg Ki8KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAxKTsKKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAwKTsKKwkvKioKKwkgKiBUaGUgaW50ZXJydXB0IHN0 YXR1cyAnc3RpY2t5JyBiaXRzIG1pZ2h0IG5vdCBiZSBjbGVhcmVkIGJ5CisJICogc2V0dGluZyAn MScgdG8gdGhhdCBiaXQgb25jZS4uLgorCSAqLworCWRvIHsgLyogY2xlYXIgYml0MzAsIDMxIEFV RF9IRE1JX1NUQVRVUyAqLworCQloYWRfcmVhZF9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsICZo ZG1pX3N0YXR1cyk7CisJCXByX2RlYnVnKCJIRE1JIHN0YXR1cyA9MHgleFxuIiwgaGRtaV9zdGF0 dXMpOworCQlpZiAoaGRtaV9zdGF0dXMgJiBBVURfQ09ORklHX01BU0tfVU5ERVJSVU4pIHsKKwkJ CWkrKzsKKwkJCWhkbWlfc3RhdHVzICY9IChBVURfQ09ORklHX01BU0tfU1JEQkcgfAorCQkJCQlB VURfQ09ORklHX01BU0tfRlVOQ1JTVCk7CisJCQloZG1pX3N0YXR1cyB8PSB+QVVEX0NPTkZJR19N QVNLX1VOREVSUlVOOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgaGRt aV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBNQVhfQ05UKTsK KwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVhciBVTkRFUlJVTiBi aXRzXG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFkX2NsZWFyX3VuZGVycnVuX2ludHJfdjIoc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBoZG1pX3N0YXR1cywgaSA9 IDA7CisKKwkvKiBIYW5kbGUgVW5kZXJydW4gaW50ZXJydXB0IHdpdGhpbiBBdWRpbyBVbml0ICov CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05GSUcsIDApOworCS8qIFJlc2V0IGJ1ZmZlciBw b2ludGVycyAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDEpOwor CWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDApOworCS8qKgorCSAqIFRo ZSBpbnRlcnJ1cHQgc3RhdHVzICdzdGlja3knIGJpdHMgbWlnaHQgbm90IGJlIGNsZWFyZWQgYnkK KwkgKiBzZXR0aW5nICcxJyB0byB0aGF0IGJpdCBvbmNlLi4uCisJICovCisJZG8geyAvKiBjbGVh ciBiaXQzMCwgMzEgQVVEX0hETUlfU1RBVFVTICovCisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9I RE1JX1NUQVRVU192MiwgJmhkbWlfc3RhdHVzKTsKKwkJcHJfZGVidWcoIkhETUkgc3RhdHVzID0w eCV4XG4iLCBoZG1pX3N0YXR1cyk7CisJCWlmIChoZG1pX3N0YXR1cyAmIEFVRF9DT05GSUdfTUFT S19VTkRFUlJVTikgeworCQkJaSsrOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NU QVRVU192MiwgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkg PCBNQVhfQ05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVh ciBVTkRFUlJVTiBiaXRzXG4iKTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfb3BlbiAtIHN0 cmVhbSBpbml0aWFsaXphdGlvbnMgYXJlIGRvbmUgaGVyZQorICogQHN1YnN0cmVhbTpzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBm dW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBQQ00gc3RyZWFtIGlzIG9wZW5lZAorICovCitz dGF0aWMgaW50IHNuZF9pbnRlbGhhZF9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3Qg c25kX3BjbV9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBoYWRfc3RyZWFtX3B2dCAqc3RyZWFt OworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJaW50IHJldHZhbDsKKworCXBy X2RlYnVnKCJzbmRfaW50ZWxoYWRfb3BlbiBjYWxsZWRcbiIpOworCWludGVsaGFkZGF0YSA9IHNu ZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRk YXRhLT5wcml2YXRlX2RhdGE7CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXBt X3J1bnRpbWVfZ2V0KGludGVsaGFkZGF0YS0+ZGV2KTsKKworCWlmIChoYWRfZ2V0X2h3c3RhdGUo aW50ZWxoYWRkYXRhKSkgeworCQlwcl9lcnIoIiVzOiBIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4i LCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9wdXRfaGFuZGxl OworCX0KKworCS8qIENoZWNrLCBpZiBkZXZpY2UgYWxyZWFkeSBpbiB1c2UgKi8KKwlpZiAocnVu dGltZS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiRGV2aWNlIGFscmVhZHkgaW4gdXNlXG4i KTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGV4aXRfcHV0X2hhbmRsZTsKKwl9CisKKwkv KiBzZXQgdGhlIHJ1bnRpbWUgaHcgcGFyYW1ldGVyIHdpdGggbG9jYWwgc25kX3BjbV9oYXJkd2Fy ZSBzdHJ1Y3QgKi8KKwlydW50aW1lLT5odyA9IHNuZF9pbnRlbF9oYWRzdHJlYW07CisKKwlzdHJl YW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW0p IHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0X3B1dF9oYW5kbGU7CisJfQorCXN0 cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFNUUkVBTV9JTklUOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0 YSA9IHN0cmVhbTsKKworCXJldHZhbCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1 bnRpbWUsCisJCQkgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXR2YWwgPCAw KQorCQlnb3RvIGV4aXRfZXJyOworCisJLyogTWFrZSBzdXJlLCB0aGF0IHRoZSBwZXJpb2Qgc2l6 ZSBpcyBhbHdheXMgYWxpZ25lZAorCSAqIDY0Ynl0ZSBib3VuZGFyeQorCSAqLworCXJldHZhbCA9 IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCVNO RFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsIDY0KTsKKwlpZiAocmV0dmFsIDwgMCkgewor CQlwcl9lcnIoIiVzOnN0ZXBfc2l6ZT02NCBmYWlsZWQsZXJyPSVkXG4iLCBfX2Z1bmNfXywgcmV0 dmFsKTsKKwkJZ290byBleGl0X2VycjsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworZXhpdF9lcnI6 CisJa2ZyZWUoc3RyZWFtKTsKK2V4aXRfcHV0X2hhbmRsZToKKwlwbV9ydW50aW1lX3B1dChpbnRl bGhhZGRhdGEtPmRldik7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4g cmV0dmFsOworfQorCisvKioKKyAqIGhhZF9wZXJpb2RfZWxhcHNlZCAtIHVwZGF0ZXMgdGhlIGhh cmR3YXJlIHBvaW50ZXIgc3RhdHVzCisgKiBAaGFkX3N1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdo aWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICovCitzdGF0aWMgdm9pZCBo YWRfcGVyaW9kX2VsYXBzZWQodm9pZCAqaGFkX3N1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3Bj bV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGhhZF9zdWJzdHJlYW07CisJc3RydWN0IGhhZF9zdHJl YW1fcHZ0ICpzdHJlYW07CisKKwkvKiBwcl9kZWJ1ZygiaGFkX3BlcmlvZF9lbGFwc2VkIGNhbGxl ZFxuIik7ICovCisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5ydW50aW1lKQorCQly ZXR1cm47CisJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYg KCFzdHJlYW0pCisJCXJldHVybjsKKworCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0gU1RS RUFNX1JVTk5JTkcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVh bSk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2luaXRfc3RyZWFtIC0gaW50ZXJuYWwgZnVu Y3Rpb24gdG8gaW5pdGlhbGl6ZSBzdHJlYW0gaW5mbworICogQHN1YnN0cmVhbTpzdWJzdHJlYW0g Zm9yIHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICovCitzdGF0aWMg aW50IHNuZF9pbnRlbGhhZF9pbml0X3N0cmVhbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1 YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBzbmRfcGNt X3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2lu aXRfc3RyZWFtIGNhbGxlZFxuIik7CisKKwlwcl9kZWJ1Zygic2V0dGluZyBidWZmZXIgcHRyIHBh cmFtXG4iKTsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gaGFk X3BlcmlvZF9lbGFwc2VkOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVh bSA9IHN1YnN0cmVhbTsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAw OworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkID0gMDsKKwlpbnRl bGhhZGRhdGEtPnN0cmVhbV9pbmZvLnNmcmVxID0gc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlOwor CXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9jbG9zZS0gdG8gZnJlZSBwYXJh bWV0ZXJlcyB3aGVuIHN0cmVhbSBpcyBzdG9wcGVkCisgKgorICogQHN1YnN0cmVhbTogIHN1YnN0 cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICoKKyAqIFRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGJ5IEFMU0EgZnJhbWV3b3JrIHdoZW4gc3RyZWFtIGlzIHN0b3BwZWQKKyAq Lworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFt ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXN0 cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFk X2Nsb3NlIGNhbGxlZFxuIik7CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9j aGlwKHN1YnN0cmVhbSk7CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWlmICgh cnVudGltZS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2RlYnVnKCJjbG9zZSgpIG1pZ2h0IGhhdmUg Y2FsbGVkIGFmdGVyIGZhaWxlZCBvcGVuIik7CisJCXJldHVybiAwOworCX0KKworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkID0gMDsKKwlpbnRlbGhhZGRhdGEtPnN0 cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uc3Ry X2lkID0gMDsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0gPSBOVUxM OworCisJLyogQ2hlY2sgaWYgZm9sbG93aW5nIGRydl9zdGF0dXMgbW9kaWZpY2F0aW9uIGlzIHJl cXVpcmVkIC0gVkEgKi8KKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzICE9IEhBRF9EUlZf RElTQ09OTkVDVEVEKSB7CisJCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfQ09O TkVDVEVEOworCQlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZf Q09OTkVDVEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwl9CisJa2ZyZWUocnVudGlt ZS0+cHJpdmF0ZV9kYXRhKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXBtX3J1 bnRpbWVfcHV0KGludGVsaGFkZGF0YS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBz bmRfaW50ZWxoYWRfaHdfcGFyYW1zLSB0byBzZXR1cCB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycwor ICogbGlrZSBhbGxvY2F0aW5nIHRoZSBidWZmZXJzCisgKgorICogQHN1YnN0cmVhbTogIHN1YnN0 cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGh3X3BhcmFtczogaGFy ZHdhcmUgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFMU0Eg ZnJhbWV3b3JrIHdoZW4gaGFyZHdhcmUgcGFyYW1zIGFyZSBzZXQKKyAqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFt LAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sKKwl1bnNp Z25lZCBsb25nIGFkZHI7CisJaW50IHBhZ2VzLCBidWZfc2l6ZSwgcmV0dmFsOworCisJcHJfZGVi dWcoInNuZF9pbnRlbGhhZF9od19wYXJhbXMgY2FsbGVkXG4iKTsKKworCWlmICghaHdfcGFyYW1z KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1Zl9zaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyho d19wYXJhbXMpOworCXJldHZhbCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0s IGJ1Zl9zaXplKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwcl9kZWJ1 ZygiJXM6YWxsb2NhdGVkIG1lbW9yeSA9ICVkXG4iLCBfX2Z1bmNfXywgYnVmX3NpemUpOworCS8q IG1hcmsgdGhlIHBhZ2VzIGFzIHVuY2FjaGVkIHJlZ2lvbiAqLworCWFkZHIgPSAodW5zaWduZWQg bG9uZykgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYTsKKwlwYWdlcyA9IChzdWJzdHJlYW0t PnJ1bnRpbWUtPmRtYV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXJldHZh bCA9IHNldF9tZW1vcnlfdWMoYWRkciwgcGFnZXMpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJy KCJzZXRfbWVtb3J5X3VjIGZhaWxlZC5FcnJvcjolZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJl dHZhbDsKKwl9CisJbWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsIGJ1Zl9z aXplKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2h3X2Zy ZWUtIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZHVyaW5nCisgKiBoYXJkd2Fy ZSBwYXJhbXMgc2V0dXAKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0 aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkg QUxTQSBmcmFtZXdvcmsgYmVmb3JlIGNsb3NlIGNhbGxiYWNrLgorICoKKyAqLworc3RhdGljIGlu dCBzbmRfaW50ZWxoYWRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVh bSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTMyIHBhZ2VzOworCisJcHJfZGVidWcoInNu ZF9pbnRlbGhhZF9od19mcmVlIGNhbGxlZFxuIik7CisKKwkvKiBtYXJrIGJhY2sgdGhlIHBhZ2Vz IGFzIGNhY2hlZC93cml0ZWJhY2sgcmVnaW9uIGJlZm9yZSB0aGUgZnJlZSAqLworCWlmIChzdWJz dHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhICE9IE5VTEwpIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBs b25nKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCQlwYWdlcyA9IChzdWJzdHJlYW0t PnJ1bnRpbWUtPmRtYV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8KKwkJCQkJCQkJUEFHRV9TSVpF OworCQlzZXRfbWVtb3J5X3diKGFkZHIsIHBhZ2VzKTsKKwkJcmV0dXJuIHNuZF9wY21fbGliX2Zy ZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2lu dGVsaGFkX3BjbV90cmlnZ2VyIC0gc3RyZWFtIGFjdGl2aXRpZXMgYXJlIGhhbmRsZWQgaGVyZQor ICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMg Y2FsbGVkCisgKiBAY21kOnRoZSBzdHJlYW0gY29tbWFtZCB0aGF0cyByZXF1ZXN0ZWQgZnJvbSB1 cHBlciBsYXllcgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gYSBzdHJl YW0gYWN0aXZpdHkgaXMgaW52b2tlZAorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9wY21f dHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJaW50IGNt ZCkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxOwor CXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9w dnQgKnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCisJcHJfZGVi dWcoInNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlciBjYWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRh ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cmVhbSA9IHN1YnN0cmVh bS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnBy aXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9T VEFSVDoKKwkJcHJfZGVidWcoIlRyaWdnZXIgU3RhcnRcbiIpOworCisJCS8qIERpc2FibGUgbG9j YWwgSU5UUnMgdGlsbCByZWdpc3RlciBwcmdtbmcgaXMgZG9uZSAqLworCQlpZiAoaGFkX2dldF9o d3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJCXByX2VycigiX1NUQVJUOiBIRE1JIGNhYmxlIHBs dWdnZWQtb3V0XG4iKTsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCQlz dHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBTVFJFQU1fUlVOTklORzsKKworCQloYWRfc3RyZWFtLT5z dHJlYW1fdHlwZSA9IEhBRF9SVU5OSU5HX1NUUkVBTTsKKworCQkvKiBFbmFibGUgQXVkaW8gKi8K KwkJLyoKKwkJICogVG9EbzogTmVlZCB0byBlbmFibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3 ZWxsCisJCSAqICAgY2FwcyA9IEhETUlfQVVESU9fVU5ERVJSVU4gfCBIRE1JX0FVRElPX0JVRkZF Ul9ET05FOworCQkgKi8KKwkJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCXJldHZh bCA9IGhhZF9zZXRfY2FwcyhIQURfU0VUX0VOQUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwkJcmV0 dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FVRElPLCBOVUxMKTsKKwkJaW50ZWxo YWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDEpOworCisJCXByX2RlYnVnKCJQ cm9jZXNzZWQgX1N0YXJ0XG4iKTsKKworCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX1RSSUdH RVJfU1RPUDoKKwkJcHJfZGVidWcoIlRyaWdnZXIgU3RvcFxuIik7CisJCXNwaW5fbG9ja19pcnFz YXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnEpOworCQlpbnRlbGhhZGRh dGEtPnN0cmVhbV9pbmZvLnN0cl9pZCA9IDA7CisJCWludGVsaGFkZGF0YS0+Y3Vycl9idWYgPSAw OworCisJCS8qIFN0b3AgcmVwb3J0aW5nIEJVRkZFUl9ET05FL1VOREVSUlVOIHRvIGFib3ZlIGxh eWVycyovCisKKwkJaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURfSU5JVDsKKwkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxKTsK KwkJLyogRGlzYWJsZSBBdWRpbyAqLworCQkvKgorCQkgKiBUb0RvOiBOZWVkIHRvIGRpc2FibGUg VU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3ZWxsCisJCSAqICAgY2FwcyA9IEhETUlfQVVESU9fVU5E RVJSVU4gfCBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCQkgKi8KKwkJY2FwcyA9IEhETUlfQVVE SU9fQlVGRkVSX0RPTkU7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU9fSU5U LCAmY2Fwcyk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oc3Vic3RyZWFtLCAw KTsKKwkJLyogUmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCisJCWludGVsaGFkZGF0YS0+b3BzLT5y ZXNldF9hdWRpbygxKTsKKwkJaW50ZWxoYWRkYXRhLT5vcHMtPnJlc2V0X2F1ZGlvKDApOworCQlz dHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBTVFJFQU1fRFJPUFBFRDsKKwkJaGFkX3NldF9jYXBzKEhB RF9TRVRfRElTQUJMRV9BVURJTywgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0 dmFsID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50 ZWxoYWRfcGNtX3ByZXBhcmUtIGludGVybmFsIHByZXBhcmF0aW9uIGJlZm9yZSBzdGFydGluZyBh IHN0cmVhbQorICoKKyAqIEBzdWJzdHJlYW06ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5j dGlvbiBpcyBjYWxsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgc3Ry ZWFtIGlzIHN0YXJ0ZWQgZm9yIGludGVybmFsIHByZXBhcmF0aW9uLgorICovCitzdGF0aWMgaW50 IHNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbSkKK3sKKwlpbnQgcmV0dmFsOworCXUzMiBkaXNwX3NhbXBfZnJlcSwgbl9wYXJhbTsKKwlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGlt ZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCisJcHJfZGVi dWcoInNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZSBjYWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRh ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXJ1bnRpbWUgPSBzdWJzdHJl YW0tPnJ1bnRpbWU7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOwor CisJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpKSB7CisJCXByX2VycigiJXM6IEhE TUkgY2FibGUgcGx1Z2dlZC1vdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsK KwkJZ290byBwcmVwX2VuZDsKKwl9CisKKwlwcl9kZWJ1ZygicGVyaW9kX3NpemU9JWRcbiIsCisJ CShpbnQpZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKSk7CisJ cHJfZGVidWcoInBlcmlvZHM9JWRcbiIsIHJ1bnRpbWUtPnBlcmlvZHMpOworCXByX2RlYnVnKCJi dWZmZXJfc2l6ZT0lZFxuIiwgKGludClzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFt KSk7CisJcHJfZGVidWcoInJhdGU9JWRcbiIsIHJ1bnRpbWUtPnJhdGUpOworCXByX2RlYnVnKCJj aGFubmVscz0lZFxuIiwgcnVudGltZS0+Y2hhbm5lbHMpOworCisJaWYgKGludGVsaGFkZGF0YS0+ c3RyZWFtX2luZm8uc3RyX2lkKSB7CisJCXByX2RlYnVnKCJfcHJlcGFyZSBpcyBjYWxsZWQgZm9y IGV4aXN0aW5nIHN0cl9pZCMlZFxuIiwKKwkJCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5z dHJfaWQpOworCQlyZXR2YWwgPSBzbmRfaW50ZWxoYWRfcGNtX3RyaWdnZXIoc3Vic3RyZWFtLAor CQkJCQkJU05EUlZfUENNX1RSSUdHRVJfU1RPUCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJ cmV0dmFsID0gc25kX2ludGVsaGFkX2luaXRfc3RyZWFtKHN1YnN0cmVhbSk7CisJaWYgKHJldHZh bCkKKwkJZ290byBwcmVwX2VuZDsKKworCisJLyogR2V0IE4gdmFsdWUgaW4gS0h6ICovCisJcmV0 dmFsID0gaGFkX2dldF9jYXBzKEhBRF9HRVRfRElTUExBWV9SQVRFLCAmZGlzcF9zYW1wX2ZyZXEp OworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJxdWVyeWluZyBkaXNwbGF5IHNhbXBsaW5nIGZy ZXEgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBwcmVwX2VuZDsKKwl9CisKKwloYWRf Z2V0X2NhcHMoSEFEX0dFVF9FTEQsICZpbnRlbGhhZGRhdGEtPmVlbGQpOworCisJcmV0dmFsID0g aW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfbihzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUsICZuX3Bh cmFtLAorCQkJCQkJCQlpbnRlbGhhZGRhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJw cm9ncmFtbWluZyBOIHZhbHVlIGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7CisJCWdvdG8gcHJlcF9l bmQ7CisJfQorCWludGVsaGFkZGF0YS0+b3BzLT5wcm9nX2N0cyhzdWJzdHJlYW0tPnJ1bnRpbWUt PnJhdGUsCisJCQkJCWRpc3Bfc2FtcF9mcmVxLCBuX3BhcmFtLCBpbnRlbGhhZGRhdGEpOworCisJ aW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfZGlwKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKwor CXJldHZhbCA9IGludGVsaGFkZGF0YS0+b3BzLT5hdWRpb19jdHJsKHN1YnN0cmVhbSwgaW50ZWxo YWRkYXRhKTsKKworCS8qIFByb2cgYnVmZmVyIGFkZHJlc3MgKi8KKwlyZXR2YWwgPSBzbmRfaW50 ZWxoYWRfcHJvZ19idWZmZXIoaW50ZWxoYWRkYXRhLAorCQkJSEFEX0JVRl9UWVBFX0EsIEhBRF9C VUZfVFlQRV9EKTsKKworCS8qCisJICogUHJvZ3JhbSBjaGFubmVsIG1hcHBpbmcgaW4gZm9sbG93 aW5nIG9yZGVyOgorCSAqIEZMLCBGUiwgQywgTEZFLCBSTCwgUlIKKwkgKi8KKworCWhhZF93cml0 ZV9yZWdpc3RlcihBVURfQlVGX0NIX1NXQVAsIFNXQVBfTEZFX0NFTlRFUik7CisKK3ByZXBfZW5k OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3BjbV9wb2ludGVy LSB0byBzZW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBwb2ludGVycHJvY2Vzc2VkIGJ5IGh3CisgKgor ICogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxl ZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFMU0EgZnJhbWV3b3JrIHRvIGdl dCB0aGUgY3VycmVudCBodyBidWZmZXIgcHRyCisgKiB3aGVuIGEgcGVyaW9kIGlzIGVsYXBzZWQK KyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9pbnRlbGhhZF9wY21fcG9pbnRlcigK KwkJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXUzMiBieXRlc19yZW5kZXJlZCA9IDA7CisJdTMy IHQ7CisJaW50IGJ1Zl9pZDsKKworCS8qIHByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX3BvaW50 ZXIgY2FsbGVkXG4iKTsgKi8KKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2No aXAoc3Vic3RyZWFtKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmZsYWdfdW5kZXJydW4pIHsKKwkJ aW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMDsKKwkJcmV0dXJuIFNORFJWX1BDTV9QT1Nf WFJVTjsKKwl9CisKKwkvKiBVc2UgYSBodyByZWdpc3RlciB0byBjYWxjdWxhdGUgc3ViLXBlcmlv ZCBwb3NpdGlvbiByZXBvcnRzLgorCSAqIFRoaXMgbWFrZXMgUHVsc2VBdWRpbyBoYXBwaWVyLgor CSAqLworCisJYnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiAlIDQ7CisJaGFkX3JlYWRf cmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArIChidWZfaWQgKiBIQURfUkVHX1dJRFRIKSwgJnQp OworCWlmICh0ID09IDApIHsKKwkJcHJfZGVidWcoImRpc2NvdmVyZWQgYnVmZmVyIGRvbmUgZm9y IGJ1ZiAlZFxuIiwgYnVmX2lkKTsKKwkJLyogaGFkX3Byb2Nlc3NfYnVmZmVyX2RvbmUoaW50ZWxo YWRkYXRhKTsgKi8KKwl9CisJdCA9IGludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5idWZf c2l6ZSAtIHQ7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcmVuZGVy ZWQpCisJCWRpdl91NjRfcmVtKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRl cmVkLAorCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5yaW5nX2J1Zl9zaXplLAorCQkJJihi eXRlc19yZW5kZXJlZCkpOworCisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcHRy ID0gYnl0ZXNfdG9fZnJhbWVzKAorCQkJCQkJc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCQkJYnl0 ZXNfcmVuZGVyZWQgKyB0KTsKKwlyZXR1cm4gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZm ZXJfcHRyOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wY21fbW1hcC0gbW1hcHMgYSBrZXJu ZWwgYnVmZmVyIHRvIHVzZXIgc3BhY2UgZm9yIGNvcHlpbmcgZGF0YQorICoKKyAqIEBzdWJzdHJl YW06ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEB2bWE6 CQlzdHJ1Y3QgaW5zdGFuY2Ugb2YgbWVtb3J5IFZNTSBtZW1vcnkgYXJlYQorICoKKyAqIFRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9TIHdoZW4gYSB1c2VyIHNwYWNlIGNvbXBvbmVudAorICog dHJpZXMgdG8gZ2V0IG1tYXAgbWVtb3J5IGZyb20gZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgc25k X2ludGVsaGFkX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAor CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCisJcHJfZGVidWcoInNuZF9pbnRlbGhh ZF9wY21fbW1hcCBjYWxsZWRcbiIpOworCisJcHJfZGVidWcoImVudHJ5IHdpdGggcHJvdDolc1xu IiwgX19mdW5jX18pOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEt PnZtX3BhZ2VfcHJvdCk7CisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3Rh cnQsCisJCQlzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA+PiBQQUdFX1NISUZULAorCQkJdm1h LT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK2ludCBo ZG1pX2F1ZGlvX21vZGVfY2hhbmdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFt KQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBkaXNwX3NhbXBfZnJlcSwgbl9wYXJhbTsKKwlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRf cGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwkvKiBEaXNhYmxlIEF1ZGlvICovCisJ aW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDApOworCisJLyogVXBk YXRlIENUUyB2YWx1ZSAqLworCXJldHZhbCA9IGhhZF9nZXRfY2FwcyhIQURfR0VUX0RJU1BMQVlf UkFURSwgJmRpc3Bfc2FtcF9mcmVxKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicXVlcnlp bmcgZGlzcGxheSBzYW1wbGluZyBmcmVxIGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7CisJCWdvdG8g b3V0OworCX0KKworCXJldHZhbCA9IGludGVsaGFkZGF0YS0+b3BzLT5wcm9nX24oc3Vic3RyZWFt LT5ydW50aW1lLT5yYXRlLCAmbl9wYXJhbSwKKwkJCQkJCQkJaW50ZWxoYWRkYXRhKTsKKwlpZiAo cmV0dmFsKSB7CisJCXByX2VycigicHJvZ3JhbW1pbmcgTiB2YWx1ZSBmYWlsZWQgJSN4XG4iLCBy ZXR2YWwpOworCQlnb3RvIG91dDsKKwl9CisJaW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfY3RzKHN1 YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwKKwkJCQkJZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW0sIGlu dGVsaGFkZGF0YSk7CisKKwkvKiBFbmFibGUgQXVkaW8gKi8KKwlpbnRlbGhhZGRhdGEtPm9wcy0+ ZW5hYmxlX2F1ZGlvKHN1YnN0cmVhbSwgMSk7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQor CisvKlBDTSBvcGVyYXRpb25zIHN0cnVjdHVyZSBhbmQgdGhlIGNhbGxzIGJhY2sgZm9yIHRoZSBz YW1lICovCitzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ludGVsaGFkX3BsYXliYWNrX29wcyA9IHsK Kwkub3BlbiA9CQlzbmRfaW50ZWxoYWRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfaW50ZWxoYWRfY2xv c2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRl bGhhZF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWxoYWRfaHdfZnJlZSwKKwkucHJl cGFyZSA9CXNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbGhh ZF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbGhhZF9wY21fcG9pbnRlciwKKwku bW1hcCA9CXNuZF9pbnRlbGhhZF9wY21fbW1hcCwKK307CisKKy8qKgorICogc25kX2ludGVsaGFk X2NyZWF0ZSAtIHRvIGNyZXRlIGFsc2EgY2FyZCBpbnN0YW5jZQorICoKKyAqIEBpbnRlbGhhZGRh dGE6IHBvaW50ZXIgdG8gaW50ZXJuYWwgY29udGV4dAorICogQGNhcmQ6IHBvaW50ZXIgdG8gY2Fy ZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhkbWkgY2FibGUgaXMg cGx1Z2dlZCBpbgorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9jcmVhdGUoCisJCXN0cnVj dCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJc3RydWN0IHNuZF9jYXJkICpjYXJkKQor eworCWludCByZXR2YWw7CisJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CisJ fTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfY3JlYXRlIGNhbGxlZFxuIik7CisKKwlpZiAo IWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBTFNBIGFwaSB0byByZWdp c3RlciB0aGUgZGV2aWNlICovCisJcmV0dmFsID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZf REVWX0xPV0xFVkVMLCBpbnRlbGhhZGRhdGEsICZvcHMpOworCXJldHVybiByZXR2YWw7Cit9Cisv KioKKyAqIHNuZF9pbnRlbGhhZF9wY21fZnJlZSAtIHRvIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0 ZWQKKyAqCisgKiBAcGNtOiBwb2ludGVyIHRvIHBjbSBpbnN0YW5jZQorICogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQKKyAqLworc3RhdGljIHZvaWQg c25kX2ludGVsaGFkX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJcHJfZGVidWco IkZyZWVpbmcgUENNIHByZWFsbG9jYXRlZCBwYWdlc1xuIik7CisJc25kX3BjbV9saWJfcHJlYWxs b2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2llYzk1OF9pbmZv KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1f aW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1 ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhZF9p ZWM5NThfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRf Y3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVs aGFkZGF0YSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1 ZS5pZWM5NTguc3RhdHVzWzBdID0gKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgPj4gMCkgJiAweGZm OworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gKGludGVsaGFkZGF0YS0+YWVz X2JpdHMgPj4gOCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0K KwkJCQkJKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgPj4gMTYpICYgMHhmZjsKKwl1Y29udHJvbC0+ dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9CisJCQkJCShpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+ IDI0KSAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGhhZF9pZWM5NThfbWFza19n ZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxl bV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0g PSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gMHhmZjsKKwl1Y29u dHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmll Yzk1OC5zdGF0dXNbM10gPSAweGZmOworCXJldHVybiAwOworfQorc3RhdGljIGludCBoYWRfaWVj OTU4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0 bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsK KworCXByX2RlYnVnKCJlbnRlcmVkIGhhZF9pZWM5NThfcHV0XG4iKTsKKwl2YWwgPSAodWNvbnRy b2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPDwgMCkgfAorCQkodWNvbnRyb2wtPnZhbHVlLmll Yzk1OC5zdGF0dXNbMV0gPDwgOCkgfAorCQkodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNb Ml0gPDwgMTYpIHwKKwkJKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdIDw8IDI0KTsK KwlpZiAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAhPSB2YWwpIHsKKwkJaW50ZWxoYWRkYXRhLT5h ZXNfYml0cyA9IHZhbDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMg c3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGFkX2NvbnRyb2xfaWVjOTU4X21hc2sgPSB7CisJLmFj Y2VzcyA9ICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0gICAgU05EUlZf Q1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgi IiwgUExBWUJBQ0ssIE1BU0spLAorCS5pbmZvID0gICAgIGhhZF9pZWM5NThfaW5mbywgLyogc2hh cmVkICovCisJLmdldCA9ICAgICAgaGFkX2llYzk1OF9tYXNrX2dldCwKK307CisKK3N0YXRpYyBz dHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoYWRfY29udHJvbF9pZWM5NTggPSB7CisJLmlmYWNlID0g ICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExf TkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBERUZBVUxUKSwKKwkuaW5mbyA9ICAgICAgICAgaGFk X2llYzk1OF9pbmZvLAorCS5nZXQgPSAgICAgICAgICBoYWRfaWVjOTU4X2dldCwKKwkucHV0ID0g ICAgICAgICAgaGFkX2llYzk1OF9wdXQKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2ludGVsX2hh ZF9pbnRlcmZhY2UgaGFkX2ludGVyZmFjZSA9IHsKKwkubmFtZSA9ICAgICAgICAgImhkbWktYXVk aW8iLAorCS5xdWVyeSA9ICAgICAgICBoZG1pX2F1ZGlvX3F1ZXJ5LAorCS5zdXNwZW5kID0gICAg ICBoZG1pX2F1ZGlvX3N1c3BlbmQsCisJLnJlc3VtZSA9ICAgICAgIGhkbWlfYXVkaW9fcmVzdW1l LAorfTsKKworc3RhdGljIHN0cnVjdCBoYWRfb3BzIGhhZF9vcHNfdjEgPSB7CisJLmVuYWJsZV9h dWRpbyA9IHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjEsCisJLnJlc2V0X2F1ZGlvID0gc25k X2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YxLAorCS5wcm9nX24gPQlzbmRfaW50ZWxoYWRfcHJvZ19u X3YxLAorCS5wcm9nX2N0cyA9CXNuZF9pbnRlbGhhZF9wcm9nX2N0c192MSwKKwkuYXVkaW9fY3Ry bCA9CXNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjEsCisJLnByb2dfZGlwID0Jc25kX2lu dGVsaGFkX3Byb2dfZGlwX3YxLAorCS5oYW5kbGVfdW5kZXJydW4gPSAgaGFkX2NsZWFyX3VuZGVy cnVuX2ludHJfdjEsCit9OworCitzdGF0aWMgc3RydWN0IGhhZF9vcHMgaGFkX29wc192MiA9IHsK KwkuZW5hYmxlX2F1ZGlvID0gc25kX2ludGVsaGFkX2VuYWJsZV9hdWRpb192MiwKKwkucmVzZXRf YXVkaW8gPSBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjIsCisJLnByb2dfbiA9CXNuZF9pbnRl bGhhZF9wcm9nX25fdjIsCisJLnByb2dfY3RzID0Jc25kX2ludGVsaGFkX3Byb2dfY3RzX3YyLAor CS5hdWRpb19jdHJsID0Jc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MiwKKwkucHJvZ19k aXAgPQlzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjIsCisJLmhhbmRsZV91bmRlcnJ1biA9IGhhZF9j bGVhcl91bmRlcnJ1bl9pbnRyX3YyLAorfTsKKy8qKgorICogaGRtaV9hdWRpb19wcm9iZSAtIHRv IGNyZWF0ZSBzb3VuZCBjYXJkIGluc3RhbmNlIGZvciBIRE1JIGF1ZGlvIHBsYXlhYmNrCisgKgor ICpAaGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKkBjYXJkX2lkOiBjYXJk IGZvciB3aGljaCBwcm9iZSBpcyBjYWxsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxl ZCB3aGVuIHRoZSBoZG1pIGNhYmxlIGlzIHBsdWdnZWQgaW4uIFRoaXMgZnVuY3Rpb24KKyAqIGNy ZWF0ZXMgYW5kIHJlZ2lzdGVycyB0aGUgc291bmQgY2FyZCB3aXRoIEFMU0EKKyAqLworaW50IGhk bWlfYXVkaW9fcHJvYmUodm9pZCAqZGV2aWNlcHRyKQoreworCWludCByZXR2YWw7CisJc3RydWN0 IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IGhhZF9jYWxs YmFja19vcHMgb3BzX2NiOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlz dHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KmRldnB0ciA9IGRldmljZXB0cjsKKworCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18p OworCisJcHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUgZG1hX21hc2s6ICVwXG4iLCBkZXZwdHIt PmRldi5kbWFfbWFzayk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBpbnRlcm5h bCBjb250ZXh0IGFuZCB3b3JraW5nICovCisJaW50ZWxoYWRkYXRhID0ga3phbGxvYyhzaXplb2Yo KmludGVsaGFkZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxoYWRkYXRhKQorCQlyZXR1 cm4gLUVOT01FTTsKKworCWhhZF9zdHJlYW0gPSBremFsbG9jKHNpemVvZigqaGFkX3N0cmVhbSks IEdGUF9LRVJORUwpOworCWlmICghaGFkX3N0cmVhbSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOwor CQlnb3RvIGZyZWVfaGFkZGF0YTsKKwl9CisKKwloYWRfZGF0YSA9IGludGVsaGFkZGF0YTsKKwlv cHNfY2IuaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjayA9IGhhZF9ldmVudF9oYW5kbGVyOworCisJ LyogcmVnaXN0ZXJpbmcgd2l0aCBkaXNwbGF5IGRyaXZlciB0byBnZXQgYWNjZXNzIHRvIGRpc3Bs YXkgQVBJcyAqLworCisJcmV0dmFsID0gbWlkX2hkbWlfYXVkaW9fc2V0dXAoCisJCQlvcHNfY2Iu aW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjaywKKwkJCSYoaW50ZWxoYWRkYXRhLT5yZWdfb3BzKSwK KwkJCSYoaW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMpKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2Vy cigicXVlcnlpbmcgZGlzcGxheSBkcml2ZXIgQVBJcyBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOwor CQlnb3RvIGZyZWVfaGFkc3RyZWFtOworCX0KKwltdXRleF9sb2NrKCZoYWRfbXV0ZXgpOworCXNw aW5fbG9ja19pbml0KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jayk7CisJaW50ZWxoYWRkYXRh LT5kcnZfc3RhdHVzID0gSEFEX0RSVl9ESVNDT05ORUNURUQ7CisJcHJfZGVidWcoIiVzIEAgJWQ6 REVCVUcgUExVRy9VTlBMVUcgOiBIQURfRFJWX0RJU0NPTk5FQ1RFRFxuIiwKKwkJCV9fZnVuY19f LCBfX0xJTkVfXyk7CisKKwkvKiBjcmVhdGUgYSBjYXJkIGluc3RhbmNlIHdpdGggQUxTQSBmcmFt ZXdvcmsgKi8KKwlyZXR2YWwgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBoZG1pX2NhcmRf aW5kZXgsIGhkbWlfY2FyZF9pZCwKKwkJCQlUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCisJaWYg KHJldHZhbCkKKwkJZ290byB1bmxvY2tfbXV0ZXg7CisJaW50ZWxoYWRkYXRhLT5jYXJkID0gY2Fy ZDsKKwlpbnRlbGhhZGRhdGEtPmNhcmRfaWQgPSBoZG1pX2NhcmRfaWQ7CisJaW50ZWxoYWRkYXRh LT5jYXJkX2luZGV4ID0gY2FyZC0+bnVtYmVyOworCWludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRh ID0gaGFkX3N0cmVhbTsKKwlpbnRlbGhhZGRhdGEtPmZsYWdfdW5kZXJydW4gPSAwOworCWludGVs aGFkZGF0YS0+YWVzX2JpdHMgPSBTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUY7CisJc3RybmNw eShjYXJkLT5kcml2ZXIsIElOVEVMX0hBRCwgc3RybGVuKElOVEVMX0hBRCkpOworCXN0cm5jcHko Y2FyZC0+c2hvcnRuYW1lLCBJTlRFTF9IQUQsIHN0cmxlbihJTlRFTF9IQUQpKTsKKworCXJldHZh bCA9IHNuZF9wY21fbmV3KGNhcmQsIElOVEVMX0hBRCwgUENNX0lOREVYLCBNQVhfUEJfU1RSRUFN UywKKwkJCQkJCU1BWF9DQVBfU1RSRUFNUywgJnBjbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBl cnI7CisKKwkvKiBzZXR1cCBwcml2YXRlIGRhdGEgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB3aGVu IHJlcXVpcmVkICovCisJcGNtLT5wcml2YXRlX2RhdGEgPSBpbnRlbGhhZGRhdGE7CisJcGNtLT5w cml2YXRlX2ZyZWUgPSBzbmRfaW50ZWxoYWRfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0g MDsKKwlzdHJuY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lLCBzdHJsZW4oY2FyZC0+c2hv cnRuYW1lKSk7CisJLyogc2V0dXAgdGhlIG9wcyBmb3IgcGFseWFiY2sgKi8KKwlzbmRfcGNtX3Nl dF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJICAgICZzbmRfaW50ZWxo YWRfcGxheWJhY2tfb3BzKTsKKwkvKiBhbGxvY2F0ZSBkbWEgcGFnZXMgZm9yIEFMU0Egc3RyZWFt IG9wZXJhdGlvbnMKKwkgKiBtZW1vcnkgYWxsb2NhdGVkIGlzIGJhc2VkIG9uIHNpemUsIG5vdCBt YXggdmFsdWUKKwkgKiB0aHVzIHVzaW5nIHNhbWUgYXJndW1lbnQgZm9yIG1heCAmIHNpemUKKwkg Ki8KKwlyZXR2YWwgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwK KwkJCVNORFJWX0RNQV9UWVBFX0RFViwgTlVMTCwKKwkJCUhBRF9NQVhfQlVGRkVSLCBIQURfTUFY X0JVRkZFUik7CisKKwlpZiAoY2FyZC0+ZGV2ID09IE5VTEwpCisJCXByX2RlYnVnKCJjYXJkLT5k ZXYgaXMgTlVMTCEhISEhIFNob3VsZCBub3QgYmUgdGhpcyBjYXNlXG4iKTsKKwllbHNlIGlmIChj YXJkLT5kZXYtPmRtYV9tYXNrID09IE5VTEwpCisJCXByX2RlYnVnKCJoZG1pX2F1ZGlvX3Byb2Jl IGRtYV9tYXNrIGlzIE5VTEwhISEhIVxuIik7CisJZWxzZQorCQlwcl9kZWJ1ZygiaGRtaV9hdWRp b19wcm9iZSBkbWFfbWFzayBpcyA6ICVwXG4iLAorCQkJCWNhcmQtPmRldi0+ZG1hX21hc2spOwor CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwkvKiBpbnRlcm5hbCBmdW5jdGlvbiBjYWxs IHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIEFMU0EgKi8KKwlyZXR2YWwgPSBzbmRfaW50ZWxoYWRf Y3JlYXRlKGludGVsaGFkZGF0YSwgY2FyZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisK KwljYXJkLT5wcml2YXRlX2RhdGEgPSAmaW50ZWxoYWRkYXRhOworCXJldHZhbCA9IHNuZF9jYXJk X3JlZ2lzdGVyKGNhcmQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJLyogSUVDOTU4 IGNvbnRyb2xzICovCisJcmV0dmFsID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZo YWRfY29udHJvbF9pZWM5NThfbWFzaywKKwkJCQkJCWludGVsaGFkZGF0YSkpOworCWlmIChyZXR2 YWwgPCAwKQorCQlnb3RvIGVycjsKKwlyZXR2YWwgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3Rs X25ldzEoJmhhZF9jb250cm9sX2llYzk1OCwKKwkJCQkJCWludGVsaGFkZGF0YSkpOworCWlmIChy ZXR2YWwgPCAwKQorCQlnb3RvIGVycjsKKworCWluaXRfY2hhbm5lbF9hbGxvY2F0aW9ucygpOwor CisJLyogUmVnaXN0ZXIgY2hhbm5lbCBtYXAgY29udHJvbHMgKi8KKwlyZXR2YWwgPSBoYWRfcmVn aXN0ZXJfY2htYXBfY3RscyhpbnRlbGhhZGRhdGEsIHBjbSk7CisJaWYgKHJldHZhbCA8IDApCisJ CWdvdG8gZXJyOworCisJaW50ZWxoYWRkYXRhLT5kZXYgPSAmZGV2cHRyLT5kZXY7CisJcG1fcnVu dGltZV9zZXRfYWN0aXZlKGludGVsaGFkZGF0YS0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShp bnRlbGhhZGRhdGEtPmRldik7CisKKwltdXRleF91bmxvY2soJmhhZF9tdXRleCk7CisJcmV0dmFs ID0gbWlkX2hkbWlfYXVkaW9fcmVnaXN0ZXIoJmhhZF9pbnRlcmZhY2UsIGludGVsaGFkZGF0YSk7 CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInJlZ2lzdGVyaW5nIHdpdGggZGlzcGxheSBkcml2 ZXIgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJZ290 byBmcmVlX2hhZHN0cmVhbTsKKwl9CisKKwlpbnRlbGhhZGRhdGEtPmh3X3NpbGVuY2UgPSAxOwor CWhhZF9vcHNfdjEgPSBoYWRfb3BzX3YxOwkvKiB1bnVzZWQgKi8KKwlpbnRlbGhhZGRhdGEtPm9w cyA9ICZoYWRfb3BzX3YyOworCisJcmV0dXJuIHJldHZhbDsKK2VycjoKKwlzbmRfY2FyZF9mcmVl KGNhcmQpOwordW5sb2NrX211dGV4OgorCW11dGV4X3VubG9jaygmaGFkX211dGV4KTsKK2ZyZWVf aGFkc3RyZWFtOgorCWtmcmVlKGhhZF9zdHJlYW0pOworCXBtX3J1bnRpbWVfZGlzYWJsZShpbnRl bGhhZGRhdGEtPmRldik7CisJaW50ZWxoYWRkYXRhLT5kZXYgPSBOVUxMOworZnJlZV9oYWRkYXRh OgorCWtmcmVlKGludGVsaGFkZGF0YSk7CisJaW50ZWxoYWRkYXRhID0gTlVMTDsKKwlwcl9lcnIo IkVycm9yIHJldHVybmVkIGZyb20gJXMgYXBpICUjeFxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJ cmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBoZG1pX2F1ZGlvX3JlbW92ZSAtIHJlbW92ZXMg dGhlIGFsc2EgY2FyZAorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0 YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhkbWkgY2FibGUgaXMg dW4tcGx1Z2dlZC4gVGhpcyBmdW5jdGlvbgorICogZnJlZSB0aGUgc291bmQgY2FyZC4KKyAqLwor aW50IGhkbWlfYXVkaW9fcmVtb3ZlKHZvaWQgKnBkZXZwdHIpCit7CisJc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisJaW50IGNhcHM7CisKKwlwcl9kZWJ1Zygi RW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghaW50ZWxoYWRkYXRhKQorCQlyZXR1cm4g MDsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9ESVNDT05ORUNU RUQpIHsKKwkJY2FwcyA9IEhETUlfQVVESU9fVU5ERVJSVU4gfCBIRE1JX0FVRElPX0JVRkZFUl9E T05FOworCQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwgJmNhcHMpOwor CQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPLCBOVUxMKTsKKwl9CisJc25kX2Nh cmRfZnJlZShpbnRlbGhhZGRhdGEtPmNhcmQpOworCWtmcmVlKGludGVsaGFkZGF0YS0+cHJpdmF0 ZV9kYXRhKTsKKwlrZnJlZShpbnRlbGhhZGRhdGEpOworCXJldHVybiAwOworfQorCitNT0RVTEVf QVVUSE9SKCJTYWlsYWphIEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwu Y29tPiIpOworTU9EVUxFX0FVVEhPUigiUmFtZXNoIEJhYnUgSyBWIDxyYW1lc2guYmFidUBpbnRl bC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndh bEBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFu ZEBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIEhETUkgQXVkaW8gZHJp dmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklD RSgie0ludGVsLEludGVsX0hBRH0iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1p X2F1ZGlvLmggYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLmQyMDE1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC94ODYv aW50ZWxfaGRtaV9hdWRpby5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChD KSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFs bGkgPHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYJ PHJhbWVzaC5iYWJ1QGludGVsLmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdh cndhbEBpbnRlbC5jb20+CisgKgkJSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29t PgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFz c29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVh bCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRo b3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisg KiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3 YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj b25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwg YmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2Yg dGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFC SUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklO R0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERF UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElU WSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lT RSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09G VFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgor ICovCisKKyNpZm5kZWYgX0lOVEVMX0hETUlfQVVESU9fSF8KKyNkZWZpbmUgX0lOVEVMX0hETUlf QVVESU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c291bmQvaW5p dHZhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9y dW50aW1lLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KKyNpbmNsdWRlIDxzb3VuZC9j b250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSAiaW50ZWxfaGRtaV9s cGVfYXVkaW8uaCIKKworI2RlZmluZSBQQ01fSU5ERVgJCTAKKyNkZWZpbmUgTUFYX1BCX1NUUkVB TVMJCTEKKyNkZWZpbmUgTUFYX0NBUF9TVFJFQU1TCQkwCisjZGVmaW5lIEhETUlfQVVESU9fRFJJ VkVSCSJoZG1pLWF1ZGlvIgorCisjZGVmaW5lIElORk9fRlJBTUVfV09SRDEJMHgwMDBhMDE4NAor I2RlZmluZSBGSUZPX1RIUkVTSE9MRAkJMHhGRQorI2RlZmluZSBETUFfRklGT19USFJFU0hPTEQJ MHg3CisjZGVmaW5lIEJZVEVTX1BFUl9XT1JECQkweDQKKworLyogU2FtcGxpbmcgcmF0ZSBhcyBw ZXIgSUVDNjA5NTggVmVyIDMgKi8KKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF8zMktIWgkweDMKKyNk ZWZpbmUgQ0hfU1RBVFVTX01BUF80NEtIWgkweDAKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF80OEtI WgkweDIKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF84OEtIWgkweDgKKyNkZWZpbmUgQ0hfU1RBVFVT X01BUF85NktIWgkweEEKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF8xNzZLSFoJMHhDCisjZGVmaW5l IENIX1NUQVRVU19NQVBfMTkyS0haCTB4RQorCisjZGVmaW5lIE1BWF9TTVBMX1dJRFRIXzIwCTB4 MAorI2RlZmluZSBNQVhfU01QTF9XSURUSF8yNAkweDEKKyNkZWZpbmUgU01QTF9XSURUSF8xNkJJ VFMJMHgxCisjZGVmaW5lIFNNUExfV0lEVEhfMjRCSVRTCTB4NQorI2RlZmluZSBDSEFOTkVMX0FM TE9DQVRJT04JMHgxRgorI2RlZmluZSBNQVNLX0JZVEUwCQkweDAwMDAwMEZGCisjZGVmaW5lIFZB TElEX0RJUF9XT1JEUwkJMworI2RlZmluZSBMQVlPVVQwCQkJMAorI2RlZmluZSBMQVlPVVQxCQkJ MQorI2RlZmluZSBTV0FQX0xGRV9DRU5URVIJCTB4MDBmYWM0YzgKKyNkZWZpbmUgQVVEX0NPTkZJ R19DSF9NQVNLX1YyCTB4NzAKKworc3RydWN0IHBjbV9zdHJlYW1faW5mbyB7CisJaW50CQlzdHJf aWQ7CisJdm9pZAkqaGFkX3N1YnN0cmVhbTsKKwl2b2lkCSgqcGVyaW9kX2VsYXBzZWQpKHZvaWQg KmhhZF9zdWJzdHJlYW0pOworCXUzMgkJYnVmZmVyX3B0cjsKKwl1NjQJCWJ1ZmZlcl9yZW5kZXJl ZDsKKwl1MzIJCXJpbmdfYnVmX3NpemU7CisJaW50CQlzZnJlcTsKK307CisKK3N0cnVjdCByaW5n X2J1Zl9pbmZvIHsKKwl1MzIJYnVmX2FkZHI7CisJdTMyCWJ1Zl9zaXplOworCXU4CWlzX3ZhbGlk OworfTsKKworc3RydWN0IGhhZF9zdHJlYW1fcHZ0IHsKKwllbnVtIGhhZF9zdHJlYW1fc3RhdHVz CQlzdHJlYW1fc3RhdHVzOworCWludAkJCQlzdHJlYW1fb3BzOworCXNzaXplX3QJCQkJZGJnX2N1 bV9ieXRlczsKK307CisKK3N0cnVjdCBoYWRfcHZ0X2RhdGEgeworCWVudW0gaGFkX3N0YXR1c19z dHJlYW0JCXN0cmVhbV90eXBlOworfTsKKworc3RydWN0IGhhZF9jYWxsYmFja19vcHMgeworCWhh ZF9ldmVudF9jYWxsX2JhY2sgaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjazsKK307CisKKy8qKgor ICogc3RydWN0IHNuZF9pbnRlbGhhZCAtIGludGVsaGFkIGRyaXZlciBzdHJ1Y3R1cmUKKyAqCisg KiBAY2FyZDogcHRyIHRvIGhvbGQgY2FyZCBkZXRhaWxzCisgKiBAY2FyZF9pbmRleDogc291bmQg Y2FyZCBpbmRleAorICogQGNhcmRfaWQ6IGRldGVjdGVkIHNvdW5kIGNhcmQgaWQKKyAqIEByZWdf b3BzOiByZWdpc3RlciBvcGVyYXRpb25zIHRvIHByb2dyYW0gcmVnaXN0ZXJzCisgKiBAcXVlcnlf b3BzOiBjYXBzIGNhbGwgYmFja3MgZm9yIGdldC9zZXQgb3BlcmF0aW9ucworICogQGRydl9zdGF0 dXM6IGRyaXZlciBzdGF0dXMKKyAqIEBidWZfaW5mbzogcmluZyBidWZmZXIgaW5mbworICogQHN0 cmVhbV9pbmZvOiBzdHJlYW0gaW5mb3JtYXRpb24KKyAqIEBlZWxkOiBob2xkcyBFRUxEIGluZm8K KyAqIEBjdXJyX2J1ZjogcG9pbnRlciB0byBob2xkIGN1cnJlbnQgYWN0aXZlIHJpbmcgYnVmCisg KiBAdmFsaWRfYnVmX2NudDogcmluZyBidWZmZXIgY291bnQgZm9yIHN0cmVhbQorICogQGhhZF9z cGlubG9jazogZHJpdmVyIGxvY2sKKyAqIEBhZXNfYml0czogSUVDOTU4IHN0YXR1cyBiaXRzCisg KiBAYnVmZl9kb25lOiBpZCBvZiBjdXJyZW50IGJ1ZmZlciBkb25lIGludHIKKyAqIEBkZXY6IHBs YXRvZm9ybSBkZXZpY2UgaGFuZGxlCisgKiBAa2N0bDogaG9sZHMga2N0bCBwdHJzIHVzZWQgZm9y IGNoYW5uZWwgbWFwCisgKiBAY2htYXA6IGhvbGRzIGNoYW5uZWwgbWFwIGluZm8KKyAqIEBhdWRp b19yZWdfYmFzZTogaGRtaSBhdWRpbyByZWdpc3RlciBiYXNlIG9mZnNldAorICogQGh3X3NpbGVu Y2U6IGZsYWcgaW5kaWNhdGVzIFNvQyBzdXBwb3J0IGZvciBIVyBzaWxlbmNlL0tlZXAgYWxpdmUK KyAqIEBvcHM6IGhvbGRzIG9wcyBmdW5jdGlvbnMgYmFzZWQgb24gcGxhdGZvcm0KKyAqLworc3Ry dWN0IHNuZF9pbnRlbGhhZCB7CisJc3RydWN0IHNuZF9jYXJkCSpjYXJkOworCWludAkJY2FyZF9p bmRleDsKKwljaGFyCQkqY2FyZF9pZDsKKwlzdHJ1Y3QgaGRtaV9hdWRpb19yZWdpc3RlcnNfb3Bz CXJlZ19vcHM7CisJc3RydWN0IGhkbWlfYXVkaW9fcXVlcnlfc2V0X29wcwlxdWVyeV9vcHM7CisJ ZW51bSBoYWRfZHJ2X3N0YXR1cwlkcnZfc3RhdHVzOworCXN0cnVjdAkJcmluZ19idWZfaW5mbyBi dWZfaW5mb1tIQURfTlVNX09GX1JJTkdfQlVGU107CisJc3RydWN0CQlwY21fc3RyZWFtX2luZm8g c3RyZWFtX2luZm87CisJdW5pb24gb3RtX2hkbWlfZWxkX3QJZWVsZDsKKwllbnVtCQlpbnRlbF9o YWRfYXVkX2J1Zl90eXBlIGN1cnJfYnVmOworCWludAkJdmFsaWRfYnVmX2NudDsKKwl1bnNpZ25l ZCBpbnQJYWVzX2JpdHM7CisJaW50IGZsYWdfdW5kZXJydW47CisJc3RydWN0IGhhZF9wdnRfZGF0 YSAqcHJpdmF0ZV9kYXRhOworCXNwaW5sb2NrX3QgaGFkX3NwaW5sb2NrOworCWVudW0JCWludGVs X2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25lOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1 Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVjdCBzbmRfcGNtX2NobWFwICpjaG1hcDsKKwl1 bnNpZ25lZCBpbnQJKmF1ZGlvX3JlZ19iYXNlOworCXVuc2lnbmVkIGludAlhdWRpb19jZmdfb2Zm c2V0OworCWJvb2wJCWh3X3NpbGVuY2U7CisJc3RydWN0IGhhZF9vcHMJKm9wczsKK307CisKK3N0 cnVjdCBoYWRfb3BzIHsKKwl2b2lkICgqZW5hYmxlX2F1ZGlvKShzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKKwkJCXU4IGVuYWJsZSk7CisJdm9pZCAoKnJlc2V0X2F1ZGlvKSh1 OCByZXNldCk7CisJaW50ICgqcHJvZ19uKSh1MzIgYXVkX3NhbXBfZnJlcSwgdTMyICpuX3BhcmFt LAorCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJvZ19j dHMpKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1kcywgdTMyIG5fcGFyYW0sCisJCQlzdHJ1Y3Qg c25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworCWludCAoKmF1ZGlvX2N0cmwpKHN0cnVjdCBz bmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmlu dGVsaGFkZGF0YSk7CisJdm9pZCAoKnByb2dfZGlwKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworCXZv aWQgKCpoYW5kbGVfdW5kZXJydW4pKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7 Cit9OworCisKK2ludCBoYWRfZXZlbnRfaGFuZGxlcihlbnVtIGhhZF9ldmVudF90eXBlIGV2ZW50 X3R5cGUsIHZvaWQgKmRhdGEpOworCitpbnQgaGRtaV9hdWRpb19xdWVyeSh2b2lkICpkcnZfZGF0 YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQpOworaW50IGhkbWlfYXVkaW9fc3VzcGVu ZCh2b2lkICpkcnZfZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQpOworaW50IGhk bWlfYXVkaW9fcmVzdW1lKHZvaWQgKmRydl9kYXRhKTsKK2ludCBoZG1pX2F1ZGlvX21vZGVfY2hh bmdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKK2V4dGVybiBzdHJ1Y3Qg c25kX3BjbV9vcHMgc25kX2ludGVsaGFkX3BsYXliYWNrX29wczsKKworaW50IHNuZF9pbnRlbGhh ZF9pbml0X2F1ZGlvX2N0cmwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJ CQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJCQkJaW50IGZsYWdfc2ls ZW5jZSk7CitpbnQgc25kX2ludGVsaGFkX3Byb2dfYnVmZmVyKHN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSwKKwkJCQkJaW50IHN0YXJ0LCBpbnQgZW5kKTsKK2ludCBzbmRfaW50ZWxo YWRfaW52ZF9idWZmZXIoaW50IHN0YXJ0LCBpbnQgZW5kKTsKK2ludCBzbmRfaW50ZWxoYWRfcmVh ZF9sZW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKK3ZvaWQgaGFkX2J1aWxk X2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh KTsKKworLyogUmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworaW50IGhhZF9nZXRfaHdzdGF0 ZShzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworaW50IGhhZF9nZXRfY2Fwcyhl bnVtIGhhZF9jYXBzX2xpc3QgcXVlcnlfZWxlbWVudCwgdm9pZCAqY2FwYWJpbHRpZXMpOworaW50 IGhhZF9zZXRfY2FwcyhlbnVtIGhhZF9jYXBzX2xpc3Qgc2V0X2VsZW1lbnQsIHZvaWQgKmNhcGFi aWx0aWVzKTsKK2ludCBoYWRfcmVhZF9yZWdpc3Rlcih1MzIgcmVnX2FkZHIsIHUzMiAqZGF0YSk7 CitpbnQgaGFkX3dyaXRlX3JlZ2lzdGVyKHUzMiByZWdfYWRkciwgdTMyIGRhdGEpOworaW50IGhh ZF9yZWFkX21vZGlmeSh1MzIgcmVnX2FkZHIsIHUzMiBkYXRhLCB1MzIgbWFzayk7CisKK2ludCBo ZG1pX2F1ZGlvX3Byb2JlKHZvaWQgKmRldnB0cik7CitpbnQgaGRtaV9hdWRpb19yZW1vdmUodm9p ZCAqcGRldik7CisKKyNlbmRpZiAvKiBfSU5URUxfSERNSV9BVURJT18gKi8KZGlmZiAtLWdpdCBh L3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvX2lmLmMgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9h dWRpb19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTBiYTQKLS0t IC9kZXYvbnVsbAorKysgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jCkBAIC0wLDAg KzEsNTUxIEBACisvKgorICogICBpbnRlbF9oZG1pX2F1ZGlvX2lmLmMgLSBJbnRlbCBIRE1JIGF1 ZGlvIGRyaXZlciBmb3IgTUlECisgKgorICogIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCBDb3Jw CisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFydXBhbGxp QGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYgPHJhbWVzaC5iYWJ1QGludGVsLmNvbT4K KyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+CisgKgkJSmVy b21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqIEFMU0EgZHJpdmVy IGZvciBJbnRlbCBNSUQgSERNSSBhdWRpbyBjb250cm9sbGVyLiAgVGhpcyBmaWxlIGNvbnRhaW5z CisgKiBpbnRlcmZhY2UgZnVuY3Rpb25zIGV4cG9zZWQgdG8gSERNSSBEaXNwbGF5IGRyaXZlciBh bmQgY29kZSB0byByZWdpc3RlcgorICogd2l0aCBBTFNBIGZyYW1ld29yay4uCisgKi8KKworI2Rl ZmluZSBwcl9mbXQoZm10KQkJImhhZDogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cisj aW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNs dWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaW50 ZWxfaGRtaV9hdWRpby5oIgorI2luY2x1ZGUgImludGVsX2hkbWlfbHBlX2F1ZGlvLmgiCisKKy8q KgorICogaGRtaV9hdWRpb19xdWVyeSAtIGhkbWkgYXVkaW8gcXVlcnkgZnVuY3Rpb24KKyAqCisg KkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqQGV2ZW50OiBhdWRpbyBl dmVudCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgaXMgaW52b2tlZAorICoKKyAqIFRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIgdG8gcXVlcnkgdGhlCisgKiBoZG1pIGF1ZGlv LgorICovCitpbnQgaGRtaV9hdWRpb19xdWVyeSh2b2lkICpoYWRkYXRhLCBzdHJ1Y3QgaGRtaV9h dWRpb19ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVh bSA9IE5VTEw7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25lZCBs b25nIGZsYWdfaXJxczsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSAoc3Ry dWN0IHNuZF9pbnRlbGhhZCAqKWhhZGRhdGE7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJlYW1f aW5mby5oYWRfc3Vic3RyZWFtKQorCQlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9p bmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9k YXRhOworCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCWNhc2UgSEFEX0VWRU5UX1FVRVJZX0lTX0FV RElPX0JVU1k6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9j aywgZmxhZ19pcnFzKTsKKworCQlpZiAoKGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID09IEhBRF9S VU5OSU5HX1NUUkVBTSkgfHwKKwkJCXN1YnN0cmVhbSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssCisJCQkJCQlmbGFnX2lycXMpOworCQkJ cHJfZGVidWcoIkF1ZGlvIHN0cmVhbSBhY3RpdmVcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJ fQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywg ZmxhZ19pcnFzKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5UX1FVRVJZX0lTX0FVRElPX1NV U1BFTkRFRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2Nr LCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZf U1VTUEVOREVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywKKwkJCQkJCWZsYWdfaXJxcyk7CisJCQlwcl9kZWJ1ZygiQXVkaW8gaXMgc3Vz cGVuZGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCWJyZWFrOworCisJZGVm YXVsdDoKKwkJcHJfZGVidWcoImVycm9yIHVuLWhhbmRsZWQgZXZlbnQgISFcbiIpOworCQlyZXR1 cm4gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhk bWlfYXVkaW9fc3VzcGVuZCAtIHBvd2VyIG1hbmFnZW1lbnQgc3VzcGVuZCBmdW5jdGlvbgorICoK KyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0YQorICpAZXZlbnQ6IHBtIGV2 ZW50IGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCisgKgorICogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgYnkgY2xpZW50IGRyaXZlciB0byBzdXNwZW5kIHRoZQorICogaGRtaSBhdWRp by4KKyAqLworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpoYWRkYXRhLCBzdHJ1Y3QgaGRt aV9hdWRpb19ldmVudCBldmVudCkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qg aGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCXN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSA9IChzdHJ1Y3Qgc25kX2ludGVsaGFkICopaGFkZGF0YTsKKworCXByX2Rl YnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0 YS0+cHJpdmF0ZV9kYXRhOworCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8u aGFkX3N1YnN0cmVhbTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRldi0+cG93ZXIucnVudGltZV9z dGF0dXMgIT0gUlBNX1NVU1BFTkRFRCkgeworCQlwcl9lcnIoImF1ZGlvIHN0cmVhbSBpcyBhY3Rp dmVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZp bnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRh LT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9k ZWJ1ZygiaGFkIG5vdCBjb25uZWN0ZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlm IChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9TVVNQRU5ERUQpIHsKKwkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJx cyk7CisJCXByX2RlYnVnKCJoYWQgYWxyZWFkeSBzdXNwZW5kZWRcbiIpOworCQlyZXR1cm4gcmV0 dmFsOworCX0KKworCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfU1VTUEVOREVE OworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9TVVNQRU5E RURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJLyoKKwkgKiBUb0Rv OiBOZWVkIHRvIGRpc2FibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3ZWxsCisJICogIGNhcHMg PSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkgKi8KKwlj YXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNB QkxFX0FVRElPX0lOVCwgJmNhcHMpOworCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVE SU8sIE5VTEwpOworCXByX2RlYnVnKCJFeGl0OiVzIiwgX19mdW5jX18pOworCXJldHVybiByZXR2 YWw7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19yZXN1bWUgLSBwb3dlciBtYW5hZ2VtZW50IHJl c3VtZSBmdW5jdGlvbgorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0 YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIgdG8gcmVz dW1lIHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlfYXVkaW9fcmVzdW1lKHZvaWQg KmhhZGRhdGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJc3RydWN0IHNuZF9pbnRlbGhh ZCAqaW50ZWxoYWRkYXRhID0gKHN0cnVjdCBzbmRfaW50ZWxoYWQgKiloYWRkYXRhOworCXVuc2ln bmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVyOiVzXG4iLCBfX2Z1bmNfXyk7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5F Q1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlu bG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3QgY29ubmVjdGVkXG4iKTsKKwkJ cmV0dXJuIDA7CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyAhPSBIQURfRFJW X1NVU1BFTkRFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJoYWQgaXMgbm90IGluIHN1c3BlbmRl ZCBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChoYWRfZ2V0X2h3c3RhdGUoaW50 ZWxoYWRkYXRhKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVzdW1lLiBEZXZp Y2Ugbm90IGFjY2Vzc2libGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbnRlbGhh ZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0NPTk5FQ1RFRDsKKwlwcl9kZWJ1ZygiJXMgQCAl ZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfRElTQ09OTkVDVEVEXG4iLAorCQkJX19mdW5j X18sIF9fTElORV9fKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkvKgorCSAqIFRvRG86IE5lZWQgdG8gZW5hYmxlIFVO REVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCSAqIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVO IHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkgKi8KKwljYXBzID0gSERNSV9BVURJT19CVUZG RVJfRE9ORTsKKwlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9FTkFCTEVfQVVESU9fSU5U LCAmY2Fwcyk7CisJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FVRElPLCBO VUxMKTsKKwlwcl9kZWJ1ZygiRXhpdDolcyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0dmFsOwor fQorCitzdGF0aWMgaW5saW5lIGludCBoYWRfY2hrX2ludHJtaXNzKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSwKKwkJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZCkK K3sKKwlpbnQgaSwgaW50cl9jb3VudCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBl IGJ1ZmZfZG9uZTsKKwl1MzIgYnVmX3NpemUsIGJ1Zl9hZGRyOworCXN0cnVjdCBoYWRfcHZ0X2Rh dGEgKmhhZF9zdHJlYW07CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwloYWRfc3RyZWFt ID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlidWZmX2RvbmUgPSBidWZfaWQ7CisK KwlpbnRyX2NvdW50ID0gc25kX2ludGVsaGFkX3JlYWRfbGVuKGludGVsaGFkZGF0YSk7CisJaWYg KGludHJfY291bnQgPiAxKSB7CisJCS8qIEluIGNhc2Ugb2YgYWN0aXZlIHBsYXliYWNrICovCisJ CXByX2VycigiRHJpdmVyIGRldGVjdGVkICVkIG1pc3NlZCBidWZmZXIgZG9uZSBpbnRlcnJ1cHQo cykhISEhXG4iLAorCQkJCShpbnRyX2NvdW50IC0gMSkpOworCQlpZiAoaW50cl9jb3VudCA+IDMp CisJCQlyZXR1cm4gaW50cl9jb3VudDsKKworCQlidWZfaWQgKz0gKGludHJfY291bnQgLSAxKTsK KwkJLyogUmVwcm9ncmFtIHJlZ2lzdGVycyovCisJCWZvciAoaSA9IGJ1ZmZfZG9uZTsgaSA8IGJ1 Zl9pZDsgaSsrKSB7CisJCQlpbnQgaiA9IGkgJSA0OworCisJCQlidWZfc2l6ZSA9IGludGVsaGFk ZGF0YS0+YnVmX2luZm9bal0uYnVmX3NpemU7CisJCQlidWZfYWRkciA9IGludGVsaGFkZGF0YS0+ YnVmX2luZm9bal0uYnVmX2FkZHI7CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0xF TkdUSCArCisJCQkJCShqICogSEFEX1JFR19XSURUSCksIGJ1Zl9zaXplKTsKKwkJCWhhZF93cml0 ZV9yZWdpc3RlcigKKwkJCQkJQVVEX0JVRl9BX0FERFIrKGogKiBIQURfUkVHX1dJRFRIKSwKKwkJ CQkJKGJ1Zl9hZGRyIHwgQklUKDApIHwgQklUKDEpKSk7CisJCX0KKwkJYnVmX2lkID0gYnVmX2lk ICUgNDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBm bGFnX2lycXMpOworCQlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1Zl9pZDsKKwkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7 CisJfQorCisJcmV0dXJuIGludHJfY291bnQ7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19idWZmZXJf ZG9uZShzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJaW50IHJldHZhbCA9 IDA7CisJdTMyIGxlbiA9IDE7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZDsK KwllbnVtIGludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25lOworCXN0cnVjdCBwY21fc3Ry ZWFtX2luZm8gKnN0cmVhbTsKKwl1MzIgYnVmX3NpemU7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAq aGFkX3N0cmVhbTsKKwlpbnQgaW50cl9jb3VudDsKKwllbnVtIGhhZF9zdGF0dXNfc3RyZWFtCQlz dHJlYW1fdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCWhhZF9zdHJlYW0gPSBp bnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxoYWRkYXRhLT5zdHJl YW1faW5mbzsKKwlpbnRyX2NvdW50ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZf c3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9lcnIoIiVz OkRldmljZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0 dmFsOworCX0KKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCWludGVsaGFkZGF0 YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWJ1ZmZfZG9uZSA9IGludGVsaGFkZGF0YS0+YnVmZl9k b25lOworCWJ1Zl9zaXplID0gaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tidWZfaWRdLmJ1Zl9zaXpl OworCXN0cmVhbV90eXBlID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGU7CisKKwlwcl9kZWJ1Zygi RW50ZXI6JXMgYnVmX2lkPSVkXG4iLCBfX2Z1bmNfXywgYnVmX2lkKTsKKworCS8qIEV2ZXJ5IGRl YnVnIHN0YXRlbWVudCBoYXMgYW4gaW1wbGljYXRpb24KKwkgKiBvZiB+NW1zZWMuIFRodXMsIGF2 b2lkIGhhdmluZyA+MyBkZWJ1ZyBzdGF0ZW1lbnRzCisJICogZm9yIGVhY2ggYnVmZmVyX2RvbmUg aGFuZGxpbmcuCisJICovCisKKwkvKiBDaGVjayBmb3IgYW55IGludHJfbWlzcyBpbiBjYXNlIG9m IGFjdGl2ZSBwbGF5YmFjayAqLworCWlmIChoYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBIQURf UlVOTklOR19TVFJFQU0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRh LT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWludHJfY291bnQgPSBoYWRfY2hrX2ludHJt aXNzKGludGVsaGFkZGF0YSwgYnVmX2lkKTsKKwkJaWYgKCFpbnRyX2NvdW50IHx8IChpbnRyX2Nv dW50ID4gMykpIHsKKwkJCXByX2VycigiSEFEIFNXIHN0YXRlIGluIG5vbi1yZWNvdmVyYWJsZSEh ISBtb2RlXG4iKTsKKwkJCXByX2VycigiQWxyZWFkeSBwbGF5ZWQgc3RhbGUgZGF0YVxuIik7CisJ CQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWJ1Zl9pZCArPSAoaW50cl9jb3VudCAtIDEpOworCQli dWZfaWQgPSBidWZfaWQgJSA0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5o YWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1ti dWZfaWRdLmlzX3ZhbGlkID0gdHJ1ZTsKKwlpZiAoaW50ZWxoYWRkYXRhLT52YWxpZF9idWZfY250 LTEgPT0gYnVmX2lkKSB7CisJCWlmIChoYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA+PSBIQURfUlVO TklOR19TVFJFQU0pCisJCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVmID0gSEFEX0JVRl9UWVBFX0E7 CisJfSBlbHNlCisJCWludGVsaGFkZGF0YS0+Y3Vycl9idWYgPSBidWZfaWQgKyAxOworCisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJx cyk7CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJcHJfZXJyKCJI RE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKlJl cHJvZ3JhbSB0aGUgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVuZ3RoKi8KKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArCisJCQkoYnVmX2lkICogSEFEX1JFR19XSURUSCks IGJ1Zl9zaXplKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0FERFIrKGJ1Zl9pZCAq IEhBRF9SRUdfV0lEVEgpLAorCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tidWZfaWRdLmJ1Zl9h ZGRyfAorCQkJQklUKDApIHwgQklUKDEpKTsKKworCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9CVUZf QV9MRU5HVEggKyAoYnVmX2lkICogSEFEX1JFR19XSURUSCksCisJCQkJCSZsZW4pOworCXByX2Rl YnVnKCIlczpFbmFibGVkIGJ1ZlslZF1cbiIsIF9fZnVuY19fLCBidWZfaWQpOworCisJLyogSW4g Y2FzZSBvZiBhY3R1YWwgZGF0YSwKKwkgKiByZXBvcnQgYnVmZmVyX2RvbmUgdG8gYWJvdmUgQUxT QSBsYXllcgorCSAqLworCWJ1Zl9zaXplID0gIGludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lk XS5idWZfc2l6ZTsKKwlpZiAoc3RyZWFtX3R5cGUgPj0gSEFEX1JVTk5JTkdfU1RSRUFNKSB7CisJ CWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkICs9CisJCQkoaW50cl9j b3VudCAqIGJ1Zl9zaXplKTsKKwkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZChzdHJlYW0tPmhhZF9z dWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19i dWZmZXJfdW5kZXJydW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWlu dCByZXR2YWwgPSAwOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3Ry dWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyZWFtOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9z dHJlYW07CisJZW51bSBoYWRfc3RhdHVzX3N0cmVhbSBzdHJlYW1fdHlwZTsKKwl1bnNpZ25lZCBs b25nIGZsYWdfaXJxczsKKwlpbnQgZHJ2X3N0YXR1czsKKworCWhhZF9zdHJlYW0gPSBpbnRlbGhh ZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5m bzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxh Z19pcnFzKTsKKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCXN0cmVhbV90eXBl ID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGU7CisJaW50ZWxoYWRkYXRhLT5idWZmX2RvbmUgPSBi dWZfaWQ7CisJZHJ2X3N0YXR1cyA9IGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1czsKKwlpZiAoc3Ry ZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVm ID0gSEFEX0JVRl9UWVBFX0E7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCXByX2RlYnVnKCJFbnRlcjolcyBidWZf aWQ9JWQsIHN0cmVhbV90eXBlPSVkXG4iLAorCQkJX19mdW5jX18sIGJ1Zl9pZCwgc3RyZWFtX3R5 cGUpOworCisJaW50ZWxoYWRkYXRhLT5vcHMtPmhhbmRsZV91bmRlcnJ1bihpbnRlbGhhZGRhdGEp OworCisJaWYgKGRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJcHJfZXJy KCIlczpEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJu IHJldHZhbDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKSB7 CisJCS8qIFJlcG9ydCBVTkRFUlJVTiBlcnJvciB0byBhYm92ZSBsYXllcnMgKi8KKwkJaW50ZWxo YWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMTsKKwkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZChzdHJl YW0tPmhhZF9zdWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBoYWRf cHJvY2Vzc19ob3RfcGx1ZyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJ aW50IHJldHZhbCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZDsKKwlz dHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRh ICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVu dGVyOiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVh bV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0 ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2Nr LCBmbGFnX2lycXMpOworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9D T05ORUNURUQpIHsKKwkJcHJfZGVidWcoIkRldmljZSBhbHJlYWR5IGNvbm5lY3RlZFxuIik7CisJ CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFn X2lycXMpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1 cnJfYnVmOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWludGVsaGFkZGF0 YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfQ09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBAICVkOkRF QlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9DT05ORUNURURcbiIsCisJCQlfX2Z1bmNfXywgX19M SU5FX18pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5s b2NrLCBmbGFnX2lycXMpOworCisJcHJfZGVidWcoIlByb2Nlc3NpbmcgSE9UX1BMVUcsIGJ1Zl9p ZCA9ICVkXG4iLCBidWZfaWQpOworCisJIC8qIFF1ZXJ5IGRpc3BsYXkgZHJpdmVyIGZvciBhdWRp byByZWdpc3RlciBiYXNlICovCisJaWYgKGludGVsaGFkZGF0YS0+cmVnX29wcy5oZG1pX2F1ZGlv X2dldF9yZWdpc3Rlcl9iYXNlKAorCQkmaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSwKKwkJ JmludGVsaGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCkpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8g Z2V0IGF1ZGlvIHJlZyBiYXNlIGZyb20gRGlzcGxheSBkcml2ZXJcbiIpOworCQlnb3RvIGVycjsK Kwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSA9PSBOVUxMKSB7CisJCXBy X2VycigiYXVkaW8gcmVnIGJhc2UgdmFsdWUgaXMgTlVMTFxuIik7CisJCWdvdG8gZXJyOworCX0K KworCXByX2RlYnVnKCIlcyBhdWRpb19yZWdfYmFzZSA9IDB4JXBcbiIsIF9fZnVuY19fLAorCQkJ aW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSk7CisKKwkvKiBTYWZldHkgY2hlY2sgKi8KKwlp ZiAoc3Vic3RyZWFtKSB7CisJCXByX2RlYnVnKCJUaGVyZSBzaG91bGQgbm90IGJlIGFjdGl2ZSBQ QiBmcm9tIEFMU0FcbiIpOworCQlwcl9kZWJ1ZygiU2lnbmlmaWVzLCBjYWJsZSBpcyBwbHVnZ2Vk LWluIGV2ZW4gYmVmb3JlXG4iKTsKKwkJcHJfZGVidWcoInByb2Nlc3Npbmcgc25kX3BjbV9kaXNj b25uZWN0XG4iKTsKKwkJLyogU2V0IHJ1bnRpbWUtPnN0YXRlIHRvIGh3X3BhcmFtcyBkb25lICov CisJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7CisJfQor CisJaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoaW50ZWxoYWRkYXRhKTsKKworCXJl dHVybiByZXR2YWw7CisKK2VycjoKKwlwbV9ydW50aW1lX2Rpc2FibGUoaW50ZWxoYWRkYXRhLT5k ZXYpOworCWludGVsaGFkZGF0YS0+ZGV2ID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitp bnQgaGFkX3Byb2Nlc3NfaG90X3VucGx1ZyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90 eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVk IGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVyOiVzXG4iLCBfX2Z1bmNfXyk7CisK KwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJYnVmX2lkID0gaW50 ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEt PmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0 dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIkRldmljZSBhbHJlYWR5 IGRpc2Nvbm5lY3RlZFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0 YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlyZXR1cm4gcmV0dmFsOworCisJfSBlbHNl IHsKKwkJLyogRGlzYWJsZSBBdWRpbyAqLworCQljYXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9O RTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19JTlQsICZj YXBzKTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJTywgTlVM TCk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oCisJCQlpbnRlbGhhZGRhdGEt PnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0sIDApOworCX0KKworCWludGVsaGFkZGF0YS0+ZHJ2 X3N0YXR1cyA9IEhBRF9EUlZfRElTQ09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVH IFBMVUcvVU5QTFVHIDogSEFEX0RSVl9ESVNDT05ORUNURURcbiIsCisJCQlfX2Z1bmNfXywgX19M SU5FX18pOworCisJLyogUmVwb3J0IHRvIGFib3ZlIEFMU0EgbGF5ZXIgKi8KKwlpZiAoaW50ZWxo YWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJ CXByX2RlYnVnKCIlczogdW5sb2NrIC0+IHNlbmRpbmcgcGNtX3N0b3AgLT4gbG9ja1xuIiwgX19m dW5jX18pOworCQlzbmRfcGNtX3N0b3AoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vi c3RyZWFtLAorCQkJCVNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQpOworCQlzcGluX2xvY2tf aXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJ aGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURfSU5JVDsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlrZnJlZShpbnRl bGhhZGRhdGEtPmNobWFwLT5jaG1hcCk7CisJaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2htYXAgPSBO VUxMOworCWludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UgPSBOVUxMOworCXByX2RlYnVnKCIl czogdW5sb2NrZWQgLT4gcmV0dXJuZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiByZXR2YWw7 Cit9CisKKy8qKgorICogaGFkX2V2ZW50X2hhbmRsZXIgLSBDYWxsIGJhY2sgZnVuY3Rpb24gdG8g aGFuZGxlIGV2ZW50cworICoKKyAqIEBldmVudF90eXBlOiBFdmVudCB0eXBlIHRvIGhhbmRsZQor ICogQGRhdGE6IGRhdGEgcmVsYXRlZCB0byB0aGUgZXZlbnRfdHlwZQorICoKKyAqIFRoaXMgZnVu Y3Rpb24gaXMgaW52b2tlZCB0byBoYW5kbGUgSERNSSBldmVudHMgZnJvbSBjbGllbnQgZHJpdmVy LgorICovCitpbnQgaGFkX2V2ZW50X2hhbmRsZXIoZW51bSBoYWRfZXZlbnRfdHlwZSBldmVudF90 eXBlLCB2b2lkICpkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSA9IGRhdGE7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1 Zl9pZDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3QgaGFk X3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJYnVm X2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRh LT5wcml2YXRlX2RhdGE7CisKKwkvKiBTd2l0Y2hpbmcgdG8gYSBmdW5jdGlvbiBjYW4gZHJvcCBh dG9taWNpdHkgZXZlbiBpbiBJTlRSIGNvbnRleHQuCisJICogVGh1cywgYSBiaWcgbG9jayBpcyBh Y3F1aXJlZCB0byBtYWludGFpbiBhdG9taWNpdHkuCisJICogVGhpcyBjYW4gYmUgb3B0aW1pemVk IGxhdGVyLgorCSAqIEN1cnJlbnRseSwgb25seSBidWZmZXJfZG9uZS9fdW5kZXJydW4gZXhlY3V0 ZXMgaW4gSU5UUiBjb250ZXh0LgorCSAqIEFsc28sIGxvY2tpbmcgaXMgaW1wbGVtZW50ZWQgc2Vw YXJhdGVseSB0byBhdm9pZCByZWFsIGNvbnRlbnRpb24KKwkgKiBvZiBkYXRhKHN0cnVjdCBpbnRl bGhhZGRhdGEpIGJldHdlZW4gSVJRL1NPRlRfSVJRL1BST0NFU1MgY29udGV4dC4KKwkgKi8KKwlz dWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJc3dp dGNoIChldmVudF90eXBlKSB7CisJY2FzZSBIQURfRVZFTlRfQVVESU9fQlVGRkVSX0RPTkU6CisJ CXJldHZhbCA9IGhhZF9wcm9jZXNzX2J1ZmZlcl9kb25lKGludGVsaGFkZGF0YSk7CisJYnJlYWs7 CisKKwljYXNlIEhBRF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJSVU46CisJCXJldHZhbCA9IGhh ZF9wcm9jZXNzX2J1ZmZlcl91bmRlcnJ1bihpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2Fz ZSBIQURfRVZFTlRfSE9UX1BMVUc6CisJCXJldHZhbCA9IGhhZF9wcm9jZXNzX2hvdF9wbHVnKGlu dGVsaGFkZGF0YSk7CisJYnJlYWs7CisKKwljYXNlIEhBRF9FVkVOVF9IT1RfVU5QTFVHOgorCQly ZXR2YWwgPSBoYWRfcHJvY2Vzc19ob3RfdW5wbHVnKGludGVsaGFkZGF0YSk7CisJYnJlYWs7CisK KwljYXNlIEhBRF9FVkVOVF9NT0RFX0NIQU5HSU5HOgorCQlwcl9kZWJ1ZygiIGNhbGxlZCBfZXZl bnRfaGFuZGxlciB3aXRoIF9NT0RFX0NIQU5HRSBldmVudFxuIik7CisJCS8qIFByb2Nlc3Mgb25s eSBpZiBzdHJlYW0gaXMgYWN0aXZlICYgY2FibGUgUGx1Z2dlZC1pbiAqLworCQlzcGluX2xvY2tf aXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWlmIChp bnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPj0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLAorCQkJCQlm bGFnX2lycXMpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50 ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWlmICgoaGFkX3N0cmVhbS0+ c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJCSYmIHN1YnN0cmVhbSkKKwkJ CXJldHZhbCA9IGhkbWlfYXVkaW9fbW9kZV9jaGFuZ2Uoc3Vic3RyZWFtKTsKKwlicmVhazsKKwor CWRlZmF1bHQ6CisJCXByX2RlYnVnKCJlcnJvciB1bi1oYW5kbGVkIGV2ZW50ICEhXG4iKTsKKwkJ cmV0dmFsID0gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKwlyZXR1cm4gcmV0dmFsOworfQpkaWZm IC0tZ2l0IGEvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMgYi9zb3VuZC94ODYvaW50 ZWxfaGRtaV9scGVfYXVkaW8uYwppbmRleCBhOWZkMmQzLi5jZTI0ZWYxIDEwMDY0NAotLS0gYS9z b3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYworKysgYi9zb3VuZC94ODYvaW50ZWxfaGRt aV9scGVfYXVkaW8uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwu aD4KICNpbmNsdWRlIDxkcm0vaW50ZWxfbHBlX2F1ZGlvLmg+CiAjaW5jbHVkZSAiaW50ZWxfaGRt aV9scGVfYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlbF9oZG1pX2F1ZGlvLmgiCiAKIC8qIGdsb2Jh bHMqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhscGVfcGRldjsKQEAgLTQ1MCw5 ICs0NTEsOSBAQCBzdGF0aWMgdm9pZCBub3RpZnlfYXVkaW9fbHBlKHZvaWQgKmF1ZGlvX3B0cikK IC8qKgogICogaGRtaV9scGVfYXVkaW9fcHJvYmUgLSBzdGFydCBicmlkZ2Ugd2l0aCBpOTE1CiAg KgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaTkxNSBkcml2ZXIgY3JlYXRl cyB0aGUgaGRtaS1scGUtYXVkaW8KLSAqIHBsYXRmb3JtIGRldmljZS4gQ2FyZCBjcmVhdGlvbiBp cyBkZWZlcnJlZCB1bnRpbCBhIGhvdCBwbHVnIGV2ZW50IGlzCi0gKiByZWNlaXZlZAorICogVGhp cyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaTkxNSBkcml2ZXIgY3JlYXRlcyB0aGUKKyAq IGhkbWktbHBlLWF1ZGlvIHBsYXRmb3JtIGRldmljZS4gQ2FyZCBjcmVhdGlvbiBpcyBkZWZlcnJl ZCB1bnRpbCBhCisgKiBob3QgcGx1ZyBldmVudCBpcyByZWNlaXZlZAogICovCiBzdGF0aWMgaW50 IGhkbWlfbHBlX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBA IC00OTUsOCArNDk2LDggQEAgc3RhdGljIGludCBoZG1pX2xwZV9hdWRpb19wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQkodW5zaWduZWQgaW50KXJlc19tbWlvLT5lbmQpOwog CiAJbW1pb19zdGFydCA9IGlvcmVtYXBfbm9jYWNoZShyZXNfbW1pby0+c3RhcnQsCi0JCQkJKHNp emVfdCkoKHJlc19tbWlvLT5lbmQgLSByZXNfbW1pby0+c3RhcnQpCi0JCQkJCQkrIDEpKTsKKwkJ CQkoc2l6ZV90KSgocmVzX21taW8tPmVuZCAtCisJCQkJCXJlc19tbWlvLT5zdGFydCkgKyAxKSk7 CiAJaWYgKCFtbWlvX3N0YXJ0KSB7CiAJCWRldl9lcnIoJmhscGVfcGRldi0+ZGV2LCAiQ291bGQg bm90IGdldCBpb3JlbWFwXG4iKTsKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC01NDgsMTEgKzU0OSwx MSBAQCBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOwogCisJcmV0ID0g aGRtaV9hdWRpb19wcm9iZSgodm9pZCAqKXBkZXYpOwogCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2 LCAiaGRtaSBscGUgYXVkaW86IHNldHRpbmcgcGluIGVsZCBub3RpZnkgY2FsbGJhY2tcbiIpOwog CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5scGVfYXVkaW9fc2xvY2ssIGZsYWdfaXJxKTsK IAlwZGF0YS0+bm90aWZ5X2F1ZGlvX2xwZSA9IG5vdGlmeV9hdWRpb19scGU7Ci0KIAlpZiAocGRh dGEtPm5vdGlmeV9wZW5kaW5nKSB7CiAKIAkJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczog aGFuZGxlIHBlbmRpbmcgbm90aWZpY2F0aW9uXG4iLCBfX2Z1bmNfXyk7CkBAIC01NzYsNiArNTc3 LDggQEAgc3RhdGljIGludCBoZG1pX2xwZV9hdWRpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKIAogCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiRW50ZXIgJXNcbiIsIF9f ZnVuY19fKTsKIAorCWhkbWlfYXVkaW9fcmVtb3ZlKHBkZXYpOworCiAJLyogZ2V0IGNvbnRleHQs IHJlbGVhc2UgcmVzb3VyY2VzICovCiAJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7 CiAJaW91bm1hcChjdHgtPm1taW9fc3RhcnQpOwotLSAKMi45LjMKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=