From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Zimmermann Subject: [PATCH v2 14/15] staging/mgakms: Import matroxfb driver source code Date: Mon, 14 Oct 2019 16:04:15 +0200 Message-ID: <20191014140416.28517-15-tzimmermann@suse.de> References: <20191014140416.28517-1-tzimmermann@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id EABB36E512 for ; Mon, 14 Oct 2019 14:04:27 +0000 (UTC) In-Reply-To: <20191014140416.28517-1-tzimmermann@suse.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: airlied@linux.ie, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, sean@poorly.run, b.zolnierkie@samsung.com, ajax@redhat.com, ville.syrjala@linux.intel.com, malat@debian.org, michel@daenzer.net Cc: gregkh@linuxfoundation.org, linux-fbdev@vger.kernel.org, Thomas Zimmermann , dri-devel@lists.freedesktop.org, corbet@lwn.net List-Id: dri-devel@lists.freedesktop.org T25seSBjb2RlIGlzIGJlaW5nIGNvcGllZCwgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzIGFyZSBtYWRl LgoKU2lnbmVkLW9mZi1ieTogVGhvbWFzIFppbW1lcm1hbm4gPHR6aW1tZXJtYW5uQHN1c2UuZGU+ Ci0tLQogZHJpdmVycy9zdGFnaW5nL21nYWttcy9nNDUwX3BsbC5jICAgICAgICAgfCAgNTM5ICsr KysrCiBkcml2ZXJzL3N0YWdpbmcvbWdha21zL2c0NTBfcGxsLmggICAgICAgICB8ICAgMTMgKwog ZHJpdmVycy9zdGFnaW5nL21nYWttcy9pMmMtbWF0cm94ZmIuYyAgICAgfCAgMjM4ICsrCiBkcml2 ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX0RBQzEwNjQuYyB8IDExMTMgKysrKysrKysrCiBk cml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX0RBQzEwNjQuaCB8ICAxODAgKysKIGRyaXZl cnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfVGkzMDI2LmMgIHwgIDc0OCArKysrKysKIGRyaXZl cnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfVGkzMDI2LmggIHwgICAxMiArCiBkcml2ZXJzL3N0 YWdpbmcvbWdha21zL21hdHJveGZiX2FjY2VsLmMgICB8ICA1MTkgKysrKwogZHJpdmVycy9zdGFn aW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5oICAgfCAgICA5ICsKIGRyaXZlcnMvc3RhZ2luZy9t Z2FrbXMvbWF0cm94ZmJfYmFzZS5jICAgIHwgMjYwNyArKysrKysrKysrKysrKysrKysrKysKIGRy aXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfYmFzZS5oICAgIHwgIDcxMCArKysrKysKIGRy aXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfY3J0YzIuaCAgIHwgICAzNSArCiBkcml2ZXJz L3N0YWdpbmcvbWdha21zL21hdHJveGZiX2c0NTAuYyAgICB8ICA2NDAgKysrKysKIGRyaXZlcnMv c3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfZzQ1MC5oICAgIHwgICAxNSArCiBkcml2ZXJzL3N0YWdp bmcvbWdha21zL21hdHJveGZiX21hdmVuLmggICB8ICAgMjEgKwogZHJpdmVycy9zdGFnaW5nL21n YWttcy9tYXRyb3hmYl9taXNjLmMgICAgfCAgODE1ICsrKysrKysKIGRyaXZlcnMvc3RhZ2luZy9t Z2FrbXMvbWF0cm94ZmJfbWlzYy5oICAgIHwgICAyMiArCiAxNyBmaWxlcyBjaGFuZ2VkLCA4MjM2 IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21z L2c0NTBfcGxsLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21zL2c0 NTBfcGxsLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21zL2kyYy1t YXRyb3hmYi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRy b3hmYl9EQUMxMDY0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21z L21hdHJveGZiX0RBQzEwNjQuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvc3RhZ2luZy9t Z2FrbXMvbWF0cm94ZmJfVGkzMDI2LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdp bmcvbWdha21zL21hdHJveGZiX1RpMzAyNi5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9z dGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9iYXNlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX2Jhc2UuaAogY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfY3J0YzIuaAogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfZzQ1MC5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9nNDUwLmgKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX21hdmVuLmgKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX21pc2MuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfbWlzYy5oCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21nYWttcy9nNDUwX3BsbC5jIGIvZHJpdmVycy9zdGFn aW5nL21nYWttcy9nNDUwX3BsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uYzE1ZjhhNTc0OThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21n YWttcy9nNDUwX3BsbC5jCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICoKKyAqIEhhcmR3YXJlIGFj Y2VsZXJhdGVkIE1hdHJveCBQQ0kgY2FyZHMgLSBHNDUwL0c1NTAgUExMIGNvbnRyb2wuCisgKgor ICogKGMpIDIwMDEtMjAwMiBQZXRyIFZhbmRyb3ZlYyA8dmFuZHJvdmVAdmMuY3Z1dC5jej4KKyAq CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMDEgTWF0cm94IEdyYXBoaWNzIEluYy4KKyAq CisgKiBWZXJzaW9uOiAxLjY0IDIwMDIvMDYvMTAKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVj dCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwor ICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9m IHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUg Imc0NTBfcGxsLmgiCisjaW5jbHVkZSAibWF0cm94ZmJfREFDMTA2NC5oIgorCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGludCBnNDUwX3ZjbzJmKHVuc2lnbmVkIGNoYXIgcCwgdW5zaWduZWQgaW50 IGZ2Y28pIHsKKwlyZXR1cm4gKHAgJiAweDQwKSA/IGZ2Y28gOiBmdmNvID4+ICgocCAmIDMpICsg MSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGc0NTBfZjJ2Y28odW5zaWduZWQg Y2hhciBwLCB1bnNpZ25lZCBpbnQgZmluKSB7CisJcmV0dXJuIChwICYgMHg0MCkgPyBmaW4gOiBm aW4gPDwgKChwICYgMykgKyAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnNDUwX21ucDJ2 Y28oY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywKKwkJCQkgdW5zaWduZWQgaW50 IG1ucCkKK3sKKwl1bnNpZ25lZCBpbnQgbSwgbjsKKworCW0gPSAoKG1ucCA+PiAxNikgJiAweDBG RikgKyAxOworCW4gPSAoKG1ucCA+PiAgNykgJiAweDFGRSkgKyA0OworCXJldHVybiAobWluZm8t PmZlYXR1cmVzLnBsbC5yZWZfZnJlcSAqIG4gKyAobSA+PiAxKSkgLyBtOworfQorCit1bnNpZ25l ZCBpbnQgZzQ1MF9tbnAyZihjb25zdCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCB1bnNp Z25lZCBpbnQgbW5wKQoreworCXJldHVybiBnNDUwX3ZjbzJmKG1ucCwgZzQ1MF9tbnAydmNvKG1p bmZvLCBtbnApKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGxsX2ZyZXFfZGVs dGEodW5zaWduZWQgaW50IGYxLCB1bnNpZ25lZCBpbnQgZjIpIHsKKwlpZiAoZjIgPCBmMSkgewor ICAgIAkJZjIgPSBmMSAtIGYyOworCX0gZWxzZSB7CisJCWYyID0gZjIgLSBmMTsKKwl9CisJcmV0 dXJuIGYyOworfQorCisjZGVmaW5lIE5PX01PUkVfTU5QCTB4MDFGRkZGRkYKKyNkZWZpbmUgRzQ1 MF9NTlBfRlJFUUJJVFMJKDB4RkZGRkZGNDMpCS8qIGRvIG5vdCBtYXNrIGhpZ2ggYnl0ZSBzbyB3 ZSdsbCBjYXRjaCBOT19NT1JFX01OUCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGc0NTBfbmV4 dHBsbChjb25zdCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLAorCQkJCSBjb25zdCBzdHJ1 Y3QgbWF0cm94X3BsbF9saW1pdHMgKnBpLAorCQkJCSB1bnNpZ25lZCBpbnQgKmZ2Y28sIHVuc2ln bmVkIGludCBtbnApCit7CisJdW5zaWduZWQgaW50IG0sIG4sIHA7CisJdW5zaWduZWQgaW50IHR2 Y28gPSAqZnZjbzsKKworCW0gPSAobW5wID4+IDE2KSAmIDB4RkY7CisJcCA9IG1ucCAmIDB4RkY7 CisKKwlkbyB7CisJCWlmIChtID09IDAgfHwgbSA9PSAweEZGKSB7CisJCQlpZiAobSA9PSAwKSB7 CisJCQkJaWYgKHAgJiAweDQwKSB7CisJCQkJCXJldHVybiBOT19NT1JFX01OUDsKKwkJCQl9CisJ CQkgICAgICAgIGlmIChwICYgMykgeworCQkJCQlwLS07CisJCQkJfSBlbHNlIHsKKwkJCQkJcCA9 IDB4NDA7CisJCQkJfQorCQkJCXR2Y28gPj49IDE7CisJCQkJaWYgKHR2Y28gPCBwaS0+dmNvbWlu KSB7CisJCQkJCXJldHVybiBOT19NT1JFX01OUDsKKwkJCQl9CisJCQkJKmZ2Y28gPSB0dmNvOwor CQkJfQorCisJCQlwICY9IDB4NDM7CisJCQlpZiAodHZjbyA8IDU1MDAwMCkgeworLyoJCQkJcCB8 PSAweDAwOyAqLworCQkJfSBlbHNlIGlmICh0dmNvIDwgNzAwMDAwKSB7CisJCQkJcCB8PSAweDA4 OworCQkJfSBlbHNlIGlmICh0dmNvIDwgMTAwMDAwMCkgeworCQkJCXAgfD0gMHgxMDsKKwkJCX0g ZWxzZSBpZiAodHZjbyA8IDExNTAwMDApIHsKKwkJCQlwIHw9IDB4MTg7CisJCQl9IGVsc2Ugewor CQkJCXAgfD0gMHgyMDsKKwkJCX0KKwkJCW0gPSA5OworCQl9IGVsc2UgeworCQkJbS0tOworCQl9 CisJCW4gPSAoKHR2Y28gKiAobSsxKSArIG1pbmZvLT5mZWF0dXJlcy5wbGwucmVmX2ZyZXEpIC8g KG1pbmZvLT5mZWF0dXJlcy5wbGwucmVmX2ZyZXEgKiAyKSkgLSAyOworCX0gd2hpbGUgKG4gPCAw eDAzIHx8IG4gPiAweDdBKTsKKwlyZXR1cm4gKG0gPDwgMTYpIHwgKG4gPDwgOCkgfCBwOworfQor CitzdGF0aWMgdW5zaWduZWQgaW50IGc0NTBfZmlyc3RwbGwoY29uc3Qgc3RydWN0IG1hdHJveF9m Yl9pbmZvICptaW5mbywKKwkJCQkgIGNvbnN0IHN0cnVjdCBtYXRyb3hfcGxsX2xpbWl0cyAqcGks CisJCQkJICB1bnNpZ25lZCBpbnQgKnZjbywgdW5zaWduZWQgaW50IGZvdXQpCit7CisJdW5zaWdu ZWQgaW50IHA7CisJdW5zaWduZWQgaW50IHZjb21heDsKKworCXZjb21heCA9IHBpLT52Y29tYXg7 CisJaWYgKGZvdXQgPiAodmNvbWF4IC8gMikpIHsKKwkJaWYgKGZvdXQgPiB2Y29tYXgpIHsKKwkJ CSp2Y28gPSB2Y29tYXg7CisJCX0gZWxzZSB7CisJCQkqdmNvID0gZm91dDsKKwkJfQorCQlwID0g MHg0MDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgdHZjbzsKKworCQlwID0gMzsKKwkJdHZj byA9IGc0NTBfZjJ2Y28ocCwgZm91dCk7CisJCXdoaWxlIChwICYmICh0dmNvID4gdmNvbWF4KSkg eworCQkJcC0tOworCQkJdHZjbyA+Pj0gMTsKKwkJfQorCQlpZiAodHZjbyA8IHBpLT52Y29taW4p IHsKKwkJCXR2Y28gPSBwaS0+dmNvbWluOworCQl9CisJCSp2Y28gPSB0dmNvOworCX0KKwlyZXR1 cm4gZzQ1MF9uZXh0cGxsKG1pbmZvLCBwaSwgdmNvLCAweEZGMDAwMCB8IHApOworfQorCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGludCBnNDUwX3NldHBsbChjb25zdCBzdHJ1Y3QgbWF0cm94X2Zi X2luZm8gKm1pbmZvLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbW5wLCB1bnNpZ25lZCBpbnQg cGxsKQoreworCXN3aXRjaCAocGxsKSB7CisJCWNhc2UgTV9QSVhFTF9QTExfQToKKwkJCW1hdHJv eGZiX0RBQ19vdXQobWluZm8sIE0xMDY0X1hQSVhQTExBTSwgbW5wID4+IDE2KTsKKwkJCW1hdHJv eGZiX0RBQ19vdXQobWluZm8sIE0xMDY0X1hQSVhQTExBTiwgbW5wID4+IDgpOworCQkJbWF0cm94 ZmJfREFDX291dChtaW5mbywgTTEwNjRfWFBJWFBMTEFQLCBtbnApOworCQkJcmV0dXJuIE0xMDY0 X1hQSVhQTExTVEFUOworCisJCWNhc2UgTV9QSVhFTF9QTExfQjoKKwkJCW1hdHJveGZiX0RBQ19v dXQobWluZm8sIE0xMDY0X1hQSVhQTExCTSwgbW5wID4+IDE2KTsKKwkJCW1hdHJveGZiX0RBQ19v dXQobWluZm8sIE0xMDY0X1hQSVhQTExCTiwgbW5wID4+IDgpOworCQkJbWF0cm94ZmJfREFDX291 dChtaW5mbywgTTEwNjRfWFBJWFBMTEJQLCBtbnApOworCQkJcmV0dXJuIE0xMDY0X1hQSVhQTExT VEFUOworCisJCWNhc2UgTV9QSVhFTF9QTExfQzoKKwkJCW1hdHJveGZiX0RBQ19vdXQobWluZm8s IE0xMDY0X1hQSVhQTExDTSwgbW5wID4+IDE2KTsKKwkJCW1hdHJveGZiX0RBQ19vdXQobWluZm8s IE0xMDY0X1hQSVhQTExDTiwgbW5wID4+IDgpOworCQkJbWF0cm94ZmJfREFDX291dChtaW5mbywg TTEwNjRfWFBJWFBMTENQLCBtbnApOworCQkJcmV0dXJuIE0xMDY0X1hQSVhQTExTVEFUOworCisJ CWNhc2UgTV9TWVNURU1fUExMOgorCQkJbWF0cm94ZmJfREFDX291dChtaW5mbywgREFDMTA2NF9Y U1lTUExMTSwgbW5wID4+IDE2KTsKKwkJCW1hdHJveGZiX0RBQ19vdXQobWluZm8sIERBQzEwNjRf WFNZU1BMTE4sIG1ucCA+PiA4KTsKKwkJCW1hdHJveGZiX0RBQ19vdXQobWluZm8sIERBQzEwNjRf WFNZU1BMTFAsIG1ucCk7CisJCQlyZXR1cm4gREFDMTA2NF9YU1lTUExMU1RBVDsKKworCQljYXNl IE1fVklERU9fUExMOgorCQkJbWF0cm94ZmJfREFDX291dChtaW5mbywgTTEwNjRfWFZJRFBMTE0s IG1ucCA+PiAxNik7CisJCQltYXRyb3hmYl9EQUNfb3V0KG1pbmZvLCBNMTA2NF9YVklEUExMTiwg bW5wID4+IDgpOworCQkJbWF0cm94ZmJfREFDX291dChtaW5mbywgTTEwNjRfWFZJRFBMTFAsIG1u cCk7CisJCQlyZXR1cm4gTTEwNjRfWFZJRFBMTFNUQVQ7CisJfQorCXJldHVybiAwOworfQorCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnNDUwX2NtcHBsbChjb25zdCBzdHJ1Y3QgbWF0cm94 X2ZiX2luZm8gKm1pbmZvLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbW5wLCB1bnNpZ25lZCBp bnQgcGxsKQoreworCXVuc2lnbmVkIGNoYXIgbSA9IG1ucCA+PiAxNjsKKwl1bnNpZ25lZCBjaGFy IG4gPSBtbnAgPj4gODsKKwl1bnNpZ25lZCBjaGFyIHAgPSBtbnA7CisKKwlzd2l0Y2ggKHBsbCkg eworCQljYXNlIE1fUElYRUxfUExMX0E6CisJCQlyZXR1cm4gKG1hdHJveGZiX0RBQ19pbihtaW5m bywgTTEwNjRfWFBJWFBMTEFNKSAhPSBtIHx8CisJCQkJbWF0cm94ZmJfREFDX2luKG1pbmZvLCBN MTA2NF9YUElYUExMQU4pICE9IG4gfHwKKwkJCQltYXRyb3hmYl9EQUNfaW4obWluZm8sIE0xMDY0 X1hQSVhQTExBUCkgIT0gcCk7CisKKwkJY2FzZSBNX1BJWEVMX1BMTF9COgorCQkJcmV0dXJuICht YXRyb3hmYl9EQUNfaW4obWluZm8sIE0xMDY0X1hQSVhQTExCTSkgIT0gbSB8fAorCQkJCW1hdHJv eGZiX0RBQ19pbihtaW5mbywgTTEwNjRfWFBJWFBMTEJOKSAhPSBuIHx8CisJCQkJbWF0cm94ZmJf REFDX2luKG1pbmZvLCBNMTA2NF9YUElYUExMQlApICE9IHApOworCisJCWNhc2UgTV9QSVhFTF9Q TExfQzoKKwkJCXJldHVybiAobWF0cm94ZmJfREFDX2luKG1pbmZvLCBNMTA2NF9YUElYUExMQ00p ICE9IG0gfHwKKwkJCQltYXRyb3hmYl9EQUNfaW4obWluZm8sIE0xMDY0X1hQSVhQTExDTikgIT0g biB8fAorCQkJCW1hdHJveGZiX0RBQ19pbihtaW5mbywgTTEwNjRfWFBJWFBMTENQKSAhPSBwKTsK KworCQljYXNlIE1fU1lTVEVNX1BMTDoKKwkJCXJldHVybiAobWF0cm94ZmJfREFDX2luKG1pbmZv LCBEQUMxMDY0X1hTWVNQTExNKSAhPSBtIHx8CisJCQkJbWF0cm94ZmJfREFDX2luKG1pbmZvLCBE QUMxMDY0X1hTWVNQTExOKSAhPSBuIHx8CisJCQkJbWF0cm94ZmJfREFDX2luKG1pbmZvLCBEQUMx MDY0X1hTWVNQTExQKSAhPSBwKTsKKworCQljYXNlIE1fVklERU9fUExMOgorCQkJcmV0dXJuICht YXRyb3hmYl9EQUNfaW4obWluZm8sIE0xMDY0X1hWSURQTExNKSAhPSBtIHx8CisJCQkJbWF0cm94 ZmJfREFDX2luKG1pbmZvLCBNMTA2NF9YVklEUExMTikgIT0gbiB8fAorCQkJCW1hdHJveGZiX0RB Q19pbihtaW5mbywgTTEwNjRfWFZJRFBMTFApICE9IHApOworCX0KKwlyZXR1cm4gMTsKK30KKwor c3RhdGljIGlubGluZSBpbnQgZzQ1MF9pc3BsbGxvY2tlZChjb25zdCBzdHJ1Y3QgbWF0cm94X2Zi X2luZm8gKm1pbmZvLAorCQkJCSAgIHVuc2lnbmVkIGludCByZWdpZHgpCit7CisJdW5zaWduZWQg aW50IGo7CisKKwlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisJCWlmIChtYXRyb3hmYl9E QUNfaW4obWluZm8sIHJlZ2lkeCkgJiAweDQwKSB7CisJCQl1bnNpZ25lZCBpbnQgciA9IDA7CisJ CQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQkJciArPSBtYXRy b3hmYl9EQUNfaW4obWluZm8sIHJlZ2lkeCkgJiAweDQwOworCQkJfQorCQkJcmV0dXJuIHIgPj0g KDkwICogMHg0MCk7CisJCX0KKwkJLyogdWRlbGF5KDEpLi4uIGJ1dCBEQUNfaW4gaXMgbXVjaCBz bG93ZXIuLi4gKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZzQ1MF90ZXN0cGxs KGNvbnN0IHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVuc2lnbmVkIGludCBtbnAsCisJ CQl1bnNpZ25lZCBpbnQgcGxsKQoreworCXJldHVybiBnNDUwX2lzcGxsbG9ja2VkKG1pbmZvLCBn NDUwX3NldHBsbChtaW5mbywgbW5wLCBwbGwpKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlaHdz dGF0ZV9jbGsoc3RydWN0IG1hdHJveF9od19zdGF0ZSogaHcsIHVuc2lnbmVkIGludCBtbnAsIHVu c2lnbmVkIGludCBwbGwpIHsKKwlzd2l0Y2ggKHBsbCkgeworCQljYXNlIE1fU1lTVEVNX1BMTDoK KwkJCWh3LT5EQUNjbGtbM10gPSBtbnAgPj4gMTY7CisJCQlody0+REFDY2xrWzRdID0gbW5wID4+ IDg7CisJCQlody0+REFDY2xrWzVdID0gbW5wOworCQkJYnJlYWs7CisJfQorfQorCit2b2lkIG1h dHJveGZiX2c0NTBfc2V0cGxsX2NvbmQoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgdW5z aWduZWQgaW50IG1ucCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGxsKQoreworCWlmIChnNDUw X2NtcHBsbChtaW5mbywgbW5wLCBwbGwpKSB7CisJCWc0NTBfc2V0cGxsKG1pbmZvLCBtbnAsIHBs bCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnNDUwX2ZpbmR3b3JraW5n cGxsKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sCisJCQkJCSAgICAgICB1bnNpZ25lZCBp bnQgcGxsLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICptbnBhcnJheSwKKwkJCQkJICAgICAg IHVuc2lnbmVkIGludCBtbnBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgZm91bmQgPSAwOworCXVu c2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgaW50IG1ucGZvdW5kID0gbW5wYXJyYXlbMF07CisJ CQorCWZvciAoaWR4ID0gMDsgaWR4IDwgbW5wY291bnQ7IGlkeCsrKSB7CisJCXVuc2lnbmVkIGlu dCBzYXJyYXlbM107CisJCXVuc2lnbmVkIGludCAqc3B0cjsKKwkJeworCQkJdW5zaWduZWQgaW50 IG1ucDsKKwkJCisJCQlzcHRyID0gc2FycmF5OworCQkJbW5wID0gbW5wYXJyYXlbaWR4XTsKKwkJ CWlmIChtbnAgJiAweDM4KSB7CisJCQkJKnNwdHIrKyA9IG1ucCAtIDg7CisJCQl9CisJCQlpZiAo KG1ucCAmIDB4MzgpICE9IDB4MzgpIHsKKwkJCQkqc3B0cisrID0gbW5wICsgODsKKwkJCX0KKwkJ CSpzcHRyID0gbW5wOworCQl9CisJCXdoaWxlIChzcHRyID49IHNhcnJheSkgeworCQkJdW5zaWdu ZWQgaW50IG1ucCA9ICpzcHRyLS07CisJCQorCQkJaWYgKGc0NTBfdGVzdHBsbChtaW5mbywgbW5w IC0gMHgwMzAwLCBwbGwpICYmCisJCQkgICAgZzQ1MF90ZXN0cGxsKG1pbmZvLCBtbnAgKyAweDAz MDAsIHBsbCkgJiYKKwkJCSAgICBnNDUwX3Rlc3RwbGwobWluZm8sIG1ucCAtIDB4MDIwMCwgcGxs KSAmJgorCQkJICAgIGc0NTBfdGVzdHBsbChtaW5mbywgbW5wICsgMHgwMjAwLCBwbGwpICYmCisJ CQkgICAgZzQ1MF90ZXN0cGxsKG1pbmZvLCBtbnAgLSAweDAxMDAsIHBsbCkgJiYKKwkJCSAgICBn NDUwX3Rlc3RwbGwobWluZm8sIG1ucCArIDB4MDEwMCwgcGxsKSkgeworCQkJCWlmIChnNDUwX3Rl c3RwbGwobWluZm8sIG1ucCwgcGxsKSkgeworCQkJCQlyZXR1cm4gbW5wOworCQkJCX0KKwkJCX0g ZWxzZSBpZiAoIWZvdW5kICYmIGc0NTBfdGVzdHBsbChtaW5mbywgbW5wLCBwbGwpKSB7CisJCQkJ bW5wZm91bmQgPSBtbnA7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQl9CisJfQorCWc0NTBfc2V0 cGxsKG1pbmZvLCBtbnBmb3VuZCwgcGxsKTsKKwlyZXR1cm4gbW5wZm91bmQ7Cit9CisKK3N0YXRp YyB2b2lkIGc0NTBfYWRkY2FjaGUoc3RydWN0IG1hdHJveF9wbGxfY2FjaGUqIGNpLCB1bnNpZ25l ZCBpbnQgbW5wX2tleSwgdW5zaWduZWQgaW50IG1ucF92YWx1ZSkgeworCWlmICgrK2NpLT52YWxp ZCA+IEFSUkFZX1NJWkUoY2ktPmRhdGEpKSB7CisJCWNpLT52YWxpZCA9IEFSUkFZX1NJWkUoY2kt PmRhdGEpOworCX0KKwltZW1tb3ZlKGNpLT5kYXRhICsgMSwgY2ktPmRhdGEsIChjaS0+dmFsaWQg LSAxKSAqIHNpemVvZigqY2ktPmRhdGEpKTsKKwljaS0+ZGF0YVswXS5tbnBfa2V5ID0gbW5wX2tl eSAmIEc0NTBfTU5QX0ZSRVFCSVRTOworCWNpLT5kYXRhWzBdLm1ucF92YWx1ZSA9IG1ucF92YWx1 ZTsKK30KKworc3RhdGljIGludCBnNDUwX2NoZWNrY2FjaGUoc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbywKKwkJCSAgIHN0cnVjdCBtYXRyb3hfcGxsX2NhY2hlICpjaSwgdW5zaWduZWQgaW50 IG1ucF9rZXkpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJbW5wX2tleSAmPSBHNDUwX01OUF9G UkVRQklUUzsKKwlmb3IgKGkgPSAwOyBpIDwgY2ktPnZhbGlkOyBpKyspIHsKKwkJaWYgKGNpLT5k YXRhW2ldLm1ucF9rZXkgPT0gbW5wX2tleSkgeworCQkJdW5zaWduZWQgaW50IG1ucDsKKwkJCQor CQkJbW5wID0gY2ktPmRhdGFbaV0ubW5wX3ZhbHVlOworCQkJaWYgKGkpIHsKKwkJCQltZW1tb3Zl KGNpLT5kYXRhICsgMSwgY2ktPmRhdGEsIGkgKiBzaXplb2YoKmNpLT5kYXRhKSk7CisJCQkJY2kt PmRhdGFbMF0ubW5wX2tleSA9IG1ucF9rZXk7CisJCQkJY2ktPmRhdGFbMF0ubW5wX3ZhbHVlID0g bW5wOworCQkJfQorCQkJcmV0dXJuIG1ucDsKKwkJfQorCX0KKwlyZXR1cm4gTk9fTU9SRV9NTlA7 Cit9CisKK3N0YXRpYyBpbnQgX19nNDUwX3NldGNsayhzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1p bmZvLCB1bnNpZ25lZCBpbnQgZm91dCwKKwkJCSB1bnNpZ25lZCBpbnQgcGxsLCB1bnNpZ25lZCBp bnQgKm1ucGFycmF5LAorCQkJIHVuc2lnbmVkIGludCAqZGVsdGFhcnJheSkKK3sKKwl1bnNpZ25l ZCBpbnQgbW5wY291bnQ7CisJdW5zaWduZWQgaW50IHBpeGVsX3ZjbzsKKwljb25zdCBzdHJ1Y3Qg bWF0cm94X3BsbF9saW1pdHMqIHBpOworCXN0cnVjdCBtYXRyb3hfcGxsX2NhY2hlKiBjaTsKKwor CXBpeGVsX3ZjbyA9IDA7CisJc3dpdGNoIChwbGwpIHsKKwkJY2FzZSBNX1BJWEVMX1BMTF9BOgor CQljYXNlIE1fUElYRUxfUExMX0I6CisJCWNhc2UgTV9QSVhFTF9QTExfQzoKKwkJCXsKKwkJCQl1 X2ludDhfdCB0bXAsIHhwd3JjdHJsOworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJ CQkJbWF0cm94ZmJfREFDX2xvY2tfaXJxc2F2ZShmbGFncyk7CisKKwkJCQl4cHdyY3RybCA9IG1h dHJveGZiX0RBQ19pbihtaW5mbywgTTEwNjRfWFBXUkNUUkwpOworCQkJCW1hdHJveGZiX0RBQ19v dXQobWluZm8sIE0xMDY0X1hQV1JDVFJMLCB4cHdyY3RybCAmIH5NMTA2NF9YUFdSQ1RSTF9QQU5F TFBETik7CisJCQkJbWdhX291dGIoTV9TRVFfSU5ERVgsIE1fU0VRMSk7CisJCQkJbWdhX291dGIo TV9TRVFfREFUQSwgbWdhX2luYihNX1NFUV9EQVRBKSB8IE1fU0VRMV9TQ1JPRkYpOworCQkJCXRt cCA9IG1hdHJveGZiX0RBQ19pbihtaW5mbywgTTEwNjRfWFBJWENMS0NUUkwpOworCQkJCXRtcCB8 PSBNMTA2NF9YUElYQ0xLQ1RSTF9ESVM7CisJCQkJaWYgKCEodG1wICYgTTEwNjRfWFBJWENMS0NU UkxfUExMX1VQKSkgeworCQkJCQl0bXAgfD0gTTEwNjRfWFBJWENMS0NUUkxfUExMX1VQOworCQkJ CX0KKwkJCQltYXRyb3hmYl9EQUNfb3V0KG1pbmZvLCBNMTA2NF9YUElYQ0xLQ1RSTCwgdG1wKTsK KwkJCQkvKiBEVkkgUExMIHByZWZlcnJlZCBmb3IgZnJlcXVlbmNpZXMgdXAgdG8KKwkJCQkgICBw YW5lbCBsaW5rIG1heCwgc3RhbmRhcmQgUExMIG90aGVyd2lzZSAqLworCQkJCWlmIChmb3V0ID49 IG1pbmZvLT5tYXhfcGl4ZWxfY2xvY2tfcGFuZWxsaW5rKQorCQkJCQl0bXAgPSAwOworCQkJCWVs c2UgdG1wID0KKwkJCQkJTTEwNjRfWERWSUNMS0NUUkxfRFZJREFUQVBBVEhTRUwgfAorCQkJCQlN MTA2NF9YRFZJQ0xLQ1RSTF9DMURWSUNMS1NFTCB8CisJCQkJCU0xMDY0X1hEVklDTEtDVFJMX0Mx RFZJQ0xLRU4gfAorCQkJCQlNMTA2NF9YRFZJQ0xLQ1RSTF9EVklMT09QQ1RMIHwKKwkJCQkJTTEw NjRfWERWSUNMS0NUUkxfUDFMT09QQldEVENUTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLyogU2V0dGluZyB0aGlzIGJyZWFrcyBQQyBzeXN0ZW1zIHNvIGRvbid0IGRvIGl0ICov CisJCQkJLyogbWF0cm94ZmJfREFDX291dChtaW5mbywgTTEwNjRfWERWSUNMS0NUUkwsIHRtcCk7 ICovCisJCQkJbWF0cm94ZmJfREFDX291dChtaW5mbywgTTEwNjRfWFBXUkNUUkwsCisJCQkJCQkg eHB3cmN0cmwpOworCisJCQkJbWF0cm94ZmJfREFDX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsK KwkJCX0KKwkJCXsKKwkJCQl1X2ludDhfdCBtaXNjOworCQkKKwkJCQltaXNjID0gbWdhX2luYihN X01JU0NfUkVHX1JFQUQpICYgfjB4MEM7CisJCQkJc3dpdGNoIChwbGwpIHsKKwkJCQkJY2FzZSBN X1BJWEVMX1BMTF9BOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTV9QSVhFTF9QTExfQjoKKwkJ CQkJCW1pc2MgfD0gIDB4MDQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCW1p c2MgfD0gIDB4MEM7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbWdhX291dGIoTV9NSVNDX1JF RywgbWlzYyk7CisJCQl9CisJCQlwaSA9ICZtaW5mby0+bGltaXRzLnBpeGVsOworCQkJY2kgPSAm bWluZm8tPmNhY2hlLnBpeGVsOworCQkJYnJlYWs7CisJCWNhc2UgTV9TWVNURU1fUExMOgorCQkJ eworCQkJCXVfaW50MzJfdCBvcHQ7CisKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobWluZm8t PnBjaWRldiwgUENJX09QVElPTl9SRUcsICZvcHQpOworCQkJCWlmICghKG9wdCAmIDB4MjApKSB7 CisJCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9S RUcsIG9wdCB8IDB4MjApOworCQkJCX0KKwkJCX0KKwkJCXBpID0gJm1pbmZvLT5saW1pdHMuc3lz dGVtOworCQkJY2kgPSAmbWluZm8tPmNhY2hlLnN5c3RlbTsKKwkJCWJyZWFrOworCQljYXNlIE1f VklERU9fUExMOgorCQkJeworCQkJCXVfaW50OF90IHRtcDsKKwkJCQl1bnNpZ25lZCBpbnQgbW5w OworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJCQkJbWF0cm94ZmJfREFDX2xvY2tf aXJxc2F2ZShmbGFncyk7CisJCQkJdG1wID0gbWF0cm94ZmJfREFDX2luKG1pbmZvLCBNMTA2NF9Y UFdSQ1RSTCk7CisJCQkJaWYgKCEodG1wICYgMikpIHsKKwkJCQkJbWF0cm94ZmJfREFDX291dCht aW5mbywgTTEwNjRfWFBXUkNUUkwsIHRtcCB8IDIpOworCQkJCX0KKwkJCQkKKwkJCQltbnAgPSBt YXRyb3hmYl9EQUNfaW4obWluZm8sIE0xMDY0X1hQSVhQTExDTSkgPDwgMTY7CisJCQkJbW5wIHw9 IG1hdHJveGZiX0RBQ19pbihtaW5mbywgTTEwNjRfWFBJWFBMTENOKSA8PCA4OworCQkJCXBpeGVs X3ZjbyA9IGc0NTBfbW5wMnZjbyhtaW5mbywgbW5wKTsKKwkJCQltYXRyb3hmYl9EQUNfdW5sb2Nr X2lycXJlc3RvcmUoZmxhZ3MpOworCQkJfQorCQkJcGkgPSAmbWluZm8tPmxpbWl0cy52aWRlbzsK KwkJCWNpID0gJm1pbmZvLT5jYWNoZS52aWRlbzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJbW5wY291bnQgPSAwOworCXsKKwkJdW5zaWduZWQgaW50 IG1ucDsKKwkJdW5zaWduZWQgaW50IHh2Y287CisKKwkJZm9yIChtbnAgPSBnNDUwX2ZpcnN0cGxs KG1pbmZvLCBwaSwgJnh2Y28sIGZvdXQpOyBtbnAgIT0gTk9fTU9SRV9NTlA7IG1ucCA9IGc0NTBf bmV4dHBsbChtaW5mbywgcGksICZ4dmNvLCBtbnApKSB7CisJCQl1bnNpZ25lZCBpbnQgaWR4Owor CQkJdW5zaWduZWQgaW50IHZjbzsKKwkJCXVuc2lnbmVkIGludCBkZWx0YTsKKworCQkJdmNvID0g ZzQ1MF9tbnAydmNvKG1pbmZvLCBtbnApOworI2lmIDAJCQkKKwkJCWlmIChwbGwgPT0gTV9WSURF T19QTEwpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYmlnLCBzbWFsbDsKKworCQkJCWlmICh2Y28gPCBw aXhlbF92Y28pIHsKKwkJCQkJc21hbGwgPSB2Y287CisJCQkJCWJpZyA9IHBpeGVsX3ZjbzsKKwkJ CQl9IGVsc2UgeworCQkJCQlzbWFsbCA9IHBpeGVsX3ZjbzsKKwkJCQkJYmlnID0gdmNvOworCQkJ CX0KKwkJCQl3aGlsZSAoYmlnID4gc21hbGwpIHsKKwkJCQkJYmlnID4+PSAxOworCQkJCX0KKwkJ CQlpZiAoYmlnID09IHNtYWxsKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKyNlbmRp ZgkJCQorCQkJZGVsdGEgPSBwbGxfZnJlcV9kZWx0YShmb3V0LCBnNDUwX3ZjbzJmKG1ucCwgdmNv KSk7CisJCQlmb3IgKGlkeCA9IG1ucGNvdW50OyBpZHggPiAwOyBpZHgtLSkgeworCQkJCS8qID09 IGlzIGltcG9ydGFudDsgZHVlIHRvIG5leHRwbGwgYWxnb3JpdGhtIHdlIGdldAorCQkJCSAgIHNv cnRlZCBlcXVhbGx5IGdvb2QgZnJlcXVlbmNpZXMgZnJvbSBsb3dlciBWQ08gCisJCQkJICAgZnJl cXVlbmN5IHRvIGhpZ2hlciAtIHdpdGggPD0gbG93ZXN0IHdpbnMsIHdoaWxlCisJCQkJICAgd2l0 aCA8IGhpZ2hlc3Qgb25lIHdpbnMgKi8KKwkJCQlpZiAoZGVsdGEgPD0gZGVsdGFhcnJheVtpZHgt MV0pIHsKKwkJCQkJLyogYWxsIGVsc2UgYmVpbmcgZXF1YWwgZXhjZXB0IFZDTywKKwkJCQkJICog Y2hvb3NlIFZDTyBub3QgbmVhciAod2l0aGluIDEvMTZ0aCBvciBzbykgVkNPbWluCisJCQkJCSAq IChmcmVxcyBuZWFyIFZDT21pbiBhcmVuJ3QgYXMgc3RhYmxlKQorCQkJCQkgKi8KKwkJCQkJaWYg KGRlbHRhID09IGRlbHRhYXJyYXlbaWR4LTFdCisJCQkJCSAgICAmJiB2Y28gIT0gZzQ1MF9tbnAy dmNvKG1pbmZvLCBtbnBhcnJheVtpZHgtMV0pCisJCQkJCSAgICAmJiB2Y28gPCAocGktPnZjb21p biAqIDE3IC8gMTYpKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQltbnBhcnJheVtpZHhd ID0gbW5wYXJyYXlbaWR4LTFdOworCQkJCQlkZWx0YWFycmF5W2lkeF0gPSBkZWx0YWFycmF5W2lk eC0xXTsKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQltbnBhcnJh eVtpZHhdID0gbW5wOworCQkJZGVsdGFhcnJheVtpZHhdID0gZGVsdGE7CisJCQltbnBjb3VudCsr OworCQl9CisJfQorCS8qIFZpZGVvUExMIGFuZCBQaXhlbFBMTCBtYXRjaGVkOiBkbyBub3RoaW5n Li4uIEluIGFsbCBvdGhlciBjYXNlcyB3ZSBzaG91bGQgZ2V0IGF0IGxlYXN0IG9uZSBmcmVxdWVu Y3kgKi8KKwlpZiAoIW1ucGNvdW50KSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXsKKwkJdW5z aWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgaW50IG1ucDsKKwkJCisJCW1hdHJveGZiX0RB Q19sb2NrX2lycXNhdmUoZmxhZ3MpOworCQltbnAgPSBnNDUwX2NoZWNrY2FjaGUobWluZm8sIGNp LCBtbnBhcnJheVswXSk7CisJCWlmIChtbnAgIT0gTk9fTU9SRV9NTlApIHsKKwkJCW1hdHJveGZi X2c0NTBfc2V0cGxsX2NvbmQobWluZm8sIG1ucCwgcGxsKTsKKwkJfSBlbHNlIHsKKwkJCW1ucCA9 IGc0NTBfZmluZHdvcmtpbmdwbGwobWluZm8sIHBsbCwgbW5wYXJyYXksIG1ucGNvdW50KTsKKwkJ CWc0NTBfYWRkY2FjaGUoY2ksIG1ucGFycmF5WzBdLCBtbnApOworCQl9CisJCXVwZGF0ZWh3c3Rh dGVfY2xrKCZtaW5mby0+aHcsIG1ucCwgcGxsKTsKKwkJbWF0cm94ZmJfREFDX3VubG9ja19pcnFy ZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIG1ucDsKKwl9Cit9CisKKy8qIEl0IG11c3QgYmUgZ3Jl YXRlciB0aGFuIG51bWJlciBvZiBwb3NzaWJsZSBQTEwgdmFsdWVzLgorICogQ3VycmVudGx5IHRo ZXJlIGlzIDUocCkgKiAxMChtKSA9IDUwIHBvc3NpYmxlIHZhbHVlcy4gKi8KKyNkZWZpbmUgTU5Q X1RBQkxFX1NJWkUgIDY0CisKK2ludCBtYXRyb3hmYl9nNDUwX3NldGNsayhzdHJ1Y3QgbWF0cm94 X2ZiX2luZm8gKm1pbmZvLCB1bnNpZ25lZCBpbnQgZm91dCwKKwkJCSB1bnNpZ25lZCBpbnQgcGxs KQoreworCXVuc2lnbmVkIGludCogYXJyOworCQorCWFyciA9IGttYWxsb2Moc2l6ZW9mKCphcnIp ICogTU5QX1RBQkxFX1NJWkUgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXJyKSB7CisJCWludCBy OworCisJCXIgPSBfX2c0NTBfc2V0Y2xrKG1pbmZvLCBmb3V0LCBwbGwsIGFyciwgYXJyICsgTU5Q X1RBQkxFX1NJWkUpOworCQlrZnJlZShhcnIpOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIC1F Tk9NRU07Cit9CisKK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfZzQ1MF9zZXRjbGspOworRVhQT1JU X1NZTUJPTChnNDUwX21ucDJmKTsKK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfZzQ1MF9zZXRwbGxf Y29uZCk7CisKK01PRFVMRV9BVVRIT1IoIihjKSAyMDAxLTIwMDIgUGV0ciBWYW5kcm92ZWMgPHZh bmRyb3ZlQHZjLmN2dXQuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hdHJveCBHNDUwL0c1 NTAgUExMIGRyaXZlciIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9k cml2ZXJzL3N0YWdpbmcvbWdha21zL2c0NTBfcGxsLmggYi9kcml2ZXJzL3N0YWdpbmcvbWdha21z L2c0NTBfcGxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi41MzAz MzM2YzY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL2c0NTBf cGxsLmgKQEAgLTAsMCArMSwxMyBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjAgKi8KKyNpZm5kZWYgX19HNDUwX1BMTF9IX18KKyNkZWZpbmUgX19HNDUwX1BMTF9IX18KKwor I2luY2x1ZGUgIm1hdHJveGZiX2Jhc2UuaCIKKworaW50IG1hdHJveGZiX2c0NTBfc2V0Y2xrKHN0 cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVuc2lnbmVkIGludCBmb3V0LAorCQkJIHVuc2ln bmVkIGludCBwbGwpOwordW5zaWduZWQgaW50IGc0NTBfbW5wMmYoY29uc3Qgc3RydWN0IG1hdHJv eF9mYl9pbmZvICptaW5mbywgdW5zaWduZWQgaW50IG1ucCk7Cit2b2lkIG1hdHJveGZiX2c0NTBf c2V0cGxsX2NvbmQoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgdW5zaWduZWQgaW50IG1u cCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGxsKTsKKworI2VuZGlmCS8qIF9fRzQ1MF9QTExf SF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWdha21zL2kyYy1tYXRyb3hmYi5j IGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9pMmMtbWF0cm94ZmIuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjBmYjI4MGVhZDNkYwotLS0gL2Rldi9udWxsCisrKyBi L2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvaTJjLW1hdHJveGZiLmMKQEAgLTAsMCArMSwyMzggQEAK Ky8qCisgKgorICogSGFyZHdhcmUgYWNjZWxlcmF0ZWQgTWF0cm94IE1pbGxlbm5pdW0gSSwgSUks IE15c3RpcXVlLCBHMTAwLCBHMjAwLCBHNDAwIGFuZCBHNDUwLgorICoKKyAqIChjKSAxOTk4LTIw MDIgUGV0ciBWYW5kcm92ZWMgPHZhbmRyb3ZlQHZjLmN2dXQuY3o+CisgKgorICogVmVyc2lvbjog MS42NCAyMDAyLzA2LzEwCisgKgorICogU2VlIG1hdHJveGZiX2Jhc2UuYyBmb3IgY29udHJpYnV0 b3JzLgorICoKKyAqLworCisjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorI2luY2x1ZGUgIm1h dHJveGZiX21hdmVuLmgiCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgv c2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorCisvKiBNR0EtVFZPIEky QyBmb3IgRzIwMCwgRzQwMCAqLworI2RlZmluZSBNQVRfQ0xLCQkweDIwCisjZGVmaW5lIE1BVF9E QVRBCTB4MTAKKy8qIHByaW1hcnkgaGVhZCBEREMgZm9yIE15c3RpcXVlKD8pLCBHMTAwLCBHMjAw LCBHNDAwICovCisjZGVmaW5lIEREQzFfQ0xLCTB4MDgKKyNkZWZpbmUgRERDMV9EQVRBCTB4MDIK Ky8qIHByaW1hcnkgaGVhZCBEREMgZm9yIE1pbGxlbm5pdW0sIE1pbGxlbm5pdW0gSUkgKi8KKyNk ZWZpbmUgRERDMUJfQ0xLCTB4MTAKKyNkZWZpbmUgRERDMUJfREFUQQkweDA0CisvKiBzZWNvbmRh cnkgaGVhZCBEREMgZm9yIEc0MDAgKi8KKyNkZWZpbmUgRERDMl9DTEsJMHgwNAorI2RlZmluZSBE REMyX0RBVEEJMHgwMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworCitzdHJ1Y3QgbWF0cm94ZmJfZGhfbWF2ZW5faW5mbyB7CisJc3Ry dWN0IGkyY19iaXRfYWRhcHRlcgltYXZlbjsKKwlzdHJ1Y3QgaTJjX2JpdF9hZGFwdGVyCWRkYzE7 CisJc3RydWN0IGkyY19iaXRfYWRhcHRlcglkZGMyOworfTsKKworc3RhdGljIGludCBtYXRyb3hm Yl9yZWFkX2dwaW8oc3RydWN0IG1hdHJveF9mYl9pbmZvKiBtaW5mbykgeworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisJaW50IHY7CisKKwltYXRyb3hmYl9EQUNfbG9ja19pcnFzYXZlKGZsYWdzKTsK Kwl2ID0gbWF0cm94ZmJfREFDX2luKG1pbmZvLCBEQUNfWEdFTklPREFUQSk7CisJbWF0cm94ZmJf REFDX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZv aWQgbWF0cm94ZmJfc2V0X2dwaW8oc3RydWN0IG1hdHJveF9mYl9pbmZvKiBtaW5mbywgaW50IG1h c2ssIGludCB2YWwpIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2OworCisJbWF0cm94 ZmJfREFDX2xvY2tfaXJxc2F2ZShmbGFncyk7CisJdiA9IChtYXRyb3hmYl9EQUNfaW4obWluZm8s IERBQ19YR0VOSU9DVFJMKSAmIG1hc2spIHwgdmFsOworCW1hdHJveGZiX0RBQ19vdXQobWluZm8s IERBQ19YR0VOSU9DVFJMLCB2KTsKKwkvKiBXZSBtdXN0IHJlc2V0IEdFTklPREFUQSB2ZXJ5IG9m dGVuLi4uIFhGcmVlIHBsYXlzIHdpdGggdGhpcyByZWdpc3RlciAqLworCW1hdHJveGZiX0RBQ19v dXQobWluZm8sIERBQ19YR0VOSU9EQVRBLCAweDAwKTsKKwltYXRyb3hmYl9EQUNfdW5sb2NrX2ly cXJlc3RvcmUoZmxhZ3MpOworfQorCisvKiBzb2Z0d2FyZSBJMkMgZnVuY3Rpb25zICovCitzdGF0 aWMgaW5saW5lIHZvaWQgbWF0cm94ZmJfaTJjX3NldChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIG1p bmZvLCBpbnQgbWFzaywgaW50IHN0YXRlKSB7CisJaWYgKHN0YXRlKQorCQlzdGF0ZSA9IDA7CisJ ZWxzZQorCQlzdGF0ZSA9IG1hc2s7CisJbWF0cm94ZmJfc2V0X2dwaW8obWluZm8sIH5tYXNrLCBz dGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hdHJveGZiX2dwaW9fc2V0c2RhKHZvaWQqIGRhdGEs IGludCBzdGF0ZSkgeworCXN0cnVjdCBpMmNfYml0X2FkYXB0ZXIqIGIgPSBkYXRhOworCW1hdHJv eGZiX2kyY19zZXQoYi0+bWluZm8sIGItPm1hc2suZGF0YSwgc3RhdGUpOworfQorCitzdGF0aWMg dm9pZCBtYXRyb3hmYl9ncGlvX3NldHNjbCh2b2lkKiBkYXRhLCBpbnQgc3RhdGUpIHsKKwlzdHJ1 Y3QgaTJjX2JpdF9hZGFwdGVyKiBiID0gZGF0YTsKKwltYXRyb3hmYl9pMmNfc2V0KGItPm1pbmZv LCBiLT5tYXNrLmNsb2NrLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm94ZmJfZ3Bpb19n ZXRzZGEodm9pZCogZGF0YSkgeworCXN0cnVjdCBpMmNfYml0X2FkYXB0ZXIqIGIgPSBkYXRhOwor CXJldHVybiAobWF0cm94ZmJfcmVhZF9ncGlvKGItPm1pbmZvKSAmIGItPm1hc2suZGF0YSkgPyAx IDogMDsKK30KKworc3RhdGljIGludCBtYXRyb3hmYl9ncGlvX2dldHNjbCh2b2lkKiBkYXRhKSB7 CisJc3RydWN0IGkyY19iaXRfYWRhcHRlciogYiA9IGRhdGE7CisJcmV0dXJuIChtYXRyb3hmYl9y ZWFkX2dwaW8oYi0+bWluZm8pICYgYi0+bWFzay5jbG9jaykgPyAxIDogMDsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBtYXRyb3hfaTJjX2FsZ29fdGVtcGxhdGUg PQoreworCS5zZXRzZGEJCT0gbWF0cm94ZmJfZ3Bpb19zZXRzZGEsCisJLnNldHNjbAkJPSBtYXRy b3hmYl9ncGlvX3NldHNjbCwKKwkuZ2V0c2RhCQk9IG1hdHJveGZiX2dwaW9fZ2V0c2RhLAorCS5n ZXRzY2wJCT0gbWF0cm94ZmJfZ3Bpb19nZXRzY2wsCisJLnVkZWxheQkJPSAxMCwKKwkudGltZW91 dAk9IDEwMCwKK307CisKK3N0YXRpYyBpbnQgaTJjX2J1c19yZWcoc3RydWN0IGkyY19iaXRfYWRh cHRlciogYiwgc3RydWN0IG1hdHJveF9mYl9pbmZvKiBtaW5mbywgCisJCXVuc2lnbmVkIGludCBk YXRhLCB1bnNpZ25lZCBpbnQgY2xvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCisJCWludCBjbGFzcykK K3sKKwlpbnQgZXJyOworCisJYi0+bWluZm8gPSBtaW5mbzsKKwliLT5tYXNrLmRhdGEgPSBkYXRh OworCWItPm1hc2suY2xvY2sgPSBjbG9jazsKKwliLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RV TEU7CisJc25wcmludGYoYi0+YWRhcHRlci5uYW1lLCBzaXplb2YoYi0+YWRhcHRlci5uYW1lKSwg bmFtZSwKKwkJbWluZm8tPmZiY29uLm5vZGUpOworCWkyY19zZXRfYWRhcGRhdGEoJmItPmFkYXB0 ZXIsIGIpOworCWItPmFkYXB0ZXIuY2xhc3MgPSBjbGFzczsKKwliLT5hZGFwdGVyLmFsZ29fZGF0 YSA9ICZiLT5iYWM7CisJYi0+YWRhcHRlci5kZXYucGFyZW50ID0gJm1pbmZvLT5wY2lkZXYtPmRl djsKKwliLT5iYWMgPSBtYXRyb3hfaTJjX2FsZ29fdGVtcGxhdGU7CisJYi0+YmFjLmRhdGEgPSBi OworCWVyciA9IGkyY19iaXRfYWRkX2J1cygmYi0+YWRhcHRlcik7CisJYi0+aW5pdGlhbGl6ZWQg PSAhZXJyOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19iaXRfYnVzX2RlbChz dHJ1Y3QgaTJjX2JpdF9hZGFwdGVyKiBiKSB7CisJaWYgKGItPmluaXRpYWxpemVkKSB7CisJCWky Y19kZWxfYWRhcHRlcigmYi0+YWRhcHRlcik7CisJCWItPmluaXRpYWxpemVkID0gMDsKKwl9Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfbWF2ZW5fZG9uZShzdHJ1Y3QgbWF0cm94ZmJfZGhf bWF2ZW5faW5mbyogbWluZm8yKSB7CisJaTJjX2JpdF9idXNfZGVsKCZtaW5mbzItPm1hdmVuKTsK K30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19kZGMxX2RvbmUoc3RydWN0IG1hdHJveGZiX2Ro X21hdmVuX2luZm8qIG1pbmZvMikgeworCWkyY19iaXRfYnVzX2RlbCgmbWluZm8yLT5kZGMxKTsK K30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19kZGMyX2RvbmUoc3RydWN0IG1hdHJveGZiX2Ro X21hdmVuX2luZm8qIG1pbmZvMikgeworCWkyY19iaXRfYnVzX2RlbCgmbWluZm8yLT5kZGMyKTsK K30KKworc3RhdGljIHZvaWQqIGkyY19tYXRyb3hmYl9wcm9iZShzdHJ1Y3QgbWF0cm94X2ZiX2lu Zm8qIG1pbmZvKSB7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBt YXRyb3hmYl9kaF9tYXZlbl9pbmZvKiBtMmluZm87CisKKwltMmluZm8gPSBremFsbG9jKHNpemVv ZigqbTJpbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtMmluZm8pCisJCXJldHVybiBOVUxMOwor CisJbWF0cm94ZmJfREFDX2xvY2tfaXJxc2F2ZShmbGFncyk7CisJbWF0cm94ZmJfREFDX291dCht aW5mbywgREFDX1hHRU5JT0RBVEEsIDB4RkYpOworCW1hdHJveGZiX0RBQ19vdXQobWluZm8sIERB Q19YR0VOSU9DVFJMLCAweDAwKTsKKwltYXRyb3hmYl9EQUNfdW5sb2NrX2lycXJlc3RvcmUoZmxh Z3MpOworCisJc3dpdGNoIChtaW5mby0+Y2hpcCkgeworCQljYXNlIE1HQV8yMDY0OgorCQljYXNl IE1HQV8yMTY0OgorCQkJZXJyID0gaTJjX2J1c19yZWcoJm0yaW5mby0+ZGRjMSwgbWluZm8sCisJ CQkJCSAgRERDMUJfREFUQSwgRERDMUJfQ0xLLAorCQkJCQkgICJEREM6ZmIldSAjMCIsIEkyQ19D TEFTU19EREMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSBpMmNfYnVzX3JlZygm bTJpbmZvLT5kZGMxLCBtaW5mbywKKwkJCQkJICBEREMxX0RBVEEsIEREQzFfQ0xLLAorCQkJCQkg ICJEREM6ZmIldSAjMCIsIEkyQ19DTEFTU19EREMpOworCQkJYnJlYWs7CisJfQorCWlmIChlcnIp CisJCWdvdG8gZmFpbF9kZGMxOworCWlmIChtaW5mby0+ZGV2ZmxhZ3MuZHVhbGhlYWQpIHsKKwkJ ZXJyID0gaTJjX2J1c19yZWcoJm0yaW5mby0+ZGRjMiwgbWluZm8sCisJCQkJICBEREMyX0RBVEEs IEREQzJfQ0xLLAorCQkJCSAgIkREQzpmYiV1ICMxIiwgSTJDX0NMQVNTX0REQyk7CisJCWlmIChl cnIgPT0gLUVOT0RFVikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLW1hdHJveGZiOiBWR0Et PlRWIHBsdWcgZGV0ZWN0ZWQsIEREQyB1bmF2YWlsYWJsZS5cbiIpOworCQl9IGVsc2UgaWYgKGVy cikKKwkJCXByaW50ayhLRVJOX0lORk8gImkyYy1tYXRyb3hmYjogQ291bGQgbm90IHJlZ2lzdGVy IHNlY29uZGFyeSBvdXRwdXQgaTJjIGJ1cy4gQ29udGludWluZyBhbnl3YXkuXG4iKTsKKwkJLyog UmVnaXN0ZXIgbWF2ZW4gYnVzIGV2ZW4gb24gRzQ1MC9HNTUwICovCisJCWVyciA9IGkyY19idXNf cmVnKCZtMmluZm8tPm1hdmVuLCBtaW5mbywKKwkJCQkgIE1BVF9EQVRBLCBNQVRfQ0xLLCAiTUFW RU46ZmIldSIsIDApOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLW1hdHJv eGZiOiBDb3VsZCBub3QgcmVnaXN0ZXIgTWF2ZW4gaTJjIGJ1cy4gQ29udGludWluZyBhbnl3YXku XG4iKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbWF2ZW5faW5mbyA9IHsK KwkJCQlJMkNfQk9BUkRfSU5GTygibWF2ZW4iLCAweDFiKSwKKwkJCX07CisJCQl1bnNpZ25lZCBz aG9ydCBjb25zdCBhZGRyX2xpc3RbMl0gPSB7CisJCQkJMHgxYiwgSTJDX0NMSUVOVF9FTkQKKwkJ CX07CisKKwkJCWkyY19uZXdfcHJvYmVkX2RldmljZSgmbTJpbmZvLT5tYXZlbi5hZGFwdGVyLAor CQkJCQkgICAgICAmbWF2ZW5faW5mbywgYWRkcl9saXN0LCBOVUxMKTsKKwkJfQorCX0KKwlyZXR1 cm4gbTJpbmZvOworZmFpbF9kZGMxOjsKKwlrZnJlZShtMmluZm8pOworCXByaW50ayhLRVJOX0VS UiAiaTJjLW1hdHJveGZiOiBDb3VsZCBub3QgcmVnaXN0ZXIgcHJpbWFyeSBhZGFwdGVyIEREQyBi dXMuXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaTJjX21hdHJveGZiX3Jl bW92ZShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIG1pbmZvLCB2b2lkKiBkYXRhKSB7CisJc3RydWN0 IG1hdHJveGZiX2RoX21hdmVuX2luZm8qIG0yaW5mbyA9IGRhdGE7CisKKwlpMmNfbWF2ZW5fZG9u ZShtMmluZm8pOworCWkyY19kZGMyX2RvbmUobTJpbmZvKTsKKwlpMmNfZGRjMV9kb25lKG0yaW5m byk7CisJa2ZyZWUobTJpbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXRyb3hmYl9kcml2ZXIg aTJjX21hdHJveGZiID0geworCS5ub2RlID0JCUxJU1RfSEVBRF9JTklUKGkyY19tYXRyb3hmYi5u b2RlKSwKKwkubmFtZSA9CQkiaTJjLW1hdHJveGZiIiwKKwkucHJvYmUgPSAJaTJjX21hdHJveGZi X3Byb2JlLAorCS5yZW1vdmUgPQlpMmNfbWF0cm94ZmJfcmVtb3ZlLAorfTsKKworc3RhdGljIGlu dCBfX2luaXQgaTJjX21hdHJveGZiX2luaXQodm9pZCkgeworCWlmIChtYXRyb3hmYl9yZWdpc3Rl cl9kcml2ZXIoJmkyY19tYXRyb3hmYikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtbWF0cm94 ZmI6IGZhaWxlZCB0byByZWdpc3RlciBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0K KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19tYXRyb3hmYl9leGl0KHZv aWQpIHsKKwltYXRyb3hmYl91bnJlZ2lzdGVyX2RyaXZlcigmaTJjX21hdHJveGZiKTsKK30KKwor TU9EVUxFX0FVVEhPUigiKGMpIDE5OTktMjAwMiBQZXRyIFZhbmRyb3ZlYyA8dmFuZHJvdmVAdmMu Y3Z1dC5jej4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBtb2R1bGUgcHJvdmlkaW5n IEkyQyBidXNlcyBwcmVzZW50IG9uIE1hdHJveCB2aWRlb2NhcmRzIik7CisKK21vZHVsZV9pbml0 KGkyY19tYXRyb3hmYl9pbml0KTsKK21vZHVsZV9leGl0KGkyY19tYXRyb3hmYl9leGl0KTsKKy8q IG5vIF9fc2V0dXAgcmVxdWlyZWQgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdp dCBhL2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfREFDMTA2NC5jIGIvZHJpdmVycy9z dGFnaW5nL21nYWttcy9tYXRyb3hmYl9EQUMxMDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi5iMzgwYTM5M2NiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJz L3N0YWdpbmcvbWdha21zL21hdHJveGZiX0RBQzEwNjQuYwpAQCAtMCwwICsxLDExMTMgQEAKKy8q CisgKgorICogSGFyZHdhcmUgYWNjZWxlcmF0ZWQgTWF0cm94IE1pbGxlbm5pdW0gSSwgSUksIE15 c3RpcXVlLCBHMTAwLCBHMjAwLCBHNDAwIGFuZCBHNDUwLgorICoKKyAqIChjKSAxOTk4LTIwMDIg UGV0ciBWYW5kcm92ZWMgPHZhbmRyb3ZlQHZjLmN2dXQuY3o+CisgKgorICogUG9ydGlvbnMgQ29w eXJpZ2h0IChjKSAyMDAxIE1hdHJveCBHcmFwaGljcyBJbmMuCisgKgorICogVmVyc2lvbjogMS42 NSAyMDAyLzA4LzE0CisgKgorICogU2VlIG1hdHJveGZiX2Jhc2UuYyBmb3IgY29udHJpYnV0b3Jz LgorICoKKyAqLworCisKKyNpbmNsdWRlICJtYXRyb3hmYl9EQUMxMDY0LmgiCisjaW5jbHVkZSAi bWF0cm94ZmJfbWlzYy5oIgorI2luY2x1ZGUgIm1hdHJveGZiX2FjY2VsLmgiCisjaW5jbHVkZSAi ZzQ1MF9wbGwuaCIKKyNpbmNsdWRlIDxsaW51eC9tYXRyb3hmYi5oPgorCisjaWZkZWYgTkVFRF9E QUMxMDY0CisjZGVmaW5lIG91dERBQzEwNjQgbWF0cm94ZmJfREFDX291dAorI2RlZmluZSBpbkRB QzEwNjQgbWF0cm94ZmJfREFDX2luCisKKyNkZWZpbmUgREFDMTA2NF9PUFRfU0NMS19QQ0kJMHgw MAorI2RlZmluZSBEQUMxMDY0X09QVF9TQ0xLX1BMTAkweDAxCisjZGVmaW5lIERBQzEwNjRfT1BU X1NDTEtfRVhUCTB4MDIKKyNkZWZpbmUgREFDMTA2NF9PUFRfU0NMS19NQVNLCTB4MDMKKyNkZWZp bmUgREFDMTA2NF9PUFRfR0RJVjEJMHgwNAkvKiBtYXliZSBpdCBpcyBHRElWMiBvbiBHMTAwID8h ICovCisjZGVmaW5lIERBQzEwNjRfT1BUX0dESVYzCTB4MDAKKyNkZWZpbmUgREFDMTA2NF9PUFRf TURJVjEJMHgwOAorI2RlZmluZSBEQUMxMDY0X09QVF9NRElWMgkweDAwCisjZGVmaW5lIERBQzEw NjRfT1BUX1JFU0VSVkVECTB4MTAKKworc3RhdGljIHZvaWQgREFDMTA2NF9jYWxjY2xvY2soY29u c3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBm cmVxLCB1bnNpZ25lZCBpbnQgZm1heCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqaW4sIHVuc2ln bmVkIGludCAqZmVlZCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqcG9zdCkKK3sKKwl1bnNpZ25l ZCBpbnQgZnZjbzsKKwl1bnNpZ25lZCBpbnQgcDsKKworCURCRyhfX2Z1bmNfXykKKwkKKwkvKiBv bmx5IGZvciBkZXZpY2VzIG9sZGVyIHRoYW4gRzQ1MCAqLworCisJZnZjbyA9IFBMTF9jYWxjY2xv Y2sobWluZm8sIGZyZXEsIGZtYXgsIGluLCBmZWVkLCAmcCk7CisJCisJcCA9ICgxIDw8IHApIC0g MTsKKwlpZiAoZnZjbyA8PSAxMDAwMDApCisJCTsKKwllbHNlIGlmIChmdmNvIDw9IDE0MDAwMCkK KwkJcCB8PSAweDA4OworCWVsc2UgaWYgKGZ2Y28gPD0gMTgwMDAwKQorCQlwIHw9IDB4MTA7CisJ ZWxzZQorCQlwIHw9IDB4MTg7CisJKnBvc3QgPSBwOworfQorCisvKiB0aGV5IG11c3QgYmUgaW4g UE9TIG9yZGVyICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNR0ExMDY0X0RBQ19yZWdz W10gPSB7CisJCU0xMDY0X1hDVVJBRERMLCBNMTA2NF9YQ1VSQURESCwgTTEwNjRfWENVUkNUUkws CisJCU0xMDY0X1hDVVJDT0wwUkVELCBNMTA2NF9YQ1VSQ09MMEdSRUVOLCBNMTA2NF9YQ1VSQ09M MEJMVUUsCisJCU0xMDY0X1hDVVJDT0wxUkVELCBNMTA2NF9YQ1VSQ09MMUdSRUVOLCBNMTA2NF9Y Q1VSQ09MMUJMVUUsCisJCU0xMDY0X1hDVVJDT0wyUkVELCBNMTA2NF9YQ1VSQ09MMkdSRUVOLCBN MTA2NF9YQ1VSQ09MMkJMVUUsCisJCURBQzEwNjRfWFZSRUZDVFJMLCBNMTA2NF9YTVVMQ1RSTCwg TTEwNjRfWFBJWENMS0NUUkwsIE0xMDY0X1hHRU5DVFJMLAorCQlNMTA2NF9YTUlTQ0NUUkwsCisJ CU0xMDY0X1hHRU5JT0NUUkwsIE0xMDY0X1hHRU5JT0RBVEEsIE0xMDY0X1haT09NQ1RSTCwgTTEw NjRfWFNFTlNFVEVTVCwKKwkJTTEwNjRfWENSQ0JJVFNFTCwKKwkJTTEwNjRfWENPTEtFWU1BU0tM LCBNMTA2NF9YQ09MS0VZTUFTS0gsIE0xMDY0X1hDT0xLRVlMLCBNMTA2NF9YQ09MS0VZSCB9Owor CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNR0ExMDY0X0RBQ1tdID0geworCQkweDAwLCAw eDAwLCBNMTA2NF9YQ1VSQ1RSTF9ESVMsCisJCTB4MDAsIDB4MDAsIDB4MDAsIAkvKiBibGFjayAq LworCQkweEZGLCAweEZGLCAweEZGLAkvKiB3aGl0ZSAqLworCQkweEZGLCAweDAwLCAweDAwLAkv KiByZWQgKi8KKwkJMHgwMCwgMCwKKwkJTTEwNjRfWFBJWENMS0NUUkxfUExMX1VQIHwgTTEwNjRf WFBJWENMS0NUUkxfRU4gfCBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfUExMLAorCQlNMTA2NF9YR0VO Q1RSTF9WU18wIHwgTTEwNjRfWEdFTkNUUkxfQUxQSEFfRElTIHwgTTEwNjRfWEdFTkNUUkxfQkxB Q0tfMElSRSB8IE0xMDY0X1hHRU5DVFJMX05PX1NZTkNfT05fR1JFRU4sCisJCU0xMDY0X1hNSVND Q1RSTF9EQUNfOEJJVCwKKwkJMHgwMCwgMHgwMCwgTTEwNjRfWFpPT01DVFJMXzEsIE0xMDY0X1hT RU5TRVRFU1RfQkNPTVAgfCBNMTA2NF9YU0VOU0VURVNUX0dDT01QIHwgTTEwNjRfWFNFTlNFVEVT VF9SQ09NUCB8IE0xMDY0X1hTRU5TRVRFU1RfUERPV04sCisJCTB4MDAsCisJCTB4MDAsIDB4MDAs IDB4RkYsIDB4RkZ9OworCitzdGF0aWMgdm9pZCBEQUMxMDY0X3NldHBjbGsoc3RydWN0IG1hdHJv eF9mYl9pbmZvICptaW5mbywgdW5zaWduZWQgbG9uZyBmb3V0KQoreworCXVuc2lnbmVkIGludCBt LCBuLCBwOworCisJREJHKF9fZnVuY19fKQorCisJREFDMTA2NF9jYWxjY2xvY2sobWluZm8sIGZv dXQsIG1pbmZvLT5tYXhfcGl4ZWxfY2xvY2ssICZtLCAmbiwgJnApOworCW1pbmZvLT5ody5EQUNj bGtbMF0gPSBtOworCW1pbmZvLT5ody5EQUNjbGtbMV0gPSBuOworCW1pbmZvLT5ody5EQUNjbGtb Ml0gPSBwOworfQorCitzdGF0aWMgdm9pZCBEQUMxMDY0X3NldG1jbGsoc3RydWN0IG1hdHJveF9m Yl9pbmZvICptaW5mbywgaW50IG9zY2luZm8sCisJCQkgICAgdW5zaWduZWQgbG9uZyBmbWVtKQor eworCXVfaW50MzJfdCBteDsKKwlzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlICpodyA9ICZtaW5mby0+ aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwlpZiAobWluZm8tPmRldmZsYWdzLm5vaW5pdCkgewor CQkvKiByZWFkIE1DTEsgYW5kIGdpdmUgdXAuLi4gKi8KKwkJaHctPkRBQ2Nsa1szXSA9IGluREFD MTA2NChtaW5mbywgREFDMTA2NF9YU1lTUExMTSk7CisJCWh3LT5EQUNjbGtbNF0gPSBpbkRBQzEw NjQobWluZm8sIERBQzEwNjRfWFNZU1BMTE4pOworCQlody0+REFDY2xrWzVdID0gaW5EQUMxMDY0 KG1pbmZvLCBEQUMxMDY0X1hTWVNQTExQKTsKKwkJcmV0dXJuOworCX0KKwlteCA9IGh3LT5NWG9w dGlvblJlZyB8IDB4MDAwMDAwMDQ7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNp ZGV2LCBQQ0lfT1BUSU9OX1JFRywgbXgpOworCW14ICY9IH4weDAwMDAwMEJCOworCWlmIChvc2Np bmZvICYgREFDMTA2NF9PUFRfR0RJVjEpCisJCW14IHw9IDB4MDAwMDAwMDg7CisJaWYgKG9zY2lu Zm8gJiBEQUMxMDY0X09QVF9NRElWMSkKKwkJbXggfD0gMHgwMDAwMDAxMDsKKwlpZiAob3NjaW5m byAmIERBQzEwNjRfT1BUX1JFU0VSVkVEKQorCQlteCB8PSAweDAwMDAwMDgwOworCWlmICgob3Nj aW5mbyAmIERBQzEwNjRfT1BUX1NDTEtfTUFTSykgPT0gREFDMTA2NF9PUFRfU0NMS19QTEwpIHsK KwkJLyogc2VsZWN0IFBDSSBjbG9jayB1bnRpbCB3ZSBoYXZlIHNldHVwIG9zY2lsYXRvci4uLiAq LworCQlpbnQgY2xrOworCQl1bnNpZ25lZCBpbnQgbSwgbiwgcDsKKworCQkvKiBwb3dlcnVwIHN5 c3RlbSBQTEwsIHNlbGVjdCBQQ0kgY2xvY2sgKi8KKwkJbXggfD0gMHgwMDAwMDAyMDsKKwkJcGNp X3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lfT1BUSU9OX1JFRywgbXgpOwor CQlteCAmPSB+MHgwMDAwMDAwNDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNp ZGV2LCBQQ0lfT1BUSU9OX1JFRywgbXgpOworCisJCS8qICEhISB5b3UgbXVzdCBub3QgYWNjZXNz IGRldmljZSBpZiBNQ0xLIGlzIG5vdCBydW5uaW5nICEhIQorCQkgICBEb2luZyBzbyBjYXVzZSBp bW1lZGlhdGUgUENJIGxvY2t1cCA6LSggTWF5YmUgdGhleSBzaG91bGQKKwkJICAgZ2VuZXJhdGUg QUJPUlQgb3IgSS9PIChwYXJpdHkuLi4pIGVycm9yIGFuZCBMaW51eCBzaG91bGQKKwkJICAgcmVj b3ZlciBmcm9tIHRoaXMuLi4gKGtpbGwgZHJpdmVyL3Byb2Nlc3MpLiBCdXQgd29ybGQgaXMgbm90 CisJCSAgIHBlcmZlY3QuLi4gKi8KKwkJLyogKGJpdCAyIG9mIFBDSV9PUFRJT05fUkVHIG11c3Qg YmUgMC4uLiBhbmQgYml0cyAwLDEgbXVzdCBub3QKKwkJICAgc2VsZWN0IFBMTC4uLiBiZWNhdXNl IG9mIFBMTCBjYW4gYmUgc3RvcHBlZCBhdCB0aGlzIHRpbWUpICovCisJCURBQzEwNjRfY2FsY2Ns b2NrKG1pbmZvLCBmbWVtLCBtaW5mby0+bWF4X3BpeGVsX2Nsb2NrLCAmbSwgJm4sICZwKTsKKwkJ b3V0REFDMTA2NChtaW5mbywgREFDMTA2NF9YU1lTUExMTSwgaHctPkRBQ2Nsa1szXSA9IG0pOwor CQlvdXREQUMxMDY0KG1pbmZvLCBEQUMxMDY0X1hTWVNQTExOLCBody0+REFDY2xrWzRdID0gbik7 CisJCW91dERBQzEwNjQobWluZm8sIERBQzEwNjRfWFNZU1BMTFAsIGh3LT5EQUNjbGtbNV0gPSBw KTsKKwkJZm9yIChjbGsgPSA2NTUzNjsgY2xrOyAtLWNsaykgeworCQkJaWYgKGluREFDMTA2NCht aW5mbywgREFDMTA2NF9YU1lTUExMU1RBVCkgJiAweDQwKQorCQkJCWJyZWFrOworCQl9CisJCWlm ICghY2xrKQorCQkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYjogYWllZSwgU1lTUExMIG5vdCBs b2NrZWRcbiIpOworCQkvKiBzZWxlY3QgUExMICovCisJCW14IHw9IDB4MDAwMDAwMDU7CisJfSBl bHNlIHsKKwkJLyogc2VsZWN0IHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgc291cmNlICovCisJCW14 IHw9IG9zY2luZm8gJiBEQUMxMDY0X09QVF9TQ0xLX01BU0s7CisJfQorCXBjaV93cml0ZV9jb25m aWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIG14KTsKKwlteCAmPSB+MHgw MDAwMDAwNDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1pbmZvLT5wY2lkZXYsIFBDSV9PUFRJ T05fUkVHLCBteCk7CisJaHctPk1Yb3B0aW9uUmVnID0gbXg7Cit9CisKKyNpZmRlZiBDT05GSUdf RkJfTUFUUk9YX0cKK3N0YXRpYyB2b2lkIGc0NTBfc2V0X3BsbHMoc3RydWN0IG1hdHJveF9mYl9p bmZvICptaW5mbykKK3sKKwl1X2ludDMyX3QgYzJfY3RsOworCXVuc2lnbmVkIGludCBweGM7CisJ c3RydWN0IG1hdHJveF9od19zdGF0ZSAqaHcgPSAmbWluZm8tPmh3OworCWludCBwaXhlbG1ucDsK KwlpbnQgdmlkZW9tbnA7CisJCisJYzJfY3RsID0gaHctPmNydGMyLmN0bCAmIH4weDQwMDc7CS8q IENsZWFyIFBMTCArIGVuYWJsZSBmb3IgQ1JUQzIgKi8KKwljMl9jdGwgfD0gMHgwMDAxOwkJCS8q IEVuYWJsZSBDUlRDMiAqLworCWh3LT5EQUNyZWdbUE9TMTA2NF9YUFdSQ1RSTF0gJj0gfjB4MDI7 CS8qIFN0b3AgVklERU8gUExMICovCisJcGl4ZWxtbnAgPSBtaW5mby0+Y3J0YzEubW5wOworCXZp ZGVvbW5wID0gbWluZm8tPmNydGMyLm1ucDsKKwlpZiAodmlkZW9tbnAgPCAwKSB7CisJCWMyX2N0 bCAmPSB+MHgwMDAxOwkJCS8qIERpc2FibGUgQ1JUQzIgKi8KKwkJaHctPkRBQ3JlZ1tQT1MxMDY0 X1hQV1JDVFJMXSAmPSB+MHgxMDsJLyogUG93ZXJkb3duIENSVEMyICovCisJfSBlbHNlIGlmICht aW5mby0+Y3J0YzIucGl4Y2xvY2sgPT0gbWluZm8tPmZlYXR1cmVzLnBsbC5yZWZfZnJlcSkgewor CQljMl9jdGwgfD0gIDB4NDAwMjsJLyogVXNlIHJlZmVyZW5jZSBkaXJlY3RseSAqLworCX0gZWxz ZSBpZiAodmlkZW9tbnAgPT0gcGl4ZWxtbnApIHsKKwkJYzJfY3RsIHw9ICAweDAwMDQ7CS8qIFVz ZSBwaXhlbCBQTEwgKi8KKwl9IGVsc2UgeworCQlpZiAoMCA9PSAoKHZpZGVvbW5wIF4gcGl4ZWxt bnApICYgMHhGRkZGRkYwMCkpIHsKKwkJCS8qIFBJWEVMIGFuZCBWSURFTyBQTEwgbXVzdCBub3Qg dXNlIHNhbWUgZnJlcXVlbmN5LiBXZSBtb2RpZnkgTgorCQkJICAgb2YgUElYRUwgUExMIGluIHN1 Y2ggY2FzZSBiZWNhdXNlIG9mIFZJREVPIFBMTCBtYXkgYmUgc291cmNlCisJCQkgICBvZiBUVk8g Y2xvY2tzLCBhbmQgY2hyb21hIHN1YmNhcnJpZXIgaXMgZGVyaXZlZCBmcm9tIGl0cworCQkJICAg cGl4ZWwgY2xvY2tzICovCisJCQlwaXhlbG1ucCArPSAweDAwMDEwMDsKKwkJfQorCQljMl9jdGwg fD0gIDB4MDAwNjsJLyogVXNlIHZpZGVvIFBMTCAqLworCQlody0+REFDcmVnW1BPUzEwNjRfWFBX UkNUUkxdIHw9IDB4MDI7CisJCQorCQlvdXREQUMxMDY0KG1pbmZvLCBNMTA2NF9YUFdSQ1RSTCwg aHctPkRBQ3JlZ1tQT1MxMDY0X1hQV1JDVFJMXSk7CisJCW1hdHJveGZiX2c0NTBfc2V0cGxsX2Nv bmQobWluZm8sIHZpZGVvbW5wLCBNX1ZJREVPX1BMTCk7CisJfQorCisJaHctPkRBQ3JlZ1tQT1Mx MDY0X1hQSVhDTEtDVFJMXSAmPSB+TTEwNjRfWFBJWENMS0NUUkxfUExMX1VQOworCWlmIChwaXhl bG1ucCA+PSAwKSB7CisJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUElYQ0xLQ1RSTF0gfD0gTTEwNjRf WFBJWENMS0NUUkxfUExMX1VQOworCQkKKwkJb3V0REFDMTA2NChtaW5mbywgTTEwNjRfWFBJWENM S0NUUkwsIGh3LT5EQUNyZWdbUE9TMTA2NF9YUElYQ0xLQ1RSTF0pOworCQltYXRyb3hmYl9nNDUw X3NldHBsbF9jb25kKG1pbmZvLCBwaXhlbG1ucCwgTV9QSVhFTF9QTExfQyk7CisJfQorCWlmIChj Ml9jdGwgIT0gaHctPmNydGMyLmN0bCkgeworCQlody0+Y3J0YzIuY3RsID0gYzJfY3RsOworCQlt Z2Ffb3V0bCgweDNDMTAsIGMyX2N0bCk7CisJfQorCisJcHhjID0gbWluZm8tPmNydGMxLnBpeGNs b2NrOworCWlmIChweGMgPT0gMCB8fCBtaW5mby0+b3V0cHV0c1syXS5zcmMgPT0gTUFUUk9YRkJf U1JDX0NSVEMyKSB7CisJCXB4YyA9IG1pbmZvLT5jcnRjMi5waXhjbG9jazsKKwl9CisJaWYgKG1p bmZvLT5jaGlwID09IE1HQV9HNTUwKSB7CisJCWlmIChweGMgPCA0NTAwMCkgeworCQkJaHctPkRB Q3JlZ1tQT1MxMDY0X1hQQU5NT0RFXSA9IDB4MDA7CS8qIDAtNTAgKi8KKwkJfSBlbHNlIGlmIChw eGMgPCA1NTAwMCkgeworCQkJaHctPkRBQ3JlZ1tQT1MxMDY0X1hQQU5NT0RFXSA9IDB4MDg7CS8q IDM0LTYyICovCisJCX0gZWxzZSBpZiAocHhjIDwgNzAwMDApIHsKKwkJCWh3LT5EQUNyZWdbUE9T MTA2NF9YUEFOTU9ERV0gPSAweDEwOwkvKiA0Mi03OCAqLworCQl9IGVsc2UgaWYgKHB4YyA8IDg1 MDAwKSB7CisJCQlody0+REFDcmVnW1BPUzEwNjRfWFBBTk1PREVdID0gMHgxODsJLyogNjItOTIg Ki8KKwkJfSBlbHNlIGlmIChweGMgPCAxMDAwMDApIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9Y UEFOTU9ERV0gPSAweDIwOwkvKiA3NC0xMDggKi8KKwkJfSBlbHNlIGlmIChweGMgPCAxMTUwMDAp IHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUEFOTU9ERV0gPSAweDI4OwkvKiA5NC0xMjIgKi8K KwkJfSBlbHNlIGlmIChweGMgPCAxMjUwMDApIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUEFO TU9ERV0gPSAweDMwOwkvKiAxMDgtMTMyICovCisJCX0gZWxzZSB7CisJCQlody0+REFDcmVnW1BP UzEwNjRfWFBBTk1PREVdID0gMHgzODsJLyogMTIwLTE2OCAqLworCQl9CisJfSBlbHNlIHsKKwkJ LyogRzQ1MCAqLworCQlpZiAocHhjIDwgNDUwMDApIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9Y UEFOTU9ERV0gPSAweDAwOwkvKiAwLTU0ICovCisJCX0gZWxzZSBpZiAocHhjIDwgNjUwMDApIHsK KwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUEFOTU9ERV0gPSAweDA4OwkvKiAzOC03MCAqLworCQl9 IGVsc2UgaWYgKHB4YyA8IDg1MDAwKSB7CisJCQlody0+REFDcmVnW1BPUzEwNjRfWFBBTk1PREVd ID0gMHgxMDsJLyogNTYtOTYgKi8KKwkJfSBlbHNlIGlmIChweGMgPCAxMDUwMDApIHsKKwkJCWh3 LT5EQUNyZWdbUE9TMTA2NF9YUEFOTU9ERV0gPSAweDE4OwkvKiA4MC0xMTQgKi8KKwkJfSBlbHNl IGlmIChweGMgPCAxMzUwMDApIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUEFOTU9ERV0gPSAw eDIwOwkvKiAxMDItMTQ0ICovCisJCX0gZWxzZSBpZiAocHhjIDwgMTYwMDAwKSB7CisJCQlody0+ REFDcmVnW1BPUzEwNjRfWFBBTk1PREVdID0gMHgyODsJLyogMTMyLTE2NiAqLworCQl9IGVsc2Ug aWYgKHB4YyA8IDE3NTAwMCkgeworCQkJaHctPkRBQ3JlZ1tQT1MxMDY0X1hQQU5NT0RFXSA9IDB4 MzA7CS8qIDE1NC0xODIgKi8KKwkJfSBlbHNlIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUEFO TU9ERV0gPSAweDM4OwkvKiAxNzAtMjA0ICovCisJCX0KKwl9Cit9CisjZW5kaWYKKwordm9pZCBE QUMxMDY0X2dsb2JhbF9pbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJc3Ry dWN0IG1hdHJveF9od19zdGF0ZSAqaHcgPSAmbWluZm8tPmh3OworCisJaHctPkRBQ3JlZ1tQT1Mx MDY0X1hNSVNDQ1RSTF0gJj0gTTEwNjRfWE1JU0NDVFJMX0RBQ19XSURUSE1BU0s7CisJaHctPkRB Q3JlZ1tQT1MxMDY0X1hNSVNDQ1RSTF0gfD0gTTEwNjRfWE1JU0NDVFJMX0xVVF9FTjsKKwlody0+ REFDcmVnW1BPUzEwNjRfWFBJWENMS0NUUkxdID0gTTEwNjRfWFBJWENMS0NUUkxfUExMX1VQIHwg TTEwNjRfWFBJWENMS0NUUkxfRU4gfCBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfUExMOworI2lmZGVm IENPTkZJR19GQl9NQVRST1hfRworCWlmIChtaW5mby0+ZGV2ZmxhZ3MuZzQ1MGRhYykgeworCQlo dy0+REFDcmVnW1BPUzEwNjRfWFBXUkNUUkxdID0gMHgxRjsJLyogcG93ZXJ1cCBldmVyeXRoaW5n ICovCisJCWh3LT5EQUNyZWdbUE9TMTA2NF9YT1VUUFVUQ09OTl0gPSAweDAwOwkvKiBkaXNhYmxl IG91dHB1dHMgKi8KKwkJaHctPkRBQ3JlZ1tQT1MxMDY0X1hNSVNDQ1RSTF0gfD0gTTEwNjRfWE1J U0NDVFJMX0RBQ19FTjsKKwkJc3dpdGNoIChtaW5mby0+b3V0cHV0c1swXS5zcmMpIHsKKwkJCWNh c2UgTUFUUk9YRkJfU1JDX0NSVEMxOgorCQkJY2FzZSBNQVRST1hGQl9TUkNfQ1JUQzI6CisJCQkJ aHctPkRBQ3JlZ1tQT1MxMDY0X1hPVVRQVVRDT05OXSB8PSAweDAxOwkvKiBlbmFibGUgb3V0cHV0 OyBDUlRDMS8yIHNlbGVjdGlvbiBpcyBpbiBDUlRDMiBjdGwgKi8KKwkJCQlicmVhazsKKwkJCWNh c2UgTUFUUk9YRkJfU1JDX05PTkU6CisJCQkJaHctPkRBQ3JlZ1tQT1MxMDY0X1hNSVNDQ1RSTF0g Jj0gfk0xMDY0X1hNSVNDQ1RSTF9EQUNfRU47CisJCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoICht aW5mby0+b3V0cHV0c1sxXS5zcmMpIHsKKwkJCWNhc2UgTUFUUk9YRkJfU1JDX0NSVEMxOgorCQkJ CWh3LT5EQUNyZWdbUE9TMTA2NF9YT1VUUFVUQ09OTl0gfD0gMHgwNDsKKwkJCQlicmVhazsKKwkJ CWNhc2UgTUFUUk9YRkJfU1JDX0NSVEMyOgorCQkJCWlmIChtaW5mby0+b3V0cHV0c1sxXS5tb2Rl ID09IE1BVFJPWEZCX09VVFBVVF9NT0RFX01PTklUT1IpIHsKKwkJCQkJaHctPkRBQ3JlZ1tQT1Mx MDY0X1hPVVRQVVRDT05OXSB8PSAweDA4OworCQkJCX0gZWxzZSB7CisJCQkJCWh3LT5EQUNyZWdb UE9TMTA2NF9YT1VUUFVUQ09OTl0gfD0gMHgwQzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNl IE1BVFJPWEZCX1NSQ19OT05FOgorCQkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUFdSQ1RSTF0gJj0g fjB4MDE7CQkvKiBQb3dlcm9mZiBEQUMyICovCisJCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoICht aW5mby0+b3V0cHV0c1syXS5zcmMpIHsKKwkJCWNhc2UgTUFUUk9YRkJfU1JDX0NSVEMxOgorCQkJ CWh3LT5EQUNyZWdbUE9TMTA2NF9YT1VUUFVUQ09OTl0gfD0gMHgyMDsKKwkJCQlicmVhazsKKwkJ CWNhc2UgTUFUUk9YRkJfU1JDX0NSVEMyOgorCQkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YT1VUUFVU Q09OTl0gfD0gMHg0MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUFUUk9YRkJfU1JDX05PTkU6Cisj aWYgMAorCQkJCS8qIEhFTFAhIElmIHdlIGJvb3Qgd2l0aG91dCBERlAgY29ubmVjdGVkIHRvIERW SSwgd2UgY2FuCisJCQkJICAgcG93ZXJvZmYgVE1EUy4gQnV0IGlmIHdlIGJvb3Qgd2l0aCBERlAg Y29ubmVjdGVkLAorCQkJCSAgIFRNRFMgZ2VuZXJhdGVkIGNsb2NrcyBhcmUgdXNlZCBpbnN0ZWFk IG9mIEFMTCBwaXhjbG9ja3MKKwkJCQkgICBhdmFpbGFibGUuLi4gSWYgc29tZW9uZSBrbm93cyB3 aGljaCByZWdpc3RlcgorCQkJCSAgIGhhbmRsZXMgaXQsIHBsZWFzZSByZXZlYWwgdGhpcyBzZWNy ZXQgdG8gbWUuLi4gKi8JCQkKKwkJCQlody0+REFDcmVnW1BPUzEwNjRfWFBXUkNUUkxdICY9IH4w eDA0OwkJLyogUG93ZXJvZmYgVE1EUyAqLworI2VuZGlmCQkJCQorCQkJCWJyZWFrOworCQl9CisJ CS8qIE5vdyBzZXQgdGltbWluZyByZWxhdGVkIHZhcmlhYmxlcy4uLiAqLworCQlnNDUwX3NldF9w bGxzKG1pbmZvKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJaWYgKG1pbmZvLT5vdXRwdXRzWzFd LnNyYyA9PSBNQVRST1hGQl9TUkNfQ1JUQzEpIHsKKwkJCWh3LT5EQUNyZWdbUE9TMTA2NF9YUElY Q0xLQ1RSTF0gPSBNMTA2NF9YUElYQ0xLQ1RSTF9QTExfVVAgfCBNMTA2NF9YUElYQ0xLQ1RSTF9F TiB8IE0xMDY0X1hQSVhDTEtDVFJMX1NSQ19FWFQ7CisJCQlody0+REFDcmVnW1BPUzEwNjRfWE1J U0NDVFJMXSB8PSBHWDAwX1hNSVNDQ1RSTF9NRkNfTUFGQyB8IEc0MDBfWE1JU0NDVFJMX1ZET19N QUZDMTI7CisJCX0gZWxzZSBpZiAobWluZm8tPm91dHB1dHNbMV0uc3JjID09IE1BVFJPWEZCX1NS Q19DUlRDMikgeworCQkJaHctPkRBQ3JlZ1tQT1MxMDY0X1hNSVNDQ1RSTF0gfD0gR1gwMF9YTUlT Q0NUUkxfTUZDX01BRkMgfCBHNDAwX1hNSVNDQ1RSTF9WRE9fQzJfTUFGQzEyOworCQl9IGVsc2Ug aWYgKG1pbmZvLT5vdXRwdXRzWzJdLnNyYyA9PSBNQVRST1hGQl9TUkNfQ1JUQzEpCisJCQlody0+ REFDcmVnW1BPUzEwNjRfWE1JU0NDVFJMXSB8PSBHWDAwX1hNSVNDQ1RSTF9NRkNfUEFORUxMSU5L IHwgRzQwMF9YTUlTQ0NUUkxfVkRPX01BRkMxMjsKKwkJZWxzZQorCQkJaHctPkRBQ3JlZ1tQT1Mx MDY0X1hNSVNDQ1RSTF0gfD0gR1gwMF9YTUlTQ0NUUkxfTUZDX0RJUzsKKworCQlpZiAobWluZm8t Pm91dHB1dHNbMF0uc3JjICE9IE1BVFJPWEZCX1NSQ19OT05FKQorCQkJaHctPkRBQ3JlZ1tQT1Mx MDY0X1hNSVNDQ1RSTF0gfD0gTTEwNjRfWE1JU0NDVFJMX0RBQ19FTjsKKwl9Cit9CisKK3ZvaWQg REFDMTA2NF9nbG9iYWxfcmVzdG9yZShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQorewor CXN0cnVjdCBtYXRyb3hfaHdfc3RhdGUgKmh3ID0gJm1pbmZvLT5odzsKKworCW91dERBQzEwNjQo bWluZm8sIE0xMDY0X1hQSVhDTEtDVFJMLCBody0+REFDcmVnW1BPUzEwNjRfWFBJWENMS0NUUkxd KTsKKwlvdXREQUMxMDY0KG1pbmZvLCBNMTA2NF9YTUlTQ0NUUkwsIGh3LT5EQUNyZWdbUE9TMTA2 NF9YTUlTQ0NUUkxdKTsKKwlpZiAobWluZm8tPmRldmZsYWdzLmFjY2VsZXJhdG9yID09IEZCX0FD Q0VMX01BVFJPWF9NR0FHNDAwKSB7CisJCW91dERBQzEwNjQobWluZm8sIDB4MjAsIDB4MDQpOwor CQlvdXREQUMxMDY0KG1pbmZvLCAweDFGLCBtaW5mby0+ZGV2ZmxhZ3MuZGZwX3R5cGUpOworCQlp ZiAobWluZm8tPmRldmZsYWdzLmc0NTBkYWMpIHsKKwkJCW91dERBQzEwNjQobWluZm8sIE0xMDY0 X1hTWU5DQ1RSTCwgMHhDQyk7CisJCQlvdXREQUMxMDY0KG1pbmZvLCBNMTA2NF9YUFdSQ1RSTCwg aHctPkRBQ3JlZ1tQT1MxMDY0X1hQV1JDVFJMXSk7CisJCQlvdXREQUMxMDY0KG1pbmZvLCBNMTA2 NF9YUEFOTU9ERSwgaHctPkRBQ3JlZ1tQT1MxMDY0X1hQQU5NT0RFXSk7CisJCQlvdXREQUMxMDY0 KG1pbmZvLCBNMTA2NF9YT1VUUFVUQ09OTiwgaHctPkRBQ3JlZ1tQT1MxMDY0X1hPVVRQVVRDT05O XSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgREFDMTA2NF9pbml0XzEoc3RydWN0IG1hdHJv eF9mYl9pbmZvICptaW5mbywgc3RydWN0IG15X3RpbW1pbmcgKm0pCit7CisJc3RydWN0IG1hdHJv eF9od19zdGF0ZSAqaHcgPSAmbWluZm8tPmh3OworCisJREJHKF9fZnVuY19fKQorCisJbWVtY3B5 KGh3LT5EQUNyZWcsIE1HQTEwNjRfREFDLCBzaXplb2YoTUdBMTA2NF9EQUNfcmVncykpOworCXN3 aXRjaCAobWluZm8tPmZiY29uLnZhci5iaXRzX3Blcl9waXhlbCkgeworCQkvKiBjYXNlIDQ6IG5v dCBzdXBwb3J0ZWQgYnkgTUdBMTA2NCBEQUMgKi8KKwkJY2FzZSA4OgorCQkJaHctPkRBQ3JlZ1tQ T1MxMDY0X1hNVUxDVFJMXSA9IE0xMDY0X1hNVUxDVFJMX0RFUFRIXzhCUFAgfCBNMTA2NF9YTVVM Q1RSTF9HUkFQSElDU19QQUxFVElaRUQ7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWlmICht aW5mby0+ZmJjb24udmFyLmdyZWVuLmxlbmd0aCA9PSA1KQorCQkJCWh3LT5EQUNyZWdbUE9TMTA2 NF9YTVVMQ1RSTF0gPSBNMTA2NF9YTVVMQ1RSTF9ERVBUSF8xNUJQUF8xQlBQIHwgTTEwNjRfWE1V TENUUkxfR1JBUEhJQ1NfUEFMRVRJWkVEOworCQkJZWxzZQorCQkJCWh3LT5EQUNyZWdbUE9TMTA2 NF9YTVVMQ1RSTF0gPSBNMTA2NF9YTVVMQ1RSTF9ERVBUSF8xNkJQUCB8IE0xMDY0X1hNVUxDVFJM X0dSQVBISUNTX1BBTEVUSVpFRDsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJaHctPkRBQ3Jl Z1tQT1MxMDY0X1hNVUxDVFJMXSA9IE0xMDY0X1hNVUxDVFJMX0RFUFRIXzI0QlBQIHwgTTEwNjRf WE1VTENUUkxfR1JBUEhJQ1NfUEFMRVRJWkVEOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlo dy0+REFDcmVnW1BPUzEwNjRfWE1VTENUUkxdID0gTTEwNjRfWE1VTENUUkxfREVQVEhfMzJCUFAg fCBNMTA2NF9YTVVMQ1RSTF9HUkFQSElDU19QQUxFVElaRUQ7CisJCQlicmVhazsKKwkJZGVmYXVs dDoKKwkJCXJldHVybiAxOwkvKiB1bnN1cHBvcnRlZCBkZXB0aCAqLworCX0KKwlody0+REFDcmVn W1BPUzEwNjRfWFZSRUZDVFJMXSA9IG1pbmZvLT5mZWF0dXJlcy5EQUMxMDY0Lnh2cmVmY3RybDsK Kwlody0+REFDcmVnW1BPUzEwNjRfWEdFTkNUUkxdICY9IH5NMTA2NF9YR0VOQ1RSTF9TWU5DX09O X0dSRUVOX01BU0s7CisJaHctPkRBQ3JlZ1tQT1MxMDY0X1hHRU5DVFJMXSB8PSAobS0+c3luYyAm IEZCX1NZTkNfT05fR1JFRU4pP00xMDY0X1hHRU5DVFJMX1NZTkNfT05fR1JFRU46TTEwNjRfWEdF TkNUUkxfTk9fU1lOQ19PTl9HUkVFTjsKKwlody0+REFDcmVnW1BPUzEwNjRfWENVUkFERExdID0g MDsKKwlody0+REFDcmVnW1BPUzEwNjRfWENVUkFEREhdID0gMDsKKworCURBQzEwNjRfZ2xvYmFs X2luaXQobWluZm8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IERBQzEwNjRfaW5pdF8y KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHN0cnVjdCBteV90aW1taW5nICptKQorewor CXN0cnVjdCBtYXRyb3hfaHdfc3RhdGUgKmh3ID0gJm1pbmZvLT5odzsKKworCURCRyhfX2Z1bmNf XykKKworCWlmIChtaW5mby0+ZmJjb24udmFyLmJpdHNfcGVyX3BpeGVsID4gMTYpIHsJLyogMjU2 IGVudHJpZXMgKi8KKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJ CQlody0+REFDcGFsW2kgKiAzICsgMF0gPSBpOworCQkJaHctPkRBQ3BhbFtpICogMyArIDFdID0g aTsKKwkJCWh3LT5EQUNwYWxbaSAqIDMgKyAyXSA9IGk7CisJCX0KKwl9IGVsc2UgaWYgKG1pbmZv LT5mYmNvbi52YXIuYml0c19wZXJfcGl4ZWwgPiA4KSB7CisJCWlmIChtaW5mby0+ZmJjb24udmFy LmdyZWVuLmxlbmd0aCA9PSA1KSB7CS8qIDAuLjMxLCAxMjguLjE1OSAqLworCQkJaW50IGk7CisK KwkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQkJLyogd2l0aCBwMTUgPT0gMCAqLwor CQkJCWh3LT5EQUNwYWxbaSAqIDMgKyAwXSA9IGkgPDwgMzsKKwkJCQlody0+REFDcGFsW2kgKiAz ICsgMV0gPSBpIDw8IDM7CisJCQkJaHctPkRBQ3BhbFtpICogMyArIDJdID0gaSA8PCAzOworCQkJ CS8qIHdpdGggcDE1ID09IDEgKi8KKwkJCQlody0+REFDcGFsWyhpICsgMTI4KSAqIDMgKyAwXSA9 IGkgPDwgMzsKKwkJCQlody0+REFDcGFsWyhpICsgMTI4KSAqIDMgKyAxXSA9IGkgPDwgMzsKKwkJ CQlody0+REFDcGFsWyhpICsgMTI4KSAqIDMgKyAyXSA9IGkgPDwgMzsKKwkJCX0KKwkJfSBlbHNl IHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewkJLyogMC4uNjMg Ki8KKwkJCQlody0+REFDcGFsW2kgKiAzICsgMF0gPSBpIDw8IDM7CisJCQkJaHctPkRBQ3BhbFtp ICogMyArIDFdID0gaSA8PCAyOworCQkJCWh3LT5EQUNwYWxbaSAqIDMgKyAyXSA9IGkgPDwgMzsK KwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldChody0+REFDcGFsLCAwLCA3NjgpOworCX0K KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgREFDMTA2NF9yZXN0b3JlXzEoc3RydWN0IG1h dHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlICpodyA9ICZt aW5mby0+aHc7CisKKwlDUklURkxBR1MKKworCURCRyhfX2Z1bmNfXykKKworCUNSSVRCRUdJTgor CisJaWYgKChpbkRBQzEwNjQobWluZm8sIERBQzEwNjRfWFNZU1BMTE0pICE9IGh3LT5EQUNjbGtb M10pIHx8CisJICAgIChpbkRBQzEwNjQobWluZm8sIERBQzEwNjRfWFNZU1BMTE4pICE9IGh3LT5E QUNjbGtbNF0pIHx8CisJICAgIChpbkRBQzEwNjQobWluZm8sIERBQzEwNjRfWFNZU1BMTFApICE9 IGh3LT5EQUNjbGtbNV0pKSB7CisJCW91dERBQzEwNjQobWluZm8sIERBQzEwNjRfWFNZU1BMTE0s IGh3LT5EQUNjbGtbM10pOworCQlvdXREQUMxMDY0KG1pbmZvLCBEQUMxMDY0X1hTWVNQTExOLCBo dy0+REFDY2xrWzRdKTsKKwkJb3V0REFDMTA2NChtaW5mbywgREFDMTA2NF9YU1lTUExMUCwgaHct PkRBQ2Nsa1s1XSk7CisJfQorCXsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJZm9yIChpID0gMDsg aSA8IHNpemVvZihNR0ExMDY0X0RBQ19yZWdzKTsgaSsrKSB7CisJCQlpZiAoKGkgIT0gUE9TMTA2 NF9YUElYQ0xLQ1RSTCkgJiYgKGkgIT0gUE9TMTA2NF9YTUlTQ0NUUkwpKQorCQkJCW91dERBQzEw NjQobWluZm8sIE1HQTEwNjRfREFDX3JlZ3NbaV0sIGh3LT5EQUNyZWdbaV0pOworCQl9CisJfQor CisJREFDMTA2NF9nbG9iYWxfcmVzdG9yZShtaW5mbyk7CisKKwlDUklURU5ECit9OworCitzdGF0 aWMgdm9pZCBEQUMxMDY0X3Jlc3RvcmVfMihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQor eworI2lmZGVmIERFQlVHCisJdW5zaWduZWQgaW50IGk7CisjZW5kaWYKKworCURCRyhfX2Z1bmNf XykKKworI2lmZGVmIERFQlVHCisJZHByaW50ayhLRVJOX0RFQlVHICJEQUMxMDY0cmVncyAiKTsK Kwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE1HQTEwNjRfREFDX3JlZ3MpOyBpKyspIHsKKwkJZHBy aW50aygiUiUwMlg9JTAyWCAiLCBNR0ExMDY0X0RBQ19yZWdzW2ldLCBtaW5mby0+aHcuREFDcmVn W2ldKTsKKwkJaWYgKChpICYgMHg3KSA9PSAweDcpIGRwcmludGsoS0VSTl9ERUJVRyAiY29udGlu dWluZy4uLiAiKTsKKwl9CisJZHByaW50ayhLRVJOX0RFQlVHICJEQUMxMDY0Y2xrICIpOworCWZv ciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRwcmludGsoIkMlMDJYPSUwMlggIiwgaSwgbWluZm8t Pmh3LkRBQ2Nsa1tpXSk7CisJZHByaW50aygiXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50 IG0xMDY0X2NvbXB1dGUodm9pZCogb3V0LCBzdHJ1Y3QgbXlfdGltbWluZyogbSkgeworI2RlZmlu ZSBtaW5mbyAoKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyopb3V0KQorCXsKKwkJaW50IGk7CisJCWlu dCB0bW91dDsKKwkJQ1JJVEZMQUdTCisKKwkJREFDMTA2NF9zZXRwY2xrKG1pbmZvLCBtLT5waXhj bG9jayk7CisKKwkJQ1JJVEJFR0lOCisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCW91 dERBQzEwNjQobWluZm8sIE0xMDY0X1hQSVhQTExDTSArIGksIG1pbmZvLT5ody5EQUNjbGtbaV0p OworCQlmb3IgKHRtb3V0ID0gNTAwMDAwOyB0bW91dDsgdG1vdXQtLSkgeworCQkJaWYgKGluREFD MTA2NChtaW5mbywgTTEwNjRfWFBJWFBMTFNUQVQpICYgMHg0MCkKKwkJCQlicmVhazsKKwkJCXVk ZWxheSgxMCk7CisJCX0KKworCQlDUklURU5ECisKKwkJaWYgKCF0bW91dCkKKwkJCXByaW50ayhL RVJOX0VSUiAibWF0cm94ZmI6IFBpeGVsIFBMTCBub3QgbG9ja2VkIGFmdGVyIDUgc2Vjc1xuIik7 CisJfQorI3VuZGVmIG1pbmZvCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cm94 X2FsdG91dCBtMTA2NCA9IHsKKwkubmFtZQkgPSAiUHJpbWFyeSBvdXRwdXQiLAorCS5jb21wdXRl ID0gbTEwNjRfY29tcHV0ZSwKK307CisKKyNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX0cKK3N0YXRp YyBpbnQgZzQ1MF9jb21wdXRlKHZvaWQqIG91dCwgc3RydWN0IG15X3RpbW1pbmcqIG0pIHsKKyNk ZWZpbmUgbWluZm8gKChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qKW91dCkKKwlpZiAobS0+bW5wIDwg MCkgeworCQltLT5tbnAgPSBtYXRyb3hmYl9nNDUwX3NldGNsayhtaW5mbywgbS0+cGl4Y2xvY2ss IChtLT5jcnRjID09IE1BVFJPWEZCX1NSQ19DUlRDMSkgPyBNX1BJWEVMX1BMTF9DIDogTV9WSURF T19QTEwpOworCQlpZiAobS0+bW5wID49IDApIHsKKwkJCW0tPnBpeGNsb2NrID0gZzQ1MF9tbnAy ZihtaW5mbywgbS0+bW5wKTsKKwkJfQorCX0KKyN1bmRlZiBtaW5mbworCXJldHVybiAwOworfQor CitzdGF0aWMgc3RydWN0IG1hdHJveF9hbHRvdXQgZzQ1MG91dCA9IHsKKwkubmFtZQkgPSAiUHJp bWFyeSBvdXRwdXQiLAorCS5jb21wdXRlID0gZzQ1MF9jb21wdXRlLAorfTsKKyNlbmRpZgorCisj ZW5kaWYgLyogTkVFRF9EQUMxMDY0ICovCisKKyNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX01ZU1RJ UVVFCitzdGF0aWMgaW50IE1HQTEwNjRfaW5pdChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZv LCBzdHJ1Y3QgbXlfdGltbWluZyAqbSkKK3sKKwlzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlICpodyA9 ICZtaW5mby0+aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwlpZiAoREFDMTA2NF9pbml0XzEobWlu Zm8sIG0pKSByZXR1cm4gMTsKKwlpZiAobWF0cm94ZmJfdmdhSFdpbml0KG1pbmZvLCBtKSkgcmV0 dXJuIDE7CisKKwlody0+TWlzY091dFJlZyA9IDB4Q0I7CisJaWYgKG0tPnN5bmMgJiBGQl9TWU5D X0hPUl9ISUdIX0FDVCkKKwkJaHctPk1pc2NPdXRSZWcgJj0gfjB4NDA7CisJaWYgKG0tPnN5bmMg JiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpCisJCWh3LT5NaXNjT3V0UmVnICY9IH4weDgwOworCWlm IChtLT5zeW5jICYgRkJfU1lOQ19DT01QX0hJR0hfQUNUKSAvKiBzaG91bGQgYmUgb25seSBGQl9T WU5DX0NPTVAgKi8KKwkJaHctPkNSVENFWFRbM10gfD0gMHg0MDsKKworCWlmIChEQUMxMDY0X2lu aXRfMihtaW5mbywgbSkpIHJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRl ZiBDT05GSUdfRkJfTUFUUk9YX0cKK3N0YXRpYyBpbnQgTUdBRzEwMF9pbml0KHN0cnVjdCBtYXRy b3hfZmJfaW5mbyAqbWluZm8sIHN0cnVjdCBteV90aW1taW5nICptKQoreworCXN0cnVjdCBtYXRy b3hfaHdfc3RhdGUgKmh3ID0gJm1pbmZvLT5odzsKKworCURCRyhfX2Z1bmNfXykKKworCWlmIChE QUMxMDY0X2luaXRfMShtaW5mbywgbSkpIHJldHVybiAxOworCWh3LT5NWG9wdGlvblJlZyAmPSB+ MHgyMDAwOworCWlmIChtYXRyb3hmYl92Z2FIV2luaXQobWluZm8sIG0pKSByZXR1cm4gMTsKKwor CWh3LT5NaXNjT3V0UmVnID0gMHhFRjsKKwlpZiAobS0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hf QUNUKQorCQlody0+TWlzY091dFJlZyAmPSB+MHg0MDsKKwlpZiAobS0+c3luYyAmIEZCX1NZTkNf VkVSVF9ISUdIX0FDVCkKKwkJaHctPk1pc2NPdXRSZWcgJj0gfjB4ODA7CisJaWYgKG0tPnN5bmMg JiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QpIC8qIHNob3VsZCBiZSBvbmx5IEZCX1NZTkNfQ09NUCAq LworCQlody0+Q1JUQ0VYVFszXSB8PSAweDQwOworCisJaWYgKERBQzEwNjRfaW5pdF8yKG1pbmZv LCBtKSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogRyAqLworCisjaWZkZWYg Q09ORklHX0ZCX01BVFJPWF9NWVNUSVFVRQorc3RhdGljIHZvaWQgTUdBMTA2NF9yYW1kYWNfaW5p dChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCisJREJHKF9fZnVuY19fKQorCisJ LyogbWluZm8tPmZlYXR1cmVzLkRBQzEwNjQudmNvX2ZyZXFfbWluID0gMTIwMDAwOyAqLworCW1p bmZvLT5mZWF0dXJlcy5wbGwudmNvX2ZyZXFfbWluID0gNjIwMDA7CisJbWluZm8tPmZlYXR1cmVz LnBsbC5yZWZfZnJlcQkgPSAxNDMxODsKKwltaW5mby0+ZmVhdHVyZXMucGxsLmZlZWRfZGl2X21p biA9IDEwMDsKKwltaW5mby0+ZmVhdHVyZXMucGxsLmZlZWRfZGl2X21heCA9IDEyNzsKKwltaW5m by0+ZmVhdHVyZXMucGxsLmluX2Rpdl9taW4JID0gMTsKKwltaW5mby0+ZmVhdHVyZXMucGxsLmlu X2Rpdl9tYXgJID0gMzE7CisJbWluZm8tPmZlYXR1cmVzLnBsbC5wb3N0X3NoaWZ0X21heCA9IDM7 CisJbWluZm8tPmZlYXR1cmVzLkRBQzEwNjQueHZyZWZjdHJsID0gREFDMTA2NF9YVlJFRkNUUkxf RVhURVJOQUw7CisJLyogbWF5YmUgY21kbGluZSBNQ0xLPSA/LCBkb2Mgc2F5cyBnY2xrPTQ0TUh6 LCBtY2xrPTY2TUh6Li4uIGl0IHdhcyA1NS84MyB3aXRoIG9sZCB2YWx1ZXMgKi8KKwlEQUMxMDY0 X3NldG1jbGsobWluZm8sIERBQzEwNjRfT1BUX01ESVYyIHwgREFDMTA2NF9PUFRfR0RJVjMgfCBE QUMxMDY0X09QVF9TQ0xLX1BMTCwgMTMzMzMzKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklH X0ZCX01BVFJPWF9HCisvKiBCSU9TIGVudmlyb24gKi8KK3N0YXRpYyBpbnQgeDdBRjQgPSAweDEw OwkvKiBmbGFncywgbWF5YmUgMHgxMCA9IFNEUkFNLCAweDAwID0gU0dSQU0/Pz8gKi8KKwkJCQkv KiBHMTAwIHdhbnRzIDB4MTAsIEcyMDAgU0dSQU0gZG9lcyBub3QgY2FyZS4uLiAqLworI2lmIDAK K3N0YXRpYyBpbnQgZGVmNTAgPSAwOwkvKiByZWc1MCwgJiAweDBGLCAmIDB4MzAwMCAob25seSAw eDAwMDAsIDB4MTAwMCwgMHgyMDAwICgweDMwMDAgZGlzYWxsb3dlZCBhbmQgdHJlYXRlZCBhcyAw KSAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkIE1HQUcxMDBfcHJvZ1BpeENsb2NrKGNvbnN0IHN0 cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCBmbGFncywKKwkJCQkgaW50IG0sIGludCBu LCBpbnQgcCkKK3sKKwlpbnQgcmVnOworCWludCBzZWxDbGs7CisJaW50IGNsazsKKworCURCRyhf X2Z1bmNfXykKKworCW91dERBQzEwNjQobWluZm8sIE0xMDY0X1hQSVhDTEtDVFJMLCBpbkRBQzEw NjQobWluZm8sIE0xMDY0X1hQSVhDTEtDVFJMKSB8IE0xMDY0X1hQSVhDTEtDVFJMX0RJUyB8CisJ CSAgIE0xMDY0X1hQSVhDTEtDVFJMX1BMTF9VUCk7CisJc3dpdGNoIChmbGFncyAmIDMpIHsKKwkJ Y2FzZSAwOgkJcmVnID0gTTEwNjRfWFBJWFBMTEFNOyBicmVhazsKKwkJY2FzZSAxOgkJcmVnID0g TTEwNjRfWFBJWFBMTEJNOyBicmVhazsKKwkJZGVmYXVsdDoJcmVnID0gTTEwNjRfWFBJWFBMTENN OyBicmVhazsKKwl9CisJb3V0REFDMTA2NChtaW5mbywgcmVnKyssIG0pOworCW91dERBQzEwNjQo bWluZm8sIHJlZysrLCBuKTsKKwlvdXREQUMxMDY0KG1pbmZvLCByZWcsIHApOworCXNlbENsayA9 IG1nYV9pbmIoTV9NSVNDX1JFR19SRUFEKSAmIH4weEM7CisJLyogdGhlcmUgc2hvdWxkIGJlIGZs YWdzICYgMHgwMyAmIGNhc2UgMC8xL2Vsc2UgKi8KKwkvKiBhbmQgd2Ugc2hvdWxkIGZpcnN0IHNl bGVjdCBzb3VyY2UgYW5kIGFmdGVyIHRoYXQgd2Ugc2hvdWxkIHdhaXQgZm9yIFBMTCAqLworCS8q IGFuZCB3ZSBhcmUgd2FpdGluZyBmb3IgUExMIHdpdGggb3NjaWxhdG9yIGRpc2FibGVkLi4uIElz IGl0IHJpZ2h0PyAqLworCXN3aXRjaCAoZmxhZ3MgJiAweDAzKSB7CisJCWNhc2UgMHgwMDoJYnJl YWs7CisJCWNhc2UgMHgwMToJc2VsQ2xrIHw9IDQ7IGJyZWFrOworCQlkZWZhdWx0OglzZWxDbGsg fD0gMHgwQzsgYnJlYWs7CisJfQorCW1nYV9vdXRiKE1fTUlTQ19SRUcsIHNlbENsayk7CisJZm9y IChjbGsgPSA1MDAwMDA7IGNsazsgY2xrLS0pIHsKKwkJaWYgKGluREFDMTA2NChtaW5mbywgTTEw NjRfWFBJWFBMTFNUQVQpICYgMHg0MCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlp ZiAoIWNsaykKKwkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYjogUGl4ZWwgUExMJWMgbm90IGxv Y2tlZCBhZnRlciB1c3VhbCB0aW1lXG4iLCAocmVnLU0xMDY0X1hQSVhQTExBTS0yKS80ICsgJ0En KTsKKwlzZWxDbGsgPSBpbkRBQzEwNjQobWluZm8sIE0xMDY0X1hQSVhDTEtDVFJMKSAmIH5NMTA2 NF9YUElYQ0xLQ1RSTF9TUkNfTUFTSzsKKwlzd2l0Y2ggKGZsYWdzICYgMHgwQykgeworCQljYXNl IDB4MDA6CXNlbENsayB8PSBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfUENJOyBicmVhazsKKwkJY2Fz ZSAweDA0OglzZWxDbGsgfD0gTTEwNjRfWFBJWENMS0NUUkxfU1JDX1BMTDsgYnJlYWs7CisJCWRl ZmF1bHQ6CXNlbENsayB8PSBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfRVhUOyBicmVhazsKKwl9CisJ b3V0REFDMTA2NChtaW5mbywgTTEwNjRfWFBJWENMS0NUUkwsIHNlbENsayk7CisJb3V0REFDMTA2 NChtaW5mbywgTTEwNjRfWFBJWENMS0NUUkwsIGluREFDMTA2NChtaW5mbywgTTEwNjRfWFBJWENM S0NUUkwpICYgfk0xMDY0X1hQSVhDTEtDVFJMX0RJUyk7Cit9CisKK3N0YXRpYyB2b2lkIE1HQUcx MDBfc2V0UGl4Q2xvY2soY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgaW50IGZs YWdzLAorCQkJCWludCBmcmVxKQoreworCXVuc2lnbmVkIGludCBtLCBuLCBwOworCisJREJHKF9f ZnVuY19fKQorCisJREFDMTA2NF9jYWxjY2xvY2sobWluZm8sIGZyZXEsIG1pbmZvLT5tYXhfcGl4 ZWxfY2xvY2ssICZtLCAmbiwgJnApOworCU1HQUcxMDBfcHJvZ1BpeENsb2NrKG1pbmZvLCBmbGFn cywgbSwgbiwgcCk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9NQVRST1hfTVlTVElR VUUKK3N0YXRpYyBpbnQgTUdBMTA2NF9wcmVpbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWlu Zm8pCit7CisJc3RhdGljIGNvbnN0IGludCB2eHJlc19teXN0aXF1ZVtdID0geyA1MTIsICAgICAg ICA2NDAsIDc2OCwgIDgwMCwgIDgzMiwgIDk2MCwKKwkJCQkJICAgICAxMDI0LCAxMTUyLCAxMjgw LCAgICAgIDE2MDAsIDE2NjQsIDE5MjAsCisJCQkJCSAgICAgMjA0OCwgICAgMH07CisJc3RydWN0 IG1hdHJveF9od19zdGF0ZSAqaHcgPSAmbWluZm8tPmh3OworCisJREJHKF9fZnVuY19fKQorCisJ LyogbWluZm8tPmNhcGFibGUuY2ZiNCA9IDA7IC4uLiBwcmVpbml0aWFsaXplZCBieSAwICovCisJ bWluZm8tPmNhcGFibGUudGV4dCA9IDE7CisJbWluZm8tPmNhcGFibGUudnhyZXMgPSB2eHJlc19t eXN0aXF1ZTsKKworCW1pbmZvLT5vdXRwdXRzWzBdLm91dHB1dCA9ICZtMTA2NDsKKwltaW5mby0+ b3V0cHV0c1swXS5zcmMgPSBtaW5mby0+b3V0cHV0c1swXS5kZWZhdWx0X3NyYzsKKwltaW5mby0+ b3V0cHV0c1swXS5kYXRhID0gbWluZm87CisJbWluZm8tPm91dHB1dHNbMF0ubW9kZSA9IE1BVFJP WEZCX09VVFBVVF9NT0RFX01PTklUT1I7CisKKwlpZiAobWluZm8tPmRldmZsYWdzLm5vaW5pdCkK KwkJcmV0dXJuIDA7CS8qIGRvIG5vdCBtb2RpZnkgc2V0dGluZ3MgKi8KKwlody0+TVhvcHRpb25S ZWcgJj0gMHhDMDAwMDEwMDsKKwlody0+TVhvcHRpb25SZWcgfD0gMHgwMDA5NEUyMDsKKwlpZiAo bWluZm8tPmRldmZsYWdzLm5vdmdhKQorCQlody0+TVhvcHRpb25SZWcgJj0gfjB4MDAwMDAxMDA7 CisJaWYgKG1pbmZvLT5kZXZmbGFncy5ub2Jpb3MpCisJCWh3LT5NWG9wdGlvblJlZyAmPSB+MHg0 MDAwMDAwMDsKKwlpZiAobWluZm8tPmRldmZsYWdzLm5vcGNpcmV0cnkpCisJCWh3LT5NWG9wdGlv blJlZyB8PSAgMHgyMDAwMDAwMDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1pbmZvLT5wY2lk ZXYsIFBDSV9PUFRJT05fUkVHLCBody0+TVhvcHRpb25SZWcpOworCW1nYV9zZXRyKE1fU0VRX0lO REVYLCAweDAxLCAweDIwKTsKKwltZ2Ffb3V0bChNX0NUTFdUU1QsIDB4MDAwMDAwMDApOworCXVk ZWxheSgyMDApOworCW1nYV9vdXRsKE1fTUFDQ0VTUywgMHgwMDAwODAwMCk7CisJdWRlbGF5KDEw MCk7CisJbWdhX291dGwoTV9NQUNDRVNTLCAweDAwMDBDMDAwKTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgTUdBMTA2NF9yZXNldChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQor eworCisJREJHKF9fZnVuY19fKTsKKworCU1HQTEwNjRfcmFtZGFjX2luaXQobWluZm8pOworfQor I2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX0cKK3N0YXRpYyB2b2lkIGc0NTBfbWNs a19pbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJLyogc3dpdGNoIGFsbCBj bG9ja3MgdG8gUENJIHNvdXJjZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBj aWRldiwgUENJX09QVElPTl9SRUcsIG1pbmZvLT5ody5NWG9wdGlvblJlZyB8IDQpOworCXBjaV93 cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTjNfUkVHLCBtaW5mby0+ dmFsdWVzLnJlZy5vcHQzICYgfjB4MDAzMDBDMDMpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQo bWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIG1pbmZvLT5ody5NWG9wdGlvblJlZyk7CisK KwlpZiAoKChtaW5mby0+dmFsdWVzLnJlZy5vcHQzICYgMHgwMDAwMDMpID09IDB4MDAwMDAzKSB8 fAorCSAgICAoKG1pbmZvLT52YWx1ZXMucmVnLm9wdDMgJiAweDAwMEMwMCkgPT0gMHgwMDBDMDAp IHx8CisJICAgICgobWluZm8tPnZhbHVlcy5yZWcub3B0MyAmIDB4MzAwMDAwKSA9PSAweDMwMDAw MCkpIHsKKwkJbWF0cm94ZmJfZzQ1MF9zZXRjbGsobWluZm8sIG1pbmZvLT52YWx1ZXMucGxsLnZp ZGVvLCBNX1ZJREVPX1BMTCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJ dW5zaWduZWQgaW50IHB3cjsKKwkJCisJCW1hdHJveGZiX0RBQ19sb2NrX2lycXNhdmUoZmxhZ3Mp OworCQlwd3IgPSBpbkRBQzEwNjQobWluZm8sIE0xMDY0X1hQV1JDVFJMKSAmIH4weDAyOworCQlv dXREQUMxMDY0KG1pbmZvLCBNMTA2NF9YUFdSQ1RSTCwgcHdyKTsKKwkJbWF0cm94ZmJfREFDX3Vu bG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKKwl9CisJbWF0cm94ZmJfZzQ1MF9zZXRjbGsobWluZm8s IG1pbmZvLT52YWx1ZXMucGxsLnN5c3RlbSwgTV9TWVNURU1fUExMKTsKKwkKKwkvKiBzd2l0Y2gg Y2xvY2tzIHRvIHRoZWlyIHJlYWwgUExMIHNvdXJjZShzKSAqLworCXBjaV93cml0ZV9jb25maWdf ZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIG1pbmZvLT5ody5NWG9wdGlvblJl ZyB8IDQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElP TjNfUkVHLCBtaW5mby0+dmFsdWVzLnJlZy5vcHQzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3Jk KG1pbmZvLT5wY2lkZXYsIFBDSV9PUFRJT05fUkVHLCBtaW5mby0+aHcuTVhvcHRpb25SZWcpOwor Cit9CisKK3N0YXRpYyB2b2lkIGc0NTBfbWVtb3J5X2luaXQoc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbykKK3sKKwkvKiBkaXNhYmxlIG1lbW9yeSByZWZyZXNoICovCisJbWluZm8tPmh3Lk1Y b3B0aW9uUmVnICY9IH4weDAwMUY4MDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8t PnBjaWRldiwgUENJX09QVElPTl9SRUcsIG1pbmZvLT5ody5NWG9wdGlvblJlZyk7CisJCisJLyog c2V0IG1lbW9yeSBpbnRlcmZhY2UgcGFyYW1ldGVycyAqLworCW1pbmZvLT5ody5NWG9wdGlvblJl ZyAmPSB+MHgwMDIwN0UwMDsKKwltaW5mby0+aHcuTVhvcHRpb25SZWcgfD0gMHgwMDIwN0UwMCAm IG1pbmZvLT52YWx1ZXMucmVnLm9wdDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1pbmZvLT5w Y2lkZXYsIFBDSV9PUFRJT05fUkVHLCBtaW5mby0+aHcuTVhvcHRpb25SZWcpOworCXBjaV93cml0 ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTjJfUkVHLCBtaW5mby0+dmFs dWVzLnJlZy5vcHQyKTsKKwkKKwltZ2Ffb3V0bChNX0NUTFdUU1QsIG1pbmZvLT52YWx1ZXMucmVn Lm1jdGx3dHN0KTsKKwkKKwkvKiBmaXJzdCBzZXQgdXAgbWVtb3J5IGludGVyZmFjZSB3aXRoIGRp c2FibGVkIG1lbW9yeSBpbnRlcmZhY2UgY2xvY2tzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29y ZChtaW5mby0+cGNpZGV2LCBQQ0lfTUVNTUlTQ19SRUcsIG1pbmZvLT52YWx1ZXMucmVnLm1lbW1p c2MgJiB+MHg4MDAwMDAwMFUpOworCW1nYV9vdXRsKE1fTUVNUkRCSywgbWluZm8tPnZhbHVlcy5y ZWcubWVtcmRiayk7CisJbWdhX291dGwoTV9NQUNDRVNTLCBtaW5mby0+dmFsdWVzLnJlZy5tYWNj ZXNzKTsKKwkvKiBzdGFydCBtZW1vcnkgY2xvY2tzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29y ZChtaW5mby0+cGNpZGV2LCBQQ0lfTUVNTUlTQ19SRUcsIG1pbmZvLT52YWx1ZXMucmVnLm1lbW1p c2MgfCAweDgwMDAwMDAwVSk7CisKKwl1ZGVsYXkoMjAwKTsKKwkKKwlpZiAobWluZm8tPnZhbHVl cy5tZW1vcnkuZGRyICYmICghbWluZm8tPnZhbHVlcy5tZW1vcnkuZW1yc3dlbiB8fCAhbWluZm8t PnZhbHVlcy5tZW1vcnkuZGxsKSkgeworCQltZ2Ffb3V0bChNX01FTVJEQkssIG1pbmZvLT52YWx1 ZXMucmVnLm1lbXJkYmsgJiB+MHgxMDAwKTsKKwl9CisJbWdhX291dGwoTV9NQUNDRVNTLCBtaW5m by0+dmFsdWVzLnJlZy5tYWNjZXNzIHwgMHg4MDAwKTsKKwkKKwl1ZGVsYXkoMjAwKTsKKwkKKwlt aW5mby0+aHcuTVhvcHRpb25SZWcgfD0gMHgwMDFGODAwMCAmIG1pbmZvLT52YWx1ZXMucmVnLm9w dDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1pbmZvLT5wY2lkZXYsIFBDSV9PUFRJT05fUkVH LCBtaW5mby0+aHcuTVhvcHRpb25SZWcpOworCQorCS8qIHZhbHVlIGlzIHdyaXR0ZW4gdG8gbWVt b3J5IGNoaXBzIG9ubHkgaWYgb2xkICE9IG5ldyAqLworCW1nYV9vdXRsKE1fUExOV1QsIDApOwor CW1nYV9vdXRsKE1fUExOV1QsIH4wKTsKKwkKKwlpZiAobWluZm8tPnZhbHVlcy5yZWcubWN0bHd0 c3QgIT0gbWluZm8tPnZhbHVlcy5yZWcubWN0bHd0c3RfY29yZSkgeworCQltZ2Ffb3V0bChNX0NU TFdUU1QsIG1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0X2NvcmUpOworCX0KKwkKK30KKworc3Rh dGljIHZvaWQgZzQ1MF9wcmVpbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJ dV9pbnQzMl90IGMyY3RsOworCXVfaW50OF90IGN1cmN0bDsKKwl1X2ludDhfdCBjMWN0bDsKKwkK KwkvKiBtaW5mby0+aHcuTVhvcHRpb25SZWcgPSBtaW5mby0+dmFsdWVzLnJlZy5vcHQ7ICovCisJ bWluZm8tPmh3Lk1Yb3B0aW9uUmVnICY9IDB4QzAwMDAxMDA7CisJbWluZm8tPmh3Lk1Yb3B0aW9u UmVnIHw9IDB4MDAwMDAwMjA7CisJaWYgKG1pbmZvLT5kZXZmbGFncy5ub3ZnYSkKKwkJbWluZm8t Pmh3Lk1Yb3B0aW9uUmVnICY9IH4weDAwMDAwMTAwOworCWlmIChtaW5mby0+ZGV2ZmxhZ3Mubm9i aW9zKQorCQltaW5mby0+aHcuTVhvcHRpb25SZWcgJj0gfjB4NDAwMDAwMDA7CisJaWYgKG1pbmZv LT5kZXZmbGFncy5ub3BjaXJldHJ5KQorCQltaW5mby0+aHcuTVhvcHRpb25SZWcgfD0gIDB4MjAw MDAwMDA7CisJbWluZm8tPmh3Lk1Yb3B0aW9uUmVnIHw9IG1pbmZvLT52YWx1ZXMucmVnLm9wdCAm IDB4MDM0MDAwNDA7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lf T1BUSU9OX1JFRywgbWluZm8tPmh3Lk1Yb3B0aW9uUmVnKTsKKworCS8qIEluaXQgc3lzdGVtIGNs b2NrcyAqLworCQkKKwkvKiBzdG9wIGNydGMyICovCisJYzJjdGwgPSBtZ2FfaW5sKE1fQzJDVEwp OworCW1nYV9vdXRsKE1fQzJDVEwsIGMyY3RsICYgfjEpOworCS8qIHN0b3AgY3Vyc29yICovCisJ Y3VyY3RsID0gaW5EQUMxMDY0KG1pbmZvLCBNMTA2NF9YQ1VSQ1RSTCk7CisJb3V0REFDMTA2NCht aW5mbywgTTEwNjRfWENVUkNUUkwsIDApOworCS8qIHN0b3AgY3J0YzEgKi8KKwljMWN0bCA9IG1n YV9yZWFkcihNX1NFUV9JTkRFWCwgMSk7CisJbWdhX3NldHIoTV9TRVFfSU5ERVgsIDEsIGMxY3Rs IHwgMHgyMCk7CisKKwlnNDUwX21jbGtfaW5pdChtaW5mbyk7CisJZzQ1MF9tZW1vcnlfaW5pdCht aW5mbyk7CisJCisJLyogc2V0IGxlZ2FjeSBWR0EgY2xvY2sgc291cmNlcyBmb3IgRE9TRW11IG9y IFZNd2FyZS4uLiAqLworCW1hdHJveGZiX2c0NTBfc2V0Y2xrKG1pbmZvLCAyNTE3NSwgTV9QSVhF TF9QTExfQSk7CisJbWF0cm94ZmJfZzQ1MF9zZXRjbGsobWluZm8sIDI4MzIyLCBNX1BJWEVMX1BM TF9CKTsKKworCS8qIHJlc3RvcmUgY3J0YzEgKi8KKwltZ2Ffc2V0cihNX1NFUV9JTkRFWCwgMSwg YzFjdGwpOworCQorCS8qIHJlc3RvcmUgY3Vyc29yICovCisJb3V0REFDMTA2NChtaW5mbywgTTEw NjRfWENVUkNUUkwsIGN1cmN0bCk7CisKKwkvKiByZXN0b3JlIGNydGMyICovCisJbWdhX291dGwo TV9DMkNUTCwgYzJjdGwpOworCQorCXJldHVybjsKK30KKworc3RhdGljIGludCBNR0FHMTAwX3By ZWluaXQoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlzdGF0aWMgY29uc3QgaW50 IHZ4cmVzX2cxMDBbXSA9IHsgIDUxMiwgICAgICAgIDY0MCwgNzY4LCAgODAwLCAgODMyLCAgOTYw LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgMTE1Miwg MTI4MCwgICAgICAxNjAwLCAxNjY0LCAxOTIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMjA0OCwgMH07CisJc3RydWN0IG1hdHJveF9od19zdGF0ZSAqaHcgPSAm bWluZm8tPmh3OworCisgICAgICAgIHVfaW50MzJfdCByZWc1MDsKKyNpZiAwCisJdV9pbnQzMl90 IHE7CisjZW5kaWYKKworCURCRyhfX2Z1bmNfXykKKworCS8qIHRoZXJlIGFyZSBzb21lIGluc3Rh YmlsaXRpZXMgaWYgaW5fZGl2ID4gMTkgJiYgdmNvIDwgNjEwMDAgKi8KKwlpZiAobWluZm8tPmRl dmZsYWdzLmc0NTBkYWMpIHsKKwkJbWluZm8tPmZlYXR1cmVzLnBsbC52Y29fZnJlcV9taW4gPSAx MzAwMDA7CS8qIG15IHNhbXBsZTogPjExOCAqLworCX0gZWxzZSB7CisJCW1pbmZvLT5mZWF0dXJl cy5wbGwudmNvX2ZyZXFfbWluID0gNjIwMDA7CisJfQorCWlmICghbWluZm8tPmZlYXR1cmVzLnBs bC5yZWZfZnJlcSkgeworCQltaW5mby0+ZmVhdHVyZXMucGxsLnJlZl9mcmVxCSA9IDI3MDAwOwor CX0KKwltaW5mby0+ZmVhdHVyZXMucGxsLmZlZWRfZGl2X21pbiA9IDc7CisJbWluZm8tPmZlYXR1 cmVzLnBsbC5mZWVkX2Rpdl9tYXggPSAxMjc7CisJbWluZm8tPmZlYXR1cmVzLnBsbC5pbl9kaXZf bWluCSA9IDE7CisJbWluZm8tPmZlYXR1cmVzLnBsbC5pbl9kaXZfbWF4CSA9IDMxOworCW1pbmZv LT5mZWF0dXJlcy5wbGwucG9zdF9zaGlmdF9tYXggPSAzOworCW1pbmZvLT5mZWF0dXJlcy5EQUMx MDY0Lnh2cmVmY3RybCA9IERBQzEwNjRfWFZSRUZDVFJMX0cxMDBfREVGQVVMVDsKKwkvKiBtaW5m by0+Y2FwYWJsZS5jZmI0ID0gMDsgLi4uIHByZWluaXRpYWxpemVkIGJ5IDAgKi8KKwltaW5mby0+ Y2FwYWJsZS50ZXh0ID0gMTsKKwltaW5mby0+Y2FwYWJsZS52eHJlcyA9IHZ4cmVzX2cxMDA7CisJ bWluZm8tPmNhcGFibGUucGxud3QgPSBtaW5mby0+ZGV2ZmxhZ3MuYWNjZWxlcmF0b3IgPT0gRkJf QUNDRUxfTUFUUk9YX01HQUcxMDAKKwkJCT8gbWluZm8tPmRldmZsYWdzLnNncmFtIDogMTsKKwor CWlmIChtaW5mby0+ZGV2ZmxhZ3MuZzQ1MGRhYykgeworCQltaW5mby0+b3V0cHV0c1swXS5vdXRw dXQgPSAmZzQ1MG91dDsKKwl9IGVsc2UgeworCQltaW5mby0+b3V0cHV0c1swXS5vdXRwdXQgPSAm bTEwNjQ7CisJfQorCW1pbmZvLT5vdXRwdXRzWzBdLnNyYyA9IG1pbmZvLT5vdXRwdXRzWzBdLmRl ZmF1bHRfc3JjOworCW1pbmZvLT5vdXRwdXRzWzBdLmRhdGEgPSBtaW5mbzsKKwltaW5mby0+b3V0 cHV0c1swXS5tb2RlID0gTUFUUk9YRkJfT1VUUFVUX01PREVfTU9OSVRPUjsKKworCWlmIChtaW5m by0+ZGV2ZmxhZ3MuZzQ1MGRhYykgeworCQkvKiB3ZSBtdXN0IGRvIHRoaXMgYWx3YXlzLCBCSU9T IGRvZXMgbm90IGRvIGl0IGZvciB1cworCQkgICBhbmQgYWNjZWxlcmF0b3IgZGllcyB3aXRob3V0 IGl0ICovCisJCW1nYV9vdXRsKDB4MUMwQywgMCk7CisJfQorCWlmIChtaW5mby0+ZGV2ZmxhZ3Mu bm9pbml0KQorCQlyZXR1cm4gMDsKKwlpZiAobWluZm8tPmRldmZsYWdzLmc0NTBkYWMpIHsKKwkJ ZzQ1MF9wcmVpbml0KG1pbmZvKTsKKwkJcmV0dXJuIDA7CisJfQorCWh3LT5NWG9wdGlvblJlZyAm PSAweEMwMDAwMTAwOworCWh3LT5NWG9wdGlvblJlZyB8PSAweDAwMDAwMDIwOworCWlmIChtaW5m by0+ZGV2ZmxhZ3Mubm92Z2EpCisJCWh3LT5NWG9wdGlvblJlZyAmPSB+MHgwMDAwMDEwMDsKKwlp ZiAobWluZm8tPmRldmZsYWdzLm5vYmlvcykKKwkJaHctPk1Yb3B0aW9uUmVnICY9IH4weDQwMDAw MDAwOworCWlmIChtaW5mby0+ZGV2ZmxhZ3Mubm9wY2lyZXRyeSkKKwkJaHctPk1Yb3B0aW9uUmVn IHw9ICAweDIwMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwg UENJX09QVElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisJREFDMTA2NF9zZXRtY2xrKG1pbmZv LCBEQUMxMDY0X09QVF9NRElWMiB8IERBQzEwNjRfT1BUX0dESVYzIHwgREFDMTA2NF9PUFRfU0NM S19QQ0ksIDEzMzMzMyk7CisKKwlpZiAobWluZm8tPmRldmZsYWdzLmFjY2VsZXJhdG9yID09IEZC X0FDQ0VMX01BVFJPWF9NR0FHMTAwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtaW5mby0+ cGNpZGV2LCBQQ0lfT1BUSU9OMl9SRUcsICZyZWc1MCk7CisJCXJlZzUwICY9IH4weDMwMDA7CisJ CXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTjJfUkVHLCBy ZWc1MCk7CisKKwkJaHctPk1Yb3B0aW9uUmVnIHw9IDB4MTA4MDsKKwkJcGNpX3dyaXRlX2NvbmZp Z19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lfT1BUSU9OX1JFRywgaHctPk1Yb3B0aW9uUmVnKTsK KwkJbWdhX291dGwoTV9DVExXVFNULCBtaW5mby0+dmFsdWVzLnJlZy5tY3Rsd3RzdCk7CisJCXVk ZWxheSgxMDApOworCQltZ2Ffb3V0YigweDFDMDUsIDB4MDApOworCQltZ2Ffb3V0YigweDFDMDUs IDB4ODApOworCQl1ZGVsYXkoMTAwKTsKKwkJbWdhX291dGIoMHgxQzA1LCAweDQwKTsKKwkJbWdh X291dGIoMHgxQzA1LCAweEMwKTsKKwkJdWRlbGF5KDEwMCk7CisJCXJlZzUwICY9IH4weEZGOwor CQlyZWc1MCB8PSAgMHgwNzsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNpZGV2 LCBQQ0lfT1BUSU9OMl9SRUcsIHJlZzUwKTsKKwkJLyogaXQgc2hvdWxkIGhlbHAgd2l0aCBHMTAw ICovCisJCW1nYV9vdXRiKE1fR1JBUEhJQ1NfSU5ERVgsIDYpOworCQltZ2Ffb3V0YihNX0dSQVBI SUNTX0RBVEEsIChtZ2FfaW5iKE1fR1JBUEhJQ1NfREFUQSkgJiAzKSB8IDQpOworCQltZ2Ffc2V0 cihNX0VYVFZHQV9JTkRFWCwgMHgwMywgMHg4MSk7CisJCW1nYV9zZXRyKE1fRVhUVkdBX0lOREVY LCAweDA0LCAweDAwKTsKKwkJbWdhX3dyaXRlYihtaW5mby0+dmlkZW8udmJhc2UsIDB4MDAwMCwg MHhBQSk7CisJCW1nYV93cml0ZWIobWluZm8tPnZpZGVvLnZiYXNlLCAweDA4MDAsIDB4NTUpOwor CQltZ2Ffd3JpdGViKG1pbmZvLT52aWRlby52YmFzZSwgMHg0MDAwLCAweDU1KTsKKyNpZiAwCisJ CWlmIChtZ2FfcmVhZGIobWluZm8tPnZpZGVvLnZiYXNlLCAweDAwMDApICE9IDB4QUEpIHsKKwkJ CWh3LT5NWG9wdGlvblJlZyAmPSB+MHgxMDAwOworCQl9CisjZW5kaWYKKwkJaHctPk1Yb3B0aW9u UmVnIHw9IDB4MDAwNzgwMjA7CisJfSBlbHNlIGlmIChtaW5mby0+ZGV2ZmxhZ3MuYWNjZWxlcmF0 b3IgPT0gRkJfQUNDRUxfTUFUUk9YX01HQUcyMDApIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3Jk KG1pbmZvLT5wY2lkZXYsIFBDSV9PUFRJT04yX1JFRywgJnJlZzUwKTsKKwkJcmVnNTAgJj0gfjB4 MzAwMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lfT1BUSU9O Ml9SRUcsIHJlZzUwKTsKKworCQlpZiAobWluZm8tPmRldmZsYWdzLm1lbXR5cGUgPT0gLTEpCisJ CQlody0+TVhvcHRpb25SZWcgfD0gbWluZm8tPnZhbHVlcy5yZWcub3B0ICYgMHgxQzAwOworCQll bHNlCisJCQlody0+TVhvcHRpb25SZWcgfD0gKG1pbmZvLT5kZXZmbGFncy5tZW10eXBlICYgNykg PDwgMTA7CisJCWlmIChtaW5mby0+ZGV2ZmxhZ3Muc2dyYW0pCisJCQlody0+TVhvcHRpb25SZWcg fD0gMHg0MDAwOworCQltZ2Ffb3V0bChNX0NUTFdUU1QsIG1pbmZvLT52YWx1ZXMucmVnLm1jdGx3 dHN0KTsKKwkJbWdhX291dGwoTV9NRU1SREJLLCBtaW5mby0+dmFsdWVzLnJlZy5tZW1yZGJrKTsK KwkJdWRlbGF5KDIwMCk7CisJCW1nYV9vdXRsKE1fTUFDQ0VTUywgMHgwMDAwMDAwMCk7CisJCW1n YV9vdXRsKE1fTUFDQ0VTUywgMHgwMDAwODAwMCk7CisJCXVkZWxheSgxMDApOworCQltZ2Ffb3V0 dyhNX01FTVJEQkssIG1pbmZvLT52YWx1ZXMucmVnLm1lbXJkYmspOworCQlody0+TVhvcHRpb25S ZWcgfD0gMHgwMDA3ODAyMDsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobWlu Zm8tPnBjaWRldiwgUENJX09QVElPTjJfUkVHLCAmcmVnNTApOworCQlyZWc1MCAmPSB+MHgwMDAw MDEwMDsKKwkJcmVnNTAgfD0gIDB4MDAwMDAwMDA7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQo bWluZm8tPnBjaWRldiwgUENJX09QVElPTjJfUkVHLCByZWc1MCk7CisKKwkJaWYgKG1pbmZvLT5k ZXZmbGFncy5tZW10eXBlID09IC0xKQorCQkJaHctPk1Yb3B0aW9uUmVnIHw9IG1pbmZvLT52YWx1 ZXMucmVnLm9wdCAmIDB4MUMwMDsKKwkJZWxzZQorCQkJaHctPk1Yb3B0aW9uUmVnIHw9IChtaW5m by0+ZGV2ZmxhZ3MubWVtdHlwZSAmIDcpIDw8IDEwOworCQlpZiAobWluZm8tPmRldmZsYWdzLnNn cmFtKQorCQkJaHctPk1Yb3B0aW9uUmVnIHw9IDB4NDAwMDsKKwkJbWdhX291dGwoTV9DVExXVFNU LCBtaW5mby0+dmFsdWVzLnJlZy5tY3Rsd3RzdCk7CisJCW1nYV9vdXRsKE1fTUVNUkRCSywgbWlu Zm8tPnZhbHVlcy5yZWcubWVtcmRiayk7CisJCXVkZWxheSgyMDApOworCQltZ2Ffb3V0bChNX01B Q0NFU1MsIDB4MDAwMDAwMDApOworCQltZ2Ffb3V0bChNX01BQ0NFU1MsIDB4MDAwMDgwMDApOwor CQl1ZGVsYXkoMTAwKTsKKwkJbWdhX291dGwoTV9NRU1SREJLLCBtaW5mby0+dmFsdWVzLnJlZy5t ZW1yZGJrKTsKKwkJaHctPk1Yb3B0aW9uUmVnIHw9IDB4MDAwNDAwMjA7CisJfQorCXBjaV93cml0 ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIGh3LT5NWG9wdGlv blJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIE1HQUcxMDBfcmVzZXQoc3RydWN0 IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwl1X2ludDhfdCBiOworCXN0cnVjdCBtYXRyb3hf aHdfc3RhdGUgKmh3ID0gJm1pbmZvLT5odzsKKworCURCRyhfX2Z1bmNfXykKKworCXsKKyNpZmRl ZiBHMTAwX0JST0tFTl9JQk1fODIzNTEKKwkJdV9pbnQzMl90IGQ7CisKKwkJZmluZCAxMDE0LzIy IChJQk0vODIzNTEpOyAvKiBpZiBmb3VuZCBhbmQgYnJpZGdpbmcgTWF0cm94LCBkbyBzb21lIHN0 cmFuZ2Ugc3R1ZmYgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaWJtLCBQQ0lfU0VDT05EQVJZ X0JVUywgJmIpOworCQlpZiAoYiA9PSBtaW5mby0+cGNpZGV2LT5idXMtPm51bWJlcikgeworCQkJ cGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlibSwgUENJX0NPTU1BTkQrMSwgMCk7CS8qIGRpc2FibGUg YmFjay10by1iYWNrICYgU0VSUiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlibSwgMHg0 MSwgMHhGNCk7CQkvKiA/Pz8gKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpYm0sIFBDSV9J T19CQVNFLCAweEYwKTsJLyogPz8/ICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWJtLCBQ Q0lfSU9fTElNSVQsIDB4MDApOwkvKiA/Pz8gKi8KKwkJfQorI2VuZGlmCisJCWlmICghbWluZm8t PmRldmZsYWdzLm5vaW5pdCkgeworCQkJaWYgKHg3QUY0ICYgOCkgeworCQkJCWh3LT5NWG9wdGlv blJlZyB8PSAweDQwOwkvKiBGSVhNRS4uLiAqLworCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQo bWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisJCQl9CisJ CQltZ2Ffc2V0cihNX0VYVFZHQV9JTkRFWCwgMHgwNiwgMHgwMCk7CisJCX0KKwl9CisJaWYgKG1p bmZvLT5kZXZmbGFncy5nNDUwZGFjKSB7CisJCS8qIGVpdGhlciBsZWF2ZSBNQ0xLIGFzIGlzLi4u IG9yIHRoZXkgd2VyZSBzZXQgaW4gcHJlaW5pdCAqLworCQlody0+REFDY2xrWzNdID0gaW5EQUMx MDY0KG1pbmZvLCBEQUMxMDY0X1hTWVNQTExNKTsKKwkJaHctPkRBQ2Nsa1s0XSA9IGluREFDMTA2 NChtaW5mbywgREFDMTA2NF9YU1lTUExMTik7CisJCWh3LT5EQUNjbGtbNV0gPSBpbkRBQzEwNjQo bWluZm8sIERBQzEwNjRfWFNZU1BMTFApOworCX0gZWxzZSB7CisJCURBQzEwNjRfc2V0bWNsayht aW5mbywgREFDMTA2NF9PUFRfUkVTRVJWRUQgfCBEQUMxMDY0X09QVF9NRElWMiB8IERBQzEwNjRf T1BUX0dESVYxIHwgREFDMTA2NF9PUFRfU0NMS19QTEwsIDEzMzMzMyk7CisJfQorCWlmIChtaW5m by0+ZGV2ZmxhZ3MuYWNjZWxlcmF0b3IgPT0gRkJfQUNDRUxfTUFUUk9YX01HQUc0MDApIHsKKwkJ aWYgKG1pbmZvLT5kZXZmbGFncy5kZnBfdHlwZSA9PSAtMSkgeworCQkJbWluZm8tPmRldmZsYWdz LmRmcF90eXBlID0gaW5EQUMxMDY0KG1pbmZvLCAweDFGKTsKKwkJfQorCX0KKwlpZiAobWluZm8t PmRldmZsYWdzLm5vaW5pdCkKKwkJcmV0dXJuOworCWlmIChtaW5mby0+ZGV2ZmxhZ3MuZzQ1MGRh YykgeworCX0gZWxzZSB7CisJCU1HQUcxMDBfc2V0UGl4Q2xvY2sobWluZm8sIDQsIDI1MTc1KTsK KwkJTUdBRzEwMF9zZXRQaXhDbG9jayhtaW5mbywgNSwgMjgzMjIpOworCQlpZiAoeDdBRjQgJiAw eDEwKSB7CisJCQliID0gaW5EQUMxMDY0KG1pbmZvLCBNMTA2NF9YR0VOSU9EQVRBKSAmIH4xOwor CQkJb3V0REFDMTA2NChtaW5mbywgTTEwNjRfWEdFTklPREFUQSwgYik7CisJCQliID0gaW5EQUMx MDY0KG1pbmZvLCBNMTA2NF9YR0VOSU9DVFJMKSB8IDE7CisJCQlvdXREQUMxMDY0KG1pbmZvLCBN MTA2NF9YR0VOSU9DVFJMLCBiKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklH X0ZCX01BVFJPWF9NWVNUSVFVRQorc3RhdGljIHZvaWQgTUdBMTA2NF9yZXN0b3JlKHN0cnVjdCBt YXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJaW50IGk7CisJc3RydWN0IG1hdHJveF9od19zdGF0 ZSAqaHcgPSAmbWluZm8tPmh3OworCisJQ1JJVEZMQUdTCisKKwlEQkcoX19mdW5jX18pCisKKwlD UklUQkVHSU4KKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09Q VElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisJbWdhX291dGIoTV9JRU4sIDB4MDApOworCW1n YV9vdXRiKE1fQ0FDSEVGTFVTSCwgMHgwMCk7CisKKwlDUklURU5ECisKKwlEQUMxMDY0X3Jlc3Rv cmVfMShtaW5mbyk7CisJbWF0cm94ZmJfdmdhSFdyZXN0b3JlKG1pbmZvKTsKKwltaW5mby0+Y3J0 YzEucGFucG9zID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbWdhX3NldHIoTV9F WFRWR0FfSU5ERVgsIGksIGh3LT5DUlRDRVhUW2ldKTsKKwlEQUMxMDY0X3Jlc3RvcmVfMihtaW5m byk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9NQVRST1hfRworc3RhdGljIHZvaWQg TUdBRzEwMF9yZXN0b3JlKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJaW50IGk7 CisJc3RydWN0IG1hdHJveF9od19zdGF0ZSAqaHcgPSAmbWluZm8tPmh3OworCisJQ1JJVEZMQUdT CisKKwlEQkcoX19mdW5jX18pCisKKwlDUklUQkVHSU4KKworCXBjaV93cml0ZV9jb25maWdfZHdv cmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisJQ1JJ VEVORAorCisJREFDMTA2NF9yZXN0b3JlXzEobWluZm8pOworCW1hdHJveGZiX3ZnYUhXcmVzdG9y ZShtaW5mbyk7CisJaWYgKG1pbmZvLT5kZXZmbGFncy5zdXBwb3J0MzJNQikKKwkJbWdhX3NldHIo TV9FWFRWR0FfSU5ERVgsIDgsIGh3LT5DUlRDRVhUWzhdKTsKKwltaW5mby0+Y3J0YzEucGFucG9z ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbWdhX3NldHIoTV9FWFRWR0FfSU5E RVgsIGksIGh3LT5DUlRDRVhUW2ldKTsKKwlEQUMxMDY0X3Jlc3RvcmVfMihtaW5mbyk7Cit9Cisj ZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9NQVRST1hfTVlTVElRVUUKK3N0cnVjdCBtYXRyb3hf c3dpdGNoIG1hdHJveF9teXN0aXF1ZSA9IHsKKwkucHJlaW5pdAk9IE1HQTEwNjRfcHJlaW5pdCwK KwkucmVzZXQJCT0gTUdBMTA2NF9yZXNldCwKKwkuaW5pdAkJPSBNR0ExMDY0X2luaXQsCisJLnJl c3RvcmUJPSBNR0ExMDY0X3Jlc3RvcmUsCit9OworRVhQT1JUX1NZTUJPTChtYXRyb3hfbXlzdGlx dWUpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX0cKK3N0cnVjdCBtYXRyb3hf c3dpdGNoIG1hdHJveF9HMTAwID0geworCS5wcmVpbml0CT0gTUdBRzEwMF9wcmVpbml0LAorCS5y ZXNldAkJPSBNR0FHMTAwX3Jlc2V0LAorCS5pbml0CQk9IE1HQUcxMDBfaW5pdCwKKwkucmVzdG9y ZQk9IE1HQUcxMDBfcmVzdG9yZSwKK307CitFWFBPUlRfU1lNQk9MKG1hdHJveF9HMTAwKTsKKyNl bmRpZgorCisjaWZkZWYgTkVFRF9EQUMxMDY0CitFWFBPUlRfU1lNQk9MKERBQzEwNjRfZ2xvYmFs X2luaXQpOworRVhQT1JUX1NZTUJPTChEQUMxMDY0X2dsb2JhbF9yZXN0b3JlKTsKKyNlbmRpZgor TU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21nYWtt cy9tYXRyb3hmYl9EQUMxMDY0LmggYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX0RB QzEwNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjNiMmE2ZmQz NWZmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJf REFDMTA2NC5oCkBAIC0wLDAgKzEsMTgwIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMCAqLworI2lmbmRlZiBfX01BVFJPWEZCX0RBQzEwNjRfSF9fCisjZGVmaW5lIF9fTUFU Uk9YRkJfREFDMTA2NF9IX18KKworCisjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorCisjaWZk ZWYgQ09ORklHX0ZCX01BVFJPWF9NWVNUSVFVRQorZXh0ZXJuIHN0cnVjdCBtYXRyb3hfc3dpdGNo IG1hdHJveF9teXN0aXF1ZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQl9NQVRST1hfRworZXh0 ZXJuIHN0cnVjdCBtYXRyb3hfc3dpdGNoIG1hdHJveF9HMTAwOworI2VuZGlmCisjaWZkZWYgTkVF RF9EQUMxMDY0Cit2b2lkIERBQzEwNjRfZ2xvYmFsX2luaXQoc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbyk7Cit2b2lkIERBQzEwNjRfZ2xvYmFsX3Jlc3RvcmUoc3RydWN0IG1hdHJveF9mYl9p bmZvICptaW5mbyk7CisjZW5kaWYKKworI2RlZmluZSBNMTA2NF9JTkRFWAkweDAwCisjZGVmaW5l IE0xMDY0X1BBTFdSQURECTB4MDAKKyNkZWZpbmUgTTEwNjRfUEFMREFUQQkweDAxCisjZGVmaW5l IE0xMDY0X1BJWFJETVNLCTB4MDIKKyNkZWZpbmUgTTEwNjRfUEFMUkRBREQJMHgwMworI2RlZmlu ZSBNMTA2NF9YX0RBVEFSRUcJMHgwQQorI2RlZmluZSBNMTA2NF9DVVJQT1NYTAkweDBDCS8qIGNh biBiZSBhY2Nlc3NlZCBhcyBEV09SRCAqLworI2RlZmluZSBNMTA2NF9DVVJQT1NYSAkweDBECisj ZGVmaW5lIE0xMDY0X0NVUlBPU1lMCTB4MEUKKyNkZWZpbmUgTTEwNjRfQ1VSUE9TWUgJMHgwRgor CisjZGVmaW5lIE0xMDY0X1hDVVJBRERMCQkweDA0CisjZGVmaW5lIE0xMDY0X1hDVVJBRERICQkw eDA1CisjZGVmaW5lIE0xMDY0X1hDVVJDVFJMCQkweDA2CisjZGVmaW5lICAgICBNMTA2NF9YQ1VS Q1RSTF9ESVMJCTB4MDAJLyogdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCwg dHJhbnNwYXJlbnQgKi8KKyNkZWZpbmUgICAgIE0xMDY0X1hDVVJDVFJMXzNDT0xPUgkweDAxCS8q IHRyYW5zcGFyZW50LCAwLCAxLCAyICovCisjZGVmaW5lICAgICBNMTA2NF9YQ1VSQ1RSTF9YR0EJ CTB4MDIJLyogMCwgMSwgdHJhbnNwYXJlbnQsIGNvbXBsZW1lbnQgKi8KKyNkZWZpbmUgICAgIE0x MDY0X1hDVVJDVFJMX1hXSU4JCTB4MDMJLyogdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50LCAwLCAx ICovCisJLyogZHJpdmUgRFZJIGJ5IHN0YW5kYXJkKDApL0RWSSgxKSBQTEwgKi8KKwkvKiBpZiBz ZXQoMSksIEM/RFZJQ0xLRU4gYW5kIEM/RFZJQ0xLU0VMIG11c3QgYmUgc2V0KDEpICovCisjZGVm aW5lICAgICAgTTEwNjRfWERWSUNMS0NUUkxfRFZJREFUQVBBVEhTRUwgICAweDAxCisJLyogZHJp dmUgQ1JUQzEgYnkgc3RhbmRhcmQoMCkvRFZJKDEpIFBMTCAqLworI2RlZmluZSAgICAgIE0xMDY0 X1hEVklDTEtDVFJMX0MxRFZJQ0xLU0VMICAgICAgMHgwMgorCS8qIGRyaXZlIENSVEMyIGJ5IHN0 YW5kYXJkKDApL0RWSSgxKSBQTEwgKi8KKyNkZWZpbmUgICAgICBNMTA2NF9YRFZJQ0xLQ1RSTF9D MkRWSUNMS1NFTCAgICAgIDB4MDQKKwkvKiBwaXhlbCBjbG9jayBhbGxvd2VkIHRvKDApL2Jsb2Nr ZWQgZnJvbSgxKSBkcml2aW5nIENSVEMxICovCisjZGVmaW5lICAgICAgTTEwNjRfWERWSUNMS0NU UkxfQzFEVklDTEtFTiAgICAgICAweDA4CisJLyogRFZJIFBMTCBsb29wIGZpbHRlciBiYW5kd2lk dGggc2VsZWN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgICAgICBNMTA2NF9YRFZJQ0xLQ1RSTF9EVklM T09QQ1RMICAgICAgIDB4MzAKKwkvKiBDUlRDMiBwaXhlbCBjbG9jayBhbGxvd2VkIHRvKDApL2Js b2NrZWQgZnJvbSgxKSBkcml2aW5nIENSVEMyICovCisjZGVmaW5lICAgICAgTTEwNjRfWERWSUNM S0NUUkxfQzJEVklDTEtFTiAgICAgICAweDQwCisJLyogUDFQTEwgbG9vcCBmaWx0ZXIgYmFuZHdp ZHRoIHNlbGVjdGlvbiAqLworI2RlZmluZSAgICAgIE0xMDY0X1hEVklDTEtDVFJMX1AxTE9PUEJX RFRDVEwgICAgMHg4MAorI2RlZmluZSBNMTA2NF9YQ1VSQ09MMFJFRAkweDA4CisjZGVmaW5lIE0x MDY0X1hDVVJDT0wwR1JFRU4JMHgwOQorI2RlZmluZSBNMTA2NF9YQ1VSQ09MMEJMVUUJMHgwQQor I2RlZmluZSBNMTA2NF9YQ1VSQ09MMVJFRAkweDBDCisjZGVmaW5lIE0xMDY0X1hDVVJDT0wxR1JF RU4JMHgwRAorI2RlZmluZSBNMTA2NF9YQ1VSQ09MMUJMVUUJMHgwRQorI2RlZmluZSBNMTA2NF9Y RFZJQ0xLQ1RSTAkweDBGCisjZGVmaW5lIE0xMDY0X1hDVVJDT0wyUkVECTB4MTAKKyNkZWZpbmUg TTEwNjRfWENVUkNPTDJHUkVFTgkweDExCisjZGVmaW5lIE0xMDY0X1hDVVJDT0wyQkxVRQkweDEy CisjZGVmaW5lIERBQzEwNjRfWFZSRUZDVFJMCTB4MTgKKyNkZWZpbmUgICAgICBEQUMxMDY0X1hW UkVGQ1RSTF9JTlRFUk5BTAkJMHgzRgorI2RlZmluZSAgICAgIERBQzEwNjRfWFZSRUZDVFJMX0VY VEVSTkFMCQkweDAwCisjZGVmaW5lICAgICAgREFDMTA2NF9YVlJFRkNUUkxfRzEwMF9ERUZBVUxU CTB4MDMKKyNkZWZpbmUgTTEwNjRfWE1VTENUUkwJCTB4MTkKKyNkZWZpbmUgICAgICBNMTA2NF9Y TVVMQ1RSTF9ERVBUSF84QlBQCQkweDAwCS8qIDggYnBwIHBhbGV0aXplZCAqLworI2RlZmluZSAg ICAgIE0xMDY0X1hNVUxDVFJMX0RFUFRIXzE1QlBQXzFCUFAJMHgwMQkvKiAxNSBicHAgcGFsZXRp emVkICsgMSBicHAgb3ZlcmxheSAqLworI2RlZmluZSAgICAgIE0xMDY0X1hNVUxDVFJMX0RFUFRI XzE2QlBQCQkweDAyCS8qIDE2IGJwcCBwYWxldGl6ZWQgKi8KKyNkZWZpbmUgICAgICBNMTA2NF9Y TVVMQ1RSTF9ERVBUSF8yNEJQUAkJMHgwMwkvKiAyNCBicHAgcGFsZXRpemVkICovCisjZGVmaW5l ICAgICAgTTEwNjRfWE1VTENUUkxfREVQVEhfMjRCUFBfOEJQUAkweDA0CS8qIDI0IGJwcCBkaXJl Y3QgKyA4IGJwcCBvdmVybGF5IHBhbGV0aXplZCAqLworI2RlZmluZSAgICAgIE0xMDY0X1hNVUxD VFJMXzJHOFYxNgkJMHgwNQkvKiAxNSBicHAgdmlkZW8gZGlyZWN0LCBoYWxmIHhyZXMsIDhicHAg cGFsZXRpemVkICovCisjZGVmaW5lICAgICAgTTEwNjRfWE1VTENUUkxfRzE2VjE2CQkweDA2CS8q IDE1IGJwcCB2aWRlbywgMTVicHAgZ3JhcGhpY3MsIG9uZSBvZiB0aGVtIHBhbGV0aXplZCAqLwor I2RlZmluZSAgICAgIE0xMDY0X1hNVUxDVFJMX0RFUFRIXzMyQlBQCQkweDA3CS8qIDI0IGJwcCBw YWxldGl6ZWQgKyA4IGJwcCB1bnVzZWQgKi8KKyNkZWZpbmUgICAgICBNMTA2NF9YTVVMQ1RSTF9H UkFQSElDU19QQUxFVElaRUQJMHgwMAorI2RlZmluZSAgICAgIE0xMDY0X1hNVUxDVFJMX1ZJREVP X1BBTEVUSVpFRAkweDA4CisjZGVmaW5lIE0xMDY0X1hQSVhDTEtDVFJMCTB4MUEKKyNkZWZpbmUg ICAgICBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfUENJCQkweDAwCisjZGVmaW5lICAgICAgTTEwNjRf WFBJWENMS0NUUkxfU1JDX1BMTAkJMHgwMQorI2RlZmluZSAgICAgIE0xMDY0X1hQSVhDTEtDVFJM X1NSQ19FWFQJCTB4MDIKKyNkZWZpbmUJICAgICBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNfU1lTCQkw eDAzCS8qIEcyMDAvRzQwMCAqLworI2RlZmluZSAgICAgIE0xMDY0X1hQSVhDTEtDVFJMX1NSQ19Q TEwyCQkweDAzCS8qIEc0NTAgKi8KKyNkZWZpbmUgICAgICBNMTA2NF9YUElYQ0xLQ1RSTF9TUkNf TUFTSwkJMHgwMworI2RlZmluZSAgICAgIE0xMDY0X1hQSVhDTEtDVFJMX0VOCQkweDAwCisjZGVm aW5lICAgICAgTTEwNjRfWFBJWENMS0NUUkxfRElTCQkweDA0CisjZGVmaW5lICAgICAgTTEwNjRf WFBJWENMS0NUUkxfUExMX0RPV04JCTB4MDAKKyNkZWZpbmUgICAgICBNMTA2NF9YUElYQ0xLQ1RS TF9QTExfVVAJCTB4MDgKKyNkZWZpbmUgTTEwNjRfWEdFTkNUUkwJCTB4MUQKKyNkZWZpbmUgICAg ICBNMTA2NF9YR0VOQ1RSTF9WU18wCQkweDAwCisjZGVmaW5lICAgICAgTTEwNjRfWEdFTkNUUkxf VlNfMQkJMHgwMQorI2RlZmluZSAgICAgIE0xMDY0X1hHRU5DVFJMX0FMUEhBX0RJUwkJMHgwMAor I2RlZmluZSAgICAgIE0xMDY0X1hHRU5DVFJMX0FMUEhBX0VOCQkweDAyCisjZGVmaW5lICAgICAg TTEwNjRfWEdFTkNUUkxfQkxBQ0tfMElSRQkJMHgwMAorI2RlZmluZSAgICAgIE0xMDY0X1hHRU5D VFJMX0JMQUNLXzc1SVJFCQkweDEwCisjZGVmaW5lICAgICAgTTEwNjRfWEdFTkNUUkxfU1lOQ19P Tl9HUkVFTgkweDAwCisjZGVmaW5lICAgICAgTTEwNjRfWEdFTkNUUkxfTk9fU1lOQ19PTl9HUkVF TgkweDIwCisjZGVmaW5lICAgICAgTTEwNjRfWEdFTkNUUkxfU1lOQ19PTl9HUkVFTl9NQVNLCTB4 MjAKKyNkZWZpbmUgTTEwNjRfWE1JU0NDVFJMCQkweDFFCisjZGVmaW5lICAgICAgTTEwNjRfWE1J U0NDVFJMX0RBQ19ESVMJCTB4MDAKKyNkZWZpbmUgICAgICBNMTA2NF9YTUlTQ0NUUkxfREFDX0VO CQkweDAxCisjZGVmaW5lICAgICAgTTEwNjRfWE1JU0NDVFJMX01GQ19WR0EJCTB4MDAKKyNkZWZp bmUgICAgICBNMTA2NF9YTUlTQ0NUUkxfTUZDX01BRkMJCTB4MDIKKyNkZWZpbmUgICAgICBNMTA2 NF9YTUlTQ0NUUkxfTUZDX0RJUwkJMHgwNgorI2RlZmluZSAgICAgIEdYMDBfWE1JU0NDVFJMX01G Q19NQUZDCQkweDAyCisjZGVmaW5lICAgICAgR1gwMF9YTUlTQ0NUUkxfTUZDX1BBTkVMTElOSwkw eDA0CisjZGVmaW5lICAgICAgR1gwMF9YTUlTQ0NUUkxfTUZDX0RJUwkJMHgwNgorI2RlZmluZSAg ICAgIEdYMDBfWE1JU0NDVFJMX01GQ19NQVNLCQkweDA2CisjZGVmaW5lICAgICAgTTEwNjRfWE1J U0NDVFJMX0RBQ182QklUCQkweDAwCisjZGVmaW5lICAgICAgTTEwNjRfWE1JU0NDVFJMX0RBQ184 QklUCQkweDA4CisjZGVmaW5lICAgICAgTTEwNjRfWE1JU0NDVFJMX0RBQ19XSURUSE1BU0sJMHgw OAorI2RlZmluZSAgICAgIE0xMDY0X1hNSVNDQ1RSTF9MVVRfRElTCQkweDAwCisjZGVmaW5lICAg ICAgTTEwNjRfWE1JU0NDVFJMX0xVVF9FTgkJMHgxMAorI2RlZmluZSAgICAgIEc0MDBfWE1JU0ND VFJMX1ZET19NQUZDMTIJCTB4MDAKKyNkZWZpbmUgICAgICBHNDAwX1hNSVNDQ1RSTF9WRE9fQllQ QVNTNjU2CTB4NDAKKyNkZWZpbmUgICAgICBHNDAwX1hNSVNDQ1RSTF9WRE9fQzJfTUFGQzEyCTB4 ODAKKyNkZWZpbmUgICAgICBHNDAwX1hNSVNDQ1RSTF9WRE9fQzJfQllQQVNTNjU2CTB4QzAKKyNk ZWZpbmUgICAgICBHNDAwX1hNSVNDQ1RSTF9WRE9fTUFTSwkJMHhFMAorI2RlZmluZSBNMTA2NF9Y R0VOSU9DVFJMCTB4MkEKKyNkZWZpbmUgTTEwNjRfWEdFTklPREFUQQkweDJCCisjZGVmaW5lIERB QzEwNjRfWFNZU1BMTE0JMHgyQworI2RlZmluZSBEQUMxMDY0X1hTWVNQTExOCTB4MkQKKyNkZWZp bmUgREFDMTA2NF9YU1lTUExMUAkweDJFCisjZGVmaW5lIERBQzEwNjRfWFNZU1BMTFNUQVQJMHgy RgorI2RlZmluZSBNMTA2NF9YWk9PTUNUUkwJCTB4MzgKKyNkZWZpbmUgICAgICBNMTA2NF9YWk9P TUNUUkxfMQkJCTB4MDAKKyNkZWZpbmUgICAgICBNMTA2NF9YWk9PTUNUUkxfMgkJCTB4MDEKKyNk ZWZpbmUgICAgICBNMTA2NF9YWk9PTUNUUkxfNAkJCTB4MDMKKyNkZWZpbmUgTTEwNjRfWFNFTlNF VEVTVAkweDNBCisjZGVmaW5lICAgICAgTTEwNjRfWFNFTlNFVEVTVF9CQ09NUAkJMHgwMQorI2Rl ZmluZSAgICAgIE0xMDY0X1hTRU5TRVRFU1RfR0NPTVAJCTB4MDIKKyNkZWZpbmUgICAgICBNMTA2 NF9YU0VOU0VURVNUX1JDT01QCQkweDA0CisjZGVmaW5lICAgICAgTTEwNjRfWFNFTlNFVEVTVF9Q RE9XTgkJMHgwMAorI2RlZmluZSAgICAgIE0xMDY0X1hTRU5TRVRFU1RfUFVQCQkweDgwCisjZGVm aW5lIE0xMDY0X1hDUkNSRU1MCQkweDNDCisjZGVmaW5lIE0xMDY0X1hDUkNSRU1ICQkweDNECisj ZGVmaW5lIE0xMDY0X1hDUkNCSVRTRUwJMHgzRQorI2RlZmluZSBNMTA2NF9YQ09MS0VZTUFTS0wJ MHg0MAorI2RlZmluZSBNMTA2NF9YQ09MS0VZTUFTS0gJMHg0MQorI2RlZmluZSBNMTA2NF9YQ09M S0VZTAkJMHg0MgorI2RlZmluZSBNMTA2NF9YQ09MS0VZSAkJMHg0MworI2RlZmluZSBNMTA2NF9Y UElYUExMQU0JCTB4NDQKKyNkZWZpbmUgTTEwNjRfWFBJWFBMTEFOCQkweDQ1CisjZGVmaW5lIE0x MDY0X1hQSVhQTExBUAkJMHg0NgorI2RlZmluZSBNMTA2NF9YUElYUExMQk0JCTB4NDgKKyNkZWZp bmUgTTEwNjRfWFBJWFBMTEJOCQkweDQ5CisjZGVmaW5lIE0xMDY0X1hQSVhQTExCUAkJMHg0QQor I2RlZmluZSBNMTA2NF9YUElYUExMQ00JCTB4NEMKKyNkZWZpbmUgTTEwNjRfWFBJWFBMTENOCQkw eDRECisjZGVmaW5lIE0xMDY0X1hQSVhQTExDUAkJMHg0RQorI2RlZmluZSBNMTA2NF9YUElYUExM U1RBVAkweDRGCisKKyNkZWZpbmUgTTEwNjRfWFRWT19JRFgJCTB4ODcKKyNkZWZpbmUgTTEwNjRf WFRWT19EQVRBCQkweDg4CisKKyNkZWZpbmUgTTEwNjRfWE9VVFBVVENPTk4JMHg4QQorI2RlZmlu ZSBNMTA2NF9YU1lOQ0NUUkwJCTB4OEIKKyNkZWZpbmUgTTEwNjRfWFZJRFBMTFNUQVQJMHg4Qwor I2RlZmluZSBNMTA2NF9YVklEUExMUAkJMHg4RAorI2RlZmluZSBNMTA2NF9YVklEUExMTQkJMHg4 RQorI2RlZmluZSBNMTA2NF9YVklEUExMTgkJMHg4RgorCisjZGVmaW5lIE0xMDY0X1hQV1JDVFJM CQkweEEwCisjZGVmaW5lICAgICBNMTA2NF9YUFdSQ1RSTF9QQU5FTFBETgkweDA0CisKKyNkZWZp bmUgTTEwNjRfWFBBTk1PREUJCTB4QTIKKworZW51bSBQT1MxMDY0IHsKKwlQT1MxMDY0X1hDVVJB RERMPTAsIFBPUzEwNjRfWENVUkFEREgsIFBPUzEwNjRfWENVUkNUUkwsCisJUE9TMTA2NF9YQ1VS Q09MMFJFRCwgUE9TMTA2NF9YQ1VSQ09MMEdSRUVOLCBQT1MxMDY0X1hDVVJDT0wwQkxVRSwKKwlQ T1MxMDY0X1hDVVJDT0wxUkVELCBQT1MxMDY0X1hDVVJDT0wxR1JFRU4sIFBPUzEwNjRfWENVUkNP TDFCTFVFLAorCVBPUzEwNjRfWENVUkNPTDJSRUQsIFBPUzEwNjRfWENVUkNPTDJHUkVFTiwgUE9T MTA2NF9YQ1VSQ09MMkJMVUUsCisJUE9TMTA2NF9YVlJFRkNUUkwsIFBPUzEwNjRfWE1VTENUUkws IFBPUzEwNjRfWFBJWENMS0NUUkwsIFBPUzEwNjRfWEdFTkNUUkwsCisJUE9TMTA2NF9YTUlTQ0NU UkwsCisJUE9TMTA2NF9YR0VOSU9DVFJMLCBQT1MxMDY0X1hHRU5JT0RBVEEsIFBPUzEwNjRfWFpP T01DVFJMLCBQT1MxMDY0X1hTRU5TRVRFU1QsCisJUE9TMTA2NF9YQ1JDQklUU0VMLAorCVBPUzEw NjRfWENPTEtFWU1BU0tMLCBQT1MxMDY0X1hDT0xLRVlNQVNLSCwgUE9TMTA2NF9YQ09MS0VZTCwg UE9TMTA2NF9YQ09MS0VZSCwKKwlQT1MxMDY0X1hPVVRQVVRDT05OLCBQT1MxMDY0X1hQQU5NT0RF LCBQT1MxMDY0X1hQV1JDVFJMIH07CisKKworI2VuZGlmCS8qIF9fTUFUUk9YRkJfREFDMTA2NF9I X18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfVGkzMDI2 LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX1RpMzAyNi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uOWZmOWJlODU3NTllCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9UaTMwMjYuYwpAQCAtMCwwICsx LDc0OCBAQAorLyoKKyAqCisgKiBIYXJkd2FyZSBhY2NlbGVyYXRlZCBNYXRyb3ggTWlsbGVubml1 bSBJLCBJSSwgTXlzdGlxdWUsIEcxMDAsIEcyMDAgYW5kIEc0MDAKKyAqCisgKiAoYykgMTk5OC0y MDAyIFBldHIgVmFuZHJvdmVjIDx2YW5kcm92ZUB2Yy5jdnV0LmN6PgorICoKKyAqIFBvcnRpb25z IENvcHlyaWdodCAoYykgMjAwMSBNYXRyb3ggR3JhcGhpY3MgSW5jLgorICoKKyAqIFZlcnNpb246 IDEuNjUgMjAwMi8wOC8xNAorICoKKyAqIE1UUlIgc3R1ZmY6IDE5OTggVG9tIFJpbmkgPHRyaW5p QGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogQ29udHJpYnV0b3JzOiAibWVuaW9uPyIgPG1l bmlvbkBtaW5kbGVzcy5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIEJldGF0ZXN0aW5nLCBm aXhlcywgaWRlYXMKKyAqCisgKiAgICAgICAgICAgICAgICJLdXJ0IEdhcmxvZmYiIDxnYXJsb2Zm QHN1c2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgIEJldGF0ZXN0aW5nLCBmaXhlcywgaWRl YXMsIHZpZGVvbW9kZXMsIHZpZGVvbW9kZXMgdGltbWluZ3MKKyAqCisgKiAgICAgICAgICAgICAg ICJUb20gUmluaSIgPHRyaW5pQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKiAgICAgICAgICAgICAg ICAgICAgIE1UUlIgc3R1ZmYsIFBQQyBjbGVhbnVwcywgYmV0YXRlc3RpbmcsIGZpeGVzLCBpZGVh cworICoKKyAqICAgICAgICAgICAgICAgIkJpYmVrIFNhaHUiIDxzY29ycGlvQGRvZGRzLm5ldD4K KyAqICAgICAgICAgICAgICAgICAgICAgQWNjZXNzIGRldmljZSB0aHJvdWdoIHJlYWRifHd8bCBh bmQgd3JpdGUgYnx3fGwKKyAqICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaXZlIGRlYnVnZ2lu ZyBzdHVmZgorICoKKyAqICAgICAgICAgICAgICAgIkRhbmllbCBIYXVuIiA8aGF1bmRAdXNhLm5l dD4KKyAqICAgICAgICAgICAgICAgICAgICAgVGVzdGluZywgaGFyZHdhcmUgY3Vyc29yIGZpeGVz CisgKgorICogICAgICAgICAgICAgICAiU2NvdHQgV29vZCIgPHNhd3N0NDYrQHBpdHQuZWR1Pgor ICogICAgICAgICAgICAgICAgICAgICBGaXhlcworICoKKyAqICAgICAgICAgICAgICAgIkdlcmQg S25vcnIiIDxrcmF4ZWxAZ29sZGJhY2guaXNkbi5jcy50dS1iZXJsaW4uZGU+CisgKiAgICAgICAg ICAgICAgICAgICAgIEJldGF0ZXN0aW5nCisgKgorICogICAgICAgICAgICAgICAiS2VsbHkgRnJl bmNoIiA8dGFyZ29uQGhhem1hdC5jb20+CisgKiAgICAgICAgICAgICAgICJGZXJuYW5kbyBIZXJy ZXJhIiA8ZmhlcnJlcmFAZXVyaWVsZWMuZXRzaXQudXBtLmVzPgorICogICAgICAgICAgICAgICAg ICAgICBCZXRhdGVzdGluZywgYnVnIHJlcG9ydGluZworICoKKyAqICAgICAgICAgICAgICAgIlBh YmxvIEJpYW51Y2NpIiA8cGJpYW5AcGNjcC5jb20uYXI+CisgKiAgICAgICAgICAgICAgICAgICAg IEZpeGVzLCBpZGVhcywgYmV0YXRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICJJbmFreSBQ ZXJleiBHb256YWxleiIgPGluYWt5QHBlbG9uY2hvLmZpcy51Y20uZXM+CisgKiAgICAgICAgICAg ICAgICAgICAgIEZpeGVzLCBlbmhhbmRjZW1lbnRzLCBpZGVhcywgYmV0YXRlc3RpbmcKKyAqCisg KiAgICAgICAgICAgICAgICJSeXVpY2hpIE9pa2F3YSIgPHJvaWthd2FAcnIuaWlpajR1Lm9yLmpw PgorICogICAgICAgICAgICAgICAgICAgICBQUEMgYmV0YXRlc3RpbmcsIFBQQyBzdXBwb3J0LCBi YWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKgorICogICAgICAgICAgICAgICAiUGF1bCBXb21hciIg PFBhdWxAcHdvbWFyLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAiT3dlbiBXYWxsZXIi IDxPLldhbGxlckBlZS5xdWIuYWMudWs+CisgKiAgICAgICAgICAgICAgICAgICAgIFBQQyBiZXRh dGVzdGluZworICoKKyAqICAgICAgICAgICAgICAgIlRob21hcyBQb3JuaW4iIDxwb3JuaW5AYm9s ZXQuZW5zLmZyPgorICogICAgICAgICAgICAgICAgICAgICBBbHBoYSBiZXRhdGVzdGluZworICoK KyAqICAgICAgICAgICAgICAgIlBpZXRlciB2YW4gTGV1dmVuIiA8cHZsQGlhZS5ubD4KKyAqICAg ICAgICAgICAgICAgIlVsZiBKYWVuaWNrZS1Sb2Vzc2xlciIgPHVqckBwaHlzaWsucGh5LnR1LWRy ZXNkZW4uZGU+CisgKiAgICAgICAgICAgICAgICAgICAgIEcxMDAgdGVzdGluZworICoKKyAqICAg ICAgICAgICAgICAgIkguIFBldGVyIEFydmluIiA8aHBhQHRyYW5zbWV0YS5jb20+CisgKiAgICAg ICAgICAgICAgICAgICAgIElkZWFzCisgKgorICogICAgICAgICAgICAgICAiQ29ydCBEb3VnYW4i IDxjb3J0QGNzLm5tdC5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgIENIUlAgZml4ZXMgYW5k IFBSZVAgY2xlYW51cAorICoKKyAqICAgICAgICAgICAgICAgIk1hcmsgVm9qa292aWNoIiA8bXZv amtvdmlAdWNzZC5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgIEc0MDAgc3VwcG9ydAorICoK KyAqIChmb2xsb3dpbmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNv ZGUsIGJ1dCBoaXMgY29kZQorICogIGlzIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyKQorICoKKyAq IEJhc2VkIG9uIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgVkJFIDIuMCBjb21wbGlhbnQgZ3JhcGhp YyBib2FyZHMKKyAqICAgICAoYykgMTk5OCBHZXJkIEtub3JyIDxrcmF4ZWxAY3MudHUtYmVybGlu LmRlPgorICoKKyAqIChmb2xsb3dpbmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0 aCB0aGlzIGNvZGUsIGJ1dCBoaXMgaWRlYXMKKyAqICB3ZXJlIHVzZWQgd2hlbiB3cml0aW5nIHRo aXMgZHJpdmVyKQorICoKKyAqCQkgRnJlZVZCRS9BRiAoTWF0cm94KSwgIlNoYXduIEhhcmdyZWF2 ZXMiIDxzaGF3bkB0YWx1bGEuZGVtb24uY28udWs+CisgKgorICovCisKKworI2luY2x1ZGUgIm1h dHJveGZiX1RpMzAyNi5oIgorI2luY2x1ZGUgIm1hdHJveGZiX21pc2MuaCIKKyNpbmNsdWRlICJt YXRyb3hmYl9hY2NlbC5oIgorI2luY2x1ZGUgPGxpbnV4L21hdHJveGZiLmg+CisKKyNpZmRlZiBD T05GSUdfRkJfTUFUUk9YX01JTExFTklVTQorI2RlZmluZSBvdXRUaTMwMjYgbWF0cm94ZmJfREFD X291dAorI2RlZmluZSBpblRpMzAyNiBtYXRyb3hmYl9EQUNfaW4KKworI2RlZmluZSBUVlAzMDI2 X0lOREVYCQkweDAwCisjZGVmaW5lIFRWUDMwMjZfUEFMV1JBREQJMHgwMAorI2RlZmluZSBUVlAz MDI2X1BBTERBVEEJCTB4MDEKKyNkZWZpbmUgVFZQMzAyNl9QSVhSRE1TSwkweDAyCisjZGVmaW5l IFRWUDMwMjZfUEFMUkRBREQJMHgwMworI2RlZmluZSBUVlAzMDI2X0NVUkNPTFdSQURECTB4MDQK KyNkZWZpbmUgICAgIFRWUDMwMjZfQ0xPVkVSU0NBTgkJMHgwMAorI2RlZmluZSAgICAgVFZQMzAy Nl9DTENPTE9SMAkJMHgwMQorI2RlZmluZSAgICAgVFZQMzAyNl9DTENPTE9SMQkJMHgwMgorI2Rl ZmluZSAgICAgVFZQMzAyNl9DTENPTE9SMgkJMHgwMworI2RlZmluZSBUVlAzMDI2X0NVUkNPTERB VEEJMHgwNQorI2RlZmluZSBUVlAzMDI2X0NVUkNPTFJEQURECTB4MDcKKyNkZWZpbmUgVFZQMzAy Nl9DVVJDVFJMCQkweDA5CisjZGVmaW5lIFRWUDMwMjZfWF9EQVRBUkVHCTB4MEEKKyNkZWZpbmUg VFZQMzAyNl9DVVJSQU1EQVRBCTB4MEIKKyNkZWZpbmUgVFZQMzAyNl9DVVJQT1NYTAkweDBDCisj ZGVmaW5lIFRWUDMwMjZfQ1VSUE9TWEgJMHgwRAorI2RlZmluZSBUVlAzMDI2X0NVUlBPU1lMCTB4 MEUKKyNkZWZpbmUgVFZQMzAyNl9DVVJQT1NZSAkweDBGCisKKyNkZWZpbmUgVFZQMzAyNl9YU0lM SUNPTlJFVgkweDAxCisjZGVmaW5lIFRWUDMwMjZfWENVUkNUUkwJMHgwNgorI2RlZmluZSAgICAg VFZQMzAyNl9YQ1VSQ1RSTF9ESVMJMHgwMAkvKiB0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQsIHRy YW5zcGFyZW50LCB0cmFuc3BhcmVudCAqLworI2RlZmluZSAgICAgVFZQMzAyNl9YQ1VSQ1RSTF8z Q09MT1IJMHgwMQkvKiB0cmFuc3BhcmVudCwgMCwgMSwgMiAqLworI2RlZmluZSAgICAgVFZQMzAy Nl9YQ1VSQ1RSTF9YR0EJMHgwMgkvKiAwLCAxLCB0cmFuc3BhcmVudCwgY29tcGxlbWVudCAqLwor I2RlZmluZSAgICAgVFZQMzAyNl9YQ1VSQ1RSTF9YV0lOCTB4MDMJLyogdHJhbnNwYXJlbnQsIHRy YW5zcGFyZW50LCAwLCAxICovCisjZGVmaW5lICAgICBUVlAzMDI2X1hDVVJDVFJMX0JMQU5LMjA0 OAkweDAwCisjZGVmaW5lICAgICBUVlAzMDI2X1hDVVJDVFJMX0JMQU5LNDA5NgkweDEwCisjZGVm aW5lICAgICBUVlAzMDI2X1hDVVJDVFJMX0lOVEVSTEFDRUQJMHgyMAorI2RlZmluZSAgICAgVFZQ MzAyNl9YQ1VSQ1RSTF9PREQJMHgwMCAvKiBleHQuc2lnbmFsIE9ERC9cRVZFTiAqLworI2RlZmlu ZSAgICAgVFZQMzAyNl9YQ1VSQ1RSTF9FVkVOCTB4NDAgLyogZXh0LnNpZ25hbCBFVkVOL1xPREQg Ki8KKyNkZWZpbmUgICAgIFRWUDMwMjZfWENVUkNUUkxfSU5ESVJFQ1QJMHgwMAorI2RlZmluZSAg ICAgVFZQMzAyNl9YQ1VSQ1RSTF9ESVJFQ1QJMHg4MAorI2RlZmluZSBUVlAzMDI2X1hMQVRDSENU UkwJMHgwRgorI2RlZmluZSAgICAgVFZQMzAyNl9YTEFUQ0hDVFJMXzFfMQkweDA2CisjZGVmaW5l ICAgICBUVlAzMDI2X1hMQVRDSENUUkxfMl8xCTB4MDcKKyNkZWZpbmUgICAgIFRWUDMwMjZfWExB VENIQ1RSTF80XzEJMHgwNgorI2RlZmluZSAgICAgVFZQMzAyNl9YTEFUQ0hDVFJMXzhfMQkweDA2 CisjZGVmaW5lICAgICBUVlAzMDI2X1hMQVRDSENUUkxfMTZfMQkweDA2CisjZGVmaW5lICAgICBU VlAzMDI2QV9YTEFUQ0hDVFJMXzRfMwkweDA2CS8qID8/PyBkbyBub3QgdW5kZXJzdGFuZC4uLiBi dXQgaXQgd29ya3MuLi4gISEhICovCisjZGVmaW5lICAgICBUVlAzMDI2QV9YTEFUQ0hDVFJMXzhf MwkweDA3CisjZGVmaW5lICAgICBUVlAzMDI2Ql9YTEFUQ0hDVFJMXzRfMwkweDA4CisjZGVmaW5l ICAgICBUVlAzMDI2Ql9YTEFUQ0hDVFJMXzhfMwkweDA2CS8qID8/PyBkbyBub3QgdW5kZXJzdGFu ZC4uLiBidXQgaXQgd29ya3MuLi4gISEhICovCisjZGVmaW5lIFRWUDMwMjZfWFRSVUVDT0xPUkNU UkwJMHgxOAorI2RlZmluZSAgICAgVFZQMzAyNl9YVFJVRUNPTE9SQ1RSTF9WUkFNX1NISUZUX0FD Q0VMCTB4MDAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWFRSVUVDT0xPUkNUUkxfVlJBTV9TSElGVF9U VlAJMHgyMAorI2RlZmluZSAgICAgVFZQMzAyNl9YVFJVRUNPTE9SQ1RSTF9QU0VVRE9DT0xPUgkJ MHg4MAorI2RlZmluZSAgICAgVFZQMzAyNl9YVFJVRUNPTE9SQ1RSTF9UUlVFQ09MT1IJCTB4NDAg LyogcGFsZXRpemVkICovCisjZGVmaW5lICAgICBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX0RJUkVD VENPTE9SCQkweDAwCisjZGVmaW5lICAgICBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMXzI0X0FMVEVS TkFURQkJMHgwOCAvKiA1OjQvNToyIGluc3RlYWQgb2YgNDozLzg6MyAqLworI2RlZmluZSAgICAg VFZQMzAyNl9YVFJVRUNPTE9SQ1RSTF9SR0JfODg4CQkweDE2IC8qIDQ6My84OjMgKG9yIDU6NC81 OjIpICovCisjZGVmaW5lCSAgICBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX0JHUl84ODgJCTB4MTcK KyNkZWZpbmUgICAgIFRWUDMwMjZfWFRSVUVDT0xPUkNUUkxfT1JHQl84ODg4CQkweDA2CisjZGVm aW5lICAgICBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX0JHUk9fODg4OAkJMHgwNworI2RlZmluZSAg ICAgVFZQMzAyNl9YVFJVRUNPTE9SQ1RSTF9SR0JfNTY1CQkweDA1CisjZGVmaW5lICAgICBUVlAz MDI2X1hUUlVFQ09MT1JDVFJMX09SR0JfMTU1NQkJMHgwNAorI2RlZmluZSAgICAgVFZQMzAyNl9Y VFJVRUNPTE9SQ1RSTF9SR0JfNjY0CQkweDAzCisjZGVmaW5lICAgICBUVlAzMDI2X1hUUlVFQ09M T1JDVFJMX1JHQk9fNDQ0NAkJMHgwMQorI2RlZmluZSBUVlAzMDI2X1hNVVhDVFJMCTB4MTkKKyNk ZWZpbmUgICAgIFRWUDMwMjZfWE1VWENUUkxfTUVNT1JZXzhCSVQJCQkweDAxIC8qIC0gKi8KKyNk ZWZpbmUgICAgIFRWUDMwMjZfWE1VWENUUkxfTUVNT1JZXzE2QklUCQkJMHgwMiAvKiAtICovCisj ZGVmaW5lICAgICBUVlAzMDI2X1hNVVhDVFJMX01FTU9SWV8zMkJJVAkJCTB4MDMgLyogMk1CIFJB TSwgNTEySyAqIDQgKi8KKyNkZWZpbmUgICAgIFRWUDMwMjZfWE1VWENUUkxfTUVNT1JZXzY0QklU CQkJMHgwNCAvKiA+Mk1CIFJBTSwgNTEySyAqIDggJiBtb3JlICovCisjZGVmaW5lICAgICBUVlAz MDI2X1hNVVhDVFJMX1BJWEVMXzRCSVQJCQkJMHg0MCAvKiBMMCxIMCxMMSxIMS4uLiAqLworI2Rl ZmluZSAgICAgVFZQMzAyNl9YTVVYQ1RSTF9QSVhFTF80QklUX1NXQVBQRUQJCQkweDYwIC8qIEgw LEwwLEgxLEwxLi4uICovCisjZGVmaW5lICAgICBUVlAzMDI2X1hNVVhDVFJMX1BJWEVMXzhCSVQJ CQkJMHg0OAorI2RlZmluZSAgICAgVFZQMzAyNl9YTVVYQ1RSTF9QSVhFTF8xNkJJVAkJCTB4NTAK KyNkZWZpbmUgICAgIFRWUDMwMjZfWE1VWENUUkxfUElYRUxfMzJCSVQJCQkweDU4CisjZGVmaW5l ICAgICBUVlAzMDI2X1hNVVhDVFJMX1ZHQQkJCQkweDk4IC8qIFZHQSBNRU1PUlksIDhCSVQgUElY RUwgKi8KKyNkZWZpbmUgVFZQMzAyNl9YQ0xLQ1RSTAkweDFBCisjZGVmaW5lICAgICBUVlAzMDI2 X1hDTEtDVFJMX0RJVjEJMHgwMAorI2RlZmluZSAgICAgVFZQMzAyNl9YQ0xLQ1RSTF9ESVYyCTB4 MTAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWENMS0NUUkxfRElWNAkweDIwCisjZGVmaW5lICAgICBU VlAzMDI2X1hDTEtDVFJMX0RJVjgJMHgzMAorI2RlZmluZSAgICAgVFZQMzAyNl9YQ0xLQ1RSTF9E SVYxNgkweDQwCisjZGVmaW5lICAgICBUVlAzMDI2X1hDTEtDVFJMX0RJVjMyCTB4NTAKKyNkZWZp bmUgICAgIFRWUDMwMjZfWENMS0NUUkxfRElWNjQJMHg2MAorI2RlZmluZSAgICAgVFZQMzAyNl9Y Q0xLQ1RSTF9DTEtTVE9QUEVECTB4NzAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWENMS0NUUkxfU1JD X0NMSzAJMHgwMAorI2RlZmluZSAgICAgVFZQMzAyNl9YQ0xLQ1RSTF9TUkNfQ0xLMSAgIDB4MDEK KyNkZWZpbmUgICAgIFRWUDMwMjZfWENMS0NUUkxfU1JDX0NMSzIJMHgwMgkvKiBDTEsyIGlzIFRU TCBzb3VyY2UqLworI2RlZmluZSAgICAgVFZQMzAyNl9YQ0xLQ1RSTF9TUkNfTkNMSzIJMHgwMwkv KiBub3QgQ0xLMiBpcyBUVEwgc291cmNlICovCisjZGVmaW5lICAgICBUVlAzMDI2X1hDTEtDVFJM X1NSQ19FQ0xLMgkweDA0CS8qIENMSzIgYW5kIG5vdCBDTEsyIGlzIEVDTCBzb3VyY2UgKi8KKyNk ZWZpbmUgICAgIFRWUDMwMjZfWENMS0NUUkxfU1JDX1BMTAkweDA1CisjZGVmaW5lICAgICBUVlAz MDI2X1hDTEtDVFJMX1NSQ19ESVMJMHgwNgkvKiBkaXNhYmxlICYgcG93ZXJvZmYgaW50ZXJuYWwg Y2xvY2sgKi8KKyNkZWZpbmUgICAgIFRWUDMwMjZfWENMS0NUUkxfU1JDX0NMSzBWR0EgMHgwNwor I2RlZmluZSBUVlAzMDI2X1hQQUxFVFRFUEFHRQkweDFDCisjZGVmaW5lIFRWUDMwMjZfWEdFTkNU UkwJMHgxRAorI2RlZmluZSAgICAgVFZQMzAyNl9YR0VOQ1RSTF9IU1lOQ19QT1MJMHgwMAorI2Rl ZmluZSAgICAgVFZQMzAyNl9YR0VOQ1RSTF9IU1lOQ19ORUcJMHgwMQorI2RlZmluZSAgICAgVFZQ MzAyNl9YR0VOQ1RSTF9WU1lOQ19QT1MJMHgwMAorI2RlZmluZSAgICAgVFZQMzAyNl9YR0VOQ1RS TF9WU1lOQ19ORUcJMHgwMgorI2RlZmluZSAgICAgVFZQMzAyNl9YR0VOQ1RSTF9MSVRUTEVfRU5E SUFOIDB4MDAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWEdFTkNUUkxfQklHX0VORElBTiAgICAweDA4 CisjZGVmaW5lICAgICBUVlAzMDI2X1hHRU5DVFJMX0JMQUNLXzBJUkUJCTB4MDAKKyNkZWZpbmUg ICAgIFRWUDMwMjZfWEdFTkNUUkxfQkxBQ0tfNzVJUkUJMHgxMAorI2RlZmluZSAgICAgVFZQMzAy Nl9YR0VOQ1RSTF9OT19TWU5DX09OX0dSRUVOCTB4MDAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWEdF TkNUUkxfU1lOQ19PTl9HUkVFTgkweDIwCisjZGVmaW5lICAgICBUVlAzMDI2X1hHRU5DVFJMX09W RVJTQ0FOX0RJUwkweDAwCisjZGVmaW5lICAgICBUVlAzMDI2X1hHRU5DVFJMX09WRVJTQ0FOX0VO CTB4NDAKKyNkZWZpbmUgVFZQMzAyNl9YTUlTQ0NUUkwJMHgxRQorI2RlZmluZSAgICAgVFZQMzAy Nl9YTUlTQ0NUUkxfREFDX1BVUAkweDAwCisjZGVmaW5lICAgICBUVlAzMDI2X1hNSVNDQ1RSTF9E QUNfUERPV04JMHgwMQorI2RlZmluZSAgICAgVFZQMzAyNl9YTUlTQ0NUUkxfREFDX0VYVAkweDAw IC8qIG9yIDgsIGJpdCAzIGlzIGlnbm9yZWQgKi8KKyNkZWZpbmUgICAgIFRWUDMwMjZfWE1JU0ND VFJMX0RBQ182QklUCTB4MDQKKyNkZWZpbmUgICAgIFRWUDMwMjZfWE1JU0NDVFJMX0RBQ184QklU CTB4MEMKKyNkZWZpbmUgICAgIFRWUDMwMjZfWE1JU0NDVFJMX1BTRUxfRElTCTB4MDAKKyNkZWZp bmUgICAgIFRWUDMwMjZfWE1JU0NDVFJMX1BTRUxfRU4JMHgxMAorI2RlZmluZSAgICAgVFZQMzAy Nl9YTUlTQ0NUUkxfUFNFTF9MT1cJMHgwMCAvKiBQU0VMIGhpZ2ggc2VsZWN0cyBkaXJlY3Rjb2xv ciAqLworI2RlZmluZSAgICAgVFZQMzAyNl9YTUlTQ0NUUkxfUFNFTF9ISUdIIDB4MjAgLyogUFNF TCBoaWdoIHNlbGVjdHMgdHJ1ZWNvbG9yIG9yIHBzZXVkb2NvbG9yICovCisjZGVmaW5lIFRWUDMw MjZfWEdFTklPQ1RSTAkweDJBCisjZGVmaW5lIFRWUDMwMjZfWEdFTklPREFUQQkweDJCCisjZGVm aW5lIFRWUDMwMjZfWFBMTEFERFIJMHgyQworI2RlZmluZSAgICAgVFZQMzAyNl9YUExMQUREUl9Y KExPT1AsTUNMSyxQSVgpICgoKExPT1ApPDw0KSB8ICgoTUNMSyk8PDIpIHwgKFBJWCkpCisjZGVm aW5lICAgICBUVlAzMDI2X1hQTExEQVRBX04JCTB4MDAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWFBM TERBVEFfTQkJMHgwMQorI2RlZmluZSAgICAgVFZQMzAyNl9YUExMREFUQV9QCQkweDAyCisjZGVm aW5lICAgICBUVlAzMDI2X1hQTExEQVRBX1NUQVQJMHgwMworI2RlZmluZSBUVlAzMDI2X1hQSVhQ TExEQVRBCTB4MkQKKyNkZWZpbmUgVFZQMzAyNl9YTUVNUExMREFUQQkweDJFCisjZGVmaW5lIFRW UDMwMjZfWExPT1BQTExEQVRBCTB4MkYKKyNkZWZpbmUgVFZQMzAyNl9YQ09MS0VZT1ZSTUlOCTB4 MzAKKyNkZWZpbmUgVFZQMzAyNl9YQ09MS0VZT1ZSTUFYCTB4MzEKKyNkZWZpbmUgVFZQMzAyNl9Y Q09MS0VZUkVETUlOCTB4MzIKKyNkZWZpbmUgVFZQMzAyNl9YQ09MS0VZUkVETUFYCTB4MzMKKyNk ZWZpbmUgVFZQMzAyNl9YQ09MS0VZR1JFRU5NSU4JMHgzNAorI2RlZmluZSBUVlAzMDI2X1hDT0xL RVlHUkVFTk1BWAkweDM1CisjZGVmaW5lIFRWUDMwMjZfWENPTEtFWUJMVUVNSU4JMHgzNgorI2Rl ZmluZSBUVlAzMDI2X1hDT0xLRVlCTFVFTUFYCTB4MzcKKyNkZWZpbmUgVFZQMzAyNl9YQ09MS0VZ Q1RSTAkweDM4CisjZGVmaW5lICAgICBUVlAzMDI2X1hDT0xLRVlDVFJMX09WUl9FTgkweDAxCisj ZGVmaW5lICAgICBUVlAzMDI2X1hDT0xLRVlDVFJMX1JFRF9FTgkweDAyCisjZGVmaW5lICAgICBU VlAzMDI2X1hDT0xLRVlDVFJMX0dSRUVOX0VOIDB4MDQKKyNkZWZpbmUgICAgIFRWUDMwMjZfWENP TEtFWUNUUkxfQkxVRV9FTgkweDA4CisjZGVmaW5lICAgICBUVlAzMDI2X1hDT0xLRVlDVFJMX05F R0FURQkweDEwCisjZGVmaW5lICAgICBUVlAzMDI2X1hDT0xLRVlDVFJMX1pPT00xCTB4MDAKKyNk ZWZpbmUgICAgIFRWUDMwMjZfWENPTEtFWUNUUkxfWk9PTTIJMHgyMAorI2RlZmluZSAgICAgVFZQ MzAyNl9YQ09MS0VZQ1RSTF9aT09NNAkweDQwCisjZGVmaW5lICAgICBUVlAzMDI2X1hDT0xLRVlD VFJMX1pPT004CTB4NjAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWENPTEtFWUNUUkxfWk9PTTE2CTB4 ODAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWENPTEtFWUNUUkxfWk9PTTMyCTB4QTAKKyNkZWZpbmUg VFZQMzAyNl9YTUVNUExMQ1RSTAkweDM5CisjZGVmaW5lICAgICBUVlAzMDI2X1hNRU1QTExDVFJM X0RJVihYKQkoKChYKS0xKT4+MSkJLyogMiw0LDYsOCwxMCwxMiwxNCwxNiwgZGl2aXNpb24gYXBw bGllZCB0byBMT09QIFBMTCBhZnRlciBkaXZpZGUgYnkgMl5QICovCisjZGVmaW5lICAgICBUVlAz MDI2X1hNRU1QTExDVFJMX1NUUk9CRU1LQzQJMHgwOAorI2RlZmluZSAgICAgVFZQMzAyNl9YTUVN UExMQ1RSTF9NQ0xLX0RPVENMT0NLCTB4MDAJLyogTUtDNCAqLworI2RlZmluZSAgICAgVFZQMzAy Nl9YTUVNUExMQ1RSTF9NQ0xLX01DTEtQTEwJMHgxMAkvKiBNS0M0ICovCisjZGVmaW5lICAgICBU VlAzMDI2X1hNRU1QTExDVFJMX1JDTEtfUElYUExMCTB4MDAKKyNkZWZpbmUgICAgIFRWUDMwMjZf WE1FTVBMTENUUkxfUkNMS19MT09QUExMCTB4MjAKKyNkZWZpbmUgICAgIFRWUDMwMjZfWE1FTVBM TENUUkxfUkNMS19ET1RESVZOCTB4NDAJLyogZG90IGNsb2NrIGRpdmlkZWQgYnkgbG9vcCBwY2xr IE4gcHJlc2NhbGVyICovCisjZGVmaW5lIFRWUDMwMjZfWFNFTlNFVEVTVAkweDNBCisjZGVmaW5l IFRWUDMwMjZfWFRFU1RNT0RFREFUQQkweDNCCisjZGVmaW5lIFRWUDMwMjZfWENSQ1JFTUwJMHgz QworI2RlZmluZSBUVlAzMDI2X1hDUkNSRU1ICTB4M0QKKyNkZWZpbmUgVFZQMzAyNl9YQ1JDQklU U0VMCTB4M0UKKyNkZWZpbmUgVFZQMzAyNl9YSUQJCTB4M0YKKworc3RhdGljIGNvbnN0IHVuc2ln bmVkIGNoYXIgREFDc2VxW10gPQoreyBUVlAzMDI2X1hMQVRDSENUUkwsIFRWUDMwMjZfWFRSVUVD T0xPUkNUUkwsCisgIFRWUDMwMjZfWE1VWENUUkwsIFRWUDMwMjZfWENMS0NUUkwsCisgIFRWUDMw MjZfWFBBTEVUVEVQQUdFLAorICBUVlAzMDI2X1hHRU5DVFJMLAorICBUVlAzMDI2X1hNSVNDQ1RS TCwKKyAgVFZQMzAyNl9YR0VOSU9DVFJMLAorICBUVlAzMDI2X1hHRU5JT0RBVEEsCisgIFRWUDMw MjZfWENPTEtFWU9WUk1JTiwgVFZQMzAyNl9YQ09MS0VZT1ZSTUFYLCBUVlAzMDI2X1hDT0xLRVlS RURNSU4sIFRWUDMwMjZfWENPTEtFWVJFRE1BWCwKKyAgVFZQMzAyNl9YQ09MS0VZR1JFRU5NSU4s IFRWUDMwMjZfWENPTEtFWUdSRUVOTUFYLCBUVlAzMDI2X1hDT0xLRVlCTFVFTUlOLCBUVlAzMDI2 X1hDT0xLRVlCTFVFTUFYLAorICBUVlAzMDI2X1hDT0xLRVlDVFJMLAorICBUVlAzMDI2X1hNRU1Q TExDVFJMLCBUVlAzMDI2X1hTRU5TRVRFU1QsIFRWUDMwMjZfWENVUkNUUkwgfTsKKworI2RlZmlu ZSBQT1MzMDI2X1hMQVRDSENUUkwJMAorI2RlZmluZSBQT1MzMDI2X1hUUlVFQ09MT1JDVFJMCTEK KyNkZWZpbmUgUE9TMzAyNl9YTVVYQ1RSTAkyCisjZGVmaW5lIFBPUzMwMjZfWENMS0NUUkwJMwor I2RlZmluZSBQT1MzMDI2X1hHRU5DVFJMCTUKKyNkZWZpbmUgUE9TMzAyNl9YTUlTQ0NUUkwJNgor I2RlZmluZSBQT1MzMDI2X1hNRU1QTExDVFJMCTE4CisjZGVmaW5lIFBPUzMwMjZfWENVUkNUUkwJ MjAKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTUdBREFDYnBwMzJbXSA9Cit7IFRWUDMw MjZfWExBVENIQ1RSTF8yXzEsIFRWUDMwMjZfWFRSVUVDT0xPUkNUUkxfRElSRUNUQ09MT1IgfCBU VlAzMDI2X1hUUlVFQ09MT1JDVFJMX09SR0JfODg4OCwKKyAgMHgwMCwgVFZQMzAyNl9YQ0xLQ1RS TF9ESVYxIHwgVFZQMzAyNl9YQ0xLQ1RSTF9TUkNfUExMLAorICAweDAwLAorICBUVlAzMDI2X1hH RU5DVFJMX0hTWU5DX1BPUyB8IFRWUDMwMjZfWEdFTkNUUkxfVlNZTkNfUE9TIHwgVFZQMzAyNl9Y R0VOQ1RSTF9MSVRUTEVfRU5ESUFOIHwgVFZQMzAyNl9YR0VOQ1RSTF9CTEFDS18wSVJFIHwgVFZQ MzAyNl9YR0VOQ1RSTF9OT19TWU5DX09OX0dSRUVOIHwgVFZQMzAyNl9YR0VOQ1RSTF9PVkVSU0NB Tl9ESVMsCisgIFRWUDMwMjZfWE1JU0NDVFJMX0RBQ19QVVAgfCBUVlAzMDI2X1hNSVNDQ1RSTF9E QUNfOEJJVCB8IFRWUDMwMjZfWE1JU0NDVFJMX1BTRUxfRElTIHwgVFZQMzAyNl9YTUlTQ0NUUkxf UFNFTF9ISUdILAorICAweDAwLAorICAweDFFLAorICAweEZGLCAweEZGLCAweEZGLCAweEZGLAor ICAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICBUVlAzMDI2X1hDT0xLRVlDVFJMX1pPT00xLAor ICAweDAwLCAweDAwLCBUVlAzMDI2X1hDVVJDVFJMX0RJUyB9OworCitzdGF0aWMgaW50IFRpMzAy Nl9jYWxjY2xvY2soY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywKKwkJCSAgICB1 bnNpZ25lZCBpbnQgZnJlcSwgdW5zaWduZWQgaW50IGZtYXgsIGludCAqaW4sCisJCQkgICAgaW50 ICpmZWVkLCBpbnQgKnBvc3QpCit7CisJdW5zaWduZWQgaW50IGZ2Y287CisJdW5zaWduZWQgaW50 IGxpbiwgbGZlZWQsIGxwb3N0OworCisJREJHKF9fZnVuY19fKQorCisJZnZjbyA9IFBMTF9jYWxj Y2xvY2sobWluZm8sIGZyZXEsIGZtYXgsICZsaW4sICZsZmVlZCwgJmxwb3N0KTsKKwlmdmNvID4+ PSAoKnBvc3QgPSBscG9zdCk7CisJKmluID0gNjQgLSBsaW47CisJKmZlZWQgPSA2NCAtIGxmZWVk OworCXJldHVybiBmdmNvOworfQorCitzdGF0aWMgaW50IFRpMzAyNl9zZXRwY2xrKHN0cnVjdCBt YXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCBjbGspCit7CisJdW5zaWduZWQgaW50IGZfcGxsOwor CXVuc2lnbmVkIGludCBwaXhmZWVkLCBwaXhpbiwgcGl4cG9zdDsKKwlzdHJ1Y3QgbWF0cm94X2h3 X3N0YXRlICpodyA9ICZtaW5mby0+aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwlmX3BsbCA9IFRp MzAyNl9jYWxjY2xvY2sobWluZm8sIGNsaywgbWluZm8tPm1heF9waXhlbF9jbG9jaywgJnBpeGlu LCAmcGl4ZmVlZCwgJnBpeHBvc3QpOworCisJaHctPkRBQ2Nsa1swXSA9IHBpeGluIHwgMHhDMDsK Kwlody0+REFDY2xrWzFdID0gcGl4ZmVlZDsKKwlody0+REFDY2xrWzJdID0gcGl4cG9zdCB8IDB4 QjA7CisKKwl7CisJCXVuc2lnbmVkIGludCBsb29wZmVlZCwgbG9vcGluLCBsb29wcG9zdCwgbG9v cGRpdiwgejsKKwkJdW5zaWduZWQgaW50IEJwcDsKKworCQlCcHAgPSBtaW5mby0+Y3Vyci5maW5h bF9icHBTaGlmdDsKKworCQlpZiAobWluZm8tPmZiY29uLnZhci5iaXRzX3Blcl9waXhlbCA9PSAy NCkgeworCQkJbG9vcGZlZWQgPSAzOwkJLyogc2V0IGxtIHRvIGFueSBwb3NzaWJsZSB2YWx1ZSAq LworCQkJbG9vcGluID0gMyAqIDMyIC8gQnBwOworCQl9IGVsc2UgeworCQkJbG9vcGZlZWQgPSA0 OworCQkJbG9vcGluID0gNCAqIDMyIC8gQnBwOworCQl9CisJCXogPSAoMTEwMDAwICogbG9vcGlu KSAvIChmX3BsbCAqIGxvb3BmZWVkKTsKKwkJbG9vcGRpdiA9IDA7IC8qIGRpdiAyICovCisJCWlm ICh6IDwgMikKKwkJCWxvb3Bwb3N0ID0gMDsKKwkJZWxzZSBpZiAoeiA8IDQpCisJCQlsb29wcG9z dCA9IDE7CisJCWVsc2UgaWYgKHogPCA4KQorCQkJbG9vcHBvc3QgPSAyOworCQllbHNlIHsKKwkJ CWxvb3Bwb3N0ID0gMzsKKwkJCWxvb3BkaXYgPSB6LzE2OworCQl9CisJCWlmIChtaW5mby0+ZmJj b24udmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KSB7CisJCQlody0+REFDY2xrWzNdID0gKCg2NSAt IGxvb3BpbikgJiAweDNGKSB8IDB4QzA7CisJCQlody0+REFDY2xrWzRdID0gKDY1IC0gbG9vcGZl ZWQpIHwgMHg4MDsKKwkJCWlmIChtaW5mby0+YWNjZWwucmFtZGFjX3JldiA+IDB4MjApIHsKKwkJ CQlpZiAoaXNJbnRlcmxlYXZlKG1pbmZvKSkKKwkJCQkJaHctPkRBQ3JlZ1tQT1MzMDI2X1hMQVRD SENUUkxdID0gVFZQMzAyNkJfWExBVENIQ1RSTF84XzM7CisJCQkJZWxzZSB7CisJCQkJCWh3LT5E QUNjbGtbNF0gJj0gfjB4QzA7CisJCQkJCWh3LT5EQUNyZWdbUE9TMzAyNl9YTEFUQ0hDVFJMXSA9 IFRWUDMwMjZCX1hMQVRDSENUUkxfNF8zOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlz SW50ZXJsZWF2ZShtaW5mbykpCisJCQkJCTsJLyogZGVmYXVsdC4uLiAqLworCQkJCWVsc2Ugewor CQkJCQlody0+REFDY2xrWzRdIF49IDB4QzA7CS8qIGNoYW5nZSBmcm9tIDB4ODAgdG8gMHg0MCAq LworCQkJCQlody0+REFDcmVnW1BPUzMwMjZfWExBVENIQ1RSTF0gPSBUVlAzMDI2QV9YTEFUQ0hD VFJMXzRfMzsKKwkJCQl9CisJCQl9CisJCQlody0+REFDY2xrWzVdID0gbG9vcHBvc3QgfCAweEY4 OworCQkJaWYgKG1pbmZvLT5kZXZmbGFncy5tZ2FfMjRicHBfZml4KQorCQkJCWh3LT5EQUNjbGtb NV0gXj0gMHg0MDsKKwkJfSBlbHNlIHsKKwkJCWh3LT5EQUNjbGtbM10gPSAoKDY1IC0gbG9vcGlu KSAmIDB4M0YpIHwgMHhDMDsKKwkJCWh3LT5EQUNjbGtbNF0gPSA2NSAtIGxvb3BmZWVkOworCQkJ aHctPkRBQ2Nsa1s1XSA9IGxvb3Bwb3N0IHwgMHhGMDsKKwkJfQorCQlody0+REFDcmVnW1BPUzMw MjZfWE1FTVBMTENUUkxdID0gbG9vcGRpdiB8IFRWUDMwMjZfWE1FTVBMTENUUkxfTUNMS19NQ0xL UExMIHwgVFZQMzAyNl9YTUVNUExMQ1RSTF9SQ0xLX0xPT1BQTEw7CisJfQorCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IFRpMzAyNl9pbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8s IHN0cnVjdCBteV90aW1taW5nICptKQoreworCXVfaW50OF90IG11eGN0cmwgPSBpc0ludGVybGVh dmUobWluZm8pID8gVFZQMzAyNl9YTVVYQ1RSTF9NRU1PUllfNjRCSVQgOiBUVlAzMDI2X1hNVVhD VFJMX01FTU9SWV8zMkJJVDsKKwlzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlICpodyA9ICZtaW5mby0+ aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwltZW1jcHkoaHctPkRBQ3JlZywgTUdBREFDYnBwMzIs IHNpemVvZihNR0FEQUNicHAzMikpOworCXN3aXRjaCAobWluZm8tPmZiY29uLnZhci5iaXRzX3Bl cl9waXhlbCkgeworCQljYXNlIDQ6CWh3LT5EQUNyZWdbUE9TMzAyNl9YTEFUQ0hDVFJMXSA9IFRW UDMwMjZfWExBVENIQ1RSTF8xNl8xOwkvKiBvciBfOF8xLCB0aGV5IGFyZSBzYW1lICovCisJCQlo dy0+REFDcmVnW1BPUzMwMjZfWFRSVUVDT0xPUkNUUkxdID0gVFZQMzAyNl9YVFJVRUNPTE9SQ1RS TF9QU0VVRE9DT0xPUjsKKwkJCWh3LT5EQUNyZWdbUE9TMzAyNl9YTVVYQ1RSTF0gPSBtdXhjdHJs IHwgVFZQMzAyNl9YTVVYQ1RSTF9QSVhFTF80QklUOworCQkJaHctPkRBQ3JlZ1tQT1MzMDI2X1hD TEtDVFJMXSA9IFRWUDMwMjZfWENMS0NUUkxfU1JDX1BMTCB8IFRWUDMwMjZfWENMS0NUUkxfRElW ODsKKwkJCWh3LT5EQUNyZWdbUE9TMzAyNl9YTUlTQ0NUUkxdID0gVFZQMzAyNl9YTUlTQ0NUUkxf REFDX1BVUCB8IFRWUDMwMjZfWE1JU0NDVFJMX0RBQ184QklUIHwgVFZQMzAyNl9YTUlTQ0NUUkxf UFNFTF9ESVMgfCBUVlAzMDI2X1hNSVNDQ1RSTF9QU0VMX0xPVzsKKwkJCWJyZWFrOworCQljYXNl IDg6IGh3LT5EQUNyZWdbUE9TMzAyNl9YTEFUQ0hDVFJMXSA9IFRWUDMwMjZfWExBVENIQ1RSTF84 XzE7CS8qIG9yIF80XzEsIHRoZXkgYXJlIHNhbWUgKi8KKwkJCWh3LT5EQUNyZWdbUE9TMzAyNl9Y VFJVRUNPTE9SQ1RSTF0gPSBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX1BTRVVET0NPTE9SOworCQkJ aHctPkRBQ3JlZ1tQT1MzMDI2X1hNVVhDVFJMXSA9IG11eGN0cmwgfCBUVlAzMDI2X1hNVVhDVFJM X1BJWEVMXzhCSVQ7CisJCQlody0+REFDcmVnW1BPUzMwMjZfWENMS0NUUkxdID0gVFZQMzAyNl9Y Q0xLQ1RSTF9TUkNfUExMIHwgVFZQMzAyNl9YQ0xLQ1RSTF9ESVY0OworCQkJaHctPkRBQ3JlZ1tQ T1MzMDI2X1hNSVNDQ1RSTF0gPSBUVlAzMDI2X1hNSVNDQ1RSTF9EQUNfUFVQIHwgVFZQMzAyNl9Y TUlTQ0NUUkxfREFDXzhCSVQgfCBUVlAzMDI2X1hNSVNDQ1RSTF9QU0VMX0RJUyB8IFRWUDMwMjZf WE1JU0NDVFJMX1BTRUxfTE9XOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQkvKiBYTEFUQ0hD VFJMIHNob3VsZCBiZSBfNF8xIC8gXzJfMS4uLiBXaHkgaXMgbm90PyAoXzJfMSBpcyB1c2VkIGV2 ZXJ5IHRpbWUpICovCisJCQlody0+REFDcmVnW1BPUzMwMjZfWFRSVUVDT0xPUkNUUkxdID0gKG1p bmZvLT5mYmNvbi52YXIuZ3JlZW4ubGVuZ3RoID09IDUpID8gKFRWUDMwMjZfWFRSVUVDT0xPUkNU UkxfRElSRUNUQ09MT1IgfCBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX09SR0JfMTU1NSkgOiAoVFZQ MzAyNl9YVFJVRUNPTE9SQ1RSTF9ESVJFQ1RDT0xPUiB8IFRWUDMwMjZfWFRSVUVDT0xPUkNUUkxf UkdCXzU2NSk7CisJCQlody0+REFDcmVnW1BPUzMwMjZfWE1VWENUUkxdID0gbXV4Y3RybCB8IFRW UDMwMjZfWE1VWENUUkxfUElYRUxfMTZCSVQ7CisJCQlody0+REFDcmVnW1BPUzMwMjZfWENMS0NU UkxdID0gVFZQMzAyNl9YQ0xLQ1RSTF9TUkNfUExMIHwgVFZQMzAyNl9YQ0xLQ1RSTF9ESVYyOwor CQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQkvKiBYTEFUQ0hDVFJMIGlzOiBmb3IgKEEpIHVzZSBf NF8zICg/XzhfMyBpcyBzYW1lPyBUQkQpLCBmb3IgKEIpIGl0IGlzIHNldCBpbiBzZXRwY2xrICov CisJCQlody0+REFDcmVnW1BPUzMwMjZfWFRSVUVDT0xPUkNUUkxdID0gVFZQMzAyNl9YVFJVRUNP TE9SQ1RSTF9ESVJFQ1RDT0xPUiB8IFRWUDMwMjZfWFRSVUVDT0xPUkNUUkxfUkdCXzg4ODsKKwkJ CWh3LT5EQUNyZWdbUE9TMzAyNl9YTVVYQ1RSTF0gPSBtdXhjdHJsIHwgVFZQMzAyNl9YTVVYQ1RS TF9QSVhFTF8zMkJJVDsKKwkJCWh3LT5EQUNyZWdbUE9TMzAyNl9YQ0xLQ1RSTF0gPSBUVlAzMDI2 X1hDTEtDVFJMX1NSQ19QTEwgfCBUVlAzMDI2X1hDTEtDVFJMX0RJVjQ7CisJCQlicmVhazsKKwkJ Y2FzZSAzMjoKKwkJCS8qIFhMQVRDSENUUkwgc2hvdWxkIGJlIF8yXzEgLyBfMV8xLi4uIFdoeSBp cyBub3Q/IChfMl8xIGlzIHVzZWQgZXZlcnkgdGltZSkgKi8KKwkJCWh3LT5EQUNyZWdbUE9TMzAy Nl9YTVVYQ1RSTF0gPSBtdXhjdHJsIHwgVFZQMzAyNl9YTVVYQ1RSTF9QSVhFTF8zMkJJVDsKKwkJ CWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CS8qIFRPRE86IGZhaWxlZCAqLworCX0K KwlpZiAobWF0cm94ZmJfdmdhSFdpbml0KG1pbmZvLCBtKSkgcmV0dXJuIDE7CisKKwkvKiBzZXQg U1lOQyAqLworCWh3LT5NaXNjT3V0UmVnID0gMHhDQjsKKwlpZiAobS0+c3luYyAmIEZCX1NZTkNf SE9SX0hJR0hfQUNUKQorCQlody0+REFDcmVnW1BPUzMwMjZfWEdFTkNUUkxdIHw9IFRWUDMwMjZf WEdFTkNUUkxfSFNZTkNfTkVHOworCWlmIChtLT5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNU KQorCQlody0+REFDcmVnW1BPUzMwMjZfWEdFTkNUUkxdIHw9IFRWUDMwMjZfWEdFTkNUUkxfVlNZ TkNfTkVHOworCWlmIChtLT5zeW5jICYgRkJfU1lOQ19PTl9HUkVFTikKKwkJaHctPkRBQ3JlZ1tQ T1MzMDI2X1hHRU5DVFJMXSB8PSBUVlAzMDI2X1hHRU5DVFJMX1NZTkNfT05fR1JFRU47CisKKwkv KiBzZXQgREVMQVkgKi8KKwlpZiAobWluZm8tPnZpZGVvLmxlbiA8IDB4NDAwMDAwKQorCQlody0+ Q1JUQ0VYVFszXSB8PSAweDA4OworCWVsc2UgaWYgKG1pbmZvLT52aWRlby5sZW4gPiAweDQwMDAw MCkKKwkJaHctPkNSVENFWFRbM10gfD0gMHgxMDsKKworCS8qIHNldCBIV0NVUlNPUiAqLworCWlm IChtLT5pbnRlcmxhY2VkKSB7CisJCWh3LT5EQUNyZWdbUE9TMzAyNl9YQ1VSQ1RSTF0gfD0gVFZQ MzAyNl9YQ1VSQ1RSTF9JTlRFUkxBQ0VEOworCX0KKwlpZiAobS0+SFRvdGFsID49IDE1MzYpCisJ CWh3LT5EQUNyZWdbUE9TMzAyNl9YQ1VSQ1RSTF0gfD0gVFZQMzAyNl9YQ1VSQ1RSTF9CTEFOSzQw OTY7CisKKwkvKiBzZXQgaW50ZXJsZWF2aW5nICovCisJaHctPk1Yb3B0aW9uUmVnICY9IH4weDAw MDAxMDAwOworCWlmIChpc0ludGVybGVhdmUobWluZm8pKSBody0+TVhvcHRpb25SZWcgfD0gMHgw MDAwMTAwMDsKKworCS8qIHNldCBEQUMgKi8KKwlUaTMwMjZfc2V0cGNsayhtaW5mbywgbS0+cGl4 Y2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aTMwMjZfc2V0TUNMSyhzdHJ1 Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBpbnQgZm91dCkKK3sKKwl1bnNpZ25lZCBpbnQgZl9w bGw7CisJdW5zaWduZWQgaW50IHBjbGtfbSwgcGNsa19uLCBwY2xrX3A7CisJdW5zaWduZWQgaW50 IG1jbGtfbSwgbWNsa19uLCBtY2xrX3A7CisJdW5zaWduZWQgaW50IHJmaGNudCwgbWNsa19jdGw7 CisJaW50IHRtb3V0OworCisJREJHKF9fZnVuY19fKQorCisJZl9wbGwgPSBUaTMwMjZfY2FsY2Ns b2NrKG1pbmZvLCBmb3V0LCBtaW5mby0+bWF4X3BpeGVsX2Nsb2NrLCAmbWNsa19uLCAmbWNsa19t LCAmbWNsa19wKTsKKworCS8qIHNhdmUgcGNsayAqLworCW91dFRpMzAyNihtaW5mbywgVFZQMzAy Nl9YUExMQUREUiwgMHhGQyk7CisJcGNsa19uID0gaW5UaTMwMjYobWluZm8sIFRWUDMwMjZfWFBJ WFBMTERBVEEpOworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHhGRCk7CisJ cGNsa19tID0gaW5UaTMwMjYobWluZm8sIFRWUDMwMjZfWFBJWFBMTERBVEEpOworCW91dFRpMzAy NihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHhGRSk7CisJcGNsa19wID0gaW5UaTMwMjYobWlu Zm8sIFRWUDMwMjZfWFBJWFBMTERBVEEpOworCisJLyogc3RvcCBwY2xrICovCisJb3V0VGkzMDI2 KG1pbmZvLCBUVlAzMDI2X1hQTExBRERSLCAweEZFKTsKKwlvdXRUaTMwMjYobWluZm8sIFRWUDMw MjZfWFBJWFBMTERBVEEsIDB4MDApOworCisJLyogc2V0IHBjbGsgdG8gbmV3IG1jbGsgKi8KKwlv dXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWFBMTEFERFIsIDB4RkMpOworCW91dFRpMzAyNihtaW5m bywgVFZQMzAyNl9YUElYUExMREFUQSwgbWNsa19uIHwgMHhDMCk7CisJb3V0VGkzMDI2KG1pbmZv LCBUVlAzMDI2X1hQSVhQTExEQVRBLCBtY2xrX20pOworCW91dFRpMzAyNihtaW5mbywgVFZQMzAy Nl9YUElYUExMREFUQSwgbWNsa19wIHwgMHhCMCk7CisKKwkvKiB3YWl0IGZvciBQTEwgdG8gbG9j ayAqLworCWZvciAodG1vdXQgPSA1MDAwMDA7IHRtb3V0OyB0bW91dC0tKSB7CisJCWlmIChpblRp MzAyNihtaW5mbywgVFZQMzAyNl9YUElYUExMREFUQSkgJiAweDQwKQorCQkJYnJlYWs7CisJCXVk ZWxheSgxMCk7CisJfQorCWlmICghdG1vdXQpCisJCXByaW50ayhLRVJOX0VSUiAibWF0cm94ZmI6 IFRlbXBvcmFyeSBwaXhlbCBQTEwgbm90IGxvY2tlZCBhZnRlciA1IHNlY3NcbiIpOworCisJLyog b3V0cHV0IHBjbGsgb24gbWNsayBwaW4gKi8KKwltY2xrX2N0bCA9IGluVGkzMDI2KG1pbmZvLCBU VlAzMDI2X1hNRU1QTExDVFJMKTsKKwlvdXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWE1FTVBMTENU UkwsIG1jbGtfY3RsICYgMHhFNyk7CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1QTExD VFJMLCAobWNsa19jdGwgJiAweEU3KSB8IFRWUDMwMjZfWE1FTVBMTENUUkxfU1RST0JFTUtDNCk7 CisKKwkvKiBzdG9wIE1DTEsgKi8KKwlvdXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWFBMTEFERFIs IDB4RkIpOworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YTUVNUExMREFUQSwgMHgwMCk7CisK KwkvKiBzZXQgbWNsayB0byBuZXcgZnJlcSAqLworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9Y UExMQUREUiwgMHhGMyk7CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1QTExEQVRBLCBt Y2xrX24gfCAweEMwKTsKKwlvdXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWE1FTVBMTERBVEEsIG1j bGtfbSk7CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1QTExEQVRBLCBtY2xrX3AgfCAw eEIwKTsKKworCS8qIHdhaXQgZm9yIFBMTCB0byBsb2NrICovCisJZm9yICh0bW91dCA9IDUwMDAw MDsgdG1vdXQ7IHRtb3V0LS0pIHsKKwkJaWYgKGluVGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1Q TExEQVRBKSAmIDB4NDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKCF0bW91 dCkKKwkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYjogTWVtb3J5IFBMTCBub3QgbG9ja2VkIGFm dGVyIDUgc2Vjc1xuIik7CisKKwlmX3BsbCA9IGZfcGxsICogMzMzIC8gKDEwMDAwIDw8IG1jbGtf cCk7CisJaWYgKGlzTWlsbGVuaXVtSUkobWluZm8pKSB7CisJCXJmaGNudCA9IChmX3BsbCAtIDEy OCkgLyAyNTY7CisJCWlmIChyZmhjbnQgPiAxNSkKKwkJCXJmaGNudCA9IDE1OworCX0gZWxzZSB7 CisJCXJmaGNudCA9IChmX3BsbCAtIDY0KSAvIDEyODsKKwkJaWYgKHJmaGNudCA+IDE1KQorCQkJ cmZoY250ID0gMDsKKwl9CisJbWluZm8tPmh3Lk1Yb3B0aW9uUmVnID0gKG1pbmZvLT5ody5NWG9w dGlvblJlZyAmIH4weDAwMEYwMDAwKSB8IChyZmhjbnQgPDwgMTYpOworCXBjaV93cml0ZV9jb25m aWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIG1pbmZvLT5ody5NWG9wdGlv blJlZyk7CisKKwkvKiBvdXRwdXQgTUNMSyB0byBNQ0xLIHBpbiAqLworCW91dFRpMzAyNihtaW5m bywgVFZQMzAyNl9YTUVNUExMQ1RSTCwgKG1jbGtfY3RsICYgMHhFNykgfCBUVlAzMDI2X1hNRU1Q TExDVFJMX01DTEtfTUNMS1BMTCk7CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1QTExD VFJMLCAobWNsa19jdGwgICAgICAgKSB8IFRWUDMwMjZfWE1FTVBMTENUUkxfTUNMS19NQ0xLUExM IHwgVFZQMzAyNl9YTUVNUExMQ1RSTF9TVFJPQkVNS0M0KTsKKworCS8qIHN0b3AgUENMSyAqLwor CW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHhGRSk7CisJb3V0VGkzMDI2KG1p bmZvLCBUVlAzMDI2X1hQSVhQTExEQVRBLCAweDAwKTsKKworCS8qIHJlc3RvcmUgcGNsayAqLwor CW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHhGQyk7CisJb3V0VGkzMDI2KG1p bmZvLCBUVlAzMDI2X1hQSVhQTExEQVRBLCBwY2xrX24pOworCW91dFRpMzAyNihtaW5mbywgVFZQ MzAyNl9YUElYUExMREFUQSwgcGNsa19tKTsKKwlvdXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWFBJ WFBMTERBVEEsIHBjbGtfcCk7CisKKwkvKiB3YWl0IGZvciBQTEwgdG8gbG9jayAqLworCWZvciAo dG1vdXQgPSA1MDAwMDA7IHRtb3V0OyB0bW91dC0tKSB7CisJCWlmIChpblRpMzAyNihtaW5mbywg VFZQMzAyNl9YUElYUExMREFUQSkgJiAweDQwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJ fQorCWlmICghdG1vdXQpCisJCXByaW50ayhLRVJOX0VSUiAibWF0cm94ZmI6IFBpeGVsIFBMTCBu b3QgbG9ja2VkIGFmdGVyIDUgc2Vjc1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRpMzAyNl9yYW1k YWNfaW5pdChzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCURCRyhfX2Z1bmNfXykK KworCW1pbmZvLT5mZWF0dXJlcy5wbGwudmNvX2ZyZXFfbWluID0gMTEwMDAwOworCW1pbmZvLT5m ZWF0dXJlcy5wbGwucmVmX2ZyZXEJID0gMTE0NTQ1OworCW1pbmZvLT5mZWF0dXJlcy5wbGwuZmVl ZF9kaXZfbWluID0gMjsKKwltaW5mby0+ZmVhdHVyZXMucGxsLmZlZWRfZGl2X21heCA9IDI0Owor CW1pbmZvLT5mZWF0dXJlcy5wbGwuaW5fZGl2X21pbgkgPSAyOworCW1pbmZvLT5mZWF0dXJlcy5w bGwuaW5fZGl2X21heAkgPSA2MzsKKwltaW5mby0+ZmVhdHVyZXMucGxsLnBvc3Rfc2hpZnRfbWF4 ID0gMzsKKwlpZiAobWluZm8tPmRldmZsYWdzLm5vaW5pdCkKKwkJcmV0dXJuOworCXRpMzAyNl9z ZXRNQ0xLKG1pbmZvLCA2MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIFRpMzAyNl9yZXN0b3JlKHN0 cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBw cm9nZGFjWzZdOworCXN0cnVjdCBtYXRyb3hfaHdfc3RhdGUgKmh3ID0gJm1pbmZvLT5odzsKKwlD UklURkxBR1MKKworCURCRyhfX2Z1bmNfXykKKworI2lmZGVmIERFQlVHCisJZHByaW50ayhLRVJO X0lORk8gIkVYVFZHQSByZWdzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkcHJp bnRrKCIlMDJYOiIsIGh3LT5DUlRDRVhUW2ldKTsKKwlkcHJpbnRrKCJcbiIpOworI2VuZGlmCisK KwlDUklUQkVHSU4KKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJ X09QVElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisKKwlDUklURU5ECisKKwltYXRyb3hmYl92 Z2FIV3Jlc3RvcmUobWluZm8pOworCisJQ1JJVEJFR0lOCisKKwltaW5mby0+Y3J0YzEucGFucG9z ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbWdhX3NldHIoTV9FWFRWR0FfSU5E RVgsIGksIGh3LT5DUlRDRVhUW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKSB7CisJ CW91dFRpMzAyNihtaW5mbywgREFDc2VxW2ldLCBody0+REFDcmVnW2ldKTsKKwl9CisKKwlvdXRU aTMwMjYobWluZm8sIFRWUDMwMjZfWFBMTEFERFIsIDB4MDApOworCXByb2dkYWNbMF0gPSBpblRp MzAyNihtaW5mbywgVFZQMzAyNl9YUElYUExMREFUQSk7CisJcHJvZ2RhY1szXSA9IGluVGkzMDI2 KG1pbmZvLCBUVlAzMDI2X1hMT09QUExMREFUQSk7CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2 X1hQTExBRERSLCAweDE1KTsKKwlwcm9nZGFjWzFdID0gaW5UaTMwMjYobWluZm8sIFRWUDMwMjZf WFBJWFBMTERBVEEpOworCXByb2dkYWNbNF0gPSBpblRpMzAyNihtaW5mbywgVFZQMzAyNl9YTE9P UFBMTERBVEEpOworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHgyQSk7CisJ cHJvZ2RhY1syXSA9IGluVGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hQSVhQTExEQVRBKTsKKwlwcm9n ZGFjWzVdID0gaW5UaTMwMjYobWluZm8sIFRWUDMwMjZfWExPT1BQTExEQVRBKTsKKworCUNSSVRF TkQKKwlpZiAobWVtY21wKGh3LT5EQUNjbGssIHByb2dkYWMsIDYpKSB7CisJCS8qIGFncmhoLi4u IHNldHRpbmcgdXAgUExMIGlzIHZlcnkgc2xvdyBvbiBNaWxsZW5uaXVtLi4uICovCisJCS8qIE15 c3RpcXVlIFBMTCBpcyBsb2NrZWQgaW4gZmV3IG1zLCBidXQgTWlsbGVubml1bSBQTEwgbG9jayB0 YWtlcyBhYm91dCAwLjE1IHMuLi4gKi8KKwkJLyogTWF5YmUgZXZlbiB3ZSBzaG91bGQgY2FsbCBz Y2hlZHVsZSgpID8gKi8KKworCQlDUklUQkVHSU4KKwkJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2 X1hDTEtDVFJMLCBody0+REFDcmVnW1BPUzMwMjZfWENMS0NUUkxdKTsKKwkJb3V0VGkzMDI2KG1p bmZvLCBUVlAzMDI2X1hQTExBRERSLCAweDJBKTsKKwkJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2 X1hMT09QUExMREFUQSwgMCk7CisJCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUElYUExMREFU QSwgMCk7CisKKwkJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hQTExBRERSLCAweDAwKTsKKwkJ Zm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUElY UExMREFUQSwgaHctPkRBQ2Nsa1tpXSk7CisJCS8qIHdhaXQgZm9yIFBMTCBvbmx5IGlmIFBMTCBj bG9jayByZXF1ZXN0ZWQgKGFsd2F5cyBmb3IgUG93ZXJNb2RlLCBuZXZlciBmb3IgVkdBKSAqLwor CQlpZiAoaHctPk1pc2NPdXRSZWcgJiAweDA4KSB7CisJCQlpbnQgdG1vdXQ7CisJCQlvdXRUaTMw MjYobWluZm8sIFRWUDMwMjZfWFBMTEFERFIsIDB4M0YpOworCQkJZm9yICh0bW91dCA9IDUwMDAw MDsgdG1vdXQ7IC0tdG1vdXQpIHsKKwkJCQlpZiAoaW5UaTMwMjYobWluZm8sIFRWUDMwMjZfWFBJ WFBMTERBVEEpICYgMHg0MCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKwor CQkJQ1JJVEVORAorCisJCQlpZiAoIXRtb3V0KQorCQkJCXByaW50ayhLRVJOX0VSUiAibWF0cm94 ZmI6IFBpeGVsIFBMTCBub3QgbG9ja2VkIGFmdGVyIDUgc2Vjc1xuIik7CisJCQllbHNlCisJCQkJ ZHByaW50ayhLRVJOX0lORk8gIlBpeGVsUExMOiAlZFxuIiwgNTAwMDAwLXRtb3V0KTsKKwkJCUNS SVRCRUdJTgorCQl9CisJCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YTUVNUExMQ1RSTCwgaHct PkRBQ3JlZ1tQT1MzMDI2X1hNRU1QTExDVFJMXSk7CisJCW91dFRpMzAyNihtaW5mbywgVFZQMzAy Nl9YUExMQUREUiwgMHgwMCk7CisJCWZvciAoaSA9IDM7IGkgPCA2OyBpKyspCisJCQlvdXRUaTMw MjYobWluZm8sIFRWUDMwMjZfWExPT1BQTExEQVRBLCBody0+REFDY2xrW2ldKTsKKwkJQ1JJVEVO RAorCQlpZiAoKGh3LT5NaXNjT3V0UmVnICYgMHgwOCkgJiYgKChody0+REFDY2xrWzVdICYgMHg4 MCkgPT0gMHg4MCkpIHsKKwkJCWludCB0bW91dDsKKworCQkJQ1JJVEJFR0lOCisJCQlvdXRUaTMw MjYobWluZm8sIFRWUDMwMjZfWFBMTEFERFIsIDB4M0YpOworCQkJZm9yICh0bW91dCA9IDUwMDAw MDsgdG1vdXQ7IC0tdG1vdXQpIHsKKwkJCQlpZiAoaW5UaTMwMjYobWluZm8sIFRWUDMwMjZfWExP T1BQTExEQVRBKSAmIDB4NDApCisJCQkJCWJyZWFrOworCQkJCXVkZWxheSgxMCk7CisJCQl9CisJ CQlDUklURU5ECisJCQlpZiAoIXRtb3V0KQorCQkJCXByaW50ayhLRVJOX0VSUiAibWF0cm94ZmI6 IExvb3AgUExMIG5vdCBsb2NrZWQgYWZ0ZXIgNSBzZWNzXG4iKTsKKwkJCWVsc2UKKwkJCQlkcHJp bnRrKEtFUk5fSU5GTyAiTG9vcFBMTDogJWRcbiIsIDUwMDAwMC10bW91dCk7CisJCX0KKwl9CisK KyNpZmRlZiBERUJVRworCWRwcmludGsoS0VSTl9ERUJVRyAiMzAyNkRBQ3JlZ3MgIik7CisJZm9y IChpID0gMDsgaSA8IDIxOyBpKyspIHsKKwkJZHByaW50aygiUiUwMlg9JTAyWCAiLCBEQUNzZXFb aV0sIGh3LT5EQUNyZWdbaV0pOworCQlpZiAoKGkgJiAweDcpID09IDB4NykgZHByaW50ayhLRVJO X0RFQlVHICJjb250aW51aW5nLi4uICIpOworCX0KKwlkcHJpbnRrKEtFUk5fREVCVUcgIkRBQ2Ns ayAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkcHJpbnRrKCJDJTAyWD0lMDJYICIs IGksIGh3LT5EQUNjbGtbaV0pOworCWRwcmludGsoIlxuIik7CisjZW5kaWYKK30KKworc3RhdGlj IHZvaWQgVGkzMDI2X3Jlc2V0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJREJH KF9fZnVuY19fKQorCisJdGkzMDI2X3JhbWRhY19pbml0KG1pbmZvKTsKK30KKworc3RhdGljIHN0 cnVjdCBtYXRyb3hfYWx0b3V0IHRpMzAyNl9vdXRwdXQgPSB7CisJLm5hbWUJID0gIlByaW1hcnkg b3V0cHV0IiwKK307CisKK3N0YXRpYyBpbnQgVGkzMDI2X3ByZWluaXQoc3RydWN0IG1hdHJveF9m Yl9pbmZvICptaW5mbykKK3sKKwlzdGF0aWMgY29uc3QgaW50IHZ4cmVzX21pbGwyW10gPSB7IDUx MiwgICAgICAgIDY0MCwgNzY4LCAgODAwLCAgODMyLCAgOTYwLAorCQkJCQkgIDEwMjQsIDExNTIs IDEyODAsICAgICAgMTYwMCwgMTY2NCwgMTkyMCwKKwkJCQkJICAyMDQ4LCAwfTsKKwlzdGF0aWMg Y29uc3QgaW50IHZ4cmVzX21pbGwxW10gPSB7ICAgICAgICAgICAgIDY0MCwgNzY4LCAgODAwLCAg ICAgICAgOTYwLAorCQkJCQkgIDEwMjQsIDExNTIsIDEyODAsICAgICAgMTYwMCwgICAgICAgMTky MCwKKwkJCQkJICAyMDQ4LCAwfTsKKwlzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlICpodyA9ICZtaW5m by0+aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwltaW5mby0+bWlsbGVuaXVtID0gMTsKKwltaW5m by0+bWlsbGVuaXVtSUkgPSAobWluZm8tPnBjaWRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURf TUFUUk9YX01JTCk7CisJbWluZm8tPmNhcGFibGUuY2ZiNCA9IDE7CisJbWluZm8tPmNhcGFibGUu dGV4dCA9IDE7IC8qIGlzTWlsbGVuaXVtSUkobWluZm8pOyAqLworCW1pbmZvLT5jYXBhYmxlLnZ4 cmVzID0gaXNNaWxsZW5pdW1JSShtaW5mbykgPyB2eHJlc19taWxsMiA6IHZ4cmVzX21pbGwxOwor CisJbWluZm8tPm91dHB1dHNbMF0uZGF0YSA9IG1pbmZvOworCW1pbmZvLT5vdXRwdXRzWzBdLm91 dHB1dCA9ICZ0aTMwMjZfb3V0cHV0OworCW1pbmZvLT5vdXRwdXRzWzBdLnNyYyA9IG1pbmZvLT5v dXRwdXRzWzBdLmRlZmF1bHRfc3JjOworCW1pbmZvLT5vdXRwdXRzWzBdLm1vZGUgPSBNQVRST1hG Ql9PVVRQVVRfTU9ERV9NT05JVE9SOworCisJaWYgKG1pbmZvLT5kZXZmbGFncy5ub2luaXQpCisJ CXJldHVybiAwOworCS8qIHByZXNlcnZlIFZHQSBJL08sIEJJT1MgYW5kIFBQQyAqLworCWh3LT5N WG9wdGlvblJlZyAmPSAweEMwMDAwMTAwOworCWh3LT5NWG9wdGlvblJlZyB8PSAweDAwMkMwMDAw OworCWlmIChtaW5mby0+ZGV2ZmxhZ3Mubm92Z2EpCisJCWh3LT5NWG9wdGlvblJlZyAmPSB+MHgw MDAwMDEwMDsKKwlpZiAobWluZm8tPmRldmZsYWdzLm5vYmlvcykKKwkJaHctPk1Yb3B0aW9uUmVn ICY9IH4weDQwMDAwMDAwOworCWlmIChtaW5mby0+ZGV2ZmxhZ3Mubm9wY2lyZXRyeSkKKwkJaHct Pk1Yb3B0aW9uUmVnIHw9ICAweDIwMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWlu Zm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsIGh3LT5NWG9wdGlvblJlZyk7CisKKwltaW5mby0+ YWNjZWwucmFtZGFjX3JldiA9IGluVGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hTSUxJQ09OUkVWKTsK KworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YQ0xLQ1RSTCwgVFZQMzAyNl9YQ0xLQ1RSTF9T UkNfQ0xLMFZHQSB8IFRWUDMwMjZfWENMS0NUUkxfQ0xLU1RPUFBFRCk7CisJb3V0VGkzMDI2KG1p bmZvLCBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMLCBUVlAzMDI2X1hUUlVFQ09MT1JDVFJMX1BTRVVE T0NPTE9SKTsKKwlvdXRUaTMwMjYobWluZm8sIFRWUDMwMjZfWE1VWENUUkwsIFRWUDMwMjZfWE1V WENUUkxfVkdBKTsKKworCW91dFRpMzAyNihtaW5mbywgVFZQMzAyNl9YUExMQUREUiwgMHgyQSk7 CisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hMT09QUExMREFUQSwgMHgwMCk7CisJb3V0VGkz MDI2KG1pbmZvLCBUVlAzMDI2X1hQSVhQTExEQVRBLCAweDAwKTsKKworCW1nYV9vdXRiKE1fTUlT Q19SRUcsIDB4NjcpOworCisJb3V0VGkzMDI2KG1pbmZvLCBUVlAzMDI2X1hNRU1QTExDVFJMLCBU VlAzMDI2X1hNRU1QTExDVFJMX1NUUk9CRU1LQzQgfCBUVlAzMDI2X1hNRU1QTExDVFJMX01DTEtf TUNMS1BMTCk7CisKKwltZ2Ffb3V0bChNX1JFU0VULCAxKTsKKwl1ZGVsYXkoMjUwKTsKKwltZ2Ff b3V0bChNX1JFU0VULCAwKTsKKwl1ZGVsYXkoMjUwKTsKKwltZ2Ffb3V0bChNX01BQ0NFU1MsIDB4 MDAwMDgwMDApOworCXVkZWxheSgxMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtYXRyb3hf c3dpdGNoIG1hdHJveF9taWxsZW5uaXVtID0geworCS5wcmVpbml0CT0gVGkzMDI2X3ByZWluaXQs CisJLnJlc2V0CQk9IFRpMzAyNl9yZXNldCwKKwkuaW5pdAkJPSBUaTMwMjZfaW5pdCwKKwkucmVz dG9yZQk9IFRpMzAyNl9yZXN0b3JlCit9OworRVhQT1JUX1NZTUJPTChtYXRyb3hfbWlsbGVubml1 bSk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMv c3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfVGkzMDI2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWdha21z L21hdHJveGZiX1RpMzAyNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uZmFlZTE0OWQwYmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21nYWtt cy9tYXRyb3hmYl9UaTMwMjYuaApAQCAtMCwwICsxLDEyIEBACisvKiBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMCAqLworI2lmbmRlZiBfX01BVFJPWEZCX1RJMzAyNl9IX18KKyNkZWZp bmUgX19NQVRST1hGQl9USTMwMjZfSF9fCisKKworI2luY2x1ZGUgIm1hdHJveGZiX2Jhc2UuaCIK KworI2lmZGVmIENPTkZJR19GQl9NQVRST1hfTUlMTEVOSVVNCitleHRlcm4gc3RydWN0IG1hdHJv eF9zd2l0Y2ggbWF0cm94X21pbGxlbm5pdW07CisjZW5kaWYKKworI2VuZGlmCS8qIF9fTUFUUk9Y RkJfVEkzMDI2X0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRy b3hmYl9hY2NlbC5jIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMGQ1Y2I4NWQwNzFhCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5jCkBA IC0wLDAgKzEsNTE5IEBACisvKgorICoKKyAqIEhhcmR3YXJlIGFjY2VsZXJhdGVkIE1hdHJveCBN aWxsZW5uaXVtIEksIElJLCBNeXN0aXF1ZSwgRzEwMCwgRzIwMCBhbmQgRzQwMAorICoKKyAqIChj KSAxOTk4LTIwMDIgUGV0ciBWYW5kcm92ZWMgPHZhbmRyb3ZlQHZjLmN2dXQuY3o+CisgKgorICog VmVyc2lvbjogMS42NSAyMDAyLzA4LzE0CisgKgorICogTVRSUiBzdHVmZjogMTk5OCBUb20gUmlu aSA8dHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBDb250cmlidXRvcnM6ICJtZW5p b24/IiA8bWVuaW9uQG1pbmRsZXNzLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgQmV0YXRl c3RpbmcsIGZpeGVzLCBpZGVhcworICoKKyAqICAgICAgICAgICAgICAgIkt1cnQgR2FybG9mZiIg PGdhcmxvZmZAc3VzZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgQmV0YXRlc3RpbmcsIGZp eGVzLCBpZGVhcywgdmlkZW9tb2RlcywgdmlkZW9tb2RlcyB0aW1taW5ncworICoKKyAqICAgICAg ICAgICAgICAgIlRvbSBSaW5pIiA8dHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqICAgICAg ICAgICAgICAgICAgICAgTVRSUiBzdHVmZiwgUFBDIGNsZWFudXBzLCBiZXRhdGVzdGluZywgZml4 ZXMsIGlkZWFzCisgKgorICogICAgICAgICAgICAgICAiQmliZWsgU2FodSIgPHNjb3JwaW9AZG9k ZHMubmV0PgorICogICAgICAgICAgICAgICAgICAgICBBY2Nlc3MgZGV2aWNlIHRocm91Z2ggcmVh ZGJ8d3xsIGFuZCB3cml0ZSBifHd8bAorICogICAgICAgICAgICAgICAgICAgICBFeHRlbnNpdmUg ZGVidWdnaW5nIHN0dWZmCisgKgorICogICAgICAgICAgICAgICAiRGFuaWVsIEhhdW4iIDxoYXVu ZEB1c2EubmV0PgorICogICAgICAgICAgICAgICAgICAgICBUZXN0aW5nLCBoYXJkd2FyZSBjdXJz b3IgZml4ZXMKKyAqCisgKiAgICAgICAgICAgICAgICJTY290dCBXb29kIiA8c2F3c3Q0NitAcGl0 dC5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgIEZpeGVzCisgKgorICogICAgICAgICAgICAg ICAiR2VyZCBLbm9yciIgPGtyYXhlbEBnb2xkYmFjaC5pc2RuLmNzLnR1LWJlcmxpbi5kZT4KKyAq ICAgICAgICAgICAgICAgICAgICAgQmV0YXRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICJL ZWxseSBGcmVuY2giIDx0YXJnb25AaGF6bWF0LmNvbT4KKyAqICAgICAgICAgICAgICAgIkZlcm5h bmRvIEhlcnJlcmEiIDxmaGVycmVyYUBldXJpZWxlYy5ldHNpdC51cG0uZXM+CisgKiAgICAgICAg ICAgICAgICAgICAgIEJldGF0ZXN0aW5nLCBidWcgcmVwb3J0aW5nCisgKgorICogICAgICAgICAg ICAgICAiUGFibG8gQmlhbnVjY2kiIDxwYmlhbkBwY2NwLmNvbS5hcj4KKyAqICAgICAgICAgICAg ICAgICAgICAgRml4ZXMsIGlkZWFzLCBiZXRhdGVzdGluZworICoKKyAqICAgICAgICAgICAgICAg IkluYWt5IFBlcmV6IEdvbnphbGV6IiA8aW5ha3lAcGVsb25jaG8uZmlzLnVjbS5lcz4KKyAqICAg ICAgICAgICAgICAgICAgICAgRml4ZXMsIGVuaGFuZGNlbWVudHMsIGlkZWFzLCBiZXRhdGVzdGlu ZworICoKKyAqICAgICAgICAgICAgICAgIlJ5dWljaGkgT2lrYXdhIiA8cm9pa2F3YUByci5paWlq NHUub3IuanA+CisgKiAgICAgICAgICAgICAgICAgICAgIFBQQyBiZXRhdGVzdGluZywgUFBDIHN1 cHBvcnQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAqCisgKiAgICAgICAgICAgICAgICJQYXVs IFdvbWFyIiA8UGF1bEBwd29tYXIuZGVtb24uY28udWs+CisgKiAgICAgICAgICAgICAgICJPd2Vu IFdhbGxlciIgPE8uV2FsbGVyQGVlLnF1Yi5hYy51az4KKyAqICAgICAgICAgICAgICAgICAgICAg UFBDIGJldGF0ZXN0aW5nCisgKgorICogICAgICAgICAgICAgICAiVGhvbWFzIFBvcm5pbiIgPHBv cm5pbkBib2xldC5lbnMuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgIEFscGhhIGJldGF0ZXN0 aW5nCisgKgorICogICAgICAgICAgICAgICAiUGlldGVyIHZhbiBMZXV2ZW4iIDxwdmxAaWFlLm5s PgorICogICAgICAgICAgICAgICAiVWxmIEphZW5pY2tlLVJvZXNzbGVyIiA8dWpyQHBoeXNpay5w aHkudHUtZHJlc2Rlbi5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgRzEwMCB0ZXN0aW5nCisg KgorICogICAgICAgICAgICAgICAiSC4gUGV0ZXIgQXJ2aW4iIDxocGFAdHJhbnNtZXRhLmNvbT4K KyAqICAgICAgICAgICAgICAgICAgICAgSWRlYXMKKyAqCisgKiAgICAgICAgICAgICAgICJDb3J0 IERvdWdhbiIgPGNvcnRAY3Mubm10LmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAgQ0hSUCBm aXhlcyBhbmQgUFJlUCBjbGVhbnVwCisgKgorICogICAgICAgICAgICAgICAiTWFyayBWb2prb3Zp Y2giIDxtdm9qa292aUB1Y3NkLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAgRzQwMCBzdXBw b3J0CisgKgorICogKGZvbGxvd2luZyBhdXRob3IgaXMgbm90IGluIGFueSByZWxhdGlvbiB3aXRo IHRoaXMgY29kZSwgYnV0IGhpcyBjb2RlCisgKiAgaXMgaW5jbHVkZWQgaW4gdGhpcyBkcml2ZXIp CisgKgorICogQmFzZWQgb24gZnJhbWVidWZmZXIgZHJpdmVyIGZvciBWQkUgMi4wIGNvbXBsaWFu dCBncmFwaGljIGJvYXJkcworICogICAgIChjKSAxOTk4IEdlcmQgS25vcnIgPGtyYXhlbEBjcy50 dS1iZXJsaW4uZGU+CisgKgorICogKGZvbGxvd2luZyBhdXRob3IgaXMgbm90IGluIGFueSByZWxh dGlvbiB3aXRoIHRoaXMgY29kZSwgYnV0IGhpcyBpZGVhcworICogIHdlcmUgdXNlZCB3aGVuIHdy aXRpbmcgdGhpcyBkcml2ZXIpCisgKgorICoJCSBGcmVlVkJFL0FGIChNYXRyb3gpLCAiU2hhd24g SGFyZ3JlYXZlcyIgPHNoYXduQHRhbHVsYS5kZW1vbi5jby51az4KKyAqCisgKi8KKworI2luY2x1 ZGUgIm1hdHJveGZiX2FjY2VsLmgiCisjaW5jbHVkZSAibWF0cm94ZmJfREFDMTA2NC5oIgorI2lu Y2x1ZGUgIm1hdHJveGZiX1RpMzAyNi5oIgorI2luY2x1ZGUgIm1hdHJveGZiX21pc2MuaCIKKwor I2RlZmluZSBjdXJyX3lkc3RvcmcoeCkJKCh4KS0+Y3Vyci55ZHN0b3JnLnBpeGVscykKKworI2Rl ZmluZSBtZ2FfeWRzdGxlbih5LGwpIG1nYV9vdXRsKE1fWURTVExFTiB8IE1fRVhFQywgKCh5KSA8 PCAxNikgfCAobCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXRyb3hfY2ZiNF9wYWwodV9pbnQz Ml90KiBwYWwpIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkr KykgeworCQlwYWxbaV0gPSBpICogMHgxMTExMTExMVU7CisJfQorfQorCitzdGF0aWMgaW5saW5l IHZvaWQgbWF0cm94X2NmYjhfcGFsKHVfaW50MzJfdCogcGFsKSB7CisJdW5zaWduZWQgaW50IGk7 CisJCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJcGFsW2ldID0gaSAqIDB4MDEwMTAx MDFVOworCX0KK30KKworc3RhdGljIHZvaWQgbWF0cm94ZmJfY29weWFyZWEoc3RydWN0IGZiX2lu Zm8qIGluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSogYXJlYSk7CitzdGF0aWMgdm9pZCBt YXRyb3hmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2Zp bGxyZWN0KiByZWN0KTsKK3N0YXRpYyB2b2lkIG1hdHJveGZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJf aW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlKiBpbWFnZSk7CitzdGF0aWMgdm9pZCBt YXRyb3hmYl9jZmI0X2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvKiBpbmZvLCBjb25zdCBzdHJ1Y3Qg ZmJfZmlsbHJlY3QqIHJlY3QpOworc3RhdGljIHZvaWQgbWF0cm94ZmJfY2ZiNF9jb3B5YXJlYShz dHJ1Y3QgZmJfaW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhKiBhcmVhKTsKKwor dm9pZCBtYXRyb3hfY2ZiWF9pbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJ dV9pbnQzMl90IG1hY2Nlc3M7CisJdV9pbnQzMl90IG1waXRjaDsKKwl1X2ludDMyX3QgbW9wbW9k ZTsKKwlpbnQgYWNjZWw7CisKKwlEQkcoX19mdW5jX18pCisKKwltcGl0Y2ggPSBtaW5mby0+ZmJj b24udmFyLnhyZXNfdmlydHVhbDsKKworCW1pbmZvLT5mYm9wcy5mYl9jb3B5YXJlYSA9IGNmYl9j b3B5YXJlYTsKKwltaW5mby0+ZmJvcHMuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3Q7CisJbWlu Zm8tPmZib3BzLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQ7CisJbWluZm8tPmZib3BzLmZi X2N1cnNvciA9IE5VTEw7CisKKwlhY2NlbCA9IChtaW5mby0+ZmJjb24udmFyLmFjY2VsX2ZsYWdz ICYgRkJfQUNDRUxGX1RFWFQpID09IEZCX0FDQ0VMRl9URVhUOworCisJc3dpdGNoIChtaW5mby0+ ZmJjb24udmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgNDoJCW1hY2Nlc3MgPSAweDAwMDAw MDAwOwkvKiBhY2NlbGVyYXRlIGFzIDhicHAgdmlkZW8gKi8KKwkJCQltcGl0Y2ggPSAobXBpdGNo ID4+IDEpIHwgMHg4MDAwOyAvKiBkaXNhYmxlIGxpbmVhcml6YXRpb24gKi8KKwkJCQltb3Btb2Rl ID0gTV9PUE1PREVfNEJQUDsKKwkJCQltYXRyb3hfY2ZiNF9wYWwobWluZm8tPmNtYXApOworCQkJ CWlmIChhY2NlbCAmJiAhKG1waXRjaCAmIDEpKSB7CisJCQkJCW1pbmZvLT5mYm9wcy5mYl9jb3B5 YXJlYSA9IG1hdHJveGZiX2NmYjRfY29weWFyZWE7CisJCQkJCW1pbmZvLT5mYm9wcy5mYl9maWxs cmVjdCA9IG1hdHJveGZiX2NmYjRfZmlsbHJlY3Q7CisJCQkJfQorCQkJCWJyZWFrOworCQljYXNl IDg6CQltYWNjZXNzID0gMHgwMDAwMDAwMDsKKwkJCQltb3Btb2RlID0gTV9PUE1PREVfOEJQUDsK KwkJCQltYXRyb3hfY2ZiOF9wYWwobWluZm8tPmNtYXApOworCQkJCWlmIChhY2NlbCkgeworCQkJ CQltaW5mby0+ZmJvcHMuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsKKwkJCQkJbWlu Zm8tPmZib3BzLmZiX2ZpbGxyZWN0ID0gbWF0cm94ZmJfZmlsbHJlY3Q7CisJCQkJCW1pbmZvLT5m Ym9wcy5mYl9pbWFnZWJsaXQgPSBtYXRyb3hmYl9pbWFnZWJsaXQ7CisJCQkJfQorCQkJCWJyZWFr OworCQljYXNlIDE2OglpZiAobWluZm8tPmZiY29uLnZhci5ncmVlbi5sZW5ndGggPT0gNSkKKwkJ CQkJbWFjY2VzcyA9IDB4QzAwMDAwMDE7CisJCQkJZWxzZQorCQkJCQltYWNjZXNzID0gMHg0MDAw MDAwMTsKKwkJCQltb3Btb2RlID0gTV9PUE1PREVfMTZCUFA7CisJCQkJaWYgKGFjY2VsKSB7CisJ CQkJCW1pbmZvLT5mYm9wcy5mYl9jb3B5YXJlYSA9IG1hdHJveGZiX2NvcHlhcmVhOworCQkJCQlt aW5mby0+ZmJvcHMuZmJfZmlsbHJlY3QgPSBtYXRyb3hmYl9maWxscmVjdDsKKwkJCQkJbWluZm8t PmZib3BzLmZiX2ltYWdlYmxpdCA9IG1hdHJveGZiX2ltYWdlYmxpdDsKKwkJCQl9CisJCQkJYnJl YWs7CisJCWNhc2UgMjQ6CW1hY2Nlc3MgPSAweDAwMDAwMDAzOworCQkJCW1vcG1vZGUgPSBNX09Q TU9ERV8yNEJQUDsKKwkJCQlpZiAoYWNjZWwpIHsKKwkJCQkJbWluZm8tPmZib3BzLmZiX2NvcHlh cmVhID0gbWF0cm94ZmJfY29weWFyZWE7CisJCQkJCW1pbmZvLT5mYm9wcy5mYl9maWxscmVjdCA9 IG1hdHJveGZiX2ZpbGxyZWN0OworCQkJCQltaW5mby0+ZmJvcHMuZmJfaW1hZ2VibGl0ID0gbWF0 cm94ZmJfaW1hZ2VibGl0OworCQkJCX0KKwkJCQlicmVhazsKKwkJY2FzZSAzMjoJbWFjY2VzcyA9 IDB4MDAwMDAwMDI7CisJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzMyQlBQOworCQkJCWlmIChhY2Nl bCkgeworCQkJCQltaW5mby0+ZmJvcHMuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsK KwkJCQkJbWluZm8tPmZib3BzLmZiX2ZpbGxyZWN0ID0gbWF0cm94ZmJfZmlsbHJlY3Q7CisJCQkJ CW1pbmZvLT5mYm9wcy5mYl9pbWFnZWJsaXQgPSBtYXRyb3hmYl9pbWFnZWJsaXQ7CisJCQkJfQor CQkJCWJyZWFrOworCQlkZWZhdWx0OgltYWNjZXNzID0gMHgwMDAwMDAwMDsKKwkJCQltb3Btb2Rl ID0gMHgwMDAwMDAwMDsKKwkJCQlicmVhazsJLyogdHVybiBvZmYgYWNjZWxlcmF0aW9uISEhICov CisJfQorCW1nYV9maWZvKDgpOworCW1nYV9vdXRsKE1fUElUQ0gsIG1waXRjaCk7CisJbWdhX291 dGwoTV9ZRFNUT1JHLCBjdXJyX3lkc3RvcmcobWluZm8pKTsKKwlpZiAobWluZm8tPmNhcGFibGUu cGxud3QpCisJCW1nYV9vdXRsKE1fUExOV1QsIC0xKTsKKwlpZiAobWluZm8tPmNhcGFibGUuc3Jj b3JnKSB7CisJCW1nYV9vdXRsKE1fU1JDT1JHLCAwKTsKKwkJbWdhX291dGwoTV9EU1RPUkcsIDAp OworCX0KKwltZ2Ffb3V0bChNX09QTU9ERSwgbW9wbW9kZSk7CisJbWdhX291dGwoTV9DWEJORFJZ LCAweEZGRkYwMDAwKTsKKwltZ2Ffb3V0bChNX1lUT1AsIDApOworCW1nYV9vdXRsKE1fWUJPVCwg MHgwMUZGRkZGRik7CisJbWdhX291dGwoTV9NQUNDRVNTLCBtYWNjZXNzKTsKKwltaW5mby0+YWNj ZWwubV9kd2dfcmVjdCA9IE1fRFdHX1RSQVAgfCBNX0RXR19TT0xJRCB8IE1fRFdHX0FSWkVSTyB8 IE1fRFdHX1NHTlpFUk8gfCBNX0RXR19TSElGVFpFUk87CisJaWYgKGlzTWlsbGVuaXVtSUkobWlu Zm8pKSBtaW5mby0+YWNjZWwubV9kd2dfcmVjdCB8PSBNX0RXR19UUkFOU0M7CisJbWluZm8tPmFj Y2VsLm1fb3Btb2RlID0gbW9wbW9kZTsKKwltaW5mby0+YWNjZWwubV9hY2Nlc3MgPSBtYWNjZXNz OworCW1pbmZvLT5hY2NlbC5tX3BpdGNoID0gbXBpdGNoOworfQorCitFWFBPUlRfU1lNQk9MKG1h dHJveF9jZmJYX2luaXQpOworCitzdGF0aWMgdm9pZCBtYXRyb3hfYWNjZWxfcmVzdG9yZV9tYWNj ZXNzKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJbWdhX291dGwoTV9NQUNDRVNT LCBtaW5mby0+YWNjZWwubV9hY2Nlc3MpOworCW1nYV9vdXRsKE1fUElUQ0gsIG1pbmZvLT5hY2Nl bC5tX3BpdGNoKTsKK30KKworc3RhdGljIHZvaWQgbWF0cm94X2FjY2VsX2Jtb3ZlKHN0cnVjdCBt YXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCB2eHJlcywgaW50IHN5LAorCQkJICAgICAgIGludCBz eCwgaW50IGR5LCBpbnQgZHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgc3RhcnQs IGVuZDsKKwlDUklURkxBR1MKKworCURCRyhfX2Z1bmNfXykKKworCUNSSVRCRUdJTgorCisJaWYg KChkeSA8IHN5KSB8fCAoKGR5ID09IHN5KSAmJiAoZHggPD0gc3gpKSkgeworCQltZ2FfZmlmbyg0 KTsKKwkJbWF0cm94X2FjY2VsX3Jlc3RvcmVfbWFjY2VzcyhtaW5mbyk7CisJCW1nYV9vdXRsKE1f RFdHQ1RMLCBNX0RXR19CSVRCTFQgfCBNX0RXR19TSElGVFpFUk8gfCBNX0RXR19TR05aRVJPIHwK KwkJCSBNX0RXR19CRkNPTCB8IE1fRFdHX1JFUExBQ0UpOworCQltZ2Ffb3V0bChNX0FSNSwgdnhy ZXMpOworCQl3aWR0aC0tOworCQlzdGFydCA9IHN5KnZ4cmVzK3N4K2N1cnJfeWRzdG9yZyhtaW5m byk7CisJCWVuZCA9IHN0YXJ0K3dpZHRoOworCX0gZWxzZSB7CisJCW1nYV9maWZvKDUpOworCQlt YXRyb3hfYWNjZWxfcmVzdG9yZV9tYWNjZXNzKG1pbmZvKTsKKwkJbWdhX291dGwoTV9EV0dDVEws IE1fRFdHX0JJVEJMVCB8IE1fRFdHX1NISUZUWkVSTyB8IE1fRFdHX0JGQ09MIHwgTV9EV0dfUkVQ TEFDRSk7CisJCW1nYV9vdXRsKE1fU0dOLCA1KTsKKwkJbWdhX291dGwoTV9BUjUsIC12eHJlcyk7 CisJCXdpZHRoLS07CisJCWVuZCA9IChzeStoZWlnaHQtMSkqdnhyZXMrc3grY3Vycl95ZHN0b3Jn KG1pbmZvKTsKKwkJc3RhcnQgPSBlbmQrd2lkdGg7CisJCWR5ICs9IGhlaWdodC0xOworCX0KKwlt Z2FfZmlmbyg2KTsKKwltYXRyb3hfYWNjZWxfcmVzdG9yZV9tYWNjZXNzKG1pbmZvKTsKKwltZ2Ff b3V0bChNX0FSMCwgZW5kKTsKKwltZ2Ffb3V0bChNX0FSMywgc3RhcnQpOworCW1nYV9vdXRsKE1f RlhCTkRSWSwgKChkeCt3aWR0aCk8PDE2KSB8IGR4KTsKKwltZ2FfeWRzdGxlbihkeSwgaGVpZ2h0 KTsKKwlXYWl0VGlsbElkbGUoKTsKKworCUNSSVRFTkQKK30KKworc3RhdGljIHZvaWQgbWF0cm94 X2FjY2VsX2Jtb3ZlX2xpbihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBpbnQgdnhyZXMs CisJCQkJICAgaW50IHN5LCBpbnQgc3gsIGludCBkeSwgaW50IGR4LCBpbnQgaGVpZ2h0LAorCQkJ CSAgIGludCB3aWR0aCkKK3sKKwlpbnQgc3RhcnQsIGVuZDsKKwlDUklURkxBR1MKKworCURCRyhf X2Z1bmNfXykKKworCUNSSVRCRUdJTgorCisJaWYgKChkeSA8IHN5KSB8fCAoKGR5ID09IHN5KSAm JiAoZHggPD0gc3gpKSkgeworCQltZ2FfZmlmbyg0KTsKKwkJbWF0cm94X2FjY2VsX3Jlc3RvcmVf bWFjY2VzcyhtaW5mbyk7CisJCW1nYV9vdXRsKE1fRFdHQ1RMLCBNX0RXR19CSVRCTFQgfCBNX0RX R19TSElGVFpFUk8gfCBNX0RXR19TR05aRVJPIHwKKwkJCU1fRFdHX0JGQ09MIHwgTV9EV0dfUkVQ TEFDRSk7CisJCW1nYV9vdXRsKE1fQVI1LCB2eHJlcyk7CisJCXdpZHRoLS07CisJCXN0YXJ0ID0g c3kqdnhyZXMrc3grY3Vycl95ZHN0b3JnKG1pbmZvKTsKKwkJZW5kID0gc3RhcnQrd2lkdGg7CisJ fSBlbHNlIHsKKwkJbWdhX2ZpZm8oNSk7CisJCW1hdHJveF9hY2NlbF9yZXN0b3JlX21hY2Nlc3Mo bWluZm8pOworCQltZ2Ffb3V0bChNX0RXR0NUTCwgTV9EV0dfQklUQkxUIHwgTV9EV0dfU0hJRlRa RVJPIHwgTV9EV0dfQkZDT0wgfCBNX0RXR19SRVBMQUNFKTsKKwkJbWdhX291dGwoTV9TR04sIDUp OworCQltZ2Ffb3V0bChNX0FSNSwgLXZ4cmVzKTsKKwkJd2lkdGgtLTsKKwkJZW5kID0gKHN5K2hl aWdodC0xKSp2eHJlcytzeCtjdXJyX3lkc3RvcmcobWluZm8pOworCQlzdGFydCA9IGVuZCt3aWR0 aDsKKwkJZHkgKz0gaGVpZ2h0LTE7CisJfQorCW1nYV9maWZvKDcpOworCW1hdHJveF9hY2NlbF9y ZXN0b3JlX21hY2Nlc3MobWluZm8pOworCW1nYV9vdXRsKE1fQVIwLCBlbmQpOworCW1nYV9vdXRs KE1fQVIzLCBzdGFydCk7CisJbWdhX291dGwoTV9GWEJORFJZLCAoKGR4K3dpZHRoKTw8MTYpIHwg ZHgpOworCW1nYV9vdXRsKE1fWURTVCwgZHkqdnhyZXMgPj4gNSk7CisJbWdhX291dGwoTV9MRU4g fCBNX0VYRUMsIGhlaWdodCk7CisJV2FpdFRpbGxJZGxlKCk7CisKKwlDUklURU5ECit9CisKK3N0 YXRpYyB2b2lkIG1hdHJveGZiX2NmYjRfY29weWFyZWEoc3RydWN0IGZiX2luZm8qIGluZm8sIGNv bnN0IHN0cnVjdCBmYl9jb3B5YXJlYSogYXJlYSkgeworCXN0cnVjdCBtYXRyb3hfZmJfaW5mbyAq bWluZm8gPSBpbmZvMm1pbmZvKGluZm8pOworCisJaWYgKChhcmVhLT5zeCB8IGFyZWEtPmR4IHwg YXJlYS0+d2lkdGgpICYgMSkKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCWVsc2UKKwkJ bWF0cm94X2FjY2VsX2Jtb3ZlX2xpbihtaW5mbywgbWluZm8tPmZiY29uLnZhci54cmVzX3ZpcnR1 YWwgPj4gMSwgYXJlYS0+c3ksIGFyZWEtPnN4ID4+IDEsIGFyZWEtPmR5LCBhcmVhLT5keCA+PiAx LCBhcmVhLT5oZWlnaHQsIGFyZWEtPndpZHRoID4+IDEpOworfQorCitzdGF0aWMgdm9pZCBtYXRy b3hmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlh cmVhKiBhcmVhKSB7CisJc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbyA9IGluZm8ybWluZm8o aW5mbyk7CisKKwltYXRyb3hfYWNjZWxfYm1vdmUobWluZm8sIG1pbmZvLT5mYmNvbi52YXIueHJl c192aXJ0dWFsLCBhcmVhLT5zeSwgYXJlYS0+c3gsIGFyZWEtPmR5LCBhcmVhLT5keCwgYXJlYS0+ aGVpZ2h0LCBhcmVhLT53aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hdHJveGZiX2FjY2VsX2Ns ZWFyKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVfaW50MzJfdCBjb2xvciwKKwkJCQkg aW50IHN5LCBpbnQgc3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlDUklURkxBR1MKKwor CURCRyhfX2Z1bmNfXykKKworCUNSSVRCRUdJTgorCisJbWdhX2ZpZm8oNyk7CisJbWF0cm94X2Fj Y2VsX3Jlc3RvcmVfbWFjY2VzcyhtaW5mbyk7CisJbWdhX291dGwoTV9EV0dDVEwsIG1pbmZvLT5h Y2NlbC5tX2R3Z19yZWN0IHwgTV9EV0dfUkVQTEFDRSk7CisJbWdhX291dGwoTV9GQ09MLCBjb2xv cik7CisJbWdhX291dGwoTV9GWEJORFJZLCAoKHN4ICsgd2lkdGgpIDw8IDE2KSB8IHN4KTsKKwlt Z2FfeWRzdGxlbihzeSwgaGVpZ2h0KTsKKwlXYWl0VGlsbElkbGUoKTsKKworCUNSSVRFTkQKK30K Kworc3RhdGljIHZvaWQgbWF0cm94ZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8qIGluZm8sIGNv bnN0IHN0cnVjdCBmYl9maWxscmVjdCogcmVjdCkgeworCXN0cnVjdCBtYXRyb3hfZmJfaW5mbyAq bWluZm8gPSBpbmZvMm1pbmZvKGluZm8pOworCisJc3dpdGNoIChyZWN0LT5yb3ApIHsKKwkJY2Fz ZSBST1BfQ09QWToKKwkJCW1hdHJveGZiX2FjY2VsX2NsZWFyKG1pbmZvLCAoKHVfaW50MzJfdCAq KWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWN0LT5jb2xvcl0sIHJlY3QtPmR5LCByZWN0LT5keCwg cmVjdC0+aGVpZ2h0LCByZWN0LT53aWR0aCk7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2 b2lkIG1hdHJveGZiX2NmYjRfY2xlYXIoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgdV9p bnQzMl90IGJneCwKKwkJCQlpbnQgc3ksIGludCBzeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQor eworCWludCB3aGF0dG9kbzsKKwlDUklURkxBR1MKKworCURCRyhfX2Z1bmNfXykKKworCUNSSVRC RUdJTgorCisJd2hhdHRvZG8gPSAwOworCWlmIChzeCAmIDEpIHsKKwkJc3ggKys7CisJCWlmICgh d2lkdGgpIHJldHVybjsKKwkJd2lkdGggLS07CisJCXdoYXR0b2RvID0gMTsKKwl9CisJaWYgKHdp ZHRoICYgMSkgeworCQl3aGF0dG9kbyB8PSAyOworCX0KKwl3aWR0aCA+Pj0gMTsKKwlzeCA+Pj0g MTsKKwlpZiAod2lkdGgpIHsKKwkJbWdhX2ZpZm8oNyk7CisJCW1hdHJveF9hY2NlbF9yZXN0b3Jl X21hY2Nlc3MobWluZm8pOworCQltZ2Ffb3V0bChNX0RXR0NUTCwgbWluZm8tPmFjY2VsLm1fZHdn X3JlY3QgfCBNX0RXR19SRVBMQUNFMik7CisJCW1nYV9vdXRsKE1fRkNPTCwgYmd4KTsKKwkJbWdh X291dGwoTV9GWEJORFJZLCAoKHN4ICsgd2lkdGgpIDw8IDE2KSB8IHN4KTsKKwkJbWdhX291dGwo TV9ZRFNULCBzeSAqIG1pbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsID4+IDYpOworCQltZ2Ff b3V0bChNX0xFTiB8IE1fRVhFQywgaGVpZ2h0KTsKKwkJV2FpdFRpbGxJZGxlKCk7CisJfQorCWlm ICh3aGF0dG9kbykgeworCQl1X2ludDMyX3Qgc3RlcCA9IG1pbmZvLT5mYmNvbi52YXIueHJlc192 aXJ0dWFsID4+IDE7CisJCXZhZGRyX3QgdmJhc2UgPSBtaW5mby0+dmlkZW8udmJhc2U7CisJCWlm ICh3aGF0dG9kbyAmIDEpIHsKKwkJCXVuc2lnbmVkIGludCB1YWRkciA9IHN5ICogc3RlcCArIHN4 IC0gMTsKKwkJCXVfaW50MzJfdCBsb29wOworCQkJdV9pbnQ4X3QgYmd4MiA9IGJneCAmIDB4RjA7 CisJCQlmb3IgKGxvb3AgPSBoZWlnaHQ7IGxvb3AgPiAwOyBsb29wIC0tKSB7CisJCQkJbWdhX3dy aXRlYih2YmFzZSwgdWFkZHIsIChtZ2FfcmVhZGIodmJhc2UsIHVhZGRyKSAmIDB4MEYpIHwgYmd4 Mik7CisJCQkJdWFkZHIgKz0gc3RlcDsKKwkJCX0KKwkJfQorCQlpZiAod2hhdHRvZG8gJiAyKSB7 CisJCQl1bnNpZ25lZCBpbnQgdWFkZHIgPSBzeSAqIHN0ZXAgKyBzeCArIHdpZHRoOworCQkJdV9p bnQzMl90IGxvb3A7CisJCQl1X2ludDhfdCBiZ3gyID0gYmd4ICYgMHgwRjsKKwkJCWZvciAobG9v cCA9IGhlaWdodDsgbG9vcCA+IDA7IGxvb3AgLS0pIHsKKwkJCQltZ2Ffd3JpdGViKHZiYXNlLCB1 YWRkciwgKG1nYV9yZWFkYih2YmFzZSwgdWFkZHIpICYgMHhGMCkgfCBiZ3gyKTsKKwkJCQl1YWRk ciArPSBzdGVwOworCQkJfQorCQl9CisJfQorCisJQ1JJVEVORAorfQorCitzdGF0aWMgdm9pZCBt YXRyb3hmYl9jZmI0X2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvKiBpbmZvLCBjb25zdCBzdHJ1Y3Qg ZmJfZmlsbHJlY3QqIHJlY3QpIHsKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gaW5m bzJtaW5mbyhpbmZvKTsKKworCXN3aXRjaCAocmVjdC0+cm9wKSB7CisJCWNhc2UgUk9QX0NPUFk6 CisJCQltYXRyb3hmYl9jZmI0X2NsZWFyKG1pbmZvLCAoKHVfaW50MzJfdCAqKWluZm8tPnBzZXVk b19wYWxldHRlKVtyZWN0LT5jb2xvcl0sIHJlY3QtPmR5LCByZWN0LT5keCwgcmVjdC0+aGVpZ2h0 LCByZWN0LT53aWR0aCk7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hdHJveGZi XzFicHBfaW1hZ2VibGl0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVfaW50MzJfdCBm Z3gsCisJCQkJICAgIHVfaW50MzJfdCBiZ3gsIGNvbnN0IHVfaW50OF90ICpjaGFyZGF0YSwKKwkJ CQkgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeXksIGludCB4eCkKK3sKKwl1X2ludDMy X3Qgc3RlcDsKKwl1X2ludDMyX3QgeWRzdGxlbjsKKwl1X2ludDMyX3QgeGxlbjsKKwl1X2ludDMy X3QgYXIwOworCXVfaW50MzJfdCBjaGFyY2VsbDsKKwl1X2ludDMyX3QgZnhibmRyeTsKKwl2YWRk cl90IG1taW87CisJaW50IGVhc3k7CisJQ1JJVEZMQUdTCisKKwlEQkdfSEVBVlkoX19mdW5jX18p OworCisJc3RlcCA9ICh3aWR0aCArIDcpID4+IDM7CisJY2hhcmNlbGwgPSBoZWlnaHQgKiBzdGVw OworCXhsZW4gPSAoY2hhcmNlbGwgKyAzKSAmIH4zOworCXlkc3RsZW4gPSAoeXkgPDwgMTYpIHwg aGVpZ2h0OworCWlmICh3aWR0aCA9PSBzdGVwIDw8IDMpIHsKKwkJYXIwID0gaGVpZ2h0ICogd2lk dGggLSAxOworCQllYXN5ID0gMTsKKwl9IGVsc2UgeworCQlhcjAgPSB3aWR0aCAtIDE7CisJCWVh c3kgPSAwOworCX0KKworCUNSSVRCRUdJTgorCisJbWdhX2ZpZm8oNSk7CisJbWF0cm94X2FjY2Vs X3Jlc3RvcmVfbWFjY2VzcyhtaW5mbyk7CisJaWYgKGVhc3kpCisJCW1nYV9vdXRsKE1fRFdHQ1RM LCBNX0RXR19JTE9BRCB8IE1fRFdHX1NHTlpFUk8gfCBNX0RXR19TSElGVFpFUk8gfCBNX0RXR19C TU9OT1dGIHwgTV9EV0dfTElORUFSIHwgTV9EV0dfUkVQTEFDRSk7CisJZWxzZQorCQltZ2Ffb3V0 bChNX0RXR0NUTCwgTV9EV0dfSUxPQUQgfCBNX0RXR19TR05aRVJPIHwgTV9EV0dfU0hJRlRaRVJP IHwgTV9EV0dfQk1PTk9XRiB8IE1fRFdHX1JFUExBQ0UpOworCW1nYV9vdXRsKE1fRkNPTCwgZmd4 KTsKKwltZ2Ffb3V0bChNX0JDT0wsIGJneCk7CisJZnhibmRyeSA9ICgoeHggKyB3aWR0aCAtIDEp IDw8IDE2KSB8IHh4OworCW1taW8gPSBtaW5mby0+bW1pby52YmFzZTsKKworCW1nYV9maWZvKDgp OworCW1hdHJveF9hY2NlbF9yZXN0b3JlX21hY2Nlc3MobWluZm8pOworCW1nYV93cml0ZWwobW1p bywgTV9GWEJORFJZLCBmeGJuZHJ5KTsKKwltZ2Ffd3JpdGVsKG1taW8sIE1fQVIwLCBhcjApOwor CW1nYV93cml0ZWwobW1pbywgTV9BUjMsIDApOworCWlmIChlYXN5KSB7CisJCW1nYV93cml0ZWwo bW1pbywgTV9ZRFNUTEVOIHwgTV9FWEVDLCB5ZHN0bGVuKTsKKwkJbWdhX21lbWNweV90b2lvKG1t aW8sIGNoYXJkYXRhLCB4bGVuKTsKKwl9IGVsc2UgeworCQltZ2Ffd3JpdGVsKG1taW8sIE1fQVI1 LCAwKTsKKwkJbWdhX3dyaXRlbChtbWlvLCBNX1lEU1RMRU4gfCBNX0VYRUMsIHlkc3RsZW4pOwor CQlpZiAoKHN0ZXAgJiAzKSA9PSAwKSB7CisJCQkvKiBHcmVhdC4gU291cmNlIGhhcyAzMmJpdCBh bGlnbmVkIGxpbmVzLCBzbyB3ZSBjYW4gZmVlZCB0aGVtCisJCQkgICBkaXJlY3RseSB0byB0aGUg YWNjZWxlcmF0b3IuICovCisJCQltZ2FfbWVtY3B5X3RvaW8obW1pbywgY2hhcmRhdGEsIGNoYXJj ZWxsKTsKKwkJfSBlbHNlIGlmIChzdGVwID09IDEpIHsKKwkJCS8qIFNwZWNpYWwgY2FzZSBmb3Ig MS4uOGJpdCB3aWR0aHMgKi8KKwkJCXdoaWxlIChoZWlnaHQtLSkgeworI2lmIGRlZmluZWQoX19C SUdfRU5ESUFOKQorCQkJCWZiX3dyaXRlbCgoKmNoYXJkYXRhKSA8PCAyNCwgbW1pby52YWRkcik7 CisjZWxzZQorCQkJCWZiX3dyaXRlbCgqY2hhcmRhdGEsIG1taW8udmFkZHIpOworI2VuZGlmCisJ CQkJY2hhcmRhdGErKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdGVwID09IDIpIHsKKwkJCS8qIFNw ZWNpYWwgY2FzZSBmb3IgOS4uMTViaXQgd2lkdGhzICovCisJCQl3aGlsZSAoaGVpZ2h0LS0pIHsK KyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwkJCQlmYl93cml0ZWwoKCoodV9pbnQxNl90Kilj aGFyZGF0YSkgPDwgMTYsIG1taW8udmFkZHIpOworI2Vsc2UKKwkJCQlmYl93cml0ZWwoKih1X2lu dDE2X3QqKWNoYXJkYXRhLCBtbWlvLnZhZGRyKTsKKyNlbmRpZgorCQkJCWNoYXJkYXRhICs9IDI7 CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBUZWxsLi4uIHdlbGwsIHdoeSBib3RoZXIuLi4gKi8K KwkJCXdoaWxlIChoZWlnaHQtLSkgeworCQkJCXNpemVfdCBpOworCQkJCQorCQkJCWZvciAoaSA9 IDA7IGkgPCBzdGVwOyBpICs9IDQpIHsKKwkJCQkJLyogSG9wZSB0aGF0IHRoZXJlIGFyZSBhdCBs ZWFzdCB0aHJlZSByZWFkYWJsZSBieXRlcyBiZXlvbmQgdGhlIGVuZCBvZiBiaXRtYXAgKi8KKwkJ CQkJZmJfd3JpdGVsKGdldF91bmFsaWduZWQoKHVfaW50MzJfdCopKGNoYXJkYXRhICsgaSkpLG1t aW8udmFkZHIpOworCQkJCX0KKwkJCQljaGFyZGF0YSArPSBzdGVwOworCQkJfQorCQl9CisJfQor CVdhaXRUaWxsSWRsZSgpOworCUNSSVRFTkQKK30KKworCitzdGF0aWMgdm9pZCBtYXRyb3hmYl9p bWFnZWJsaXQoc3RydWN0IGZiX2luZm8qIGluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSogaW1h Z2UpIHsKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gaW5mbzJtaW5mbyhpbmZvKTsK KworCURCR19IRUFWWShfX2Z1bmNfXyk7CisKKwlpZiAoaW1hZ2UtPmRlcHRoID09IDEpIHsKKwkJ dV9pbnQzMl90IGZneCwgYmd4OworCisJCWZneCA9ICgodV9pbnQzMl90KilpbmZvLT5wc2V1ZG9f cGFsZXR0ZSlbaW1hZ2UtPmZnX2NvbG9yXTsKKwkJYmd4ID0gKCh1X2ludDMyX3QqKWluZm8tPnBz ZXVkb19wYWxldHRlKVtpbWFnZS0+YmdfY29sb3JdOworCQltYXRyb3hmYl8xYnBwX2ltYWdlYmxp dChtaW5mbywgZmd4LCBiZ3gsIGltYWdlLT5kYXRhLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWln aHQsIGltYWdlLT5keSwgaW1hZ2UtPmR4KTsKKwl9IGVsc2UgeworCQkvKiBEYW5nZXIhIGltYWdl LT5kZXB0aCBpcyB1c2VsZXNzOiBsb2dvIHBhaW50aW5nIGNvZGUgYWx3YXlzCisJCSAgIHBhc3Nl cyBmcmFtZWJ1ZmZlciBjb2xvciBkZXB0aCBoZXJlLCBhbHRob3VnaCBsb2dvIGRhdGEgYXJlCisJ CSAgIGFsd2F5cyA4YnBwIGFuZCBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSBpcyBjaGFuZ2VkIHRvIGNv bnRhaW4KKwkJICAgbG9nbyBwYWxldHRlIHRvIGJlIHVzZWQgKGJ1dCBvbmx5IGZvciB0cnVlL2Rp cmVjdC1jb2xvci4uLiBzaWMuLi4pLgorCQkgICBTbyBkbyBpdCBjb21wbGV0ZWx5IGluIHNvZnR3 YXJlLi4uICovCisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCX0KK30KKworTU9EVUxF X0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRy b3hmYl9hY2NlbC5oIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5oCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYTdhYTlhMWQyNmMwCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9hY2NlbC5oCkBA IC0wLDAgKzEsOSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyNp Zm5kZWYgX19NQVRST1hGQl9BQ0NFTF9IX18KKyNkZWZpbmUgX19NQVRST1hGQl9BQ0NFTF9IX18K KworI2luY2x1ZGUgIm1hdHJveGZiX2Jhc2UuaCIKKwordm9pZCBtYXRyb3hfY2ZiWF9pbml0KHN0 cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZl cnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94ZmJfYmFzZS5jIGIvZHJpdmVycy9zdGFnaW5nL21nYWtt cy9tYXRyb3hmYl9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw Li5kMTFiNWU2MjEwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWdha21z L21hdHJveGZiX2Jhc2UuYwpAQCAtMCwwICsxLDI2MDcgQEAKKy8qCisgKgorICogSGFyZHdhcmUg YWNjZWxlcmF0ZWQgTWF0cm94IE1pbGxlbm5pdW0gSSwgSUksIE15c3RpcXVlLCBHMTAwLCBHMjAw IGFuZCBHNDAwCisgKgorICogKGMpIDE5OTgtMjAwMiBQZXRyIFZhbmRyb3ZlYyA8dmFuZHJvdmVA dmMuY3Z1dC5jej4KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMDEgTWF0cm94IEdy YXBoaWNzIEluYy4KKyAqCisgKiBWZXJzaW9uOiAxLjY1IDIwMDIvMDgvMTQKKyAqCisgKiBNVFJS IHN0dWZmOiAxOTk4IFRvbSBSaW5pIDx0cmluaUBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAq IENvbnRyaWJ1dG9yczogIm1lbmlvbj8iIDxtZW5pb25AbWluZGxlc3MuY29tPgorICogICAgICAg ICAgICAgICAgICAgICBCZXRhdGVzdGluZywgZml4ZXMsIGlkZWFzCisgKgorICogICAgICAgICAg ICAgICAiS3VydCBHYXJsb2ZmIiA8Z2FybG9mZkBzdXNlLmRlPgorICogICAgICAgICAgICAgICAg ICAgICBCZXRhdGVzdGluZywgZml4ZXMsIGlkZWFzLCB2aWRlb21vZGVzLCB2aWRlb21vZGVzIHRp bW1pbmdzCisgKgorICogICAgICAgICAgICAgICAiVG9tIFJpbmkiIDx0cmluaUBrZXJuZWwuY3Jh c2hpbmcub3JnPgorICogICAgICAgICAgICAgICAgICAgICBNVFJSIHN0dWZmLCBQUEMgY2xlYW51 cHMsIGJldGF0ZXN0aW5nLCBmaXhlcywgaWRlYXMKKyAqCisgKiAgICAgICAgICAgICAgICJCaWJl ayBTYWh1IiA8c2NvcnBpb0Bkb2Rkcy5uZXQ+CisgKiAgICAgICAgICAgICAgICAgICAgIEFjY2Vz cyBkZXZpY2UgdGhyb3VnaCByZWFkYnx3fGwgYW5kIHdyaXRlIGJ8d3xsCisgKiAgICAgICAgICAg ICAgICAgICAgIEV4dGVuc2l2ZSBkZWJ1Z2dpbmcgc3R1ZmYKKyAqCisgKiAgICAgICAgICAgICAg ICJEYW5pZWwgSGF1biIgPGhhdW5kQHVzYS5uZXQ+CisgKiAgICAgICAgICAgICAgICAgICAgIFRl c3RpbmcsIGhhcmR3YXJlIGN1cnNvciBmaXhlcworICoKKyAqICAgICAgICAgICAgICAgIlNjb3R0 IFdvb2QiIDxzYXdzdDQ2K0BwaXR0LmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAgRml4ZXMK KyAqCisgKiAgICAgICAgICAgICAgICJHZXJkIEtub3JyIiA8a3JheGVsQGdvbGRiYWNoLmlzZG4u Y3MudHUtYmVybGluLmRlPgorICogICAgICAgICAgICAgICAgICAgICBCZXRhdGVzdGluZworICoK KyAqICAgICAgICAgICAgICAgIktlbGx5IEZyZW5jaCIgPHRhcmdvbkBoYXptYXQuY29tPgorICog ICAgICAgICAgICAgICAiRmVybmFuZG8gSGVycmVyYSIgPGZoZXJyZXJhQGV1cmllbGVjLmV0c2l0 LnVwbS5lcz4KKyAqICAgICAgICAgICAgICAgICAgICAgQmV0YXRlc3RpbmcsIGJ1ZyByZXBvcnRp bmcKKyAqCisgKiAgICAgICAgICAgICAgICJQYWJsbyBCaWFudWNjaSIgPHBiaWFuQHBjY3AuY29t LmFyPgorICogICAgICAgICAgICAgICAgICAgICBGaXhlcywgaWRlYXMsIGJldGF0ZXN0aW5nCisg KgorICogICAgICAgICAgICAgICAiSW5ha3kgUGVyZXogR29uemFsZXoiIDxpbmFreUBwZWxvbmNo by5maXMudWNtLmVzPgorICogICAgICAgICAgICAgICAgICAgICBGaXhlcywgZW5oYW5kY2VtZW50 cywgaWRlYXMsIGJldGF0ZXN0aW5nCisgKgorICogICAgICAgICAgICAgICAiUnl1aWNoaSBPaWth d2EiIDxyb2lrYXdhQHJyLmlpaWo0dS5vci5qcD4KKyAqICAgICAgICAgICAgICAgICAgICAgUFBD IGJldGF0ZXN0aW5nLCBQUEMgc3VwcG9ydCwgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICoKKyAq ICAgICAgICAgICAgICAgIlBhdWwgV29tYXIiIDxQYXVsQHB3b21hci5kZW1vbi5jby51az4KKyAq ICAgICAgICAgICAgICAgIk93ZW4gV2FsbGVyIiA8Ty5XYWxsZXJAZWUucXViLmFjLnVrPgorICog ICAgICAgICAgICAgICAgICAgICBQUEMgYmV0YXRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAg ICJUaG9tYXMgUG9ybmluIiA8cG9ybmluQGJvbGV0LmVucy5mcj4KKyAqICAgICAgICAgICAgICAg ICAgICAgQWxwaGEgYmV0YXRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICJQaWV0ZXIgdmFu IExldXZlbiIgPHB2bEBpYWUubmw+CisgKiAgICAgICAgICAgICAgICJVbGYgSmFlbmlja2UtUm9l c3NsZXIiIDx1anJAcGh5c2lrLnBoeS50dS1kcmVzZGVuLmRlPgorICogICAgICAgICAgICAgICAg ICAgICBHMTAwIHRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICJILiBQZXRlciBBcnZpbiIg PGhwYUB0cmFuc21ldGEuY29tPgorICogICAgICAgICAgICAgICAgICAgICBJZGVhcworICoKKyAq ICAgICAgICAgICAgICAgIkNvcnQgRG91Z2FuIiA8Y29ydEBjcy5ubXQuZWR1PgorICogICAgICAg ICAgICAgICAgICAgICBDSFJQIGZpeGVzIGFuZCBQUmVQIGNsZWFudXAKKyAqCisgKiAgICAgICAg ICAgICAgICJNYXJrIFZvamtvdmljaCIgPG12b2prb3ZpQHVjc2QuZWR1PgorICogICAgICAgICAg ICAgICAgICAgICBHNDAwIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgICJTYW11ZWwgSG9j ZXZhciIgPHNhbUB2aWEuZWNwLmZyPgorICogICAgICAgICAgICAgICAgICAgICBGaXhlcworICoK KyAqICAgICAgICAgICAgICAgIkFudG9uIEFsdGFwYXJtYWtvdiIgPEFudG9uQUBiaWdmb290LmNv bT4KKyAqICAgICAgICAgICAgICAgICAgICAgRzQwMCBNQVgvbm9uLU1BWCBkaXN0aW5jdGlvbgor ICoKKyAqICAgICAgICAgICAgICAgIktlbiBBYWtlciIgPGtkYWFrZXJAcmNobGFuZC52bmV0Lmli bS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIG1lbXR5cGUgZXh0ZW5zaW9uIChuZWVkZWQg Zm9yIEdYVDEzMFAgUlMvNjAwMCBhZGFwdGVyKQorICoKKyAqICAgICAgICAgICAgICAgIlVucyBM aWRlciIgPHVuc2xpZGVyQG1pcmFuZGEub3JnPgorICogICAgICAgICAgICAgICAgICAgICBHMTAw IFBMTldUIGZpeGVzCisgKgorICogICAgICAgICAgICAgICAiRGVuaXMgWmFpdHNldiIgPHp6ekBj ZC1jbHViLnJ1PgorICogICAgICAgICAgICAgICAgICAgICBGaXhlcworICoKKyAqICAgICAgICAg ICAgICAgIk1pa2UgUGllcGVyIiA8bWlrZUBwaWVwZXItZmFtaWx5LmRlPgorICogICAgICAgICAg ICAgICAgICAgICBUVk91dCBlbmhhbmRjZW1lbnRzLCBWNEwyIGNvbnRyb2wgaW50ZXJmYWNlLgor ICoKKyAqICAgICAgICAgICAgICAgIkRpZWdvIEJpdXJydW4iIDxkaWVnb0BiaXVycnVuLmRlPgor ICogICAgICAgICAgICAgICAgICAgICBERlAgdGVzdGluZworICoKKyAqIChmb2xsb3dpbmcgYXV0 aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNvZGUsIGJ1dCBoaXMgY29kZQor ICogIGlzIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyKQorICoKKyAqIEJhc2VkIG9uIGZyYW1lYnVm ZmVyIGRyaXZlciBmb3IgVkJFIDIuMCBjb21wbGlhbnQgZ3JhcGhpYyBib2FyZHMKKyAqICAgICAo YykgMTk5OCBHZXJkIEtub3JyIDxrcmF4ZWxAY3MudHUtYmVybGluLmRlPgorICoKKyAqIChmb2xs b3dpbmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNvZGUsIGJ1dCBo aXMgaWRlYXMKKyAqICB3ZXJlIHVzZWQgd2hlbiB3cml0aW5nIHRoaXMgZHJpdmVyKQorICoKKyAq CQkgRnJlZVZCRS9BRiAoTWF0cm94KSwgIlNoYXduIEhhcmdyZWF2ZXMiIDxzaGF3bkB0YWx1bGEu ZGVtb24uY28udWs+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNp bmNsdWRlICJtYXRyb3hmYl9iYXNlLmgiCisjaW5jbHVkZSAibWF0cm94ZmJfbWlzYy5oIgorI2lu Y2x1ZGUgIm1hdHJveGZiX2FjY2VsLmgiCisjaW5jbHVkZSAibWF0cm94ZmJfREFDMTA2NC5oIgor I2luY2x1ZGUgIm1hdHJveGZiX1RpMzAyNi5oIgorI2luY2x1ZGUgIm1hdHJveGZiX21hdmVuLmgi CisjaW5jbHVkZSAibWF0cm94ZmJfY3J0YzIuaCIKKyNpbmNsdWRlICJtYXRyb3hmYl9nNDUwLmgi CisjaW5jbHVkZSA8bGludXgvbWF0cm94ZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQu aD4KKyNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNp bmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKyNpbmNs dWRlIDxhc20vbWFjaGRlcC5oPgorc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlID0gVk1PREVfTlZS QU07CitzdGF0aWMgaW50IGRlZmF1bHRfY21vZGUgPSBDTU9ERV9OVlJBTTsKKyNlbmRpZgorCitz dGF0aWMgdm9pZCBtYXRyb3hmYl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbWF0cm94X2ZiX2lu Zm8qIG1pbmZvKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjYXJkIHBhcmFtZXRl cnMKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBmYl92YXJfc2Ny ZWVuaW5mbyB2ZXNhZmJfZGVmaW5lZCA9IHsKKwk2NDAsNDgwLDY0MCw0ODAsLyogVyxILCBXLCBI ICh2aXJ0dWFsKSBsb2FkIHhyZXMseHJlc192aXJ0dWFsKi8KKwkwLDAsCQkvKiB2aXJ0dWFsIC0+ IHZpc2libGUgbm8gb2Zmc2V0ICovCisJOCwJCS8qIGRlcHRoIC0+IGxvYWQgYml0c19wZXJfcGl4 ZWwgKi8KKwkwLAkJLyogZ3JleXNjYWxlID8gKi8KKwl7MCwwLDB9LAkvKiBSICovCisJezAsMCww fSwJLyogRyAqLworCXswLDAsMH0sCS8qIEIgKi8KKwl7MCwwLDB9LAkvKiB0cmFuc3BhcmVuY3kg Ki8KKwkwLAkJLyogc3RhbmRhcmQgcGl4ZWwgZm9ybWF0ICovCisJRkJfQUNUSVZBVEVfTk9XLAor CS0xLC0xLAorCUZCX0FDQ0VMRl9URVhULAkvKiBhY2NlbCBmbGFncyAqLworCTM5NzIxTCw0OEws MTZMLDMzTCwxMEwsCisJOTZMLDJMLH4wLAkvKiBObyBzeW5jIGluZm8gKi8KKwlGQl9WTU9ERV9O T05JTlRFUkxBQ0VELAorfTsKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQg dXBkYXRlX2NydGMyKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVuc2lnbmVkIGludCBw b3MpCit7CisJc3RydWN0IG1hdHJveGZiX2RoX2ZiX2luZm8gKmluZm8gPSBtaW5mby0+Y3J0YzIu aW5mbzsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGRpc3BsYXlzIGFyZSBjb21wYXRpYmxlICovCisJ aWYgKGluZm8gJiYgKGluZm8tPmZiY29uLnZhci5iaXRzX3Blcl9waXhlbCA9PSBtaW5mby0+ZmJj b24udmFyLmJpdHNfcGVyX3BpeGVsKQorCQkgJiYgKGluZm8tPmZiY29uLnZhci54cmVzX3ZpcnR1 YWwgPT0gbWluZm8tPmZiY29uLnZhci54cmVzX3ZpcnR1YWwpCisJCSAmJiAoaW5mby0+ZmJjb24u dmFyLmdyZWVuLmxlbmd0aCA9PSBtaW5mby0+ZmJjb24udmFyLmdyZWVuLmxlbmd0aCkKKwkJICkg eworCQlzd2l0Y2ggKG1pbmZvLT5mYmNvbi52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJCWNhc2Ug MTY6CisJCQljYXNlIDMyOgorCQkJCXBvcyA9IHBvcyAqIDg7CisJCQkJaWYgKGluZm8tPmludGVy bGFjZWQpIHsKKwkJCQkJbWdhX291dGwoMHgzQzJDLCBwb3MpOworCQkJCQltZ2Ffb3V0bCgweDND MjgsIHBvcyArIG1pbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsICogbWluZm8tPmZiY29uLnZh ci5iaXRzX3Blcl9waXhlbCAvIDgpOworCQkJCX0gZWxzZSB7CisJCQkJCW1nYV9vdXRsKDB4M0My OCwgcG9zKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1h dHJveGZiX2NydGMxX3BhbnBvcyhzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCWlm IChtaW5mby0+Y3J0YzEucGFucG9zID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJ aW50IHBhbnBvczsKKworCQltYXRyb3hmYl9EQUNfbG9ja19pcnFzYXZlKGZsYWdzKTsKKwkJcGFu cG9zID0gbWluZm8tPmNydGMxLnBhbnBvczsKKwkJaWYgKHBhbnBvcyA+PSAwKSB7CisJCQl1bnNp Z25lZCBpbnQgZXh0dmdhX3JlZzsKKworCQkJbWluZm8tPmNydGMxLnBhbnBvcyA9IC0xOyAvKiBO byB1cGRhdGUgcGVuZGluZyBhbnltb3JlICovCisJCQlleHR2Z2FfcmVnID0gbWdhX2luYihNX0VY VFZHQV9JTkRFWCk7CisJCQltZ2Ffc2V0cihNX0VYVFZHQV9JTkRFWCwgMHgwMCwgcGFucG9zKTsK KwkJCWlmIChleHR2Z2FfcmVnICE9IDB4MDApIHsKKwkJCQltZ2Ffb3V0YihNX0VYVFZHQV9JTkRF WCwgZXh0dmdhX3JlZyk7CisJCQl9CisJCX0KKwkJbWF0cm94ZmJfREFDX3VubG9ja19pcnFyZXN0 b3JlKGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYXRyb3hfaXJxKGludCBp cnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1X2ludDMyX3Qgc3RhdHVzOworCWludCBoYW5kbGVkID0g MDsKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gZGV2X2lkOworCisJc3RhdHVzID0g bWdhX2lubChNX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgMHgyMCkgeworCQltZ2Ffb3V0bChN X0lDTEVBUiwgMHgyMCk7CisJCW1pbmZvLT5jcnRjMS52c3luYy5jbnQrKzsKKwkJbWF0cm94ZmJf Y3J0YzFfcGFucG9zKG1pbmZvKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaW5mby0+Y3J0 YzEudnN5bmMud2FpdCk7CisJCWhhbmRsZWQgPSAxOworCX0KKwlpZiAoc3RhdHVzICYgMHgyMDAp IHsKKwkJbWdhX291dGwoTV9JQ0xFQVIsIDB4MjAwKTsKKwkJbWluZm8tPmNydGMyLnZzeW5jLmNu dCsrOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pbmZvLT5jcnRjMi52c3luYy53YWl0KTsK KwkJaGFuZGxlZCA9IDE7CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitp bnQgbWF0cm94ZmJfZW5hYmxlX2lycShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBpbnQg cmVlbmFibGUpCit7CisJdV9pbnQzMl90IGJtOworCisJaWYgKG1pbmZvLT5kZXZmbGFncy5hY2Nl bGVyYXRvciA9PSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMCkKKwkJYm0gPSAweDIyMDsKKwllbHNl CisJCWJtID0gMHgwMjA7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJm1pbmZvLT5pcnFf ZmxhZ3MpKSB7CisJCWlmIChyZXF1ZXN0X2lycShtaW5mby0+cGNpZGV2LT5pcnEsIG1hdHJveF9p cnEsCisJCQkJSVJRRl9TSEFSRUQsICJtYXRyb3hmYiIsIG1pbmZvKSkgeworCQkJY2xlYXJfYml0 KDAsICZtaW5mby0+aXJxX2ZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENs ZWFyIGFueSBwZW5kaW5nIGZpZWxkIGludGVycnVwdHMgKi8KKwkJbWdhX291dGwoTV9JQ0xFQVIs IGJtKTsKKwkJbWdhX291dGwoTV9JRU4sIG1nYV9pbmwoTV9JRU4pIHwgYm0pOworCX0gZWxzZSBp ZiAocmVlbmFibGUpIHsKKwkJdV9pbnQzMl90IGllbjsKKworCQlpZW4gPSBtZ2FfaW5sKE1fSUVO KTsKKwkJaWYgKChpZW4gJiBibSkgIT0gYm0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYXRy b3hmYjogc29tZW9uZSBkaXNhYmxlZCBJUlEgWyUwOFhdXG4iLCBpZW4pOworCQkJbWdhX291dGwo TV9JRU4sIGllbiB8IGJtKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg bWF0cm94ZmJfZGlzYWJsZV9pcnEoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlp ZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZtaW5mby0+aXJxX2ZsYWdzKSkgeworCQkvKiBGbHVz aCBwZW5kaW5nIHBhbi1hdC12YmwgcmVxdWVzdC4uLiAqLworCQltYXRyb3hmYl9jcnRjMV9wYW5w b3MobWluZm8pOworCQlpZiAobWluZm8tPmRldmZsYWdzLmFjY2VsZXJhdG9yID09IEZCX0FDQ0VM X01BVFJPWF9NR0FHNDAwKQorCQkJbWdhX291dGwoTV9JRU4sIG1nYV9pbmwoTV9JRU4pICYgfjB4 MjIwKTsKKwkJZWxzZQorCQkJbWdhX291dGwoTV9JRU4sIG1nYV9pbmwoTV9JRU4pICYgfjB4MjAp OworCQlmcmVlX2lycShtaW5mby0+cGNpZGV2LT5pcnEsIG1pbmZvKTsKKwl9Cit9CisKK2ludCBt YXRyb3hmYl93YWl0X2Zvcl9zeW5jKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHVfaW50 MzJfdCBjcnRjKQoreworCXN0cnVjdCBtYXRyb3hfdnN5bmMgKnZzOworCXVuc2lnbmVkIGludCBj bnQ7CisJaW50IHJldDsKKworCXN3aXRjaCAoY3J0YykgeworCQljYXNlIDA6CisJCQl2cyA9ICZt aW5mby0+Y3J0YzEudnN5bmM7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKG1pbmZvLT5k ZXZmbGFncy5hY2NlbGVyYXRvciAhPSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMCkgeworCQkJCXJl dHVybiAtRU5PREVWOworCQkJfQorCQkJdnMgPSAmbWluZm8tPmNydGMyLnZzeW5jOworCQkJYnJl YWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0ID0gbWF0cm94ZmJf ZW5hYmxlX2lycShtaW5mbywgMCk7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKwor CWNudCA9IHZzLT5jbnQ7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQo dnMtPndhaXQsIGNudCAhPSB2cy0+Y250LCBIWi8xMCk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0 dXJuIHJldDsKKwl9CisJaWYgKHJldCA9PSAwKSB7CisJCW1hdHJveGZiX2VuYWJsZV9pcnEobWlu Zm8sIDEpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBtYXRyb3hfcGFuX3ZhcihzdHJ1Y3QgbWF0cm94 X2ZiX2luZm8gKm1pbmZvLAorCQkJICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7 CisJdW5zaWduZWQgaW50IHBvczsKKwl1bnNpZ25lZCBzaG9ydCBwMCwgcDEsIHAyOworCXVuc2ln bmVkIGludCBwMzsKKwlpbnQgdmJsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDUklURkxB R1MKKworCURCRyhfX2Z1bmNfXykKKworCWlmIChtaW5mby0+ZGVhZCkKKwkJcmV0dXJuOworCisJ bWluZm8tPmZiY29uLnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCW1pbmZvLT5mYmNvbi52 YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwlwb3MgPSAobWluZm8tPmZiY29uLnZhci55b2Zm c2V0ICogbWluZm8tPmZiY29uLnZhci54cmVzX3ZpcnR1YWwgKyBtaW5mby0+ZmJjb24udmFyLnhv ZmZzZXQpICogbWluZm8tPmN1cnIuZmluYWxfYnBwU2hpZnQgLyAzMjsKKwlwb3MgKz0gbWluZm8t PmN1cnIueWRzdG9yZy5jaHVua3M7CisJcDAgPSBtaW5mby0+aHcuQ1JUQ1sweDBEXSA9IHBvcyAm IDB4RkY7CisJcDEgPSBtaW5mby0+aHcuQ1JUQ1sweDBDXSA9IChwb3MgJiAweEZGMDApID4+IDg7 CisJcDIgPSBtaW5mby0+aHcuQ1JUQ0VYVFswXSA9IChtaW5mby0+aHcuQ1JUQ0VYVFswXSAmIDB4 QjApIHwgKChwb3MgPj4gMTYpICYgMHgwRikgfCAoKHBvcyA+PiAxNCkgJiAweDQwKTsKKwlwMyA9 IG1pbmZvLT5ody5DUlRDRVhUWzhdID0gcG9zID4+IDIxOworCisJLyogRkJfQUNUSVZBVEVfVkJM IGFuZCB3ZSBjYW4gYWNxdWlyZSBpbnRlcnJ1cHRzPyBIb25vciBGQl9BQ1RJVkFURV9WQkwgdGhl bi4uLiAqLworCXZibCA9ICh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVkJMKSAmJiAobWF0 cm94ZmJfZW5hYmxlX2lycShtaW5mbywgMCkgPT0gMCk7CisKKwlDUklUQkVHSU4KKworCW1hdHJv eGZiX0RBQ19sb2NrX2lycXNhdmUoZmxhZ3MpOworCW1nYV9zZXRyKE1fQ1JUQ19JTkRFWCwgMHgw RCwgcDApOworCW1nYV9zZXRyKE1fQ1JUQ19JTkRFWCwgMHgwQywgcDEpOworCWlmIChtaW5mby0+ ZGV2ZmxhZ3Muc3VwcG9ydDMyTUIpCisJCW1nYV9zZXRyKE1fRVhUVkdBX0lOREVYLCAweDA4LCBw Myk7CisJaWYgKHZibCkgeworCQltaW5mby0+Y3J0YzEucGFucG9zID0gcDI7CisJfSBlbHNlIHsK KwkJLyogQWJvcnQgYW55IHBlbmRpbmcgY2hhbmdlICovCisJCW1pbmZvLT5jcnRjMS5wYW5wb3Mg PSAtMTsKKwkJbWdhX3NldHIoTV9FWFRWR0FfSU5ERVgsIDB4MDAsIHAyKTsKKwl9CisJbWF0cm94 ZmJfREFDX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKKworCXVwZGF0ZV9jcnRjMihtaW5mbywg cG9zKTsKKworCUNSSVRFTkQKK30KKworc3RhdGljIHZvaWQgbWF0cm94ZmJfcmVtb3ZlKHN0cnVj dCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCBkdW1teSkKK3sKKwkvKiBDdXJyZW50bHkgd2Ug YXJlIGhvbGRpbmcgYmlnIGtlcm5lbCBsb2NrIG9uIGFsbCBkZWFkICYgdXNlY291bnQgdXBkYXRl cy4KKwkgKiBEZXN0cm95IGV2ZXJ5dGhpbmcgYWZ0ZXIgYWxsIHVzZXJzIHJlbGVhc2UgaXQuIEVz cGVjaWFsbHkgZG8gbm90IHVucmVnaXN0ZXIKKwkgKiBmcmFtZWJ1ZmZlciBhbmQgaW91bm1hcCBt ZW1vcnksIG5laXRoZXIgZmJtZW0gbm9yIGZiY29uLWNmYiogZG9lcyBub3QgY2hlY2sKKwkgKiBm b3IgZGV2aWNlIHVucGx1Z2dlZCB3aGVuIGluIHVzZS4KKwkgKiBJbiBmdXR1cmUgd2Ugc2hvdWxk IHBvaW50IG1taW8udmJhc2UgJiB2aWRlby52YmFzZSBzb21ld2hlcmUgd2hlcmUgd2UgY2FuCisJ ICogd3JpdGUgZGF0YSB3aXRob3V0IGNhdXNpbmcgdG9vIG11Y2ggZGFtYWdlLi4uCisJICovCisK KwltaW5mby0+ZGVhZCA9IDE7CisJaWYgKG1pbmZvLT51c2Vjb3VudCkgeworCQkvKiBkZXN0cm95 IGl0IGxhdGVyICovCisJCXJldHVybjsKKwl9CisJbWF0cm94ZmJfdW5yZWdpc3Rlcl9kZXZpY2Uo bWluZm8pOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJm1pbmZvLT5mYmNvbik7CisJbWF0cm94 ZmJfZzQ1MF9zaHV0ZG93bihtaW5mbyk7CisJYXJjaF9waHlzX3djX2RlbChtaW5mby0+d2NfY29v a2llKTsKKwlpb3VubWFwKG1pbmZvLT5tbWlvLnZiYXNlLnZhZGRyKTsKKwlpb3VubWFwKG1pbmZv LT52aWRlby52YmFzZS52YWRkcik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1pbmZvLT52aWRlby5i YXNlLCBtaW5mby0+dmlkZW8ubGVuX21heGltdW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtaW5m by0+bW1pby5iYXNlLCAxNjM4NCk7CisJa2ZyZWUobWluZm8pOworfQorCisJLyoKKwkgKiBPcGVu L1JlbGVhc2UgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UKKwkgKi8KKworc3RhdGljIGludCBtYXRy b3hmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlzdHJ1Y3QgbWF0 cm94X2ZiX2luZm8gKm1pbmZvID0gaW5mbzJtaW5mbyhpbmZvKTsKKworCURCR19MT09QKF9fZnVu Y19fKQorCisJaWYgKG1pbmZvLT5kZWFkKSB7CisJCXJldHVybiAtRU5YSU87CisJfQorCW1pbmZv LT51c2Vjb3VudCsrOworCWlmICh1c2VyKSB7CisJCW1pbmZvLT51c2VydXNlY291bnQrKzsKKwl9 CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IG1hdHJveGZiX3JlbGVhc2Uoc3RydWN0IGZi X2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8g PSBpbmZvMm1pbmZvKGluZm8pOworCisJREJHX0xPT1AoX19mdW5jX18pCisKKwlpZiAodXNlcikg eworCQlpZiAoMCA9PSAtLW1pbmZvLT51c2VydXNlY291bnQpIHsKKwkJCW1hdHJveGZiX2Rpc2Fi bGVfaXJxKG1pbmZvKTsKKwkJfQorCX0KKwlpZiAoISgtLW1pbmZvLT51c2Vjb3VudCkgJiYgbWlu Zm8tPmRlYWQpIHsKKwkJbWF0cm94ZmJfcmVtb3ZlKG1pbmZvLCAwKTsKKwl9CisJcmV0dXJuKDAp OworfQorCitzdGF0aWMgaW50IG1hdHJveGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2Ny ZWVuaW5mbyAqdmFyLAorCQlzdHJ1Y3QgZmJfaW5mbyogaW5mbykgeworCXN0cnVjdCBtYXRyb3hf ZmJfaW5mbyAqbWluZm8gPSBpbmZvMm1pbmZvKGluZm8pOworCisJREJHKF9fZnVuY19fKQorCisJ bWF0cm94X3Bhbl92YXIobWluZm8sIHZhcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg bWF0cm94ZmJfZ2V0X2ZpbmFsX2JwcFNoaWZ0KGNvbnN0IHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAq bWluZm8sCisJCQkJICAgICAgIGludCBicHApCit7CisJaW50IGJwcHNoZnQyOworCisJREJHKF9f ZnVuY19fKQorCisJYnBwc2hmdDIgPSBicHA7CisJaWYgKCFicHBzaGZ0MikgeworCQlyZXR1cm4g ODsKKwl9CisJaWYgKGlzSW50ZXJsZWF2ZShtaW5mbykpCisJCWJwcHNoZnQyID4+PSAxOworCWlm IChtaW5mby0+ZGV2ZmxhZ3MudmlkZW82NGJpdHMpCisJCWJwcHNoZnQyID4+PSAxOworCXJldHVy biBicHBzaGZ0MjsKK30KKworc3RhdGljIGludCBtYXRyb3hmYl90ZXN0X2FuZF9zZXRfcm91bmRp bmcoY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywKKwkJCQkJICBpbnQgeHJlcywg aW50IGJwcCkKK3sKKwlpbnQgb3ZlcjsKKwlpbnQgcm91bmRpbmc7CisKKwlEQkcoX19mdW5jX18p CisKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDA6CQlyZXR1cm4geHJlczsKKwkJY2FzZSA0OgkJ cm91bmRpbmcgPSAxMjg7CisJCQkJYnJlYWs7CisJCWNhc2UgODoJCXJvdW5kaW5nID0gNjQ7CS8q IGRvYyBzYXlzIDY0OyAzMiBpcyBPSyBmb3IgRzQwMCAqLworCQkJCWJyZWFrOworCQljYXNlIDE2 Oglyb3VuZGluZyA9IDMyOworCQkJCWJyZWFrOworCQljYXNlIDI0Oglyb3VuZGluZyA9IDY0Owkv KiBkb2Mgc2F5cyA2NDsgMzIgaXMgT0sgZm9yIEc0MDAgKi8KKwkJCQlicmVhazsKKwkJZGVmYXVs dDoJcm91bmRpbmcgPSAxNjsKKwkJCQkvKiBvbiBHNDAwLCAxNiByZWFsbHkgZG9lcyBub3Qgd29y ayAqLworCQkJCWlmIChtaW5mby0+ZGV2ZmxhZ3MuYWNjZWxlcmF0b3IgPT0gRkJfQUNDRUxfTUFU Uk9YX01HQUc0MDApCisJCQkJCXJvdW5kaW5nID0gMzI7CisJCQkJYnJlYWs7CisJfQorCWlmIChp c0ludGVybGVhdmUobWluZm8pKSB7CisJCXJvdW5kaW5nICo9IDI7CisJfQorCW92ZXIgPSB4cmVz ICUgcm91bmRpbmc7CisJaWYgKG92ZXIpCisJCXhyZXMgKz0gcm91bmRpbmctb3ZlcjsKKwlyZXR1 cm4geHJlczsKK30KKworc3RhdGljIGludCBtYXRyb3hmYl9waXRjaF9hZGp1c3QoY29uc3Qgc3Ry dWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgaW50IHhyZXMsCisJCQkJIGludCBicHApCit7CisJ Y29uc3QgaW50KiB3aWR0aDsKKwlpbnQgeHJlc19uZXc7CisKKwlEQkcoX19mdW5jX18pCisKKwlp ZiAoIWJwcCkgcmV0dXJuIHhyZXM7CisKKwl3aWR0aCA9IG1pbmZvLT5jYXBhYmxlLnZ4cmVzOwor CisJaWYgKG1pbmZvLT5kZXZmbGFncy5wcmVjaXNlX3dpZHRoKSB7CisJCXdoaWxlICgqd2lkdGgp IHsKKwkJCWlmICgoKndpZHRoID49IHhyZXMpICYmIChtYXRyb3hmYl90ZXN0X2FuZF9zZXRfcm91 bmRpbmcobWluZm8sICp3aWR0aCwgYnBwKSA9PSAqd2lkdGgpKSB7CisJCQkJYnJlYWs7CisJCQl9 CisJCQl3aWR0aCsrOworCQl9CisJCXhyZXNfbmV3ID0gKndpZHRoOworCX0gZWxzZSB7CisJCXhy ZXNfbmV3ID0gbWF0cm94ZmJfdGVzdF9hbmRfc2V0X3JvdW5kaW5nKG1pbmZvLCB4cmVzLCBicHAp OworCX0KKwlyZXR1cm4geHJlc19uZXc7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm94ZmJfZ2V0X2Nt YXBfbGVuKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKSB7CisKKwlEQkcoX19mdW5jX18p CisKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA0OgorCQkJcmV0dXJu IDE2OwkvKiBwc2V1ZG9jb2xvci4uLiAxNiBlbnRyaWVzIEhXIHBhbGV0dGUgKi8KKwkJY2FzZSA4 OgorCQkJcmV0dXJuIDI1NjsJLyogcHNldWRvY29sb3IuLi4gMjU2IGVudHJpZXMgSFcgcGFsZXR0 ZSAqLworCQljYXNlIDE2OgorCQkJcmV0dXJuIDE2OwkvKiBkaXJlY3Rjb2xvci4uLiAxNiBlbnRy aWVzIFNXIHBhbGV0dGUgKi8KKwkJCQkJLyogTXlzdGlxdWU6IHRydWVjb2xvciwgMTYgZW50cmll cyBTVyBwYWxldHRlLCBIVyBwYWxldHRlIGhhcmR3aXJlZCBpbnRvIDE6MSBtYXBwaW5nICovCisJ CWNhc2UgMjQ6CisJCQlyZXR1cm4gMTY7CS8qIGRpcmVjdGNvbG9yLi4uIDE2IGVudHJpZXMgU1cg cGFsZXR0ZSAqLworCQkJCQkvKiBNeXN0aXF1ZTogdHJ1ZWNvbG9yLCAxNiBlbnRyaWVzIFNXIHBh bGV0dGUsIEhXIHBhbGV0dGUgaGFyZHdpcmVkIGludG8gMToxIG1hcHBpbmcgKi8KKwkJY2FzZSAz MjoKKwkJCXJldHVybiAxNjsJLyogZGlyZWN0Y29sb3IuLi4gMTYgZW50cmllcyBTVyBwYWxldHRl ICovCisJCQkJCS8qIE15c3RpcXVlOiB0cnVlY29sb3IsIDE2IGVudHJpZXMgU1cgcGFsZXR0ZSwg SFcgcGFsZXR0ZSBoYXJkd2lyZWQgaW50byAxOjEgbWFwcGluZyAqLworCX0KKwlyZXR1cm4gMTY7 CS8qIHJldHVybiBzb21ldGhpbmcgcmVhc29uYWJsZS4uLiBvciBwYW5pYygpPyAqLworfQorCitz dGF0aWMgaW50IG1hdHJveGZiX2RlY29kZV92YXIoY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50ICp2 aXN1YWwsCisJCQkgICAgICAgaW50ICp2aWRlb19jbWFwX2xlbiwgdW5zaWduZWQgaW50KiB5ZHN0 b3JnKQoreworCXN0cnVjdCBSR0JUIHsKKwkJdW5zaWduZWQgY2hhciBicHA7CisJCXN0cnVjdCB7 CisJCQl1bnNpZ25lZCBjaGFyIG9mZnNldCwKKwkJCQkgICAgICBsZW5ndGg7CisJCX0gcmVkLAor CQkgIGdyZWVuLAorCQkgIGJsdWUsCisJCSAgdHJhbnNwOworCQlzaWduZWQgY2hhciB2aXN1YWw7 CisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IFJHQlQgdGFibGVbXT0geworCQl7IDgseyAwLDh9 LHswLDh9LHswLDh9LHsgMCwwfSxNWF9WSVNVQUxfUFNFVURPQ09MT1J9LAorCQl7MTUsezEwLDV9 LHs1LDV9LHswLDV9LHsxNSwxfSxNWF9WSVNVQUxfRElSRUNUQ09MT1J9LAorCQl7MTYsezExLDV9 LHs1LDZ9LHswLDV9LHsgMCwwfSxNWF9WSVNVQUxfRElSRUNUQ09MT1J9LAorCQl7MjQsezE2LDh9 LHs4LDh9LHswLDh9LHsgMCwwfSxNWF9WSVNVQUxfRElSRUNUQ09MT1J9LAorCQl7MzIsezE2LDh9 LHs4LDh9LHswLDh9LHsyNCw4fSxNWF9WSVNVQUxfRElSRUNUQ09MT1J9CisJfTsKKwlzdHJ1Y3Qg UkdCVCBjb25zdCAqcmdidDsKKwl1bnNpZ25lZCBpbnQgYnBwID0gdmFyLT5iaXRzX3Blcl9waXhl bDsKKwl1bnNpZ25lZCBpbnQgdnJhbWxlbjsKKwl1bnNpZ25lZCBpbnQgbWVtbGVuOworCisJREJH KF9fZnVuY19fKQorCisJc3dpdGNoIChicHApIHsKKwkJY2FzZSA0OgkgaWYgKCFtaW5mby0+Y2Fw YWJsZS5jZmI0KSByZXR1cm4gLUVJTlZBTDsKKwkJCSBicmVhazsKKwkJY2FzZSA4OgkgYnJlYWs7 CisJCWNhc2UgMTY6IGJyZWFrOworCQljYXNlIDI0OiBicmVhazsKKwkJY2FzZSAzMjogYnJlYWs7 CisJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKwkqeWRzdG9yZyA9IDA7CisJdnJhbWxl biA9IG1pbmZvLT52aWRlby5sZW5fdXNhYmxlOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZh ci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisJaWYgKHZhci0+eHJl c192aXJ0dWFsIDwgdmFyLT54cmVzKQorCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsK KworCXZhci0+eHJlc192aXJ0dWFsID0gbWF0cm94ZmJfcGl0Y2hfYWRqdXN0KG1pbmZvLCB2YXIt PnhyZXNfdmlydHVhbCwgYnBwKTsKKwltZW1sZW4gPSB2YXItPnhyZXNfdmlydHVhbCAqIGJwcCAq IHZhci0+eXJlc192aXJ0dWFsIC8gODsKKwlpZiAobWVtbGVuID4gdnJhbWxlbikgeworCQl2YXIt PnlyZXNfdmlydHVhbCA9IHZyYW1sZW4gKiA4IC8gKHZhci0+eHJlc192aXJ0dWFsICogYnBwKTsK KwkJbWVtbGVuID0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgKiB2YXItPnlyZXNfdmlydHVhbCAv IDg7CisJfQorCS8qIFRoZXJlIGlzIGhhcmR3YXJlIGJ1ZyB0aGF0IG5vIGxpbmUgY2FuIGNyb3Nz IDRNQiBib3VuZGFyeSAqLworCS8qIGdpdmUgdXAgZm9yIENGQjI0LCBpdCBpcyBpbXBvc3NpYmxl IHRvIGVhc3kgd29ya2Fyb3VuZCBpdCAqLworCS8qIGZvciBvdGhlciB0cnkgdG8gZG8gc29tZXRo aW5nICovCisJaWYgKCFtaW5mby0+Y2FwYWJsZS5jcm9zczRNQiAmJiAobWVtbGVuID4gMHg0MDAw MDApKSB7CisJCWlmIChicHAgPT0gMjQpIHsKKwkJCS8qIHNvcnJ5ICovCisJCX0gZWxzZSB7CisJ CQl1bnNpZ25lZCBpbnQgbGluZWxlbjsKKwkJCXVuc2lnbmVkIGludCBtMSA9IGxpbmVsZW4gPSB2 YXItPnhyZXNfdmlydHVhbCAqIGJwcCAvIDg7CisJCQl1bnNpZ25lZCBpbnQgbTIgPSBQQUdFX1NJ WkU7CS8qIG9yIDEyOCBpZiB5b3UgZG8gbm90IG5lZWQgUEFHRSBBTElHTkVEIGFkZHJlc3MgKi8K KwkJCXVuc2lnbmVkIGludCBtYXhfeXJlczsKKworCQkJd2hpbGUgKG0xKSB7CisJCQkJd2hpbGUg KG0yID49IG0xKSBtMiAtPSBtMTsKKwkJCQlzd2FwKG0xLCBtMik7CisJCQl9CisJCQltMiA9IGxp bmVsZW4gKiBQQUdFX1NJWkUgLyBtMjsKKwkJCSp5ZHN0b3JnID0gbTIgPSAweDQwMDAwMCAlIG0y OworCQkJbWF4X3lyZXMgPSAodnJhbWxlbiAtIG0yKSAvIGxpbmVsZW47CisJCQlpZiAodmFyLT55 cmVzX3ZpcnR1YWwgPiBtYXhfeXJlcykKKwkJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heF95cmVz OworCQl9CisJfQorCS8qIFlEU1RMRU4gY29udGFpbnMgb25seSBzaWduZWQgMTZiaXQgdmFsdWUg Ki8KKwlpZiAodmFyLT55cmVzX3ZpcnR1YWwgPiAzMjc2NykKKwkJdmFyLT55cmVzX3ZpcnR1YWwg PSAzMjc2NzsKKwkvKiB3ZSBtdXN0IHJvdW5kIHlyZXMveHJlcyBkb3duLCB3ZSBhbHJlYWR5IHJv dW5kZWQgeS94cmVzX3ZpcnR1YWwgdXAKKwkgICBpZiBpdCB3YXMgcG9zc2libGUuIFdlIHNob3Vs ZCByZXR1cm4gLUVJTlZBTCwgYnV0IEkgZGlzYWdyZWUgKi8KKwlpZiAodmFyLT55cmVzX3ZpcnR1 YWwgPCB2YXItPnlyZXMpCisJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsOworCWlmICh2 YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKKwkJdmFyLT54cmVzID0gdmFyLT54cmVzX3Zp cnR1YWw7CisJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFs KQorCQl2YXItPnhvZmZzZXQgPSB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlczsKKwlpZiAo dmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXZhci0+eW9m ZnNldCA9IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzOworCisJaWYgKGJwcCA9PSAxNiAm JiB2YXItPmdyZWVuLmxlbmd0aCA9PSA1KSB7CisJCWJwcC0tOyAvKiBhbiBhcnRpZmljaWFsIHZh bHVlIC0gMTUgKi8KKwl9CisKKwlmb3IgKHJnYnQgPSB0YWJsZTsgcmdidC0+YnBwIDwgYnBwOyBy Z2J0KyspOworI2RlZmluZQlTRVRDTFIoY2xyKVwKKwl2YXItPmNsci5vZmZzZXQgPSByZ2J0LT5j bHIub2Zmc2V0O1wKKwl2YXItPmNsci5sZW5ndGggPSByZ2J0LT5jbHIubGVuZ3RoCisJU0VUQ0xS KHJlZCk7CisJU0VUQ0xSKGdyZWVuKTsKKwlTRVRDTFIoYmx1ZSk7CisJU0VUQ0xSKHRyYW5zcCk7 CisjdW5kZWYJU0VUQ0xSCisJKnZpc3VhbCA9IHJnYnQtPnZpc3VhbDsKKworCWlmIChicHAgPiA4 KQorCQlkcHJpbnRrKCJtYXRyb3hmYjogdHJ1ZWNvbG9yOiAiCisJCQkic2l6ZT0lZDolZDolZDol ZCwgc2hpZnQ9JWQ6JWQ6JWQ6JWRcbiIsCisJCQl2YXItPnRyYW5zcC5sZW5ndGgsIHZhci0+cmVk Lmxlbmd0aCwgdmFyLT5ncmVlbi5sZW5ndGgsIHZhci0+Ymx1ZS5sZW5ndGgsCisJCQl2YXItPnRy YW5zcC5vZmZzZXQsIHZhci0+cmVkLm9mZnNldCwgdmFyLT5ncmVlbi5vZmZzZXQsIHZhci0+Ymx1 ZS5vZmZzZXQpOworCisJKnZpZGVvX2NtYXBfbGVuID0gbWF0cm94ZmJfZ2V0X2NtYXBfbGVuKHZh cik7CisJZHByaW50ayhLRVJOX0lORk8gInJlcXVlc3RlZCAlZColZC8lZGJwcCAoJWQqJWQpXG4i LCB2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCwKKwkJCQl2YXItPnhy ZXNfdmlydHVhbCwgdmFyLT55cmVzX3ZpcnR1YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IG1hdHJveGZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNp Z25lZCBncmVlbiwKKwkJCSAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKKwkJ CSAgICAgIHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQoreworCXN0cnVjdCBtYXRyb3hfZmJfaW5m byogbWluZm8gPSBjb250YWluZXJfb2YoZmJfaW5mbywgc3RydWN0IG1hdHJveF9mYl9pbmZvLCBm YmNvbik7CisKKwlEQkcoX19mdW5jX18pCisKKwkvKgorCSAqICBTZXQgYSBzaW5nbGUgY29sb3Ig cmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlCisJICogIGFscmVhZHkgcm91bmRlZCBk b3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcworCSAqICAoYWNjb3JkaW5nIHRvIHRo ZSBlbnRyaWVzIGluIHRoZSBgdmFyJyBzdHJ1Y3R1cmUpLiBSZXR1cm4KKwkgKiAgIT0gMCBmb3Ig aW52YWxpZCByZWduby4KKwkgKi8KKworCWlmIChyZWdubyA+PSBtaW5mby0+Y3Vyci5jbWFwX2xl bikKKwkJcmV0dXJuIDE7CisKKwlpZiAobWluZm8tPmZiY29uLnZhci5ncmF5c2NhbGUpIHsKKwkJ LyogZ3JheSA9IDAuMzAqUiArIDAuNTkqRyArIDAuMTEqQiAqLworCQlyZWQgPSBncmVlbiA9IGJs dWUgPSAocmVkICogNzcgKyBncmVlbiAqIDE1MSArIGJsdWUgKiAyOCkgPj4gODsKKwl9CisKKwly ZWQgPSBDTlZUX1RPSFcocmVkLCBtaW5mby0+ZmJjb24udmFyLnJlZC5sZW5ndGgpOworCWdyZWVu ID0gQ05WVF9UT0hXKGdyZWVuLCBtaW5mby0+ZmJjb24udmFyLmdyZWVuLmxlbmd0aCk7CisJYmx1 ZSA9IENOVlRfVE9IVyhibHVlLCBtaW5mby0+ZmJjb24udmFyLmJsdWUubGVuZ3RoKTsKKwl0cmFu c3AgPSBDTlZUX1RPSFcodHJhbnNwLCBtaW5mby0+ZmJjb24udmFyLnRyYW5zcC5sZW5ndGgpOwor CisJc3dpdGNoIChtaW5mby0+ZmJjb24udmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA0Ogor CWNhc2UgODoKKwkJbWdhX291dGIoTV9EQUNfUkVHLCByZWdubyk7CisJCW1nYV9vdXRiKE1fREFD X1ZBTCwgcmVkKTsKKwkJbWdhX291dGIoTV9EQUNfVkFMLCBncmVlbik7CisJCW1nYV9vdXRiKE1f REFDX1ZBTCwgYmx1ZSk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWlmIChyZWdubyA+PSAxNikK KwkJCWJyZWFrOworCQl7CisJCQl1X2ludDE2X3QgY29sID0KKwkJCQkocmVkIDw8IG1pbmZvLT5m YmNvbi52YXIucmVkLm9mZnNldCkgICAgIHwKKwkJCQkoZ3JlZW4gPDwgbWluZm8tPmZiY29uLnZh ci5ncmVlbi5vZmZzZXQpIHwKKwkJCQkoYmx1ZSA8PCBtaW5mby0+ZmJjb24udmFyLmJsdWUub2Zm c2V0KSAgIHwKKwkJCQkodHJhbnNwIDw8IG1pbmZvLT5mYmNvbi52YXIudHJhbnNwLm9mZnNldCk7 IC8qIGZvciAxOjU6NTo1ICovCisJCQltaW5mby0+Y21hcFtyZWdub10gPSBjb2wgfCAoY29sIDw8 IDE2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWlmIChyZWdubyA+ PSAxNikKKwkJCWJyZWFrOworCQltaW5mby0+Y21hcFtyZWdub10gPQorCQkJKHJlZCAgIDw8IG1p bmZvLT5mYmNvbi52YXIucmVkLm9mZnNldCkgICB8CisJCQkoZ3JlZW4gPDwgbWluZm8tPmZiY29u LnZhci5ncmVlbi5vZmZzZXQpIHwKKwkJCShibHVlICA8PCBtaW5mby0+ZmJjb24udmFyLmJsdWUu b2Zmc2V0KSAgfAorCQkJKHRyYW5zcCA8PCBtaW5mby0+ZmJjb24udmFyLnRyYW5zcC5vZmZzZXQp OwkvKiA4Ojg6ODo4ICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgbWF0cm94ZmJfaW5pdF9maXgoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlz dHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZtaW5mby0+ZmJjb24uZml4OworCURCRyhf X2Z1bmNfXykKKworCXN0cmNweShmaXgtPmlkLCJNQVRST1giKTsKKworCWZpeC0+eHBhbnN0ZXAg PSA4OwkvKiA4IGZvciA4YnBwLCA0IGZvciAxNmJwcCwgMiBmb3IgMzJicHAgKi8KKwlmaXgtPnlw YW5zdGVwID0gMTsKKwlmaXgtPnl3cmFwc3RlcCA9IDA7CisJZml4LT5tbWlvX3N0YXJ0ID0gbWlu Zm8tPm1taW8uYmFzZTsKKwlmaXgtPm1taW9fbGVuID0gbWluZm8tPm1taW8ubGVuOworCWZpeC0+ YWNjZWwgPSBtaW5mby0+ZGV2ZmxhZ3MuYWNjZWxlcmF0b3I7Cit9CisKK3N0YXRpYyB2b2lkIG1h dHJveGZiX3VwZGF0ZV9maXgoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlzdHJ1 Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZtaW5mby0+ZmJjb24uZml4OworCURCRyhfX2Z1 bmNfXykKKworCW11dGV4X2xvY2soJm1pbmZvLT5mYmNvbi5tbV9sb2NrKTsKKwlmaXgtPnNtZW1f c3RhcnQgPSBtaW5mby0+dmlkZW8uYmFzZSArIG1pbmZvLT5jdXJyLnlkc3RvcmcuYnl0ZXM7CisJ Zml4LT5zbWVtX2xlbiA9IG1pbmZvLT52aWRlby5sZW5fdXNhYmxlIC0gbWluZm8tPmN1cnIueWRz dG9yZy5ieXRlczsKKwltdXRleF91bmxvY2soJm1pbmZvLT5mYmNvbi5tbV9sb2NrKTsKK30KKwor c3RhdGljIGludCBtYXRyb3hmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2 YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBlcnI7CisJaW50IHZpc3VhbDsKKwlp bnQgY21hcF9sZW47CisJdW5zaWduZWQgaW50IHlkc3Rvcmc7CisJc3RydWN0IG1hdHJveF9mYl9p bmZvICptaW5mbyA9IGluZm8ybWluZm8oaW5mbyk7CisKKwlpZiAobWluZm8tPmRlYWQpIHsKKwkJ cmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKChlcnIgPSBtYXRyb3hmYl9kZWNvZGVfdmFyKG1pbmZv LCB2YXIsICZ2aXN1YWwsICZjbWFwX2xlbiwgJnlkc3RvcmcpKSAhPSAwKQorCQlyZXR1cm4gZXJy OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdHJveGZiX3NldF9wYXIoc3RydWN0IGZi X2luZm8gKmluZm8pCit7CisJaW50IGVycjsKKwlpbnQgdmlzdWFsOworCWludCBjbWFwX2xlbjsK Kwl1bnNpZ25lZCBpbnQgeWRzdG9yZzsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsK KwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gaW5mbzJtaW5mbyhpbmZvKTsKKworCURC RyhfX2Z1bmNfXykKKworCWlmIChtaW5mby0+ZGVhZCkgeworCQlyZXR1cm4gLUVOWElPOworCX0K KworCXZhciA9ICZpbmZvLT52YXI7CisJaWYgKChlcnIgPSBtYXRyb3hmYl9kZWNvZGVfdmFyKG1p bmZvLCB2YXIsICZ2aXN1YWwsICZjbWFwX2xlbiwgJnlkc3RvcmcpKSAhPSAwKQorCQlyZXR1cm4g ZXJyOworCW1pbmZvLT5mYmNvbi5zY3JlZW5fYmFzZSA9IHZhZGRyX3ZhKG1pbmZvLT52aWRlby52 YmFzZSkgKyB5ZHN0b3JnOworCW1hdHJveGZiX3VwZGF0ZV9maXgobWluZm8pOworCW1pbmZvLT5m YmNvbi5maXgudmlzdWFsID0gdmlzdWFsOworCW1pbmZvLT5mYmNvbi5maXgudHlwZSA9IEZCX1RZ UEVfUEFDS0VEX1BJWEVMUzsKKwltaW5mby0+ZmJjb24uZml4LnR5cGVfYXV4ID0gMDsKKwltaW5m by0+ZmJjb24uZml4LmxpbmVfbGVuZ3RoID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRz X3Blcl9waXhlbCkgPj4gMzsKKwl7CisJCXVuc2lnbmVkIGludCBwb3M7CisKKwkJbWluZm8tPmN1 cnIuY21hcF9sZW4gPSBjbWFwX2xlbjsKKwkJeWRzdG9yZyArPSBtaW5mby0+ZGV2ZmxhZ3MueWRz dG9yZzsKKwkJbWluZm8tPmN1cnIueWRzdG9yZy5ieXRlcyA9IHlkc3Rvcmc7CisJCW1pbmZvLT5j dXJyLnlkc3RvcmcuY2h1bmtzID0geWRzdG9yZyA+PiAoaXNJbnRlcmxlYXZlKG1pbmZvKSA/IDMg OiAyKTsKKwkJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gNCkKKwkJCW1pbmZvLT5jdXJyLnlk c3RvcmcucGl4ZWxzID0geWRzdG9yZzsKKwkJZWxzZQorCQkJbWluZm8tPmN1cnIueWRzdG9yZy5w aXhlbHMgPSAoeWRzdG9yZyAqIDgpIC8gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwkJbWluZm8tPmN1 cnIuZmluYWxfYnBwU2hpZnQgPSBtYXRyb3hmYl9nZXRfZmluYWxfYnBwU2hpZnQobWluZm8sIHZh ci0+Yml0c19wZXJfcGl4ZWwpOworCQl7CXN0cnVjdCBteV90aW1taW5nIG10OworCQkJc3RydWN0 IG1hdHJveF9od19zdGF0ZSogaHc7CisJCQlpbnQgb3V0OworCisJCQltYXRyb3hmYl92YXIybXko dmFyLCAmbXQpOworCQkJbXQuY3J0YyA9IE1BVFJPWEZCX1NSQ19DUlRDMTsKKwkJCS8qIENSVEMx IGRlbGF5cyAqLworCQkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJCQkJY2FzZSAg MDoJbXQuZGVsYXkgPSAzMSArIDA7IGJyZWFrOworCQkJCWNhc2UgMTY6CW10LmRlbGF5ID0gMjEg KyA4OyBicmVhazsKKwkJCQljYXNlIDI0OgltdC5kZWxheSA9IDE3ICsgODsgYnJlYWs7CisJCQkJ Y2FzZSAzMjoJbXQuZGVsYXkgPSAxNiArIDg7IGJyZWFrOworCQkJCWRlZmF1bHQ6CW10LmRlbGF5 ID0gMzEgKyA4OyBicmVhazsKKwkJCX0KKworCQkJaHcgPSAmbWluZm8tPmh3OworCisJCQlkb3du X3JlYWQoJm1pbmZvLT5hbHRvdXQubG9jayk7CisJCQlmb3IgKG91dCA9IDA7IG91dCA8IE1BVFJP WEZCX01BWF9PVVRQVVRTOyBvdXQrKykgeworCQkJCWlmIChtaW5mby0+b3V0cHV0c1tvdXRdLnNy YyA9PSBNQVRST1hGQl9TUkNfQ1JUQzEgJiYKKwkJCQkgICAgbWluZm8tPm91dHB1dHNbb3V0XS5v dXRwdXQtPmNvbXB1dGUpIHsKKwkJCQkJbWluZm8tPm91dHB1dHNbb3V0XS5vdXRwdXQtPmNvbXB1 dGUobWluZm8tPm91dHB1dHNbb3V0XS5kYXRhLCAmbXQpOworCQkJCX0KKwkJCX0KKwkJCXVwX3Jl YWQoJm1pbmZvLT5hbHRvdXQubG9jayk7CisJCQltaW5mby0+Y3J0YzEucGl4Y2xvY2sgPSBtdC5w aXhjbG9jazsKKwkJCW1pbmZvLT5jcnRjMS5tbnAgPSBtdC5tbnA7CisJCQltaW5mby0+aHdfc3dp dGNoLT5pbml0KG1pbmZvLCAmbXQpOworCQkJcG9zID0gKHZhci0+eW9mZnNldCAqIHZhci0+eHJl c192aXJ0dWFsICsgdmFyLT54b2Zmc2V0KSAqIG1pbmZvLT5jdXJyLmZpbmFsX2JwcFNoaWZ0IC8g MzI7CisJCQlwb3MgKz0gbWluZm8tPmN1cnIueWRzdG9yZy5jaHVua3M7CisKKwkJCWh3LT5DUlRD WzB4MERdID0gcG9zICYgMHhGRjsKKwkJCWh3LT5DUlRDWzB4MENdID0gKHBvcyAmIDB4RkYwMCkg Pj4gODsKKwkJCWh3LT5DUlRDRVhUWzBdID0gKGh3LT5DUlRDRVhUWzBdICYgMHhGMCkgfCAoKHBv cyA+PiAxNikgJiAweDBGKSB8ICgocG9zID4+IDE0KSAmIDB4NDApOworCQkJaHctPkNSVENFWFRb OF0gPSBwb3MgPj4gMjE7CisJCQltaW5mby0+aHdfc3dpdGNoLT5yZXN0b3JlKG1pbmZvKTsKKwkJ CXVwZGF0ZV9jcnRjMihtaW5mbywgcG9zKTsKKwkJCWRvd25fcmVhZCgmbWluZm8tPmFsdG91dC5s b2NrKTsKKwkJCWZvciAob3V0ID0gMDsgb3V0IDwgTUFUUk9YRkJfTUFYX09VVFBVVFM7IG91dCsr KSB7CisJCQkJaWYgKG1pbmZvLT5vdXRwdXRzW291dF0uc3JjID09IE1BVFJPWEZCX1NSQ19DUlRD MSAmJgorCQkJCSAgICBtaW5mby0+b3V0cHV0c1tvdXRdLm91dHB1dC0+cHJvZ3JhbSkgeworCQkJ CQltaW5mby0+b3V0cHV0c1tvdXRdLm91dHB1dC0+cHJvZ3JhbShtaW5mby0+b3V0cHV0c1tvdXRd LmRhdGEpOworCQkJCX0KKwkJCX0KKwkJCWZvciAob3V0ID0gMDsgb3V0IDwgTUFUUk9YRkJfTUFY X09VVFBVVFM7IG91dCsrKSB7CisJCQkJaWYgKG1pbmZvLT5vdXRwdXRzW291dF0uc3JjID09IE1B VFJPWEZCX1NSQ19DUlRDMSAmJgorCQkJCSAgICBtaW5mby0+b3V0cHV0c1tvdXRdLm91dHB1dC0+ c3RhcnQpIHsKKwkJCQkJbWluZm8tPm91dHB1dHNbb3V0XS5vdXRwdXQtPnN0YXJ0KG1pbmZvLT5v dXRwdXRzW291dF0uZGF0YSk7CisJCQkJfQorCQkJfQorCQkJdXBfcmVhZCgmbWluZm8tPmFsdG91 dC5sb2NrKTsKKwkJCW1hdHJveF9jZmJYX2luaXQobWluZm8pOworCQl9CisJfQorCW1pbmZvLT5p bml0aWFsaXplZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm94ZmJfZ2V0 X3ZibGFuayhzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLAorCQkJICAgICAgIHN0cnVjdCBm Yl92YmxhbmsgKnZibGFuaykKK3sKKwl1bnNpZ25lZCBpbnQgc3RzMTsKKworCW1hdHJveGZiX2Vu YWJsZV9pcnEobWluZm8sIDApOworCW1lbXNldCh2YmxhbmssIDAsIHNpemVvZigqdmJsYW5rKSk7 CisJdmJsYW5rLT5mbGFncyA9IEZCX1ZCTEFOS19IQVZFX1ZDT1VOVCB8IEZCX1ZCTEFOS19IQVZF X1ZTWU5DIHwKKwkJCUZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8IEZCX1ZCTEFOS19IQVZFX0hCTEFO SzsKKwlzdHMxID0gbWdhX2luYihNX0lOU1RTMSk7CisJdmJsYW5rLT52Y291bnQgPSBtZ2FfaW5s KE1fVkNPVU5UKTsKKwkvKiBCVFcsIG9uIG15IFBJSUkvNDUwIHdpdGggRzQwMCwgcmVhZGluZyBN X0lOU1RTMQorCSAgIGJ5dGUgbWFrZXMgdGhpcyBjYWxsIGFib3V0IDEyJSBzbG93ZXIgKDEuNzAg dnMuIDIuMDUgdXMKKwkgICBwZXIgaW9jdGwoKSkgKi8KKwlpZiAoc3RzMSAmIDEpCisJCXZibGFu ay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX0hCTEFOS0lORzsKKwlpZiAoc3RzMSAmIDgpCisJCXZibGFu ay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX1ZTWU5DSU5HOworCWlmICh2YmxhbmstPnZjb3VudCA+PSBt aW5mby0+ZmJjb24udmFyLnlyZXMpCisJCXZibGFuay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX1ZCTEFO S0lORzsKKwlpZiAodGVzdF9iaXQoMCwgJm1pbmZvLT5pcnFfZmxhZ3MpKSB7CisJCXZibGFuay0+ ZmxhZ3MgfD0gRkJfVkJMQU5LX0hBVkVfQ09VTlQ7CisJCS8qIE9ubHkgb25lIHdyaXRlciwgYWxp Z25lZCBpbnQgdmFsdWUuLi4KKwkJICAgaXQgc2hvdWxkIHdvcmsgd2l0aG91dCBsb2NrIGFuZCB3 aXRob3V0IGF0b21pY190ICovCisJCXZibGFuay0+Y291bnQgPSBtaW5mby0+Y3J0YzEudnN5bmMu Y250OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtYXRyb3hfYWx0b3V0IHBh bmVsbGlua19vdXRwdXQgPSB7CisJLm5hbWUJID0gIlBhbmVsbGluayBvdXRwdXQiLAorfTsKKwor c3RhdGljIGludCBtYXRyb3hmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgdW5z aWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3Ag PSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbyA9IGlu Zm8ybWluZm8oaW5mbyk7CisKKwlEQkcoX19mdW5jX18pCisKKwlpZiAobWluZm8tPmRlYWQpIHsK KwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZCSU9HRVRf VkJMQU5LOgorCQkJeworCQkJCXN0cnVjdCBmYl92YmxhbmsgdmJsYW5rOworCQkJCWludCBlcnI7 CisKKwkJCQllcnIgPSBtYXRyb3hmYl9nZXRfdmJsYW5rKG1pbmZvLCAmdmJsYW5rKTsKKwkJCQlp ZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZi bGFuaywgc2l6ZW9mKHZibGFuaykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4g MDsKKwkJCX0KKwkJY2FzZSBGQklPX1dBSVRGT1JWU1lOQzoKKwkJCXsKKwkJCQl1X2ludDMyX3Qg Y3J0OworCisJCQkJaWYgKGdldF91c2VyKGNydCwgKHVfaW50MzJfdCBfX3VzZXIgKilhcmcpKQor CQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCXJldHVybiBtYXRyb3hmYl93YWl0X2Zvcl9zeW5j KG1pbmZvLCBjcnQpOworCQkJfQorCQljYXNlIE1BVFJPWEZCX1NFVF9PVVRQVVRfTU9ERToKKwkJ CXsKKwkJCQlzdHJ1Y3QgbWF0cm94aW9jX291dHB1dF9tb2RlIG1vbTsKKwkJCQlzdHJ1Y3QgbWF0 cm94X2FsdG91dCAqb3Byb2M7CisJCQkJaW50IHZhbDsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNl cigmbW9tLCBhcmdwLCBzaXplb2YobW9tKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlm IChtb20ub3V0cHV0ID49IE1BVFJPWEZCX01BWF9PVVRQVVRTKQorCQkJCQlyZXR1cm4gLUVOWElP OworCQkJCWRvd25fcmVhZCgmbWluZm8tPmFsdG91dC5sb2NrKTsKKwkJCQlvcHJvYyA9IG1pbmZv LT5vdXRwdXRzW21vbS5vdXRwdXRdLm91dHB1dDsKKwkJCQlpZiAoIW9wcm9jKSB7CisJCQkJCXZh bCA9IC1FTlhJTzsKKwkJCQl9IGVsc2UgaWYgKCFvcHJvYy0+dmVyaWZ5bW9kZSkgeworCQkJCQlp ZiAobW9tLm1vZGUgPT0gTUFUUk9YRkJfT1VUUFVUX01PREVfTU9OSVRPUikgeworCQkJCQkJdmFs ID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZhbCA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQl9 IGVsc2UgeworCQkJCQl2YWwgPSBvcHJvYy0+dmVyaWZ5bW9kZShtaW5mby0+b3V0cHV0c1ttb20u b3V0cHV0XS5kYXRhLCBtb20ubW9kZSk7CisJCQkJfQorCQkJCWlmICghdmFsKSB7CisJCQkJCWlm IChtaW5mby0+b3V0cHV0c1ttb20ub3V0cHV0XS5tb2RlICE9IG1vbS5tb2RlKSB7CisJCQkJCQlt aW5mby0+b3V0cHV0c1ttb20ub3V0cHV0XS5tb2RlID0gbW9tLm1vZGU7CisJCQkJCQl2YWwgPSAx OworCQkJCQl9CisJCQkJfQorCQkJCXVwX3JlYWQoJm1pbmZvLT5hbHRvdXQubG9jayk7CisJCQkJ aWYgKHZhbCAhPSAxKQorCQkJCQlyZXR1cm4gdmFsOworCQkJCXN3aXRjaCAobWluZm8tPm91dHB1 dHNbbW9tLm91dHB1dF0uc3JjKSB7CisJCQkJCWNhc2UgTUFUUk9YRkJfU1JDX0NSVEMxOgorCQkJ CQkJbWF0cm94ZmJfc2V0X3BhcihpbmZvKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE1BVFJP WEZCX1NSQ19DUlRDMjoKKwkJCQkJCXsKKwkJCQkJCQlzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5m byogY3J0YzI7CisKKwkJCQkJCQlkb3duX3JlYWQoJm1pbmZvLT5jcnRjMi5sb2NrKTsKKwkJCQkJ CQljcnRjMiA9IG1pbmZvLT5jcnRjMi5pbmZvOworCQkJCQkJCWlmIChjcnRjMikKKwkJCQkJCQkJ Y3J0YzItPmZiY29uLmZib3BzLT5mYl9zZXRfcGFyKCZjcnRjMi0+ZmJjb24pOworCQkJCQkJCXVw X3JlYWQoJm1pbmZvLT5jcnRjMi5sb2NrKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0K KwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJY2FzZSBNQVRST1hGQl9HRVRfT1VUUFVUX01PREU6CisJ CQl7CisJCQkJc3RydWN0IG1hdHJveGlvY19vdXRwdXRfbW9kZSBtb207CisJCQkJc3RydWN0IG1h dHJveF9hbHRvdXQgKm9wcm9jOworCQkJCWludCB2YWw7CisKKwkJCQlpZiAoY29weV9mcm9tX3Vz ZXIoJm1vbSwgYXJncCwgc2l6ZW9mKG1vbSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlp ZiAobW9tLm91dHB1dCA+PSBNQVRST1hGQl9NQVhfT1VUUFVUUykKKwkJCQkJcmV0dXJuIC1FTlhJ TzsKKwkJCQlkb3duX3JlYWQoJm1pbmZvLT5hbHRvdXQubG9jayk7CisJCQkJb3Byb2MgPSBtaW5m by0+b3V0cHV0c1ttb20ub3V0cHV0XS5vdXRwdXQ7CisJCQkJaWYgKCFvcHJvYykgeworCQkJCQl2 YWwgPSAtRU5YSU87CisJCQkJfSBlbHNlIHsKKwkJCQkJbW9tLm1vZGUgPSBtaW5mby0+b3V0cHV0 c1ttb20ub3V0cHV0XS5tb2RlOworCQkJCQl2YWwgPSAwOworCQkJCX0KKwkJCQl1cF9yZWFkKCZt aW5mby0+YWx0b3V0LmxvY2spOworCQkJCWlmICh2YWwpCisJCQkJCXJldHVybiB2YWw7CisJCQkJ aWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbW9tLCBzaXplb2YobW9tKSkpCisJCQkJCXJldHVybiAt RUZBVUxUOworCQkJCXJldHVybiAwOworCQkJfQorCQljYXNlIE1BVFJPWEZCX1NFVF9PVVRQVVRf Q09OTkVDVElPTjoKKwkJCXsKKwkJCQl1X2ludDMyX3QgdG1wOworCQkJCWludCBpOworCQkJCWlu dCBjaGFuZ2VzOworCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIGFyZ3AsIHNpemVvZih0 bXApKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKysp IHsKKwkJCQkJaWYgKHRtcCAmICgxIDw8IGkpKSB7CisJCQkJCQlpZiAoaSA+PSBNQVRST1hGQl9N QVhfT1VUUFVUUykKKwkJCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCQkJaWYgKCFtaW5mby0+b3V0 cHV0c1tpXS5vdXRwdXQpCisJCQkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQkJCXN3aXRjaCAobWlu Zm8tPm91dHB1dHNbaV0uc3JjKSB7CisJCQkJCQkJY2FzZSBNQVRST1hGQl9TUkNfTk9ORToKKwkJ CQkJCQljYXNlIE1BVFJPWEZCX1NSQ19DUlRDMToKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVm YXVsdDoKKwkJCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJ CQlpZiAobWluZm8tPmRldmZsYWdzLnBhbmVsbGluaykgeworCQkJCQlpZiAodG1wICYgTUFUUk9Y RkJfT1VUUFVUX0NPTk5fREZQKSB7CisJCQkJCQlpZiAodG1wICYgTUFUUk9YRkJfT1VUUFVUX0NP Tk5fU0VDT05EQVJZKQorCQkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQkJZm9yIChpID0gMDsg aSA8IE1BVFJPWEZCX01BWF9PVVRQVVRTOyBpKyspIHsKKwkJCQkJCQlpZiAobWluZm8tPm91dHB1 dHNbaV0uc3JjID09IE1BVFJPWEZCX1NSQ19DUlRDMikgeworCQkJCQkJCQlyZXR1cm4gLUVCVVNZ OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljaGFuZ2VzID0gMDsKKwkJ CQlmb3IgKGkgPSAwOyBpIDwgTUFUUk9YRkJfTUFYX09VVFBVVFM7IGkrKykgeworCQkJCQlpZiAo dG1wICYgKDEgPDwgaSkpIHsKKwkJCQkJCWlmIChtaW5mby0+b3V0cHV0c1tpXS5zcmMgIT0gTUFU Uk9YRkJfU1JDX0NSVEMxKSB7CisJCQkJCQkJY2hhbmdlcyA9IDE7CisJCQkJCQkJbWluZm8tPm91 dHB1dHNbaV0uc3JjID0gTUFUUk9YRkJfU1JDX0NSVEMxOworCQkJCQkJfQorCQkJCQl9IGVsc2Ug aWYgKG1pbmZvLT5vdXRwdXRzW2ldLnNyYyA9PSBNQVRST1hGQl9TUkNfQ1JUQzEpIHsKKwkJCQkJ CWNoYW5nZXMgPSAxOworCQkJCQkJbWluZm8tPm91dHB1dHNbaV0uc3JjID0gTUFUUk9YRkJfU1JD X05PTkU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFjaGFuZ2VzKQorCQkJCQlyZXR1cm4gMDsK KwkJCQltYXRyb3hmYl9zZXRfcGFyKGluZm8pOworCQkJCXJldHVybiAwOworCQkJfQorCQljYXNl IE1BVFJPWEZCX0dFVF9PVVRQVVRfQ09OTkVDVElPTjoKKwkJCXsKKwkJCQl1X2ludDMyX3QgY29u biA9IDA7CisJCQkJaW50IGk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUFUUk9YRkJfTUFYX09V VFBVVFM7IGkrKykgeworCQkJCQlpZiAobWluZm8tPm91dHB1dHNbaV0uc3JjID09IE1BVFJPWEZC X1NSQ19DUlRDMSkgeworCQkJCQkJY29ubiB8PSAxIDw8IGk7CisJCQkJCX0KKwkJCQl9CisJCQkJ aWYgKHB1dF91c2VyKGNvbm4sICh1X2ludDMyX3QgX191c2VyICopYXJnKSkKKwkJCQkJcmV0dXJu IC1FRkFVTFQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWNhc2UgTUFUUk9YRkJfR0VUX0FWQUlM QUJMRV9PVVRQVVRTOgorCQkJeworCQkJCXVfaW50MzJfdCBjb25uID0gMDsKKwkJCQlpbnQgaTsK KworCQkJCWZvciAoaSA9IDA7IGkgPCBNQVRST1hGQl9NQVhfT1VUUFVUUzsgaSsrKSB7CisJCQkJ CWlmIChtaW5mby0+b3V0cHV0c1tpXS5vdXRwdXQpIHsKKwkJCQkJCXN3aXRjaCAobWluZm8tPm91 dHB1dHNbaV0uc3JjKSB7CisJCQkJCQkJY2FzZSBNQVRST1hGQl9TUkNfTk9ORToKKwkJCQkJCQlj YXNlIE1BVFJPWEZCX1NSQ19DUlRDMToKKwkJCQkJCQkJY29ubiB8PSAxIDw8IGk7CisJCQkJCQkJ CWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChtaW5mby0+ZGV2ZmxhZ3Mu cGFuZWxsaW5rKSB7CisJCQkJCWlmIChjb25uICYgTUFUUk9YRkJfT1VUUFVUX0NPTk5fREZQKQor CQkJCQkJY29ubiAmPSB+TUFUUk9YRkJfT1VUUFVUX0NPTk5fU0VDT05EQVJZOworCQkJCQlpZiAo Y29ubiAmIE1BVFJPWEZCX09VVFBVVF9DT05OX1NFQ09OREFSWSkKKwkJCQkJCWNvbm4gJj0gfk1B VFJPWEZCX09VVFBVVF9DT05OX0RGUDsKKwkJCQl9CisJCQkJaWYgKHB1dF91c2VyKGNvbm4sICh1 X2ludDMyX3QgX191c2VyICopYXJnKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJu IDA7CisJCQl9CisJCWNhc2UgTUFUUk9YRkJfR0VUX0FMTF9PVVRQVVRTOgorCQkJeworCQkJCXVf aW50MzJfdCBjb25uID0gMDsKKwkJCQlpbnQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBNQVRS T1hGQl9NQVhfT1VUUFVUUzsgaSsrKSB7CisJCQkJCWlmIChtaW5mby0+b3V0cHV0c1tpXS5vdXRw dXQpIHsKKwkJCQkJCWNvbm4gfD0gMSA8PCBpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwdXRf dXNlcihjb25uLCAodV9pbnQzMl90IF9fdXNlciAqKWFyZykpCisJCQkJCXJldHVybiAtRUZBVUxU OworCQkJCXJldHVybiAwOworCQkJfQorCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKKwkJCXsKKwkJ CQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHI7CisKKwkJCQltZW1zZXQoJnIsIDAsIHNpemVvZihy KSk7CisJCQkJc3RyY3B5KHIuZHJpdmVyLCAibWF0cm94ZmIiKTsKKwkJCQlzdHJjcHkoci5jYXJk LCAiTWF0cm94Iik7CisJCQkJc3ByaW50ZihyLmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUo bWluZm8tPnBjaWRldikpOworCQkJCXIudmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsMCwwKTsK KwkJCQlyLmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX09VVFBVVDsKKwkJCQlpZiAoY29w eV90b191c2VyKGFyZ3AsICZyLCBzaXplb2YocikpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJ CQlyZXR1cm4gMDsKKworCQkJfQorCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJCQl7CisJCQkJ c3RydWN0IHY0bDJfcXVlcnljdHJsIHFjdHJsOworCQkJCWludCBlcnI7CisKKwkJCQlpZiAoY29w eV9mcm9tX3VzZXIoJnFjdHJsLCBhcmdwLCBzaXplb2YocWN0cmwpKSkKKwkJCQkJcmV0dXJuIC1F RkFVTFQ7CisKKwkJCQlkb3duX3JlYWQoJm1pbmZvLT5hbHRvdXQubG9jayk7CisJCQkJaWYgKCFt aW5mby0+b3V0cHV0c1sxXS5vdXRwdXQpIHsKKwkJCQkJZXJyID0gLUVOWElPOworCQkJCX0gZWxz ZSBpZiAobWluZm8tPm91dHB1dHNbMV0ub3V0cHV0LT5nZXRxdWVyeWN0cmwpIHsKKwkJCQkJZXJy ID0gbWluZm8tPm91dHB1dHNbMV0ub3V0cHV0LT5nZXRxdWVyeWN0cmwobWluZm8tPm91dHB1dHNb MV0uZGF0YSwgJnFjdHJsKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJ CX0KKwkJCQl1cF9yZWFkKCZtaW5mby0+YWx0b3V0LmxvY2spOworCQkJCWlmIChlcnIgPj0gMCAm JgorCQkJCSAgICBjb3B5X3RvX3VzZXIoYXJncCwgJnFjdHJsLCBzaXplb2YocWN0cmwpKSkKKwkJ CQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJY2FzZSBWSURJT0Nf R19DVFJMOgorCQkJeworCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKwkJCQlpbnQgZXJy OworCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHJsLCBhcmdwLCBzaXplb2YoY3RybCkpKQor CQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCWRvd25fcmVhZCgmbWluZm8tPmFsdG91dC5sb2Nr KTsKKwkJCQlpZiAoIW1pbmZvLT5vdXRwdXRzWzFdLm91dHB1dCkgeworCQkJCQllcnIgPSAtRU5Y SU87CisJCQkJfSBlbHNlIGlmIChtaW5mby0+b3V0cHV0c1sxXS5vdXRwdXQtPmdldGN0cmwpIHsK KwkJCQkJZXJyID0gbWluZm8tPm91dHB1dHNbMV0ub3V0cHV0LT5nZXRjdHJsKG1pbmZvLT5vdXRw dXRzWzFdLmRhdGEsICZjdHJsKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSAtRUlOVkFMOwor CQkJCX0KKwkJCQl1cF9yZWFkKCZtaW5mby0+YWx0b3V0LmxvY2spOworCQkJCWlmIChlcnIgPj0g MCAmJgorCQkJCSAgICBjb3B5X3RvX3VzZXIoYXJncCwgJmN0cmwsIHNpemVvZihjdHJsKSkpCisJ CQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCWNhc2UgVklESU9D X1NfQ1RSTDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJCQkJaW50IGVy cjsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3RybCwgYXJncCwgc2l6ZW9mKGN0cmwpKSkK KwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQlkb3duX3JlYWQoJm1pbmZvLT5hbHRvdXQubG9j ayk7CisJCQkJaWYgKCFtaW5mby0+b3V0cHV0c1sxXS5vdXRwdXQpIHsKKwkJCQkJZXJyID0gLUVO WElPOworCQkJCX0gZWxzZSBpZiAobWluZm8tPm91dHB1dHNbMV0ub3V0cHV0LT5zZXRjdHJsKSB7 CisJCQkJCWVyciA9IG1pbmZvLT5vdXRwdXRzWzFdLm91dHB1dC0+c2V0Y3RybChtaW5mby0+b3V0 cHV0c1sxXS5kYXRhLCAmY3RybCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gLUVJTlZBTDsK KwkJCQl9CisJCQkJdXBfcmVhZCgmbWluZm8tPmFsdG91dC5sb2NrKTsKKwkJCQlyZXR1cm4gZXJy OworCQkJfQorCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyogMCB1bmJsYW5rLCAxIGJsYW5r LCAyIG5vIHZzeW5jLCAzIG5vIGhzeW5jLCA0IG9mZiAqLworCitzdGF0aWMgaW50IG1hdHJveGZi X2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHNlcTsKKwlp bnQgY3J0YzsKKwlDUklURkxBR1MKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gaW5m bzJtaW5mbyhpbmZvKTsKKworCURCRyhfX2Z1bmNfXykKKworCWlmIChtaW5mby0+ZGVhZCkKKwkJ cmV0dXJuIDE7CisKKwlzd2l0Y2ggKGJsYW5rKSB7CisJY2FzZSBGQl9CTEFOS19OT1JNQUw6ICBz ZXEgPSAweDIwOyBjcnRjID0gMHgwMDsgYnJlYWs7IC8qIHdvcmtzID8/PyAqLworCWNhc2UgRkJf QkxBTktfVlNZTkNfU1VTUEVORDogIHNlcSA9IDB4MjA7IGNydGMgPSAweDEwOyBicmVhazsKKwlj YXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6ICBzZXEgPSAweDIwOyBjcnRjID0gMHgyMDsgYnJl YWs7CisJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046ICBzZXEgPSAweDIwOyBjcnRjID0gMHgzMDsg YnJlYWs7CisJZGVmYXVsdDogc2VxID0gMHgwMDsgY3J0YyA9IDB4MDA7IGJyZWFrOworCX0KKwor CUNSSVRCRUdJTgorCisJbWdhX291dGIoTV9TRVFfSU5ERVgsIDEpOworCW1nYV9vdXRiKE1fU0VR X0RBVEEsIChtZ2FfaW5iKE1fU0VRX0RBVEEpICYgfjB4MjApIHwgc2VxKTsKKwltZ2Ffb3V0YihN X0VYVFZHQV9JTkRFWCwgMSk7CisJbWdhX291dGIoTV9FWFRWR0FfREFUQSwgKG1nYV9pbmIoTV9F WFRWR0FfREFUQSkgJiB+MHgzMCkgfCBjcnRjKTsKKworCUNSSVRFTkQKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl9vcHMgbWF0cm94ZmJfb3BzID0geworCS5vd25lciA9 CVRISVNfTU9EVUxFLAorCS5mYl9vcGVuID0JbWF0cm94ZmJfb3BlbiwKKwkuZmJfcmVsZWFzZSA9 CW1hdHJveGZiX3JlbGVhc2UsCisJLmZiX2NoZWNrX3ZhciA9CW1hdHJveGZiX2NoZWNrX3ZhciwK KwkuZmJfc2V0X3BhciA9CW1hdHJveGZiX3NldF9wYXIsCisJLmZiX3NldGNvbHJlZyA9CW1hdHJv eGZiX3NldGNvbHJlZywKKwkuZmJfcGFuX2Rpc3BsYXkgPW1hdHJveGZiX3Bhbl9kaXNwbGF5LAor CS5mYl9ibGFuayA9CW1hdHJveGZiX2JsYW5rLAorCS5mYl9pb2N0bCA9CW1hdHJveGZiX2lvY3Rs LAorLyoJLmZiX2ZpbGxyZWN0ID0JPHNldCBieSBtYXRyb3hfY2ZiWF9pbml0PiwgKi8KKy8qCS5m Yl9jb3B5YXJlYSA9CTxzZXQgYnkgbWF0cm94X2NmYlhfaW5pdD4sICovCisvKgkuZmJfaW1hZ2Vi bGl0ID0JPHNldCBieSBtYXRyb3hfY2ZiWF9pbml0PiwgKi8KKy8qCS5mYl9jdXJzb3IgPQk8c2V0 IGJ5IG1hdHJveF9jZmJYX2luaXQ+LCAqLworfTsKKworI2RlZmluZSBSU0RlcHRoKFgpCSgoKFgp ID4+IDgpICYgMHgwRikKKyNkZWZpbmUgUlM4YnBwCQkweDEKKyNkZWZpbmUgUlMxNWJwcAkJMHgy CisjZGVmaW5lIFJTMTZicHAJCTB4MworI2RlZmluZSBSUzMyYnBwCQkweDQKKyNkZWZpbmUgUlM0 YnBwCQkweDUKKyNkZWZpbmUgUlMyNGJwcAkJMHg2CisjZGVmaW5lIFJTVGV4dAkJMHg3CisjZGVm aW5lIFJTVGV4dDgJCTB4OAorLyogOS1GICovCitzdGF0aWMgc3RydWN0IHsgc3RydWN0IGZiX2Jp dGZpZWxkIHJlZCwgZ3JlZW4sIGJsdWUsIHRyYW5zcDsgaW50IGJpdHNfcGVyX3BpeGVsOyB9IGNv bG9yc1tdID0geworCXsgeyAgMCwgOCwgMH0sIHsgMCwgOCwgMH0sIHsgMCwgOCwgMH0sIHsgIDAs IDAsIDB9LCAgOCB9LAorCXsgeyAxMCwgNSwgMH0sIHsgNSwgNSwgMH0sIHsgMCwgNSwgMH0sIHsg MTUsIDEsIDB9LCAxNiB9LAorCXsgeyAxMSwgNSwgMH0sIHsgNSwgNiwgMH0sIHsgMCwgNSwgMH0s IHsgIDAsIDAsIDB9LCAxNiB9LAorCXsgeyAxNiwgOCwgMH0sIHsgOCwgOCwgMH0sIHsgMCwgOCwg MH0sIHsgMjQsIDgsIDB9LCAzMiB9LAorCXsgeyAgMCwgOCwgMH0sIHsgMCwgOCwgMH0sIHsgMCwg OCwgMH0sIHsgIDAsIDAsIDB9LCAgNCB9LAorCXsgeyAxNiwgOCwgMH0sIHsgOCwgOCwgMH0sIHsg MCwgOCwgMH0sIHsgIDAsIDAsIDB9LCAyNCB9LAorCXsgeyAgMCwgNiwgMH0sIHsgMCwgNiwgMH0s IHsgMCwgNiwgMH0sIHsgIDAsIDAsIDB9LCAgMCB9LAkvKiB0ZXh0bW9kZSB3aXRoIChkZWZhdWx0 KSBWR0E4eDE2ICovCisJeyB7ICAwLCA2LCAwfSwgeyAwLCA2LCAwfSwgeyAwLCA2LCAwfSwgeyAg MCwgMCwgMH0sICAwIH0sCS8qIHRleHRtb2RlIGhhcmR3aXJlZCB0byBWR0E4eDggKi8KK307CisK Ky8qIGluaXRpYWxpemVkIGJ5IHNldHVwLCBzZWUgZXhwbGFuYXRpb24gYXQgZW5kIG9mIGZpbGUg KHNlYXJjaCBmb3IgTU9EVUxFX1BBUk1fREVTQykgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVt OwkJLyogIm1hdHJveGZiOm1lbTp4eHh4eE0iICovCitzdGF0aWMgaW50IG9wdGlvbl9wcmVjaXNl X3dpZHRoID0gMTsJLyogY2Fubm90IGJlIGNoYW5nZWQsIG9wdGlvbl9wcmVjaXNlX3dpZHRoPT0w IG11c3QgaW1wbHkgbm9hY2NlbCAqLworc3RhdGljIGludCBpbnYyNDsJCQkvKiAibWF0cm94ZmI6 aW52MjQiICovCitzdGF0aWMgaW50IGNyb3NzNE1CID0gLTE7CQkvKiAibWF0cm94ZmI6Y3Jvc3M0 TUIiICovCitzdGF0aWMgaW50IGRpc2FibGVkOwkJCS8qICJtYXRyb3hmYjpkaXNhYmxlZCIgKi8K K3N0YXRpYyBpbnQgbm9hY2NlbDsJCQkvKiAibWF0cm94ZmI6bm9hY2NlbCIgKi8KK3N0YXRpYyBp bnQgbm9wYW47CQkJLyogIm1hdHJveGZiOm5vcGFuIiAqLworc3RhdGljIGludCBub19wY2lfcmV0 cnk7CQkvKiAibWF0cm94ZmI6bm9wY2lyZXRyeSIgKi8KK3N0YXRpYyBpbnQgbm92Z2E7CQkJLyog Im1hdHJveGZiOm5vdmdhIiAqLworc3RhdGljIGludCBub2Jpb3M7CQkJLyogIm1hdHJveGZiOm5v YmlvcyIgKi8KK3N0YXRpYyBpbnQgbm9pbml0ID0gMTsJCQkvKiAibWF0cm94ZmI6aW5pdCIgKi8K K3N0YXRpYyBpbnQgaW52ZXJzZTsJCQkvKiAibWF0cm94ZmI6aW52ZXJzZSIgKi8KK3N0YXRpYyBp bnQgc2dyYW07CQkJLyogIm1hdHJveGZiOnNncmFtIiAqLworc3RhdGljIGludCBtdHJyID0gMTsJ CQkvKiAibWF0cm94ZmI6bm9tdHJyIiAqLworc3RhdGljIGludCBncmF5c2NhbGU7CQkJLyogIm1h dHJveGZiOmdyYXlzY2FsZSIgKi8KK3N0YXRpYyBpbnQgZGV2ID0gLTE7CQkJLyogIm1hdHJveGZi OmRldjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVzYSA9IH4wOwkJLyogIm1hdHJv eGZiOnZlc2E6eHh4eHgiICovCitzdGF0aWMgaW50IGRlcHRoID0gLTE7CQkJLyogIm1hdHJveGZi OmRlcHRoOnh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCB4cmVzOwkJLyogIm1hdHJveGZi OnhyZXM6eHh4eHgiICovCitzdGF0aWMgdW5zaWduZWQgaW50IHlyZXM7CQkvKiAibWF0cm94ZmI6 eXJlczp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXBwZXIgPSB+MDsJCS8qICJtYXRy b3hmYjp1cHBlcjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG93ZXIgPSB+MDsJCS8q ICJtYXRyb3hmYjpsb3dlcjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnNsZW47CQkv KiAibWF0cm94ZmI6dnNsZW46eHh4eHgiICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZnQgPSB+ MDsJCS8qICJtYXRyb3hmYjpsZWZ0Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCByaWdo dCA9IH4wOwkJLyogIm1hdHJveGZiOnJpZ2h0Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGlu dCBoc2xlbjsJCS8qICJtYXRyb3hmYjpoc2xlbjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBp bnQgcGl4Y2xvY2s7CQkvKiAibWF0cm94ZmI6cGl4Y2xvY2s6eHh4eHgiICovCitzdGF0aWMgaW50 IHN5bmMgPSAtMTsJCQkvKiAibWF0cm94ZmI6c3luYzp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25l ZCBpbnQgZnY7CQkJLyogIm1hdHJveGZiOmZ2Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGlu dCBmaDsJCQkvKiAibWF0cm94ZmI6Zmg6eHh4eHhrIiAqLworc3RhdGljIHVuc2lnbmVkIGludCBt YXhjbGs7CQkvKiAibWF0cm94ZmI6bWF4Y2xrOnh4eHhNIiAqLworc3RhdGljIGludCBkZnA7CQkJ CS8qICJtYXRyb3hmYjpkZnAgKi8KK3N0YXRpYyBpbnQgZGZwX3R5cGUgPSAtMTsJCS8qICJtYXRy b3hmYjpkZnA6eHh4ICovCitzdGF0aWMgaW50IG1lbXR5cGUgPSAtMTsJCS8qICJtYXRyb3hmYjpt ZW10eXBlOnh4eCIgKi8KK3N0YXRpYyBjaGFyIG91dHB1dHNbOF07CQkJLyogIm1hdHJveGZiOm91 dHB1dHM6eHh4IiAqLworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgdmlkZW9tb2RlWzY0 XTsJCS8qICJtYXRyb3hmYjptb2RlOnh4eHh4IiBvciAibWF0cm94ZmI6eHh4eHgiICovCisjZW5k aWYKKworc3RhdGljIGludCBtYXRyb3hmYl9nZXRtZW1vcnkoc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtYXhTaXplLCB1bnNpZ25lZCBpbnQgKnJl YWxTaXplKQoreworCXZhZGRyX3Qgdm07CisJdW5zaWduZWQgaW50IG9mZnM7CisJdW5zaWduZWQg aW50IG9mZnMyOworCXVuc2lnbmVkIGNoYXIgb3JpZzsKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzWzMy XTsKKwl1bnNpZ25lZCBjaGFyKiB0bXA7CisKKwlEQkcoX19mdW5jX18pCisKKwl2bSA9IG1pbmZv LT52aWRlby52YmFzZTsKKwltYXhTaXplICY9IH4weDFGRkZGRjsJLyogbXVzdCBiZSBYKjJNQiAo cmVhbGx5IGl0IG11c3QgYmUgMiBvciBYKjRNQikgKi8KKwkvKiBhdCBsZWFzdCAyTUIgKi8KKwlp ZiAobWF4U2l6ZSA8IDB4MDIwMDAwMCkgcmV0dXJuIDA7CisJaWYgKG1heFNpemUgPiAweDIwMDAw MDApIG1heFNpemUgPSAweDIwMDAwMDA7CisKKwltZ2Ffb3V0YihNX0VYVFZHQV9JTkRFWCwgMHgw Myk7CisJb3JpZyA9IG1nYV9pbmIoTV9FWFRWR0FfREFUQSk7CisJbWdhX291dGIoTV9FWFRWR0Ff REFUQSwgb3JpZyB8IDB4ODApOworCisJdG1wID0gYnl0ZXM7CisJZm9yIChvZmZzID0gMHgxMDAw MDA7IG9mZnMgPCBtYXhTaXplOyBvZmZzICs9IDB4MjAwMDAwKQorCQkqdG1wKysgPSBtZ2FfcmVh ZGIodm0sIG9mZnMpOworCWZvciAob2ZmcyA9IDB4MTAwMDAwOyBvZmZzIDwgbWF4U2l6ZTsgb2Zm cyArPSAweDIwMDAwMCkKKwkJbWdhX3dyaXRlYih2bSwgb2ZmcywgMHgwMik7CisJbWdhX291dGIo TV9DQUNIRUZMVVNILCAweDAwKTsKKwlmb3IgKG9mZnMgPSAweDEwMDAwMDsgb2ZmcyA8IG1heFNp emU7IG9mZnMgKz0gMHgyMDAwMDApIHsKKwkJaWYgKG1nYV9yZWFkYih2bSwgb2ZmcykgIT0gMHgw MikKKwkJCWJyZWFrOworCQltZ2Ffd3JpdGViKHZtLCBvZmZzLCBtZ2FfcmVhZGIodm0sIG9mZnMp IC0gMHgwMik7CisJCWlmIChtZ2FfcmVhZGIodm0sIG9mZnMpKQorCQkJYnJlYWs7CisJfQorCXRt cCA9IGJ5dGVzOworCWZvciAob2ZmczIgPSAweDEwMDAwMDsgb2ZmczIgPCBtYXhTaXplOyBvZmZz MiArPSAweDIwMDAwMCkKKwkJbWdhX3dyaXRlYih2bSwgb2ZmczIsICp0bXArKyk7CisKKwltZ2Ff b3V0YihNX0VYVFZHQV9JTkRFWCwgMHgwMyk7CisJbWdhX291dGIoTV9FWFRWR0FfREFUQSwgb3Jp Zyk7CisKKwkqcmVhbFNpemUgPSBvZmZzIC0gMHgxMDAwMDA7CisjaWZkZWYgQ09ORklHX0ZCX01B VFJPWF9NSUxMRU5JVU0KKwltaW5mby0+aW50ZXJsZWF2ZSA9ICEoIWlzTWlsbGVuaXVtKG1pbmZv KSB8fCAoKG9mZnMgLSAweDEwMDAwMCkgJiAweDNGRkZGRikpOworI2VuZGlmCisJcmV0dXJuIDE7 Cit9CisKK3N0cnVjdCB2aWRlb19ib2FyZCB7CisJaW50IG1heHZyYW07CisJaW50IG1heGRpc3Bs YXlhYmxlOworCWludCBhY2NlbElEOworCXN0cnVjdCBtYXRyb3hfc3dpdGNoKiBsb3dsZXZlbDsK KwkJIH07CisjaWZkZWYgQ09ORklHX0ZCX01BVFJPWF9NSUxMRU5JVU0KK3N0YXRpYyBzdHJ1Y3Qg dmlkZW9fYm9hcmQgdmJNaWxsZW5uaXVtID0geworCS5tYXh2cmFtID0gMHgwODAwMDAwLAorCS5t YXhkaXNwbGF5YWJsZSA9IDB4MDgwMDAwMCwKKwkuYWNjZWxJRCA9IEZCX0FDQ0VMX01BVFJPWF9N R0EyMDY0VywKKwkubG93bGV2ZWwgPSAmbWF0cm94X21pbGxlbm5pdW0KK307CisKK3N0YXRpYyBz dHJ1Y3QgdmlkZW9fYm9hcmQgdmJNaWxsZW5uaXVtMiA9IHsKKwkubWF4dnJhbSA9IDB4MTAwMDAw MCwKKwkubWF4ZGlzcGxheWFibGUgPSAweDA4MDAwMDAsCisJLmFjY2VsSUQgPSBGQl9BQ0NFTF9N QVRST1hfTUdBMjE2NFcsCisJLmxvd2xldmVsID0gJm1hdHJveF9taWxsZW5uaXVtCit9OworCitz dGF0aWMgc3RydWN0IHZpZGVvX2JvYXJkIHZiTWlsbGVubml1bTJBID0geworCS5tYXh2cmFtID0g MHgxMDAwMDAwLAorCS5tYXhkaXNwbGF5YWJsZSA9IDB4MDgwMDAwMCwKKwkuYWNjZWxJRCA9IEZC X0FDQ0VMX01BVFJPWF9NR0EyMTY0V19BR1AsCisJLmxvd2xldmVsID0gJm1hdHJveF9taWxsZW5u aXVtCit9OworI2VuZGlmCS8qIENPTkZJR19GQl9NQVRST1hfTUlMTEVOSVVNICovCisjaWZkZWYg Q09ORklHX0ZCX01BVFJPWF9NWVNUSVFVRQorc3RhdGljIHN0cnVjdCB2aWRlb19ib2FyZCB2Yk15 c3RpcXVlID0geworCS5tYXh2cmFtID0gMHgwODAwMDAwLAorCS5tYXhkaXNwbGF5YWJsZSA9IDB4 MDgwMDAwMCwKKwkuYWNjZWxJRCA9IEZCX0FDQ0VMX01BVFJPWF9NR0ExMDY0U0csCisJLmxvd2xl dmVsID0gJm1hdHJveF9teXN0aXF1ZQorfTsKKyNlbmRpZgkvKiBDT05GSUdfRkJfTUFUUk9YX01Z U1RJUVVFICovCisjaWZkZWYgQ09ORklHX0ZCX01BVFJPWF9HCitzdGF0aWMgc3RydWN0IHZpZGVv X2JvYXJkIHZiRzEwMCA9IHsKKwkubWF4dnJhbSA9IDB4MDgwMDAwMCwKKwkubWF4ZGlzcGxheWFi bGUgPSAweDA4MDAwMDAsCisJLmFjY2VsSUQgPSBGQl9BQ0NFTF9NQVRST1hfTUdBRzEwMCwKKwku bG93bGV2ZWwgPSAmbWF0cm94X0cxMDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fYm9hcmQg dmJHMjAwID0geworCS5tYXh2cmFtID0gMHgxMDAwMDAwLAorCS5tYXhkaXNwbGF5YWJsZSA9IDB4 MTAwMDAwMCwKKwkuYWNjZWxJRCA9IEZCX0FDQ0VMX01BVFJPWF9NR0FHMjAwLAorCS5sb3dsZXZl bCA9ICZtYXRyb3hfRzEwMAorfTsKKy8qIGZyb20gZG9jIGl0IGxvb2tzIGxpa2UgdGhhdCBhY2Nl bGVyYXRvciBjYW4gZHJhdyBvbmx5IHRvIGxvdyAxNk1CIDotKCBEaXJlY3QgYWNjZXNzZXMgJiBk aXNwbGF5aW5nIGFyZSBPSyBmb3IKKyAgIHdob2xlIDMyTUIgKi8KK3N0YXRpYyBzdHJ1Y3Qgdmlk ZW9fYm9hcmQgdmJHNDAwID0geworCS5tYXh2cmFtID0gMHgyMDAwMDAwLAorCS5tYXhkaXNwbGF5 YWJsZSA9IDB4MTAwMDAwMCwKKwkuYWNjZWxJRCA9IEZCX0FDQ0VMX01BVFJPWF9NR0FHNDAwLAor CS5sb3dsZXZlbCA9ICZtYXRyb3hfRzEwMAorfTsKKyNlbmRpZgorCisjZGVmaW5lIERFVkZfVklE RU82NEJJVAkJMHgwMDAxCisjZGVmaW5lCURFVkZfU1dBUFMJCTB4MDAwMgorI2RlZmluZSBERVZG X1NSQ09SRwkJMHgwMDA0CisjZGVmaW5lIERFVkZfRFVBTEhFQUQJCTB4MDAwOAorI2RlZmluZSBE RVZGX0NST1NTNE1CCQkweDAwMTAKKyNkZWZpbmUgREVWRl9URVhUNEIJCTB4MDAyMAorLyogI2Rl ZmluZSBERVZGX3JlY3ljbGVkCTB4MDA0MAkqLworLyogI2RlZmluZSBERVZGX3JlY3ljbGVkCTB4 MDA4MAkqLworI2RlZmluZSBERVZGX1NVUFBPUlQzMk1CCTB4MDEwMAorI2RlZmluZSBERVZGX0FO WV9WWFJFUwkJMHgwMjAwCisjZGVmaW5lIERFVkZfVEVYVDE2QgkJMHgwNDAwCisjZGVmaW5lIERF VkZfQ1JUQzIJCTB4MDgwMAorI2RlZmluZSBERVZGX01BVkVOX0NBUEFCTEUJMHgxMDAwCisjZGVm aW5lIERFVkZfUEFORUxMSU5LX0NBUEFCTEUJMHgyMDAwCisjZGVmaW5lIERFVkZfRzQ1MERBQwkJ MHg0MDAwCisKKyNkZWZpbmUgREVWRl9HQ09SRQkoREVWRl9WSURFTzY0QklUIHwgREVWRl9TV0FQ UyB8IERFVkZfQ1JPU1M0TUIpCisjZGVmaW5lIERFVkZfRzJDT1JFCShERVZGX0dDT1JFIHwgREVW Rl9BTllfVlhSRVMgfCBERVZGX01BVkVOX0NBUEFCTEUgfCBERVZGX1BBTkVMTElOS19DQVBBQkxF IHwgREVWRl9TUkNPUkcgfCBERVZGX0RVQUxIRUFEKQorI2RlZmluZSBERVZGX0cxMDAJKERFVkZf R0NPUkUpIC8qIG5vIGRvYywgbm8gdnhyZXMuLi4gKi8KKyNkZWZpbmUgREVWRl9HMjAwCShERVZG X0cyQ09SRSkKKyNkZWZpbmUgREVWRl9HNDAwCShERVZGX0cyQ09SRSB8IERFVkZfU1VQUE9SVDMy TUIgfCBERVZGX1RFWFQxNkIgfCBERVZGX0NSVEMyKQorLyogaWYgeW91J2xsIGZpbmQgaG93IHRv IGRyaXZlIERGUC4uLiAqLworI2RlZmluZSBERVZGX0c0NTAJKERFVkZfR0NPUkUgfCBERVZGX0FO WV9WWFJFUyB8IERFVkZfU1VQUE9SVDMyTUIgfCBERVZGX1RFWFQxNkIgfCBERVZGX0NSVEMyIHwg REVWRl9HNDUwREFDIHwgREVWRl9TUkNPUkcgfCBERVZGX0RVQUxIRUFEKQorI2RlZmluZSBERVZG X0c1NTAJKERFVkZfRzQ1MCkKKworc3RhdGljIHN0cnVjdCBib2FyZCB7CisJdW5zaWduZWQgc2hv cnQgdmVuZG9yLCBkZXZpY2UsIHJldiwgc3ZpZCwgc2lkOworCXVuc2lnbmVkIGludCBmbGFnczsK Kwl1bnNpZ25lZCBpbnQgbWF4Y2xrOworCWVudW0gbWdhX2NoaXAgY2hpcDsKKwlzdHJ1Y3Qgdmlk ZW9fYm9hcmQqIGJhc2U7CisJY29uc3QgY2hhciogbmFtZTsKKwkJfSBkZXZfbGlzdFtdID0gewor I2lmZGVmIENPTkZJR19GQl9NQVRST1hfTUlMTEVOSVVNCisJe1BDSV9WRU5ET1JfSURfTUFUUk9Y LAlQQ0lfREVWSUNFX0lEX01BVFJPWF9NSUwsCTB4RkYsCisJCTAsCQkJMCwKKwkJREVWRl9URVhU NEIsCisJCTIzMDAwMCwKKwkJTUdBXzIwNjQsCisJCSZ2Yk1pbGxlbm5pdW0sCisJCSJNaWxsZW5u aXVtIChQQ0kpIn0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJP WF9NSUxfMiwJMHhGRiwKKwkJMCwJCQkwLAorCQlERVZGX1NXQVBTLAorCQkyMjAwMDAsCisJCU1H QV8yMTY0LAorCQkmdmJNaWxsZW5uaXVtMiwKKwkJIk1pbGxlbm5pdW0gSUkgKFBDSSkifSwKKwl7 UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX01JTF8yX0FHUCwJMHhG RiwKKwkJMCwJCQkwLAorCQlERVZGX1NXQVBTLAorCQkyNTAwMDAsCisJCU1HQV8yMTY0LAorCQkm dmJNaWxsZW5uaXVtMkEsCisJCSJNaWxsZW5uaXVtIElJIChBR1ApIn0sCisjZW5kaWYKKyNpZmRl ZiBDT05GSUdfRkJfTUFUUk9YX01ZU1RJUVVFCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lf REVWSUNFX0lEX01BVFJPWF9NWVMsCTB4MDIsCisJCTAsCQkJMCwKKwkJREVWRl9WSURFTzY0QklU IHwgREVWRl9DUk9TUzRNQiwKKwkJMTgwMDAwLAorCQlNR0FfMTA2NCwKKwkJJnZiTXlzdGlxdWUs CisJCSJNeXN0aXF1ZSAoUENJKSJ9LAorCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJUENJX0RFVklD RV9JRF9NQVRST1hfTVlTLAkweEZGLAorCQkwLAkJCTAsCisJCURFVkZfVklERU82NEJJVCB8IERF VkZfU1dBUFMgfCBERVZGX0NST1NTNE1CLAorCQkyMjAwMDAsCisJCU1HQV8xMTY0LAorCQkmdmJN eXN0aXF1ZSwKKwkJIk15c3RpcXVlIDIyMCAoUENJKSJ9LAorCXtQQ0lfVkVORE9SX0lEX01BVFJP WCwJUENJX0RFVklDRV9JRF9NQVRST1hfTVlTX0FHUCwJMHgwMiwKKwkJMCwJCQkwLAorCQlERVZG X1ZJREVPNjRCSVQgfCBERVZGX0NST1NTNE1CLAorCQkxODAwMDAsCisJCU1HQV8xMDY0LAorCQkm dmJNeXN0aXF1ZSwKKwkJIk15c3RpcXVlIChBR1ApIn0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9Y LAlQQ0lfREVWSUNFX0lEX01BVFJPWF9NWVNfQUdQLAkweEZGLAorCQkwLAkJCTAsCisJCURFVkZf VklERU82NEJJVCB8IERFVkZfU1dBUFMgfCBERVZGX0NST1NTNE1CLAorCQkyMjAwMDAsCisJCU1H QV8xMTY0LAorCQkmdmJNeXN0aXF1ZSwKKwkJIk15c3RpcXVlIDIyMCAoQUdQKSJ9LAorI2VuZGlm CisjaWZkZWYgQ09ORklHX0ZCX01BVFJPWF9HCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lf REVWSUNFX0lEX01BVFJPWF9HMTAwX01NLAkweEZGLAorCQkwLAkJCTAsCisJCURFVkZfRzEwMCwK KwkJMjMwMDAwLAorCQlNR0FfRzEwMCwKKwkJJnZiRzEwMCwKKwkJIk1HQS1HMTAwIChQQ0kpIn0s CisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMTAwX0FHUCwJ MHhGRiwKKwkJMCwJCQkwLAorCQlERVZGX0cxMDAsCisJCTIzMDAwMCwKKwkJTUdBX0cxMDAsCisJ CSZ2YkcxMDAsCisJCSJNR0EtRzEwMCAoQUdQKSJ9LAorCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJ UENJX0RFVklDRV9JRF9NQVRST1hfRzIwMF9QQ0ksCTB4RkYsCisJCTAsCQkJMCwKKwkJREVWRl9H MjAwLAorCQkyNTAwMDAsCisJCU1HQV9HMjAwLAorCQkmdmJHMjAwLAorCQkiTUdBLUcyMDAgKFBD SSkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBf QUdQLAkweEZGLAorCQlQQ0lfU1NfVkVORE9SX0lEX01BVFJPWCwJUENJX1NTX0lEX01BVFJPWF9H RU5FUklDLAorCQlERVZGX0cyMDAsCisJCTIyMDAwMCwKKwkJTUdBX0cyMDAsCisJCSZ2YkcyMDAs CisJCSJNR0EtRzIwMCAoQUdQKSJ9LAorCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJUENJX0RFVklD RV9JRF9NQVRST1hfRzIwMF9BR1AsCTB4RkYsCisJCVBDSV9TU19WRU5ET1JfSURfTUFUUk9YLAlQ Q0lfU1NfSURfTUFUUk9YX01ZU1RJUVVFX0cyMDBfQUdQLAorCQlERVZGX0cyMDAsCisJCTIzMDAw MCwKKwkJTUdBX0cyMDAsCisJCSZ2YkcyMDAsCisJCSJNeXN0aXF1ZSBHMjAwIChBR1ApIn0sCisJ e1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX0FHUCwJMHhG RiwKKwkJUENJX1NTX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9TU19JRF9NQVRST1hfTUlMTEVOSVVN X0cyMDBfQUdQLAorCQlERVZGX0cyMDAsCisJCTI1MDAwMCwKKwkJTUdBX0cyMDAsCisJCSZ2Ykcy MDAsCisJCSJNaWxsZW5uaXVtIEcyMDAgKEFHUCkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRST1gs CVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfQUdQLAkweEZGLAorCQlQQ0lfU1NfVkVORE9SX0lE X01BVFJPWCwJUENJX1NTX0lEX01BVFJPWF9NQVJWRUxfRzIwMF9BR1AsCisJCURFVkZfRzIwMCwK KwkJMjMwMDAwLAorCQlNR0FfRzIwMCwKKwkJJnZiRzIwMCwKKwkJIk1hcnZlbCBHMjAwIChBR1Ap In0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX0FH UCwJMHhGRiwKKwkJUENJX1NTX1ZFTkRPUl9JRF9TSUVNRU5TX05JWERPUkYsCVBDSV9TU19JRF9T SUVNRU5TX01HQV9HMjAwX0FHUCwKKwkJREVWRl9HMjAwLAorCQkyMzAwMDAsCisJCU1HQV9HMjAw LAorCQkmdmJHMjAwLAorCQkiTUdBLUcyMDAgKEFHUCkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRS T1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfQUdQLAkweEZGLAorCQkwLAkJCTAsCisJCURF VkZfRzIwMCwKKwkJMjMwMDAwLAorCQlNR0FfRzIwMCwKKwkJJnZiRzIwMCwKKwkJIkcyMDAgKEFH UCkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0c0MDAs CTB4ODAsCisJCVBDSV9TU19WRU5ET1JfSURfTUFUUk9YLAlQQ0lfU1NfSURfTUFUUk9YX01JTExF Tk5JVU1fRzQwMF9NQVhfQUdQLAorCQlERVZGX0c0MDAsCisJCTM2MDAwMCwKKwkJTUdBX0c0MDAs CisJCSZ2Ykc0MDAsCisJCSJNaWxsZW5uaXVtIEc0MDAgTUFYIChBR1ApIn0sCisJe1BDSV9WRU5E T1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HNDAwLAkweDgwLAorCQkwLAkJCTAs CisJCURFVkZfRzQwMCwKKwkJMzAwMDAwLAorCQlNR0FfRzQwMCwKKwkJJnZiRzQwMCwKKwkJIkc0 MDAgKEFHUCkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9Y X0c0MDAsCTB4RkYsCisJCTAsCQkJMCwKKwkJREVWRl9HNDUwLAorCQkzNjAwMDAsCisJCU1HQV9H NDUwLAorCQkmdmJHNDAwLAorCQkiRzQ1MCJ9LAorCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJUENJ X0RFVklDRV9JRF9NQVRST1hfRzU1MCwJMHhGRiwKKwkJMCwJCQkwLAorCQlERVZGX0c1NTAsCisJ CTM2MDAwMCwKKwkJTUdBX0c1NTAsCisJCSZ2Ykc0MDAsCisJCSJHNTUwIn0sCisjZW5kaWYKKwl7 MCwJCQkwLAkJCQkweEZGLAorCQkwLAkJCTAsCisJCTAsCisJCTAsCisJCTAsCisJCU5VTEwsCisJ CU5VTEx9fTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9t b2RlIGRlZmF1bHRtb2RlID0geworCS8qIDY0MHg0ODAgQCA2MEh6LCAzMS41IGtIeiAqLworCU5V TEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjEsIDQwLCAyNCwgMzIsIDExLCA5NiwgMiwKKwkwLCBGQl9W TU9ERV9OT05JTlRFUkxBQ0VECit9OworCitzdGF0aWMgaW50IGhvdHBsdWcgPSAwOworI2VuZGlm IC8qICFNT0RVTEUgKi8KKworc3RhdGljIHZvaWQgc2V0RGVmYXVsdE91dHB1dHMoc3RydWN0IG1h dHJveF9mYl9pbmZvICptaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyKiBw dHI7CisKKwltaW5mby0+b3V0cHV0c1swXS5kZWZhdWx0X3NyYyA9IE1BVFJPWEZCX1NSQ19DUlRD MTsKKwlpZiAobWluZm8tPmRldmZsYWdzLmc0NTBkYWMpIHsKKwkJbWluZm8tPm91dHB1dHNbMV0u ZGVmYXVsdF9zcmMgPSBNQVRST1hGQl9TUkNfQ1JUQzE7CisJCW1pbmZvLT5vdXRwdXRzWzJdLmRl ZmF1bHRfc3JjID0gTUFUUk9YRkJfU1JDX0NSVEMxOworCX0gZWxzZSBpZiAoZGZwKSB7CisJCW1p bmZvLT5vdXRwdXRzWzJdLmRlZmF1bHRfc3JjID0gTUFUUk9YRkJfU1JDX0NSVEMxOworCX0KKwlw dHIgPSBvdXRwdXRzOworCWZvciAoaSA9IDA7IGkgPCBNQVRST1hGQl9NQVhfT1VUUFVUUzsgaSsr KSB7CisJCWNoYXIgYyA9ICpwdHIrKzsKKworCQlpZiAoYyA9PSAwKSB7CisJCQlicmVhazsKKwkJ fQorCQlpZiAoYyA9PSAnMCcpIHsKKwkJCW1pbmZvLT5vdXRwdXRzW2ldLmRlZmF1bHRfc3JjID0g TUFUUk9YRkJfU1JDX05PTkU7CisJCX0gZWxzZSBpZiAoYyA9PSAnMScpIHsKKwkJCW1pbmZvLT5v dXRwdXRzW2ldLmRlZmF1bHRfc3JjID0gTUFUUk9YRkJfU1JDX0NSVEMxOworCQl9IGVsc2UgaWYg KGMgPT0gJzInICYmIG1pbmZvLT5kZXZmbGFncy5jcnRjMikgeworCQkJbWluZm8tPm91dHB1dHNb aV0uZGVmYXVsdF9zcmMgPSBNQVRST1hGQl9TUkNfQ1JUQzI7CisJCX0gZWxzZSB7CisJCQlwcmlu dGsoS0VSTl9FUlIgIm1hdHJveGZiOiBVbmtub3duIG91dHB1dHMgc2V0dGluZ1xuIik7CisJCQli cmVhazsKKwkJfQorCX0KKwkvKiBOdWxsaWZ5IHRoaXMgb3B0aW9uIGZvciBzdWJzZXF1ZW50IGFk YXB0ZXJzICovCisJb3V0cHV0c1swXSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdE1hdHJveDIo c3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgc3RydWN0IGJvYXJkICpiKQoreworCXVuc2ln bmVkIGxvbmcgY3RybHB0cl9waHlzID0gMDsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX2Jhc2VfcGh5 cyA9IDA7CisJdW5zaWduZWQgaW50IG1lbXNpemU7CisJaW50IGVycjsKKworCXN0YXRpYyBjb25z dCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbnRlbF84MjQzN1tdID0geworCQl7IFBDSV9ERVZJQ0Uo UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzNykgfSwKKwkJeyB9 LAorCX07CisKKwlEQkcoX19mdW5jX18pCisKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMuLi4gKi8K Kwl2ZXNhZmJfZGVmaW5lZC5hY2NlbF9mbGFncyA9IEZCX0FDQ0VMRl9URVhUOworCisJbWluZm8t Pmh3X3N3aXRjaCA9IGItPmJhc2UtPmxvd2xldmVsOworCW1pbmZvLT5kZXZmbGFncy5hY2NlbGVy YXRvciA9IGItPmJhc2UtPmFjY2VsSUQ7CisJbWluZm8tPm1heF9waXhlbF9jbG9jayA9IGItPm1h eGNsazsKKworCXByaW50ayhLRVJOX0lORk8gIm1hdHJveGZiOiBNYXRyb3ggJXMgZGV0ZWN0ZWRc biIsIGItPm5hbWUpOworCW1pbmZvLT5jYXBhYmxlLnBsbnd0ID0gMTsKKwltaW5mby0+Y2hpcCA9 IGItPmNoaXA7CisJbWluZm8tPmNhcGFibGUuc3Jjb3JnID0gYi0+ZmxhZ3MgJiBERVZGX1NSQ09S RzsKKwltaW5mby0+ZGV2ZmxhZ3MudmlkZW82NGJpdHMgPSBiLT5mbGFncyAmIERFVkZfVklERU82 NEJJVDsKKwlpZiAoYi0+ZmxhZ3MgJiBERVZGX1RFWFQ0QikgeworCQltaW5mby0+ZGV2ZmxhZ3Mu dmdhc3RlcCA9IDQ7CisJCW1pbmZvLT5kZXZmbGFncy50ZXh0bW9kZSA9IDQ7CisJCW1pbmZvLT5k ZXZmbGFncy50ZXh0X3R5cGVfYXV4ID0gRkJfQVVYX1RFWFRfTUdBX1NURVAxNjsKKwl9IGVsc2Ug aWYgKGItPmZsYWdzICYgREVWRl9URVhUMTZCKSB7CisJCW1pbmZvLT5kZXZmbGFncy52Z2FzdGVw ID0gMTY7CisJCW1pbmZvLT5kZXZmbGFncy50ZXh0bW9kZSA9IDE7CisJCW1pbmZvLT5kZXZmbGFn cy50ZXh0X3R5cGVfYXV4ID0gRkJfQVVYX1RFWFRfTUdBX1NURVAxNjsKKwl9IGVsc2UgeworCQlt aW5mby0+ZGV2ZmxhZ3Mudmdhc3RlcCA9IDg7CisJCW1pbmZvLT5kZXZmbGFncy50ZXh0bW9kZSA9 IDE7CisJCW1pbmZvLT5kZXZmbGFncy50ZXh0X3R5cGVfYXV4ID0gRkJfQVVYX1RFWFRfTUdBX1NU RVA4OworCX0KKwltaW5mby0+ZGV2ZmxhZ3Muc3VwcG9ydDMyTUIgPSAoYi0+ZmxhZ3MgJiBERVZG X1NVUFBPUlQzMk1CKSAhPSAwOworCW1pbmZvLT5kZXZmbGFncy5wcmVjaXNlX3dpZHRoID0gIShi LT5mbGFncyAmIERFVkZfQU5ZX1ZYUkVTKTsKKwltaW5mby0+ZGV2ZmxhZ3MuY3J0YzIgPSAoYi0+ ZmxhZ3MgJiBERVZGX0NSVEMyKSAhPSAwOworCW1pbmZvLT5kZXZmbGFncy5tYXZlbl9jYXBhYmxl ID0gKGItPmZsYWdzICYgREVWRl9NQVZFTl9DQVBBQkxFKSAhPSAwOworCW1pbmZvLT5kZXZmbGFn cy5kdWFsaGVhZCA9IChiLT5mbGFncyAmIERFVkZfRFVBTEhFQUQpICE9IDA7CisJbWluZm8tPmRl dmZsYWdzLmRmcF90eXBlID0gZGZwX3R5cGU7CisJbWluZm8tPmRldmZsYWdzLmc0NTBkYWMgPSAo Yi0+ZmxhZ3MgJiBERVZGX0c0NTBEQUMpICE9IDA7CisJbWluZm8tPmRldmZsYWdzLnRleHRzdGVw ID0gbWluZm8tPmRldmZsYWdzLnZnYXN0ZXAgKiBtaW5mby0+ZGV2ZmxhZ3MudGV4dG1vZGU7CisJ bWluZm8tPmRldmZsYWdzLnRleHR2cmFtID0gNjU1MzYgLyBtaW5mby0+ZGV2ZmxhZ3MudGV4dG1v ZGU7CisJc2V0RGVmYXVsdE91dHB1dHMobWluZm8pOworCWlmIChiLT5mbGFncyAmIERFVkZfUEFO RUxMSU5LX0NBUEFCTEUpIHsKKwkJbWluZm8tPm91dHB1dHNbMl0uZGF0YSA9IG1pbmZvOworCQlt aW5mby0+b3V0cHV0c1syXS5vdXRwdXQgPSAmcGFuZWxsaW5rX291dHB1dDsKKwkJbWluZm8tPm91 dHB1dHNbMl0uc3JjID0gbWluZm8tPm91dHB1dHNbMl0uZGVmYXVsdF9zcmM7CisJCW1pbmZvLT5v dXRwdXRzWzJdLm1vZGUgPSBNQVRST1hGQl9PVVRQVVRfTU9ERV9NT05JVE9SOworCQltaW5mby0+ ZGV2ZmxhZ3MucGFuZWxsaW5rID0gMTsKKwl9CisKKwlpZiAobWluZm8tPmNhcGFibGUuY3Jvc3M0 TUIgPCAwKQorCQltaW5mby0+Y2FwYWJsZS5jcm9zczRNQiA9IGItPmZsYWdzICYgREVWRl9DUk9T UzRNQjsKKwlpZiAoYi0+ZmxhZ3MgJiBERVZGX1NXQVBTKSB7CisJCWN0cmxwdHJfcGh5cyA9IHBj aV9yZXNvdXJjZV9zdGFydChtaW5mby0+cGNpZGV2LCAxKTsKKwkJdmlkZW9fYmFzZV9waHlzID0g cGNpX3Jlc291cmNlX3N0YXJ0KG1pbmZvLT5wY2lkZXYsIDApOworCQltaW5mby0+ZGV2ZmxhZ3Mu ZmJSZXNvdXJjZSA9IFBDSV9CQVNFX0FERFJFU1NfMDsKKwl9IGVsc2UgeworCQljdHJscHRyX3Bo eXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQobWluZm8tPnBjaWRldiwgMCk7CisJCXZpZGVvX2Jhc2Vf cGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChtaW5mby0+cGNpZGV2LCAxKTsKKwkJbWluZm8tPmRl dmZsYWdzLmZiUmVzb3VyY2UgPSBQQ0lfQkFTRV9BRERSRVNTXzE7CisJfQorCWVyciA9IC1FSU5W QUw7CisJaWYgKCFjdHJscHRyX3BoeXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYjog Y29udHJvbCByZWdpc3RlcnMgYXJlIG5vdCBhdmFpbGFibGUsIG1hdHJveGZiIGRpc2FibGVkXG4i KTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIXZpZGVvX2Jhc2VfcGh5cykgeworCQlwcmludGso S0VSTl9FUlIgIm1hdHJveGZiOiB2aWRlbyBSQU0gaXMgbm90IGF2YWlsYWJsZSBpbiBQQ0kgYWRk cmVzcyBzcGFjZSwgbWF0cm94ZmIgZGlzYWJsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCW1l bXNpemUgPSBiLT5iYXNlLT5tYXh2cmFtOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGN0cmxw dHJfcGh5cywgMTYzODQsICJtYXRyb3hmYiBNTUlPIikpIHsKKwkJZ290byBmYWlsOworCX0KKwlp ZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih2aWRlb19iYXNlX3BoeXMsIG1lbXNpemUsICJtYXRyb3hm YiBGQiIpKSB7CisJCWdvdG8gZmFpbEN0cmxNUjsKKwl9CisJbWluZm8tPnZpZGVvLmxlbl9tYXhp bXVtID0gbWVtc2l6ZTsKKwkvKiBjb252ZXJ0IG1lbSAoYXV0b2RldGVjdCBrLCBNKSAqLworCWlm IChtZW0gPCAxMDI0KSBtZW0gKj0gMTAyNDsKKwlpZiAobWVtIDwgMHgwMDEwMDAwMCkgbWVtICo9 IDEwMjQ7CisKKwlpZiAobWVtICYmIChtZW0gPCBtZW1zaXplKSkKKwkJbWVtc2l6ZSA9IG1lbTsK KwllcnIgPSAtRU5PTUVNOworCisJbWluZm8tPm1taW8udmJhc2UudmFkZHIgPSBpb3JlbWFwX25v Y2FjaGUoY3RybHB0cl9waHlzLCAxNjM4NCk7CisJaWYgKCFtaW5mby0+bW1pby52YmFzZS52YWRk cikgeworCQlwcmludGsoS0VSTl9FUlIgIm1hdHJveGZiOiBjYW5ub3QgaW9yZW1hcCglbFgsIDE2 Mzg0KSwgbWF0cm94ZmIgZGlzYWJsZWRcbiIsIGN0cmxwdHJfcGh5cyk7CisJCWdvdG8gZmFpbFZp ZGVvTVI7CisJfQorCW1pbmZvLT5tbWlvLmJhc2UgPSBjdHJscHRyX3BoeXM7CisJbWluZm8tPm1t aW8ubGVuID0gMTYzODQ7CisJbWluZm8tPnZpZGVvLmJhc2UgPSB2aWRlb19iYXNlX3BoeXM7CisJ bWluZm8tPnZpZGVvLnZiYXNlLnZhZGRyID0gaW9yZW1hcF93Yyh2aWRlb19iYXNlX3BoeXMsIG1l bXNpemUpOworCWlmICghbWluZm8tPnZpZGVvLnZiYXNlLnZhZGRyKSB7CisJCXByaW50ayhLRVJO X0VSUiAibWF0cm94ZmI6IGNhbm5vdCBpb3JlbWFwKCVsWCwgJWQpLCBtYXRyb3hmYiBkaXNhYmxl ZFxuIiwKKwkJCXZpZGVvX2Jhc2VfcGh5cywgbWVtc2l6ZSk7CisJCWdvdG8gZmFpbEN0cmxJTzsK Kwl9CisJeworCQl1X2ludDMyX3QgY21kOworCQl1X2ludDMyX3QgbWdhX29wdGlvbjsKKworCQlw Y2lfcmVhZF9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX09QVElPTl9SRUcsICZtZ2Ff b3B0aW9uKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1pbmZvLT5wY2lkZXYsIFBDSV9DT01N QU5ELCAmY21kKTsKKwkJbWdhX29wdGlvbiAmPSAweDdGRkZGRkZGOyAvKiBjbGVhciBCSUdfRU5E SUFOICovCisJCW1nYV9vcHRpb24gfD0gTVhfT1BUSU9OX0JTV0FQOworCQkvKiBkaXNhYmxlIHBh bGV0dGUgc25vb3BpbmcgKi8KKwkJY21kICY9IH5QQ0lfQ09NTUFORF9WR0FfUEFMRVRURTsKKwkJ aWYgKHBjaV9kZXZfcHJlc2VudChpbnRlbF84MjQzNykpIHsKKwkJCWlmICghKG1nYV9vcHRpb24g JiAweDIwMDAwMDAwKSAmJiAhbWluZm8tPmRldmZsYWdzLm5vcGNpcmV0cnkpIHsKKwkJCQlwcmlu dGsoS0VSTl9XQVJOSU5HICJtYXRyb3hmYjogRGlzYWJsaW5nIFBDSSByZXRyaWVzIGR1ZSB0byBp ODI0MzcgcHJlc2VudFxuIik7CisJCQl9CisJCQltZ2Ffb3B0aW9uIHw9IDB4MjAwMDAwMDA7CisJ CQltaW5mby0+ZGV2ZmxhZ3Mubm9wY2lyZXRyeSA9IDE7CisJCX0KKwkJcGNpX3dyaXRlX2NvbmZp Z19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwkJcGNpX3dyaXRlX2Nv bmZpZ19kd29yZChtaW5mby0+cGNpZGV2LCBQQ0lfT1BUSU9OX1JFRywgbWdhX29wdGlvbik7CisJ CW1pbmZvLT5ody5NWG9wdGlvblJlZyA9IG1nYV9vcHRpb247CisKKwkJLyogc2VsZWN0IG5vbi1E TUEgbWVtb3J5IGZvciBQQ0lfTUdBX0RBVEEsIG90aGVyd2lzZSBkdW1wIG9mIFBDSSBjZmcgc3Bh Y2UgY2FuIGxvY2sgUENJIGJ1cyAqLworCQkvKiBtYXliZSBwcmVpbml0KCkgY2FuZGlkYXRlLCBi dXQgaXQgaXMgc2FtZS4uLiBmb3IgYWxsIGRldmljZXMuLi4gYXQgdGhpcyB0aW1lLi4uICovCisJ CXBjaV93cml0ZV9jb25maWdfZHdvcmQobWluZm8tPnBjaWRldiwgUENJX01HQV9JTkRFWCwgMHgw MDAwM0MwMCk7CisJfQorCisJZXJyID0gLUVOWElPOworCW1hdHJveGZiX3JlYWRfcGlucyhtaW5m byk7CisJaWYgKG1pbmZvLT5od19zd2l0Y2gtPnByZWluaXQobWluZm8pKSB7CisJCWdvdG8gZmFp bFZpZGVvSU87CisJfQorCisJZXJyID0gLUVOT01FTTsKKwlpZiAoIW1hdHJveGZiX2dldG1lbW9y eShtaW5mbywgbWVtc2l6ZSwgJm1pbmZvLT52aWRlby5sZW4pIHx8ICFtaW5mby0+dmlkZW8ubGVu KSB7CisJCXByaW50ayhLRVJOX0VSUiAibWF0cm94ZmI6IGNhbm5vdCBkZXRlcm1pbmUgbWVtb3J5 IHNpemVcbiIpOworCQlnb3RvIGZhaWxWaWRlb0lPOworCX0KKwltaW5mby0+ZGV2ZmxhZ3MueWRz dG9yZyA9IDA7CisKKwltaW5mby0+dmlkZW8uYmFzZSA9IHZpZGVvX2Jhc2VfcGh5czsKKwltaW5m by0+dmlkZW8ubGVuX3VzYWJsZSA9IG1pbmZvLT52aWRlby5sZW47CisJaWYgKG1pbmZvLT52aWRl by5sZW5fdXNhYmxlID4gYi0+YmFzZS0+bWF4ZGlzcGxheWFibGUpCisJCW1pbmZvLT52aWRlby5s ZW5fdXNhYmxlID0gYi0+YmFzZS0+bWF4ZGlzcGxheWFibGU7CisJaWYgKG10cnIpCisJCW1pbmZv LT53Y19jb29raWUgPSBhcmNoX3BoeXNfd2NfYWRkKHZpZGVvX2Jhc2VfcGh5cywKKwkJCQkJCSAg ICBtaW5mby0+dmlkZW8ubGVuKTsKKworCWlmICghbWluZm8tPmRldmZsYWdzLm5vdmdhKQorCQly ZXF1ZXN0X3JlZ2lvbigweDNDMCwgMzIsICJtYXRyb3giKTsKKwltYXRyb3hmYl9nNDUwX2Nvbm5l Y3QobWluZm8pOworCW1pbmZvLT5od19zd2l0Y2gtPnJlc2V0KG1pbmZvKTsKKworCW1pbmZvLT5m YmNvbi5tb25zcGVjcy5oZm1pbiA9IDA7CisJbWluZm8tPmZiY29uLm1vbnNwZWNzLmhmbWF4ID0g Zmg7CisJbWluZm8tPmZiY29uLm1vbnNwZWNzLnZmbWluID0gMDsKKwltaW5mby0+ZmJjb24ubW9u c3BlY3MudmZtYXggPSBmdjsKKwltaW5mby0+ZmJjb24ubW9uc3BlY3MuZHBtcyA9IDA7CS8qIFRC RCAqLworCisJLyogc3RhdGljIHNldHRpbmdzICovCisJdmVzYWZiX2RlZmluZWQucmVkID0gY29s b3JzW2RlcHRoLTFdLnJlZDsKKwl2ZXNhZmJfZGVmaW5lZC5ncmVlbiA9IGNvbG9yc1tkZXB0aC0x XS5ncmVlbjsKKwl2ZXNhZmJfZGVmaW5lZC5ibHVlID0gY29sb3JzW2RlcHRoLTFdLmJsdWU7CisJ dmVzYWZiX2RlZmluZWQuYml0c19wZXJfcGl4ZWwgPSBjb2xvcnNbZGVwdGgtMV0uYml0c19wZXJf cGl4ZWw7CisJdmVzYWZiX2RlZmluZWQuZ3JheXNjYWxlID0gZ3JheXNjYWxlOworCXZlc2FmYl9k ZWZpbmVkLnZtb2RlID0gMDsKKwlpZiAobm9hY2NlbCkKKwkJdmVzYWZiX2RlZmluZWQuYWNjZWxf ZmxhZ3MgJj0gfkZCX0FDQ0VMRl9URVhUOworCisJbWluZm8tPmZib3BzID0gbWF0cm94ZmJfb3Bz OworCW1pbmZvLT5mYmNvbi5mYm9wcyA9ICZtaW5mby0+ZmJvcHM7CisJbWluZm8tPmZiY29uLnBz ZXVkb19wYWxldHRlID0gbWluZm8tPmNtYXA7CisJbWluZm8tPmZiY29uLmZsYWdzID0gRkJJTkZP X1BBUlRJQUxfUEFOX09LIHwgCSAvKiBQcmVmZXIgcGFubmluZyBmb3Igc2Nyb2xsIHVuZGVyIE1D IHZpZXdlci9lZGl0ICovCisJCQkJICAgICAgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfCAgLyog V2UgaGF2ZSBody1hc3Npc3RlZCBibW92ZSAqLworCQkJCSAgICAgIEZCSU5GT19IV0FDQ0VMX0ZJ TExSRUNUIHwgIC8qIEFuZCBmaWxscmVjdCAqLworCQkJCSAgICAgIEZCSU5GT19IV0FDQ0VMX0lN QUdFQkxJVCB8IC8qIEFuZCBpbWFnZWJsaXQgKi8KKwkJCQkgICAgICBGQklORk9fSFdBQ0NFTF9Y UEFOIHwgICAgICAvKiBBbmQgd2Ugc3VwcG9ydCBib3RoIGhvcml6b250YWwgKi8KKwkJCQkgICAg ICBGQklORk9fSFdBQ0NFTF9ZUEFOIHwgICAgICAvKiBBbmQgdmVydGljYWwgcGFubmluZyAqLwor CQkJCSAgICAgIEZCSU5GT19SRUFEU19GQVNUOworCW1pbmZvLT52aWRlby5sZW5fdXNhYmxlICY9 IFBBR0VfTUFTSzsKKwlmYl9hbGxvY19jbWFwKCZtaW5mby0+ZmJjb24uY21hcCwgMjU2LCAxKTsK KworI2lmbmRlZiBNT0RVTEUKKwkvKiBtb2RlIGRhdGFiYXNlIGlzIG1hcmtlZCBfX2luaXQhISEg Ki8KKwlpZiAoIWhvdHBsdWcpIHsKKwkJZmJfZmluZF9tb2RlKCZ2ZXNhZmJfZGVmaW5lZCwgJm1p bmZvLT5mYmNvbiwgdmlkZW9tb2RlWzBdID8gdmlkZW9tb2RlIDogTlVMTCwKKwkJCU5VTEwsIDAs ICZkZWZhdWx0bW9kZSwgdmVzYWZiX2RlZmluZWQuYml0c19wZXJfcGl4ZWwpOworCX0KKyNlbmRp ZiAvKiAhTU9EVUxFICovCisKKwkvKiBtb2RlIG1vZGlmaWVycyAqLworCWlmIChoc2xlbikKKwkJ dmVzYWZiX2RlZmluZWQuaHN5bmNfbGVuID0gaHNsZW47CisJaWYgKHZzbGVuKQorCQl2ZXNhZmJf ZGVmaW5lZC52c3luY19sZW4gPSB2c2xlbjsKKwlpZiAobGVmdCAhPSB+MCkKKwkJdmVzYWZiX2Rl ZmluZWQubGVmdF9tYXJnaW4gPSBsZWZ0OworCWlmIChyaWdodCAhPSB+MCkKKwkJdmVzYWZiX2Rl ZmluZWQucmlnaHRfbWFyZ2luID0gcmlnaHQ7CisJaWYgKHVwcGVyICE9IH4wKQorCQl2ZXNhZmJf ZGVmaW5lZC51cHBlcl9tYXJnaW4gPSB1cHBlcjsKKwlpZiAobG93ZXIgIT0gfjApCisJCXZlc2Fm Yl9kZWZpbmVkLmxvd2VyX21hcmdpbiA9IGxvd2VyOworCWlmICh4cmVzKQorCQl2ZXNhZmJfZGVm aW5lZC54cmVzID0geHJlczsKKwlpZiAoeXJlcykKKwkJdmVzYWZiX2RlZmluZWQueXJlcyA9IHly ZXM7CisJaWYgKHN5bmMgIT0gLTEpCisJCXZlc2FmYl9kZWZpbmVkLnN5bmMgPSBzeW5jOworCWVs c2UgaWYgKHZlc2FmYl9kZWZpbmVkLnN5bmMgPT0gfjApIHsKKwkJdmVzYWZiX2RlZmluZWQuc3lu YyA9IDA7CisJCWlmICh5cmVzIDwgNDAwKQorCQkJdmVzYWZiX2RlZmluZWQuc3luYyB8PSBGQl9T WU5DX0hPUl9ISUdIX0FDVDsKKwkJZWxzZSBpZiAoeXJlcyA8IDQ4MCkKKwkJCXZlc2FmYl9kZWZp bmVkLnN5bmMgfD0gRkJfU1lOQ19WRVJUX0hJR0hfQUNUOworCX0KKworCS8qIGZ2LCBmaCwgbWF4 Y2xrIGxpbWl0cyB3YXMgc3BlY2lmaWVkICovCisJeworCQl1bnNpZ25lZCBpbnQgdG1wOworCisJ CWlmIChmdikgeworCQkJdG1wID0gZnYgKiAodmVzYWZiX2RlZmluZWQudXBwZXJfbWFyZ2luICsg dmVzYWZiX2RlZmluZWQueXJlcworCQkJCSAgKyB2ZXNhZmJfZGVmaW5lZC5sb3dlcl9tYXJnaW4g KyB2ZXNhZmJfZGVmaW5lZC52c3luY19sZW4pOworCQkJaWYgKCh0bXAgPCBmaCkgfHwgKGZoID09 IDApKSBmaCA9IHRtcDsKKwkJfQorCQlpZiAoZmgpIHsKKwkJCXRtcCA9IGZoICogKHZlc2FmYl9k ZWZpbmVkLmxlZnRfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQueHJlcworCQkJCSAgKyB2ZXNhZmJf ZGVmaW5lZC5yaWdodF9tYXJnaW4gKyB2ZXNhZmJfZGVmaW5lZC5oc3luY19sZW4pOworCQkJaWYg KCh0bXAgPCBtYXhjbGspIHx8IChtYXhjbGsgPT0gMCkpIG1heGNsayA9IHRtcDsKKwkJfQorCQl0 bXAgPSAobWF4Y2xrICsgNDk5KSAvIDUwMDsKKwkJaWYgKHRtcCkgeworCQkJdG1wID0gKDIwMDAw MDAwMDAgKyB0bXApIC8gdG1wOworCQkJaWYgKHRtcCA+IHBpeGNsb2NrKSBwaXhjbG9jayA9IHRt cDsKKwkJfQorCX0KKwlpZiAocGl4Y2xvY2spIHsKKwkJaWYgKHBpeGNsb2NrIDwgMjAwMCkJCS8q ID4gNTAwTUh6ICovCisJCQlwaXhjbG9jayA9IDQwMDA7CS8qIDI1ME1IeiAqLworCQlpZiAocGl4 Y2xvY2sgPiAxMDAwMDAwKQorCQkJcGl4Y2xvY2sgPSAxMDAwMDAwOwkvKiAxTUh6ICovCisJCXZl c2FmYl9kZWZpbmVkLnBpeGNsb2NrID0gcGl4Y2xvY2s7CisJfQorCisJLyogRklYTUU6IFdoZXJl IHRvIG1vdmUgdGhpcz8hICovCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCisjaWZuZGVm IE1PRFVMRQorCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgeworCQlzdHJ1Y3QgZmJfdmFyX3Nj cmVlbmluZm8gdmFyOworCisJCWlmIChkZWZhdWx0X3Ztb2RlIDw9IDAgfHwgZGVmYXVsdF92bW9k ZSA+IFZNT0RFX01BWCkKKwkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV82NDBfNDgwXzYwOworI2lm IGRlZmluZWQoQ09ORklHX1BQQzMyKQorCQlpZiAoSVNfUkVBQ0hBQkxFKENPTkZJR19OVlJBTSkg JiYgZGVmYXVsdF9jbW9kZSA9PSBDTU9ERV9OVlJBTSkKKwkJCWRlZmF1bHRfY21vZGUgPSBudnJh bV9yZWFkX2J5dGUoTlZfQ01PREUpOworI2VuZGlmCisJCWlmIChkZWZhdWx0X2Ntb2RlIDwgQ01P REVfOCB8fCBkZWZhdWx0X2Ntb2RlID4gQ01PREVfMzIpCisJCQlkZWZhdWx0X2Ntb2RlID0gQ01P REVfODsKKwkJaWYgKCFtYWNfdm1vZGVfdG9fdmFyKGRlZmF1bHRfdm1vZGUsIGRlZmF1bHRfY21v ZGUsICZ2YXIpKSB7CisJCQl2YXIuYWNjZWxfZmxhZ3MgPSB2ZXNhZmJfZGVmaW5lZC5hY2NlbF9m bGFnczsKKwkJCXZhci54b2Zmc2V0ID0gdmFyLnlvZmZzZXQgPSAwOworCQkJLyogTm90ZTogbWFj X3Ztb2RlX3RvX3ZhcigpIGRvZXMgbm90IHNldCBhbGwgcGFyYW1ldGVycyAqLworCQkJdmVzYWZi X2RlZmluZWQgPSB2YXI7CisJCX0KKwl9CisjZW5kaWYgLyogIU1PRFVMRSAqLworI2VuZGlmIC8q IENPTkZJR19QUENfUE1BQyAqLworCXZlc2FmYl9kZWZpbmVkLnhyZXNfdmlydHVhbCA9IHZlc2Fm Yl9kZWZpbmVkLnhyZXM7CisJaWYgKG5vcGFuKSB7CisJCXZlc2FmYl9kZWZpbmVkLnlyZXNfdmly dHVhbCA9IHZlc2FmYl9kZWZpbmVkLnlyZXM7CisJfSBlbHNlIHsKKwkJdmVzYWZiX2RlZmluZWQu eXJlc192aXJ0dWFsID0gNjU1MzY7IC8qIGxhcmdlIGVub3VnaCB0byBiZSBJTkYsIGJ1dCBzbWFs bCBlbm91Z2gKKwkJCQkJCQl0byB5cmVzX3ZpcnR1YWwgKiB4cmVzX3ZpcnR1YWwgPCAyXjMyICov CisJfQorCW1hdHJveGZiX2luaXRfZml4KG1pbmZvKTsKKwltaW5mby0+ZmJjb24uc2NyZWVuX2Jh c2UgPSB2YWRkcl92YShtaW5mby0+dmlkZW8udmJhc2UpOworCS8qIE5vcm1hbGl6ZSB2YWx1ZXMg KG5hbWVseSB5cmVzX3ZpcnR1YWwpICovCisJbWF0cm94ZmJfY2hlY2tfdmFyKCZ2ZXNhZmJfZGVm aW5lZCwgJm1pbmZvLT5mYmNvbik7CisJLyogQW5kIHB1dCBpdCBpbnRvICJjdXJyZW50IiB2YXIu IERvIE5PVCBwcm9ncmFtIGhhcmR3YXJlIHlldCwgb3Igd2UnbGwgbm90IHRha2Ugb3ZlcgorCSAq IHZnYWNvbiBjb3JyZWN0bHkuIGZiY29uX3N0YXJ0dXAgd2lsbCBjYWxsIGZiX3NldF9wYXIgZm9y IHVzLCBXSVRIT1VUIGNoZWNrX3ZhciwKKwkgKiBhbmQgdW5mb3J0dW5hdGVseSBpdCB3aWxsIGRv IGl0IEJFRk9SRSB2Z2Fjb24gY29udGVudHMgaXMgc2F2ZWQsIHNvIGl0IHdvbid0IHdvcmsKKwkg KiBhbnl3YXkuIEJ1dCB3ZSBhdCBsZWFzdCB0cmllZC4uLiAqLworCW1pbmZvLT5mYmNvbi52YXIg PSB2ZXNhZmJfZGVmaW5lZDsKKwllcnIgPSAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAi bWF0cm94ZmI6ICVkeCVkeCVkYnBwICh2aXJ0dWFsOiAlZHglZClcbiIsCisJCXZlc2FmYl9kZWZp bmVkLnhyZXMsIHZlc2FmYl9kZWZpbmVkLnlyZXMsIHZlc2FmYl9kZWZpbmVkLmJpdHNfcGVyX3Bp eGVsLAorCQl2ZXNhZmJfZGVmaW5lZC54cmVzX3ZpcnR1YWwsIHZlc2FmYl9kZWZpbmVkLnlyZXNf dmlydHVhbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAibWF0cm94ZmI6IGZyYW1lYnVmZmVyIGF0IDB4 JWxYLCBtYXBwZWQgdG8gMHglcCwgc2l6ZSAlZFxuIiwKKwkJbWluZm8tPnZpZGVvLmJhc2UsIHZh ZGRyX3ZhKG1pbmZvLT52aWRlby52YmFzZSksIG1pbmZvLT52aWRlby5sZW4pOworCisvKiBXZSBk byBub3QgaGF2ZSB0byBzZXQgY3VycmNvbiB0byAwLi4uIHJlZ2lzdGVyX2ZyYW1lYnVmZmVyIGRv IGl0IGZvciB1cyBvbiBmaXJzdCBjb25zb2xlCisgKiBhbmQgd2UgZG8gbm90IHdhbnQgY3VycmNv biA9PSAwIGZvciBzdWJzZXF1ZW50IGZyYW1lYnVmZmVycyAqLworCisJbWluZm8tPmZiY29uLmRl dmljZSA9ICZtaW5mby0+cGNpZGV2LT5kZXY7CisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZt aW5mby0+ZmJjb24pIDwgMCkgeworCQlnb3RvIGZhaWxWaWRlb0lPOworCX0KKwlmYl9pbmZvKCZt aW5mby0+ZmJjb24sICIlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLCBtaW5mby0+ZmJjb24uZml4 LmlkKTsKKworCS8qIHRoZXJlIGlzIG5vIGNvbnNvbGUgb24gdGhpcyBmYi4uLiBidXQgd2UgaGF2 ZSB0byBpbml0aWFsaXplIGhhcmR3YXJlCisJICogdW50aWwgc29tZW9uZSB0ZWxscyBtZSB3aGF0 IGlzIHByb3BlciB0aGluZyB0byBkbyAqLworCWlmICghbWluZm8tPmluaXRpYWxpemVkKSB7CisJ CWZiX2luZm8oJm1pbmZvLT5mYmNvbiwgImluaXRpYWxpemluZyBoYXJkd2FyZVxuIik7CisJCS8q IFdlIGhhdmUgdG8gdXNlIEZCX0FDVElWQVRFX0ZPUkNFLCBhcyB3ZSBoYWQgdG8gcHV0IHZlc2Fm Yl9kZWZpbmVkIHRvIHRoZSBmYmNvbi52YXIKKwkJICogYWxyZWFkeSBiZWZvcmUsIHNvIHJlZ2lz dGVyX2ZyYW1lYnVmZmVyIHdvcmtzIGNvcnJlY3RseS4gKi8KKwkJdmVzYWZiX2RlZmluZWQuYWN0 aXZhdGUgfD0gRkJfQUNUSVZBVEVfRk9SQ0U7CisJCWZiX3NldF92YXIoJm1pbmZvLT5mYmNvbiwg JnZlc2FmYl9kZWZpbmVkKTsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWxWaWRlb0lPOjsKKwltYXRy b3hmYl9nNDUwX3NodXRkb3duKG1pbmZvKTsKKwlpb3VubWFwKG1pbmZvLT52aWRlby52YmFzZS52 YWRkcik7CitmYWlsQ3RybElPOjsKKwlpb3VubWFwKG1pbmZvLT5tbWlvLnZiYXNlLnZhZGRyKTsK K2ZhaWxWaWRlb01SOjsKKwlyZWxlYXNlX21lbV9yZWdpb24odmlkZW9fYmFzZV9waHlzLCBtaW5m by0+dmlkZW8ubGVuX21heGltdW0pOworZmFpbEN0cmxNUjo7CisJcmVsZWFzZV9tZW1fcmVnaW9u KGN0cmxwdHJfcGh5cywgMTYzODQpOworZmFpbDo7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGlj IExJU1RfSEVBRChtYXRyb3hmYl9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQobWF0cm94ZmJfZHJp dmVyX2xpc3QpOworCisjZGVmaW5lIG1hdHJveGZiX2woeCkgbGlzdF9lbnRyeSh4LCBzdHJ1Y3Qg bWF0cm94X2ZiX2luZm8sIG5leHRfZmIpCisjZGVmaW5lIG1hdHJveGZiX2RyaXZlcl9sKHgpIGxp c3RfZW50cnkoeCwgc3RydWN0IG1hdHJveGZiX2RyaXZlciwgbm9kZSkKK2ludCBtYXRyb3hmYl9y ZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1hdHJveGZiX2RyaXZlciogZHJ2KSB7CisJc3RydWN0IG1h dHJveF9mYl9pbmZvKiBtaW5mbzsKKworCWxpc3RfYWRkKCZkcnYtPm5vZGUsICZtYXRyb3hmYl9k cml2ZXJfbGlzdCk7CisJZm9yIChtaW5mbyA9IG1hdHJveGZiX2wobWF0cm94ZmJfbGlzdC5uZXh0 KTsKKwkgICAgIG1pbmZvICE9IG1hdHJveGZiX2woJm1hdHJveGZiX2xpc3QpOworCSAgICAgbWlu Zm8gPSBtYXRyb3hmYl9sKG1pbmZvLT5uZXh0X2ZiLm5leHQpKSB7CisJCXZvaWQqIHA7CisKKwkJ aWYgKG1pbmZvLT5kcml2ZXJzX2NvdW50ID09IE1BVFJPWEZCX01BWF9GQl9EUklWRVJTKQorCQkJ Y29udGludWU7CisJCXAgPSBkcnYtPnByb2JlKG1pbmZvKTsKKwkJaWYgKHApIHsKKwkJCW1pbmZv LT5kcml2ZXJzX2RhdGFbbWluZm8tPmRyaXZlcnNfY291bnRdID0gcDsKKwkJCW1pbmZvLT5kcml2 ZXJzW21pbmZvLT5kcml2ZXJzX2NvdW50KytdID0gZHJ2OworCQl9CisJfQorCXJldHVybiAwOwor fQorCit2b2lkIG1hdHJveGZiX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtYXRyb3hmYl9kcml2 ZXIqIGRydikgeworCXN0cnVjdCBtYXRyb3hfZmJfaW5mbyogbWluZm87CisKKwlsaXN0X2RlbCgm ZHJ2LT5ub2RlKTsKKwlmb3IgKG1pbmZvID0gbWF0cm94ZmJfbChtYXRyb3hmYl9saXN0Lm5leHQp OworCSAgICAgbWluZm8gIT0gbWF0cm94ZmJfbCgmbWF0cm94ZmJfbGlzdCk7CisJICAgICBtaW5m byA9IG1hdHJveGZiX2wobWluZm8tPm5leHRfZmIubmV4dCkpIHsKKwkJaW50IGk7CisKKwkJZm9y IChpID0gMDsgaSA8IG1pbmZvLT5kcml2ZXJzX2NvdW50OyApIHsKKwkJCWlmIChtaW5mby0+ZHJp dmVyc1tpXSA9PSBkcnYpIHsKKwkJCQlpZiAoZHJ2ICYmIGRydi0+cmVtb3ZlKQorCQkJCQlkcnYt PnJlbW92ZShtaW5mbywgbWluZm8tPmRyaXZlcnNfZGF0YVtpXSk7CisJCQkJbWluZm8tPmRyaXZl cnNbaV0gPSBtaW5mby0+ZHJpdmVyc1stLW1pbmZvLT5kcml2ZXJzX2NvdW50XTsKKwkJCQltaW5m by0+ZHJpdmVyc19kYXRhW2ldID0gbWluZm8tPmRyaXZlcnNfZGF0YVttaW5mby0+ZHJpdmVyc19j b3VudF07CisJCQl9IGVsc2UKKwkJCQlpKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1h dHJveGZiX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIG1pbmZvKSB7CisJ c3RydWN0IG1hdHJveGZiX2RyaXZlciogZHJ2OworCWludCBpID0gMDsKKwlsaXN0X2FkZCgmbWlu Zm8tPm5leHRfZmIsICZtYXRyb3hmYl9saXN0KTsKKwlmb3IgKGRydiA9IG1hdHJveGZiX2RyaXZl cl9sKG1hdHJveGZiX2RyaXZlcl9saXN0Lm5leHQpOworCSAgICAgZHJ2ICE9IG1hdHJveGZiX2Ry aXZlcl9sKCZtYXRyb3hmYl9kcml2ZXJfbGlzdCk7CisJICAgICBkcnYgPSBtYXRyb3hmYl9kcml2 ZXJfbChkcnYtPm5vZGUubmV4dCkpIHsKKwkJaWYgKGRydi0+cHJvYmUpIHsKKwkJCXZvaWQgKnAg PSBkcnYtPnByb2JlKG1pbmZvKTsKKwkJCWlmIChwKSB7CisJCQkJbWluZm8tPmRyaXZlcnNfZGF0 YVtpXSA9IHA7CisJCQkJbWluZm8tPmRyaXZlcnNbaSsrXSA9IGRydjsKKwkJCQlpZiAoaSA9PSBN QVRST1hGQl9NQVhfRkJfRFJJVkVSUykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbWlu Zm8tPmRyaXZlcnNfY291bnQgPSBpOworfQorCitzdGF0aWMgdm9pZCBtYXRyb3hmYl91bnJlZ2lz dGVyX2RldmljZShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIG1pbmZvKSB7CisJaW50IGk7CisKKwls aXN0X2RlbCgmbWluZm8tPm5leHRfZmIpOworCWZvciAoaSA9IDA7IGkgPCBtaW5mby0+ZHJpdmVy c19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBtYXRyb3hmYl9kcml2ZXIqIGRydiA9IG1pbmZvLT5k cml2ZXJzW2ldOworCisJCWlmIChkcnYgJiYgZHJ2LT5yZW1vdmUpCisJCQlkcnYtPnJlbW92ZSht aW5mbywgbWluZm8tPmRyaXZlcnNfZGF0YVtpXSk7CisJfQorfQorCitzdGF0aWMgaW50IG1hdHJv eGZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2KiBwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9p ZCogZHVtbXkpIHsKKwlzdHJ1Y3QgYm9hcmQqIGI7CisJdV9pbnQxNl90IHN2aWQ7CisJdV9pbnQx Nl90IHNpZDsKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIG1pbmZvOworCWludCBlcnI7CisJdV9p bnQzMl90IGNtZDsKKwlEQkcoX19mdW5jX18pCisKKwlzdmlkID0gcGRldi0+c3Vic3lzdGVtX3Zl bmRvcjsKKwlzaWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWZvciAoYiA9IGRldl9saXN0 OyBiLT52ZW5kb3I7IGIrKykgeworCQlpZiAoKGItPnZlbmRvciAhPSBwZGV2LT52ZW5kb3IpIHx8 IChiLT5kZXZpY2UgIT0gcGRldi0+ZGV2aWNlKSB8fCAoYi0+cmV2IDwgcGRldi0+cmV2aXNpb24p KSBjb250aW51ZTsKKwkJaWYgKGItPnN2aWQpCisJCQlpZiAoKGItPnN2aWQgIT0gc3ZpZCkgfHwg KGItPnNpZCAhPSBzaWQpKSBjb250aW51ZTsKKwkJYnJlYWs7CisJfQorCS8qIG5vdCBtYXRjaC4u LiAqLworCWlmICghYi0+dmVuZG9yKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2ID4gMCkg eworCQkvKiBub3QgcmVxdWVzdGVkIG9uZS4uLiAqLworCQlkZXYtLTsKKwkJcmV0dXJuIC1FTk9E RVY7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7 CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlt aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCptaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbWluZm8p CisJCXJldHVybiAtRU5PTUVNOworCisJbWluZm8tPnBjaWRldiA9IHBkZXY7CisJbWluZm8tPmRl YWQgPSAwOworCW1pbmZvLT51c2Vjb3VudCA9IDA7CisJbWluZm8tPnVzZXJ1c2Vjb3VudCA9IDA7 CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbWluZm8pOworCS8qIERFVkZMQUdTICovCisJbWlu Zm8tPmRldmZsYWdzLm1lbXR5cGUgPSBtZW10eXBlOworCWlmIChtZW10eXBlICE9IC0xKQorCQlu b2luaXQgPSAwOworCWlmIChjbWQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpIHsKKwkJbWluZm8tPmRl dmZsYWdzLm5vdmdhID0gbm92Z2E7CisJCW1pbmZvLT5kZXZmbGFncy5ub2Jpb3MgPSBub2Jpb3M7 CisJCW1pbmZvLT5kZXZmbGFncy5ub2luaXQgPSBub2luaXQ7CisJCS8qIHN1YnNlcXVlbnQgaGVh ZHMgYWx3YXlzIG5lZWRzIGluaXRpYWxpemF0aW9uIGFuZCBtdXN0IG5vdCBlbmFibGUgQklPUyAq LworCQlub3ZnYSA9IDE7CisJCW5vYmlvcyA9IDE7CisJCW5vaW5pdCA9IDA7CisJfSBlbHNlIHsK KwkJbWluZm8tPmRldmZsYWdzLm5vdmdhID0gMTsKKwkJbWluZm8tPmRldmZsYWdzLm5vYmlvcyA9 IDE7CisJCW1pbmZvLT5kZXZmbGFncy5ub2luaXQgPSAwOworCX0KKworCW1pbmZvLT5kZXZmbGFn cy5ub3BjaXJldHJ5ID0gbm9fcGNpX3JldHJ5OworCW1pbmZvLT5kZXZmbGFncy5tZ2FfMjRicHBf Zml4ID0gaW52MjQ7CisJbWluZm8tPmRldmZsYWdzLnByZWNpc2Vfd2lkdGggPSBvcHRpb25fcHJl Y2lzZV93aWR0aDsKKwltaW5mby0+ZGV2ZmxhZ3Muc2dyYW0gPSBzZ3JhbTsKKwltaW5mby0+Y2Fw YWJsZS5jcm9zczRNQiA9IGNyb3NzNE1COworCisJc3Bpbl9sb2NrX2luaXQoJm1pbmZvLT5sb2Nr LkRBQyk7CisJc3Bpbl9sb2NrX2luaXQoJm1pbmZvLT5sb2NrLmFjY2VsKTsKKwlpbml0X3J3c2Vt KCZtaW5mby0+Y3J0YzIubG9jayk7CisJaW5pdF9yd3NlbSgmbWluZm8tPmFsdG91dC5sb2NrKTsK KwltdXRleF9pbml0KCZtaW5mby0+ZmJjb24ubW1fbG9jayk7CisJbWluZm8tPmlycV9mbGFncyA9 IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWluZm8tPmNydGMxLnZzeW5jLndhaXQpOworCWlu aXRfd2FpdHF1ZXVlX2hlYWQoJm1pbmZvLT5jcnRjMi52c3luYy53YWl0KTsKKwltaW5mby0+Y3J0 YzEucGFucG9zID0gLTE7CisKKwllcnIgPSBpbml0TWF0cm94MihtaW5mbywgYik7CisJaWYgKCFl cnIpIHsKKwkJbWF0cm94ZmJfcmVnaXN0ZXJfZGV2aWNlKG1pbmZvKTsKKwkJcmV0dXJuIDA7CisJ fQorCWtmcmVlKG1pbmZvKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9yZW1v dmVfbWF0cm94KHN0cnVjdCBwY2lfZGV2KiBwZGV2KSB7CisJc3RydWN0IG1hdHJveF9mYl9pbmZv KiBtaW5mbzsKKworCW1pbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW1hdHJveGZiX3Jl bW92ZShtaW5mbywgMSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBt YXRyb3hmYl9kZXZpY2VzW10gPSB7CisjaWZkZWYgQ09ORklHX0ZCX01BVFJPWF9NSUxMRU5JVU0K Kwl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX01JTCwKKwkJUENJ X0FOWV9JRCwJUENJX0FOWV9JRCwJMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQ Q0lfREVWSUNFX0lEX01BVFJPWF9NSUxfMiwKKwkJUENJX0FOWV9JRCwJUENJX0FOWV9JRCwJMCwg MCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9NSUxf Ml9BR1AsCisJCVBDSV9BTllfSUQsCVBDSV9BTllfSUQsCTAsIDAsIDB9LAorI2VuZGlmCisjaWZk ZWYgQ09ORklHX0ZCX01BVFJPWF9NWVNUSVFVRQorCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJUENJ X0RFVklDRV9JRF9NQVRST1hfTVlTLAorCQlQQ0lfQU5ZX0lELAlQQ0lfQU5ZX0lELAkwLCAwLCAw fSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQl9NQVRST1hfRworCXtQQ0lfVkVORE9SX0lEX01B VFJPWCwJUENJX0RFVklDRV9JRF9NQVRST1hfRzEwMF9NTSwKKwkJUENJX0FOWV9JRCwJUENJX0FO WV9JRCwJMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01B VFJPWF9HMTAwX0FHUCwKKwkJUENJX0FOWV9JRCwJUENJX0FOWV9JRCwJMCwgMCwgMH0sCisJe1BD SV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX1BDSSwKKwkJUENJ X0FOWV9JRCwJUENJX0FOWV9JRCwJMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQ Q0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX0FHUCwKKwkJUENJX0FOWV9JRCwJUENJX0FOWV9JRCwJ MCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9H NDAwLAorCQlQQ0lfQU5ZX0lELAlQQ0lfQU5ZX0lELAkwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9J RF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0c1NTAsCisJCVBDSV9BTllfSUQsCVBDSV9B TllfSUQsCTAsIDAsIDB9LAorI2VuZGlmCisJezAsCQkJMCwKKwkJMCwJCTAsCQkwLCAwLCAwfQor fTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1hdHJveGZiX2RldmljZXMpOworCisKK3N0 YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtYXRyb3hmYl9kcml2ZXIgPSB7CisJLm5hbWUgPQkJIm1h dHJveGZiIiwKKwkuaWRfdGFibGUgPQltYXRyb3hmYl9kZXZpY2VzLAorCS5wcm9iZSA9CW1hdHJv eGZiX3Byb2JlLAorCS5yZW1vdmUgPQlwY2lfcmVtb3ZlX21hdHJveCwKK307CisKKy8qICoqKioq KioqKioqKioqKioqKioqKioqKioqKiogaW5pdC10aW1lIG9ubHkgKioqKioqKioqKioqKioqKioq KioqKioqKioqKiAqLworCisjZGVmaW5lIFJTUmVzb2x1dGlvbihYKQkoKFgpICYgMHgwRikKKyNk ZWZpbmUgUlM2NDB4NDAwCTEKKyNkZWZpbmUgUlM2NDB4NDgwCTIKKyNkZWZpbmUgUlM4MDB4NjAw CTMKKyNkZWZpbmUgUlMxMDI0eDc2OAk0CisjZGVmaW5lIFJTMTI4MHgxMDI0CTUKKyNkZWZpbmUg UlMxNjAweDEyMDAJNgorI2RlZmluZSBSUzc2OHg1NzYJNworI2RlZmluZSBSUzk2MHg3MjAJOAor I2RlZmluZSBSUzExNTJ4ODY0CTkKKyNkZWZpbmUgUlMxNDA4eDEwNTYJMTAKKyNkZWZpbmUgUlM2 NDB4MzUwCTExCisjZGVmaW5lIFJTMTA1NngzNDQJMTIJLyogMTMyIHggNDMgdGV4dCAqLworI2Rl ZmluZSBSUzEwNTZ4NDAwCTEzCS8qIDEzMiB4IDUwIHRleHQgKi8KKyNkZWZpbmUgUlMxMDU2eDQ4 MAkxNAkvKiAxMzIgeCA2MCB0ZXh0ICovCisjZGVmaW5lIFJTTm94Tm8JCTE1CisvKiAxMC1GRiAq Lworc3RhdGljIHN0cnVjdCB7IGludCB4cmVzLCB5cmVzLCBsZWZ0LCByaWdodCwgdXBwZXIsIGxv d2VyLCBoc2xlbiwgdnNsZW4sIHZmcmVxOyB9IHRpbW1pbmdzW10gX19pbml0ZGF0YSA9IHsKKwl7 ICA2NDAsICA0MDAsICA0OCwgMTYsIDM5LCAgOCwgIDk2LCAyLCA3MCB9LAorCXsgIDY0MCwgIDQ4 MCwgIDQ4LCAxNiwgMzMsIDEwLCAgOTYsIDIsIDYwIH0sCisJeyAgODAwLCAgNjAwLCAxNDQsIDI0 LCAyOCwgIDgsIDExMiwgNiwgNjAgfSwKKwl7IDEwMjQsICA3NjgsIDE2MCwgMzIsIDMwLCAgNCwg MTI4LCA0LCA2MCB9LAorCXsgMTI4MCwgMTAyNCwgMjI0LCAzMiwgMzIsICA0LCAxMzYsIDQsIDYw IH0sCisJeyAxNjAwLCAxMjAwLCAyNzIsIDQ4LCAzMiwgIDUsIDE1MiwgNSwgNjAgfSwKKwl7ICA3 NjgsICA1NzYsIDE0NCwgMTYsIDI4LCAgNiwgMTEyLCA0LCA2MCB9LAorCXsgIDk2MCwgIDcyMCwg MTQ0LCAyNCwgMjgsICA4LCAxMTIsIDQsIDYwIH0sCisJeyAxMTUyLCAgODY0LCAxOTIsIDMyLCAz MCwgIDQsIDEyOCwgNCwgNjAgfSwKKwl7IDE0MDgsIDEwNTYsIDI1NiwgNDAsIDMyLCAgNSwgMTQ0 LCA1LCA2MCB9LAorCXsgIDY0MCwgIDM1MCwgIDQ4LCAxNiwgMzksICA4LCAgOTYsIDIsIDcwIH0s CisJeyAxMDU2LCAgMzQ0LCAgOTYsIDI0LCA1OSwgNDQsIDE2MCwgMiwgNzAgfSwKKwl7IDEwNTYs ICA0MDAsICA5NiwgMjQsIDM5LCAgOCwgMTYwLCAyLCA3MCB9LAorCXsgMTA1NiwgIDQ4MCwgIDk2 LCAyNCwgMzYsIDEyLCAxNjAsIDMsIDYwIH0sCisJeyAgICAwLCAgICAwLCAgfjAsIH4wLCB+MCwg fjAsICAgMCwgMCwgIDAgfQorfTsKKworI2RlZmluZSBSU0NyZWF0ZShYLFkpCSgoWCkgfCAoKFkp IDw8IDgpKQorc3RhdGljIHN0cnVjdCB7IHVuc2lnbmVkIGludCB2ZXNhOyB1bnNpZ25lZCBpbnQg aW5mbzsgfSAqUlNwdHIsIHZlc2FtYXBbXSBfX2luaXRkYXRhID0geworLyogZGVmYXVsdCBtdXN0 IGJlIGZpcnN0ICovCisJeyAgICB+MCwgUlNDcmVhdGUoUlNOb3hObywgICAgIFJTOGJwcCApIH0s CisJeyAweDEwMSwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTOGJwcCApIH0sCisJeyAweDEwMCwg UlNDcmVhdGUoUlM2NDB4NDAwLCAgIFJTOGJwcCApIH0sCisJeyAweDE4MCwgUlNDcmVhdGUoUlM3 Njh4NTc2LCAgIFJTOGJwcCApIH0sCisJeyAweDEwMywgUlNDcmVhdGUoUlM4MDB4NjAwLCAgIFJT OGJwcCApIH0sCisJeyAweDE4OCwgUlNDcmVhdGUoUlM5NjB4NzIwLCAgIFJTOGJwcCApIH0sCisJ eyAweDEwNSwgUlNDcmVhdGUoUlMxMDI0eDc2OCwgIFJTOGJwcCApIH0sCisJeyAweDE5MCwgUlND cmVhdGUoUlMxMTUyeDg2NCwgIFJTOGJwcCApIH0sCisJeyAweDEwNywgUlNDcmVhdGUoUlMxMjgw eDEwMjQsIFJTOGJwcCApIH0sCisJeyAweDE5OCwgUlNDcmVhdGUoUlMxNDA4eDEwNTYsIFJTOGJw cCApIH0sCisJeyAweDExQywgUlNDcmVhdGUoUlMxNjAweDEyMDAsIFJTOGJwcCApIH0sCisJeyAw eDExMCwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTMTVicHApIH0sCisJeyAweDE4MSwgUlNDcmVh dGUoUlM3Njh4NTc2LCAgIFJTMTVicHApIH0sCisJeyAweDExMywgUlNDcmVhdGUoUlM4MDB4NjAw LCAgIFJTMTVicHApIH0sCisJeyAweDE4OSwgUlNDcmVhdGUoUlM5NjB4NzIwLCAgIFJTMTVicHAp IH0sCisJeyAweDExNiwgUlNDcmVhdGUoUlMxMDI0eDc2OCwgIFJTMTVicHApIH0sCisJeyAweDE5 MSwgUlNDcmVhdGUoUlMxMTUyeDg2NCwgIFJTMTVicHApIH0sCisJeyAweDExOSwgUlNDcmVhdGUo UlMxMjgweDEwMjQsIFJTMTVicHApIH0sCisJeyAweDE5OSwgUlNDcmVhdGUoUlMxNDA4eDEwNTYs IFJTMTVicHApIH0sCisJeyAweDExRCwgUlNDcmVhdGUoUlMxNjAweDEyMDAsIFJTMTVicHApIH0s CisJeyAweDExMSwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTMTZicHApIH0sCisJeyAweDE4Miwg UlNDcmVhdGUoUlM3Njh4NTc2LCAgIFJTMTZicHApIH0sCisJeyAweDExNCwgUlNDcmVhdGUoUlM4 MDB4NjAwLCAgIFJTMTZicHApIH0sCisJeyAweDE4QSwgUlNDcmVhdGUoUlM5NjB4NzIwLCAgIFJT MTZicHApIH0sCisJeyAweDExNywgUlNDcmVhdGUoUlMxMDI0eDc2OCwgIFJTMTZicHApIH0sCisJ eyAweDE5MiwgUlNDcmVhdGUoUlMxMTUyeDg2NCwgIFJTMTZicHApIH0sCisJeyAweDExQSwgUlND cmVhdGUoUlMxMjgweDEwMjQsIFJTMTZicHApIH0sCisJeyAweDE5QSwgUlNDcmVhdGUoUlMxNDA4 eDEwNTYsIFJTMTZicHApIH0sCisJeyAweDExRSwgUlNDcmVhdGUoUlMxNjAweDEyMDAsIFJTMTZi cHApIH0sCisJeyAweDFCMiwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTMjRicHApIH0sCisJeyAw eDE4NCwgUlNDcmVhdGUoUlM3Njh4NTc2LCAgIFJTMjRicHApIH0sCisJeyAweDFCNSwgUlNDcmVh dGUoUlM4MDB4NjAwLCAgIFJTMjRicHApIH0sCisJeyAweDE4QywgUlNDcmVhdGUoUlM5NjB4NzIw LCAgIFJTMjRicHApIH0sCisJeyAweDFCOCwgUlNDcmVhdGUoUlMxMDI0eDc2OCwgIFJTMjRicHAp IH0sCisJeyAweDE5NCwgUlNDcmVhdGUoUlMxMTUyeDg2NCwgIFJTMjRicHApIH0sCisJeyAweDFC QiwgUlNDcmVhdGUoUlMxMjgweDEwMjQsIFJTMjRicHApIH0sCisJeyAweDE5QywgUlNDcmVhdGUo UlMxNDA4eDEwNTYsIFJTMjRicHApIH0sCisJeyAweDFCRiwgUlNDcmVhdGUoUlMxNjAweDEyMDAs IFJTMjRicHApIH0sCisJeyAweDExMiwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTMzJicHApIH0s CisJeyAweDE4MywgUlNDcmVhdGUoUlM3Njh4NTc2LCAgIFJTMzJicHApIH0sCisJeyAweDExNSwg UlNDcmVhdGUoUlM4MDB4NjAwLCAgIFJTMzJicHApIH0sCisJeyAweDE4QiwgUlNDcmVhdGUoUlM5 NjB4NzIwLCAgIFJTMzJicHApIH0sCisJeyAweDExOCwgUlNDcmVhdGUoUlMxMDI0eDc2OCwgIFJT MzJicHApIH0sCisJeyAweDE5MywgUlNDcmVhdGUoUlMxMTUyeDg2NCwgIFJTMzJicHApIH0sCisJ eyAweDExQiwgUlNDcmVhdGUoUlMxMjgweDEwMjQsIFJTMzJicHApIH0sCisJeyAweDE5QiwgUlND cmVhdGUoUlMxNDA4eDEwNTYsIFJTMzJicHApIH0sCisJeyAweDExRiwgUlNDcmVhdGUoUlMxNjAw eDEyMDAsIFJTMzJicHApIH0sCisJeyAweDAxMCwgUlNDcmVhdGUoUlM2NDB4MzUwLCAgIFJTNGJw cCApIH0sCisJeyAweDAxMiwgUlNDcmVhdGUoUlM2NDB4NDgwLCAgIFJTNGJwcCApIH0sCisJeyAw eDEwMiwgUlNDcmVhdGUoUlM4MDB4NjAwLCAgIFJTNGJwcCApIH0sCisJeyAweDEwNCwgUlNDcmVh dGUoUlMxMDI0eDc2OCwgIFJTNGJwcCApIH0sCisJeyAweDEwNiwgUlNDcmVhdGUoUlMxMjgweDEw MjQsIFJTNGJwcCApIH0sCisJeyAgICAgMCwgMAkJCQl9fTsKKworc3RhdGljIHZvaWQgX19pbml0 IG1hdHJveGZiX2luaXRfcGFyYW1zKHZvaWQpIHsKKwkvKiBmaCBmcm9tIGtIeiB0byBIeiAqLwor CWlmIChmaCA8IDEwMDApCisJCWZoICo9IDEwMDA7CS8qIDFrSHogbWluaW11bSAqLworCS8qIG1h eGNsayAqLworCWlmIChtYXhjbGsgPCAxMDAwKSBtYXhjbGsgKj0gMTAwMDsJLyoga0h6IC0+IEh6 LCBNSHogLT4ga0h6ICovCisJaWYgKG1heGNsayA8IDEwMDAwMDApIG1heGNsayAqPSAxMDAwOwkv KiBrSHogLT4gSHosIDFNSHogbWluaW11bSAqLworCS8qIGZpeCBWRVNBIG51bWJlciAqLworCWlm ICh2ZXNhICE9IH4wKQorCQl2ZXNhICY9IDB4MURGRjsJCS8qIG1hc2sgb3V0IGNsZWFyc2NyZWVu LCBhY2NlbGVyYXRpb24gYW5kIHNvIG9uICovCisKKwkvKiBzdGF0aWMgc2V0dGluZ3MgKi8KKwlm b3IgKFJTcHRyID0gdmVzYW1hcDsgUlNwdHItPnZlc2E7IFJTcHRyKyspIHsKKwkJaWYgKFJTcHRy LT52ZXNhID09IHZlc2EpIGJyZWFrOworCX0KKwlpZiAoIVJTcHRyLT52ZXNhKSB7CisJCXByaW50 ayhLRVJOX0VSUiAiSW52YWxpZCB2ZXNhIG1vZGUgMHglMDRYXG4iLCB2ZXNhKTsKKwkJUlNwdHIg PSB2ZXNhbWFwOworCX0KKwl7CisJCWludCByZXMgPSBSU1Jlc29sdXRpb24oUlNwdHItPmluZm8p LTE7CisJCWlmIChsZWZ0ID09IH4wKQorCQkJbGVmdCA9IHRpbW1pbmdzW3Jlc10ubGVmdDsKKwkJ aWYgKCF4cmVzKQorCQkJeHJlcyA9IHRpbW1pbmdzW3Jlc10ueHJlczsKKwkJaWYgKHJpZ2h0ID09 IH4wKQorCQkJcmlnaHQgPSB0aW1taW5nc1tyZXNdLnJpZ2h0OworCQlpZiAoIWhzbGVuKQorCQkJ aHNsZW4gPSB0aW1taW5nc1tyZXNdLmhzbGVuOworCQlpZiAodXBwZXIgPT0gfjApCisJCQl1cHBl ciA9IHRpbW1pbmdzW3Jlc10udXBwZXI7CisJCWlmICgheXJlcykKKwkJCXlyZXMgPSB0aW1taW5n c1tyZXNdLnlyZXM7CisJCWlmIChsb3dlciA9PSB+MCkKKwkJCWxvd2VyID0gdGltbWluZ3NbcmVz XS5sb3dlcjsKKwkJaWYgKCF2c2xlbikKKwkJCXZzbGVuID0gdGltbWluZ3NbcmVzXS52c2xlbjsK KwkJaWYgKCEoZnZ8fGZofHxtYXhjbGt8fHBpeGNsb2NrKSkKKwkJCWZ2ID0gdGltbWluZ3NbcmVz XS52ZnJlcTsKKwkJaWYgKGRlcHRoID09IC0xKQorCQkJZGVwdGggPSBSU0RlcHRoKFJTcHRyLT5p bmZvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1hdHJveF9pbml0KHZvaWQpIHsKKwlp bnQgZXJyOworCisJbWF0cm94ZmJfaW5pdF9wYXJhbXMoKTsKKwllcnIgPSBwY2lfcmVnaXN0ZXJf ZHJpdmVyKCZtYXRyb3hmYl9kcml2ZXIpOworCWRldiA9IC0xOwkvKiBhY2NlcHQgYWxsIG5ldyBk ZXZpY2VzLi4uICovCisJcmV0dXJuIGVycjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioq KioqKioqKiBleGl0LXRpbWUgb25seSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisK K3N0YXRpYyB2b2lkIF9fZXhpdCBtYXRyb3hfZG9uZSh2b2lkKSB7CisJcGNpX3VucmVnaXN0ZXJf ZHJpdmVyKCZtYXRyb3hmYl9kcml2ZXIpOworfQorCisjaWZuZGVmIE1PRFVMRQorCisvKiAqKioq KioqKioqKioqKioqKioqKioqKioqIGluaXQgaW4ta2VybmVsIGNvZGUgKioqKioqKioqKioqKioq KioqKioqKioqKiogKi8KKworc3RhdGljIGludCBfX2luaXQgbWF0cm94ZmJfc2V0dXAoY2hhciAq b3B0aW9ucykgeworCWNoYXIgKnRoaXNfb3B0OworCisJREJHKF9fZnVuY19fKQorCisJaWYgKCFv cHRpb25zIHx8ICEqb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0g c3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfb3B0KSBjb250 aW51ZTsKKworCQlkcHJpbnRrKCJtYXRyb3hmYl9zZXR1cDogb3B0aW9uICVzXG4iLCB0aGlzX29w dCk7CisKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiZGV2OiIsIDQpKQorCQkJZGV2ID0gc2lt cGxlX3N0cnRvdWwodGhpc19vcHQrNCwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRo aXNfb3B0LCAiZGVwdGg6IiwgNikpIHsKKwkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvdWwodGhpc19v cHQrNiwgTlVMTCwgMCkpIHsKKwkJCQljYXNlIDA6IGRlcHRoID0gUlNUZXh0OyBicmVhazsKKwkJ CQljYXNlIDQ6IGRlcHRoID0gUlM0YnBwOyBicmVhazsKKwkJCQljYXNlIDg6IGRlcHRoID0gUlM4 YnBwOyBicmVhazsKKwkJCQljYXNlIDE1OmRlcHRoID0gUlMxNWJwcDsgYnJlYWs7CisJCQkJY2Fz ZSAxNjpkZXB0aCA9IFJTMTZicHA7IGJyZWFrOworCQkJCWNhc2UgMjQ6ZGVwdGggPSBSUzI0YnBw OyBicmVhazsKKwkJCQljYXNlIDMyOmRlcHRoID0gUlMzMmJwcDsgYnJlYWs7CisJCQkJZGVmYXVs dDoKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYjogdW5zdXBwb3J0ZWQgY29sb3IgZGVw dGhcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAieHJlczoiLCA1 KSkKKwkJCXhyZXMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs1LCBOVUxMLCAwKTsKKwkJZWxz ZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ5cmVzOiIsIDUpKQorCQkJeXJlcyA9IHNpbXBsZV9z dHJ0b3VsKHRoaXNfb3B0KzUsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29w dCwgInZzbGVuOiIsIDYpKQorCQkJdnNsZW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs2LCBO VUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJoc2xlbjoiLCA2KSkKKwkJ CWhzbGVuID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwgMCk7CisJCWVsc2UgaWYg KCFzdHJuY21wKHRoaXNfb3B0LCAibGVmdDoiLCA1KSkKKwkJCWxlZnQgPSBzaW1wbGVfc3RydG91 bCh0aGlzX29wdCs1LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJy aWdodDoiLCA2KSkKKwkJCXJpZ2h0ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwg MCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidXBwZXI6IiwgNikpCisJCQl1cHBl ciA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3Ry bmNtcCh0aGlzX29wdCwgImxvd2VyOiIsIDYpKQorCQkJbG93ZXIgPSBzaW1wbGVfc3RydG91bCh0 aGlzX29wdCs2LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwaXhj bG9jazoiLCA5KSkKKwkJCXBpeGNsb2NrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrOSwgTlVM TCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAic3luYzoiLCA1KSkKKwkJCXN5 bmMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs1LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0 cm5jbXAodGhpc19vcHQsICJ2ZXNhOiIsIDUpKQorCQkJdmVzYSA9IHNpbXBsZV9zdHJ0b3VsKHRo aXNfb3B0KzUsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1heGNs azoiLCA3KSkKKwkJCW1heGNsayA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzcsIE5VTEwsIDAp OworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImZoOiIsIDMpKQorCQkJZmggPSBzaW1w bGVfc3RydG91bCh0aGlzX29wdCszLCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhp c19vcHQsICJmdjoiLCAzKSkKKwkJCWZ2ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrMywgTlVM TCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWVtOiIsIDQpKQorCQkJbWVt ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNCwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJu Y21wKHRoaXNfb3B0LCAibW9kZToiLCA1KSkKKwkJCXN0cmxjcHkodmlkZW9tb2RlLCB0aGlzX29w dCs1LCBzaXplb2YodmlkZW9tb2RlKSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAi b3V0cHV0czoiLCA4KSkKKwkJCXN0cmxjcHkob3V0cHV0cywgdGhpc19vcHQrOCwgc2l6ZW9mKG91 dHB1dHMpKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJkZnA6IiwgNCkpIHsKKwkJ CWRmcF90eXBlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNCwgTlVMTCwgMCk7CisJCQlkZnAg PSAxOworCQl9CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJCWVsc2UgaWYgKCFzdHJuY21wKHRo aXNfb3B0LCAidm1vZGU6IiwgNikpIHsKKwkJCXVuc2lnbmVkIGludCB2bW9kZSA9IHNpbXBsZV9z dHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOworCQkJaWYgKHZtb2RlID4gMCAmJiB2bW9kZSA8 PSBWTU9ERV9NQVgpCisJCQkJZGVmYXVsdF92bW9kZSA9IHZtb2RlOworCQl9IGVsc2UgaWYgKCFz dHJuY21wKHRoaXNfb3B0LCAiY21vZGU6IiwgNikpIHsKKwkJCXVuc2lnbmVkIGludCBjbW9kZSA9 IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOworCQkJc3dpdGNoIChjbW9kZSkg eworCQkJCWNhc2UgMDoKKwkJCQljYXNlIDg6CisJCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84 OworCQkJCQlicmVhazsKKwkJCQljYXNlIDE1OgorCQkJCWNhc2UgMTY6CisJCQkJCWRlZmF1bHRf Y21vZGUgPSBDTU9ERV8xNjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyNDoKKwkJCQljYXNlIDMy OgorCQkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfMzI7CisJCQkJCWJyZWFrOworCQkJfQorCQl9 CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cmNtcCh0aGlzX29wdCwgImRpc2FibGVkIikpCS8qIG5v ZGlzYWJsZWQgZG9lcyBub3QgZXhpc3QgKi8KKwkJCWRpc2FibGVkID0gMTsKKwkJZWxzZSBpZiAo IXN0cmNtcCh0aGlzX29wdCwgImVuYWJsZWQiKSkJLyogbm9lbmFibGVkIGRvZXMgbm90IGV4aXN0 ICovCisJCQlkaXNhYmxlZCA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJzZ3Jh bSIpKQkvKiBub3NncmFtID09IHNkcmFtICovCisJCQlzZ3JhbSA9IDE7CisJCWVsc2UgaWYgKCFz dHJjbXAodGhpc19vcHQsICJzZHJhbSIpKQorCQkJc2dyYW0gPSAwOworCQllbHNlIGlmICghc3Ry bmNtcCh0aGlzX29wdCwgIm1lbXR5cGU6IiwgOCkpCisJCQltZW10eXBlID0gc2ltcGxlX3N0cnRv dWwodGhpc19vcHQrOCwgTlVMTCwgMCk7CisJCWVsc2UgeworCQkJaW50IHZhbHVlID0gMTsKKwor CQkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibm8iLCAyKSkgeworCQkJCXZhbHVlID0gMDsKKwkJ CQl0aGlzX29wdCArPSAyOworCQkJfQorCQkJaWYgKCEgc3RyY21wKHRoaXNfb3B0LCAiaW52ZXJz ZSIpKQorCQkJCWludmVyc2UgPSB2YWx1ZTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQs ICJhY2NlbCIpKQorCQkJCW5vYWNjZWwgPSAhdmFsdWU7CisJCQllbHNlIGlmICghc3RyY21wKHRo aXNfb3B0LCAicGFuIikpCisJCQkJbm9wYW4gPSAhdmFsdWU7CisJCQllbHNlIGlmICghc3RyY21w KHRoaXNfb3B0LCAicGNpcmV0cnkiKSkKKwkJCQlub19wY2lfcmV0cnkgPSAhdmFsdWU7CisJCQll bHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAidmdhIikpCisJCQkJbm92Z2EgPSAhdmFsdWU7CisJ CQllbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAiYmlvcyIpKQorCQkJCW5vYmlvcyA9ICF2YWx1 ZTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJpbml0IikpCisJCQkJbm9pbml0ID0g IXZhbHVlOworCQkJZWxzZSBpZiAoIXN0cmNtcCh0aGlzX29wdCwgIm10cnIiKSkKKwkJCQltdHJy ID0gdmFsdWU7CisJCQllbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAiaW52MjQiKSkKKwkJCQlp bnYyNCA9IHZhbHVlOworCQkJZWxzZSBpZiAoIXN0cmNtcCh0aGlzX29wdCwgImNyb3NzNE1CIikp CisJCQkJY3Jvc3M0TUIgPSB2YWx1ZTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJn cmF5c2NhbGUiKSkKKwkJCQlncmF5c2NhbGUgPSB2YWx1ZTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAo dGhpc19vcHQsICJkZnAiKSkKKwkJCQlkZnAgPSB2YWx1ZTsKKwkJCWVsc2UgeworCQkJCXN0cmxj cHkodmlkZW9tb2RlLCB0aGlzX29wdCwgc2l6ZW9mKHZpZGVvbW9kZSkpOworCQkJfQorCQl9CisJ fQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW5pdGlhbGl6ZWQgPSAw OworCitzdGF0aWMgaW50IF9faW5pdCBtYXRyb3hmYl9pbml0KHZvaWQpCit7CisJY2hhciAqb3B0 aW9uID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCURCRyhfX2Z1bmNfXykKKworCWlmIChmYl9n ZXRfb3B0aW9ucygibWF0cm94ZmIiLCAmb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWF0 cm94ZmJfc2V0dXAob3B0aW9uKTsKKworCWlmIChkaXNhYmxlZCkKKwkJcmV0dXJuIC1FTlhJTzsK KwlpZiAoIWluaXRpYWxpemVkKSB7CisJCWluaXRpYWxpemVkID0gMTsKKwkJZXJyID0gbWF0cm94 X2luaXQoKTsKKwl9CisJaG90cGx1ZyA9IDE7CisJLyogbmV2ZXIgcmV0dXJuIGZhaWx1cmUsIHVz ZXIgY2FuIGhvdHBsdWcgbWF0cm94IGxhdGVyLi4uICovCisJcmV0dXJuIGVycjsKK30KKworbW9k dWxlX2luaXQobWF0cm94ZmJfaW5pdCk7CisKKyNlbHNlCisKKy8qICoqKioqKioqKioqKioqKioq KioqKioqKioqKiBpbml0IG1vZHVsZSBjb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKiog Ki8KKworTU9EVUxFX0FVVEhPUigiKGMpIDE5OTgtMjAwMiBQZXRyIFZhbmRyb3ZlYyA8dmFuZHJv dmVAdmMuY3Z1dC5jej4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWNjZWxlcmF0ZWQgRkJEZXYg ZHJpdmVyIGZvciBNYXRyb3ggTWlsbGVubml1bS9NeXN0aXF1ZS9HMTAwL0cyMDAvRzQwMC9HNDUw L0c1NTAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1lbSwgaW50 LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiU2l6ZSBvZiBhdmFpbGFibGUgbWVtb3J5IGlu IE1CLCBLQiBvciBCICgyLDQsOCwxMiwxNk1CLCBkZWZhdWx0PWF1dG9kZXRlY3QpIik7Cittb2R1 bGVfcGFyYW0oZGlzYWJsZWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVkLCAi RGlzYWJsZWQgKDAgb3IgMT1kaXNhYmxlZCkgKGRlZmF1bHQ9MCkiKTsKK21vZHVsZV9wYXJhbShu b2FjY2VsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub2FjY2VsLCAiRG8gbm90IHVzZSBh Y2NlbGVyYXRpbmcgZW5naW5lICgwIG9yIDE9ZGlzYWJsZWQpIChkZWZhdWx0PTApIik7Cittb2R1 bGVfcGFyYW0obm9wYW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vcGFuLCAiRGlzYWJs ZSBwYW4gb24gc3RhcnR1cCAoMCBvciAxPWRpc2FibGVkKSAoZGVmYXVsdD0wKSIpOworbW9kdWxl X3BhcmFtKG5vX3BjaV9yZXRyeSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9fcGNpX3Jl dHJ5LCAiUENJIHJldHJpZXMgZW5hYmxlZCAoMCBvciAxPWRpc2FibGVkKSAoZGVmYXVsdD0wKSIp OworbW9kdWxlX3BhcmFtKG5vdmdhLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3ZnYSwg IlZHQSBJL08gKDB4M0MwLTB4M0RGKSBkaXNhYmxlZCAoMCBvciAxPWRpc2FibGVkKSAoZGVmYXVs dD0wKSIpOworbW9kdWxlX3BhcmFtKG5vYmlvcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mo bm9iaW9zLCAiRGlzYWJsZXMgUk9NIEJJT1MgKDAgb3IgMT1kaXNhYmxlZCkgKGRlZmF1bHQ9ZG8g bm90IGNoYW5nZSBCSU9TIHN0YXRlKSIpOworbW9kdWxlX3BhcmFtKG5vaW5pdCwgaW50LCAwKTsK K01PRFVMRV9QQVJNX0RFU0Mobm9pbml0LCAiRGlzYWJsZXMgVy9TRy9TRC1SQU0gYW5kIGJ1cyBp bnRlcmZhY2UgaW5pdGlhbGl6YXRpb24gKDAgb3IgMT1kbyBub3QgaW5pdGlhbGl6ZSkgKGRlZmF1 bHQ9MCkiKTsKK21vZHVsZV9wYXJhbShtZW10eXBlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVT QyhtZW10eXBlLCAiTWVtb3J5IHR5cGUgZm9yIEcyMDAvRzQwMCAoc2VlIERvY3VtZW50YXRpb24v ZmIvbWF0cm94ZmIudHh0IGZvciBleHBsYW5hdGlvbikgKGRlZmF1bHQ9MyBmb3IgRzIwMCwgMCBm b3IgRzQwMCkiKTsKK21vZHVsZV9wYXJhbShtdHJyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVT QyhtdHJyLCAiVGhpcyBzcGVlZHMgdXAgdmlkZW8gbWVtb3J5IGFjY2Vzc2VzICgwPWRpc2FibGVk IG9yIDEpIChkZWZhdWx0PTEpIik7Cittb2R1bGVfcGFyYW0oc2dyYW0sIGludCwgMCk7CitNT0RV TEVfUEFSTV9ERVNDKHNncmFtLCAiSW5kaWNhdGVzIHRoYXQgRzEwMC9HMjAwL0c0MDAgaGFzIFNH UkFNIG1lbW9yeSAoMD1TRFJBTSwgMT1TR1JBTSkgKGRlZmF1bHQ9MCkiKTsKK21vZHVsZV9wYXJh bShpbnYyNCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW52MjQsICJJbnZlcnRzIGNsb2Nr IHBvbGFyaXR5IGZvciAyNGJwcCBhbmQgbG9vcCBmcmVxdWVuY3kgPiAxMDBNSHogKGRlZmF1bHQ9 ZG8gbm90IGludmVydCBwb2xhcml0eSkiKTsKK21vZHVsZV9wYXJhbShpbnZlcnNlLCBpbnQsIDAp OworTU9EVUxFX1BBUk1fREVTQyhpbnZlcnNlLCAiSW52ZXJzZSAoMCBvciAxKSAoZGVmYXVsdD0w KSIpOworbW9kdWxlX3BhcmFtKGRldiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAi TXVsdGloZWFkIHN1cHBvcnQsIGF0dGFjaCB0byBkZXZpY2UgSUQgKDAuLk4pIChkZWZhdWx0PWFs bCB3b3JraW5nKSIpOworbW9kdWxlX3BhcmFtKHZlc2EsIGludCwgMCk7CitNT0RVTEVfUEFSTV9E RVNDKHZlc2EsICJTdGFydHVwIHZpZGVvbW9kZSAoMHgwMDAtMHgxRkYpIChkZWZhdWx0PTB4MTAx KSIpOworbW9kdWxlX3BhcmFtKHhyZXMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHhyZXMs ICJIb3Jpem9udGFsIHJlc29sdXRpb24gKHB4KSwgb3ZlcnJpZGVzIHhyZXMgZnJvbSB2ZXNhIChk ZWZhdWx0PXZlc2EpIik7Cittb2R1bGVfcGFyYW0oeXJlcywgaW50LCAwKTsKK01PRFVMRV9QQVJN X0RFU0MoeXJlcywgIlZlcnRpY2FsIHJlc29sdXRpb24gKHNjYW5zKSwgb3ZlcnJpZGVzIHlyZXMg ZnJvbSB2ZXNhIChkZWZhdWx0PXZlc2EpIik7Cittb2R1bGVfcGFyYW0odXBwZXIsIGludCwgMCk7 CitNT0RVTEVfUEFSTV9ERVNDKHVwcGVyLCAiVXBwZXIgYmxhbmsgc3BhY2UgKHNjYW5zKSwgb3Zl cnJpZGVzIHVwcGVyIGZyb20gdmVzYSAoZGVmYXVsdD12ZXNhKSIpOworbW9kdWxlX3BhcmFtKGxv d2VyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhsb3dlciwgIkxvd2VyIGJsYW5rIHNwYWNl IChzY2FucyksIG92ZXJyaWRlcyBsb3dlciBmcm9tIHZlc2EgKGRlZmF1bHQ9dmVzYSkiKTsKK21v ZHVsZV9wYXJhbSh2c2xlbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModnNsZW4sICJWZXJ0 aWNhbCBzeW5jIGxlbmd0aCAoc2NhbnMpLCBvdmVycmlkZXMgbG93ZXIgZnJvbSB2ZXNhIChkZWZh dWx0PXZlc2EpIik7Cittb2R1bGVfcGFyYW0obGVmdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RF U0MobGVmdCwgIkxlZnQgYmxhbmsgc3BhY2UgKHB4KSwgb3ZlcnJpZGVzIGxlZnQgZnJvbSB2ZXNh IChkZWZhdWx0PXZlc2EpIik7Cittb2R1bGVfcGFyYW0ocmlnaHQsIGludCwgMCk7CitNT0RVTEVf UEFSTV9ERVNDKHJpZ2h0LCAiUmlnaHQgYmxhbmsgc3BhY2UgKHB4KSwgb3ZlcnJpZGVzIHJpZ2h0 IGZyb20gdmVzYSAoZGVmYXVsdD12ZXNhKSIpOworbW9kdWxlX3BhcmFtKGhzbGVuLCBpbnQsIDAp OworTU9EVUxFX1BBUk1fREVTQyhoc2xlbiwgIkhvcml6b250YWwgc3luYyBsZW5ndGggKHB4KSwg b3ZlcnJpZGVzIGhzbGVuIGZyb20gdmVzYSAoZGVmYXVsdD12ZXNhKSIpOworbW9kdWxlX3BhcmFt KHBpeGNsb2NrLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwaXhjbG9jaywgIlBpeGVsY2xv Y2sgKG5zKSwgb3ZlcnJpZGVzIHBpeGNsb2NrIGZyb20gdmVzYSAoZGVmYXVsdD12ZXNhKSIpOwor bW9kdWxlX3BhcmFtKHN5bmMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bmMsICJTeW5j IHBvbGFyaXR5LCBvdmVycmlkZXMgc3luYyBmcm9tIHZlc2EgKGRlZmF1bHQ9dmVzYSkiKTsKK21v ZHVsZV9wYXJhbShkZXB0aCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVwdGgsICJDb2xv ciBkZXB0aCAoMD10ZXh0LDgsMTUsMTYsMjQsMzIpIChkZWZhdWx0PXZlc2EpIik7Cittb2R1bGVf cGFyYW0obWF4Y2xrLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhjbGssICJTdGFydHVw IG1heGltYWwgY2xvY2ssIDAtOTk5TUh6LCAxMDAwLTk5OTk5OWtIeiwgMTAwMDAwMC1JTkYgSHoi KTsKK21vZHVsZV9wYXJhbShmaCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmgsICJTdGFy dHVwIGhvcml6b250YWwgZnJlcXVlbmN5LCAwLTk5OWtIeiwgMTAwMC1JTkYgSHoiKTsKK21vZHVs ZV9wYXJhbShmdiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnYsICJTdGFydHVwIHZlcnRp Y2FsIGZyZXF1ZW5jeSwgMC1JTkYgSHpcbiIKKyJZb3Ugc2hvdWxkIHNwZWNpZnkgXCJmdjptYXhf bW9uaXRvcl92c3luYyxmaDptYXhfbW9uaXRvcl9oc3luYyxtYXhjbGs6bWF4X21vbml0b3JfZG90 Y2xvY2tcIiIpOworbW9kdWxlX3BhcmFtKGdyYXlzY2FsZSwgaW50LCAwKTsKK01PRFVMRV9QQVJN X0RFU0MoZ3JheXNjYWxlLCAiU2V0cyBkaXNwbGF5IGludG8gZ3JheXNjYWxlLiBXb3JrcyBwZXJm ZWN0bHkgd2l0aCBwYWxldGl6ZWQgdmlkZW9tb2RlICg0LCA4YnBwKSwgc29tZSBsaW1pdGF0aW9u cyBhcHBseSB0byAxNiwgMjQgYW5kIDMyYnBwIHZpZGVvbW9kZXMgKGRlZmF1bHQ9bm9ncmF5c2Nh bGUpIik7Cittb2R1bGVfcGFyYW0oY3Jvc3M0TUIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVND KGNyb3NzNE1CLCAiU3BlY2lmaWVzIHRoYXQgNE1CIGJvdW5kYXJ5IGNhbiBiZSBpbiBtaWRkbGUg b2YgbGluZS4gKGRlZmF1bHQ9YXV0b2RldGVjdGVkKSIpOworbW9kdWxlX3BhcmFtKGRmcCwgaW50 LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGZwLCAiU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGRp Z2l0YWwgZmxhdCBwYW5lbCBpbnRlcmZhY2Ugb2YgRzIwMC9HNDAwICgwIG9yIDEpIChkZWZhdWx0 PTApIik7Cittb2R1bGVfcGFyYW0oZGZwX3R5cGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVND KGRmcF90eXBlLCAiU3BlY2lmaWVzIERGUCBpbnRlcmZhY2UgdHlwZSAoMCB0byAyNTUpIChkZWZh dWx0PXJlYWQgZnJvbSBoYXJkd2FyZSkiKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcob3V0cHV0cywg b3V0cHV0cywgc2l6ZW9mKG91dHB1dHMpLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mob3V0cHV0cywg IlNwZWNpZmllcyB3aGljaCBDUlRDIGlzIG1hcHBlZCB0byB3aGljaCBvdXRwdXQgKHN0cmluZyBv ZiB1cCB0byB0aHJlZSBsZXR0ZXJzLCBjb25zaXN0aW5nIG9mIDAgKGRpc2FibGVkKSwgMSAoQ1JU QzEpLCAyIChDUlRDMikpIChkZWZhdWx0PTExMSBmb3IgR3g1MCwgMTAxIGZvciBHMjAwL0c0MDAg d2l0aCBERlAsIGFuZCAxMDAgZm9yIGFsbCBvdGhlciBkZXZpY2VzKSIpOworI2lmZGVmIENPTkZJ R19QUENfUE1BQworbW9kdWxlX3BhcmFtX25hbWVkKHZtb2RlLCBkZWZhdWx0X3Ztb2RlLCBpbnQs IDApOworTU9EVUxFX1BBUk1fREVTQyh2bW9kZSwgIlNwZWNpZnkgdGhlIHZtb2RlIG1vZGUgbnVt YmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgKDY0MHg0ODAgZGVmYXVsdCkiKTsKK21vZHVsZV9wYXJh bV9uYW1lZChjbW9kZSwgZGVmYXVsdF9jbW9kZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mo Y21vZGUsICJTcGVjaWZ5IHRoZSB2aWRlbyBkZXB0aCB0aGF0IHNob3VsZCBiZSB1c2VkICg4Yml0 IGRlZmF1bHQpIik7CisjZW5kaWYKKworaW50IF9faW5pdCBpbml0X21vZHVsZSh2b2lkKXsKKwor CURCRyhfX2Z1bmNfXykKKworCWlmIChkaXNhYmxlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlm IChkZXB0aCA9PSAwKQorCQlkZXB0aCA9IFJTVGV4dDsKKwllbHNlIGlmIChkZXB0aCA9PSA0KQor CQlkZXB0aCA9IFJTNGJwcDsKKwllbHNlIGlmIChkZXB0aCA9PSA4KQorCQlkZXB0aCA9IFJTOGJw cDsKKwllbHNlIGlmIChkZXB0aCA9PSAxNSkKKwkJZGVwdGggPSBSUzE1YnBwOworCWVsc2UgaWYg KGRlcHRoID09IDE2KQorCQlkZXB0aCA9IFJTMTZicHA7CisJZWxzZSBpZiAoZGVwdGggPT0gMjQp CisJCWRlcHRoID0gUlMyNGJwcDsKKwllbHNlIGlmIChkZXB0aCA9PSAzMikKKwkJZGVwdGggPSBS UzMyYnBwOworCWVsc2UgaWYgKGRlcHRoICE9IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWF0 cm94ZmI6IGRlcHRoICVkIGlzIG5vdCBzdXBwb3J0ZWQsIHVzaW5nIGRlZmF1bHRcbiIsIGRlcHRo KTsKKwkJZGVwdGggPSAtMTsKKwl9CisJbWF0cm94X2luaXQoKTsKKwkvKiBuZXZlciByZXR1cm4g ZmFpbHVyZTsgdXNlciBjYW4gaG90cGx1ZyBtYXRyb3ggbGF0ZXIuLi4gKi8KKwlyZXR1cm4gMDsK K30KKyNlbmRpZgkvKiBNT0RVTEUgKi8KKworbW9kdWxlX2V4aXQobWF0cm94X2RvbmUpOworRVhQ T1JUX1NZTUJPTChtYXRyb3hmYl9yZWdpc3Rlcl9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChtYXRy b3hmYl91bnJlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKG1hdHJveGZiX3dhaXRfZm9y X3N5bmMpOworRVhQT1JUX1NZTUJPTChtYXRyb3hmYl9lbmFibGVfaXJxKTsKKworLyoKKyAqIE92 ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxl LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2lj LW9mZnNldDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9t Z2FrbXMvbWF0cm94ZmJfYmFzZS5oIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9i YXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5mODVhZDI1NjU5 ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX2Jh c2UuaApAQCAtMCwwICsxLDcxMCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjAgKi8KKy8qCisgKgorICogSGFyZHdhcmUgYWNjZWxlcmF0ZWQgTWF0cm94IE1pbGxlbm5pdW0g SSwgSUksIE15c3RpcXVlLCBHMTAwLCBHMjAwLCBHNDAwIGFuZCBHNDUwCisgKgorICogKGMpIDE5 OTgtMjAwMiBQZXRyIFZhbmRyb3ZlYyA8dmFuZHJvdmVAdmMuY3Z1dC5jej4KKyAqCisgKi8KKyNp Zm5kZWYgX19NQVRST1hGQl9IX18KKyNkZWZpbmUgX19NQVRST1hGQl9IX18KKworLyogZ2VuZXJh bCwgYnV0IGZhaXJseSBoZWF2eSwgZGVidWdnaW5nICovCisjdW5kZWYgTUFUUk9YRkJfREVCVUcK KworLyogaGVhdnkgZGVidWdnaW5nOiAqLworLyogLS0gbG9ncyBwdXRjW3NdLCBzbyBldmVyeSB0 aW1lIGEgY2hhciBpcyBkaXNwbGF5ZWQsIGl0J3MgbG9nZ2VkICovCisjdW5kZWYgTUFUUk9YRkJf REVCVUdfSEVBVlkKKworLyogVGhpcyBvbmUgX2NvdWxkXyBjYXVzZSBpbmZpbml0ZSBsb29wcyAq LworLyogSXQgX2RvZXNfIGNhdXNlIGxvdHMgYW5kIGxvdHMgb2YgbWVzc2FnZXMgZHVyaW5nIGlk bGUgbG9vcHMgKi8KKyN1bmRlZiBNQVRST1hGQl9ERUJVR19MT09QCisKKy8qIERlYnVnIHJlZ2lz dGVyIGNhbGxzLCB0b28/ICovCisjdW5kZWYgTUFUUk9YRkJfREVCVUdfUkVHCisKKy8qIEd1YXJk IGFjY2VsZXJhdG9yIGFjY2Vzc2VzIHdpdGggc3Bpbl9sb2NrX2lycXNhdmUuLi4gKi8KKyN1bmRl ZiBNQVRST1hGQl9VU0VfU1BJTkxPQ0tTCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1 ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGlu dXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmIu aD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9u Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgor I2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVk ZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCisjaW5jbHVkZSA8 YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaWYgZGVmaW5lZChDT05G SUdfUFBDX1BNQUMpCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlICIuLi9tYWNtb2Rl cy5oIgorI2VuZGlmCisKKyNpZmRlZiBNQVRST1hGQl9ERUJVRworCisjZGVmaW5lIERFQlVHCisj ZGVmaW5lIERCRyh4KQkJcHJpbnRrKEtFUk5fREVCVUcgIm1hdHJveGZiOiAlc1xuIiwgKHgpKTsK KworI2lmZGVmIE1BVFJPWEZCX0RFQlVHX0hFQVZZCisjZGVmaW5lIERCR19IRUFWWSh4KQlEQkco eCkKKyNlbHNlIC8qIE1BVFJPWEZCX0RFQlVHX0hFQVZZICovCisjZGVmaW5lIERCR19IRUFWWSh4 KQkvKiBEQkdfSEVBVlkgKi8KKyNlbmRpZiAvKiBNQVRST1hGQl9ERUJVR19IRUFWWSAqLworCisj aWZkZWYgTUFUUk9YRkJfREVCVUdfTE9PUAorI2RlZmluZSBEQkdfTE9PUCh4KQlEQkcoeCkKKyNl bHNlIC8qIE1BVFJPWEZCX0RFQlVHX0xPT1AgKi8KKyNkZWZpbmUgREJHX0xPT1AoeCkJLyogREJH X0xPT1AgKi8KKyNlbmRpZiAvKiBNQVRST1hGQl9ERUJVR19MT09QICovCisKKyNpZmRlZiBNQVRS T1hGQl9ERUJVR19SRUcKKyNkZWZpbmUgREJHX1JFRyh4KQlEQkcoeCkKKyNlbHNlIC8qIE1BVFJP WEZCX0RFQlVHX1JFRyAqLworI2RlZmluZSBEQkdfUkVHKHgpCS8qIERCR19SRUcgKi8KKyNlbmRp ZiAvKiBNQVRST1hGQl9ERUJVR19SRUcgKi8KKworI2Vsc2UgLyogTUFUUk9YRkJfREVCVUcgKi8K KworI2RlZmluZSBEQkcoeCkJCS8qIERCRyAqLworI2RlZmluZSBEQkdfSEVBVlkoeCkJLyogREJH X0hFQVZZICovCisjZGVmaW5lIERCR19SRUcoeCkJLyogREJHX1JFRyAqLworI2RlZmluZSBEQkdf TE9PUCh4KQkvKiBEQkdfTE9PUCAqLworCisjZW5kaWYgLyogTUFUUk9YRkJfREVCVUcgKi8KKwor I2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGsoWC4uLikJcHJpbnRrKFgpCisjZWxzZQorI2Rl ZmluZSBkcHJpbnRrKFguLi4pCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfU1NfVkVORE9SX0lEX1NJ RU1FTlNfTklYRE9SRgorI2RlZmluZSBQQ0lfU1NfVkVORE9SX0lEX1NJRU1FTlNfTklYRE9SRgkw eDExMEEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfU1NfVkVORE9SX0lEX01BVFJPWAorI2RlZmluZSBQ Q0lfU1NfVkVORE9SX0lEX01BVFJPWAkJUENJX1ZFTkRPUl9JRF9NQVRST1gKKyNlbmRpZgorCisj aWZuZGVmIFBDSV9TU19JRF9NQVRST1hfUFJPRFVDVElWQV9HMTAwX0FHUAorI2RlZmluZSBQQ0lf U1NfSURfTUFUUk9YX0dFTkVSSUMJCTB4RkYwMAorI2RlZmluZSBQQ0lfU1NfSURfTUFUUk9YX1BS T0RVQ1RJVkFfRzEwMF9BR1AJMHhGRjAxCisjZGVmaW5lIFBDSV9TU19JRF9NQVRST1hfTVlTVElR VUVfRzIwMF9BR1AJMHhGRjAyCisjZGVmaW5lIFBDSV9TU19JRF9NQVRST1hfTUlMTEVOSVVNX0cy MDBfQUdQCTB4RkYwMworI2RlZmluZSBQQ0lfU1NfSURfTUFUUk9YX01BUlZFTF9HMjAwX0FHUAkw eEZGMDQKKyNkZWZpbmUgUENJX1NTX0lEX01BVFJPWF9NR0FfRzEwMF9QQ0kJCTB4RkYwNQorI2Rl ZmluZSBQQ0lfU1NfSURfTUFUUk9YX01HQV9HMTAwX0FHUAkJMHgxMDAxCisjZGVmaW5lIFBDSV9T U19JRF9NQVRST1hfTUlMTEVOTklVTV9HNDAwX01BWF9BR1AJMHgyMTc5CisjZGVmaW5lIFBDSV9T U19JRF9TSUVNRU5TX01HQV9HMTAwX0FHUAkJMHgwMDFFIC8qIDMwICovCisjZGVmaW5lIFBDSV9T U19JRF9TSUVNRU5TX01HQV9HMjAwX0FHUAkJMHgwMDMyIC8qIDUwICovCisjZW5kaWYKKworI2Rl ZmluZSBNWF9WSVNVQUxfVFJVRUNPTE9SCUZCX1ZJU1VBTF9ESVJFQ1RDT0xPUgorI2RlZmluZSBN WF9WSVNVQUxfRElSRUNUQ09MT1IJRkJfVklTVUFMX1RSVUVDT0xPUgorI2RlZmluZSBNWF9WSVNV QUxfUFNFVURPQ09MT1IJRkJfVklTVUFMX1BTRVVET0NPTE9SCisKKyNkZWZpbmUgQ05WVF9UT0hX KHZhbCx3aWR0aCkgKCgoKHZhbCk8PCh3aWR0aCkpKzB4N0ZGRi0odmFsKSk+PjE2KQorCisvKiBH LXNlcmllcyBhbmQgTXlzdGlxdWUgaGF2ZSAoYWxtb3N0KSBzYW1lIERBQyAqLworI3VuZGVmIE5F RURfREFDMTA2NAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX01BVFJPWF9NWVNUSVFVRSkgfHwgZGVm aW5lZChDT05GSUdfRkJfTUFUUk9YX0cpCisjZGVmaW5lIE5FRURfREFDMTA2NCAxCisjZW5kaWYK KwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgX19pb21lbSoJdmFkZHI7Cit9IHZhZGRyX3Q7CisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1nYV9yZWFkYih2YWRkcl90IHZhLCB1bnNpZ25l ZCBpbnQgb2ZmcykgeworCXJldHVybiByZWFkYih2YS52YWRkciArIG9mZnMpOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgbWdhX3dyaXRlYih2YWRkcl90IHZhLCB1bnNpZ25lZCBpbnQgb2Zmcywg dV9pbnQ4X3QgdmFsdWUpIHsKKwl3cml0ZWIodmFsdWUsIHZhLnZhZGRyICsgb2Zmcyk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBtZ2Ffd3JpdGV3KHZhZGRyX3QgdmEsIHVuc2lnbmVkIGludCBv ZmZzLCB1X2ludDE2X3QgdmFsdWUpIHsKKwl3cml0ZXcodmFsdWUsIHZhLnZhZGRyICsgb2Zmcyk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdV9pbnQzMl90IG1nYV9yZWFkbCh2YWRkcl90IHZhLCB1bnNp Z25lZCBpbnQgb2ZmcykgeworCXJldHVybiByZWFkbCh2YS52YWRkciArIG9mZnMpOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgbWdhX3dyaXRlbCh2YWRkcl90IHZhLCB1bnNpZ25lZCBpbnQgb2Zm cywgdV9pbnQzMl90IHZhbHVlKSB7CisJd3JpdGVsKHZhbHVlLCB2YS52YWRkciArIG9mZnMpOwor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWdhX21lbWNweV90b2lvKHZhZGRyX3QgdmEsIGNvbnN0 IHZvaWQqIHNyYywgaW50IGxlbikgeworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVk KF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJLyoKKwkgKiBpb3dyaXRlMzJfcmVw IHdvcmtzIGZvciB1cyBpZjoKKwkgKiAgKDEpIENvcGllcyBkYXRhIGFzIDMyYml0IHF1YW50aXRp ZXMsIG5vdCBieXRlIGFmdGVyIGJ5dGUsCisJICogICgyKSBQZXJmb3JtcyBMRSBvcmRlcmVkIHN0 b3JlcywgYW5kCisJICogICgzKSBJdCBjb3BlcyB3aXRoIHVuYWxpZ25lZCBzb3VyY2UgKGRlc3Rp bmF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgcGFnZQorCSAqICAgICAgYWxpZ25lZCBhbmQgbGVu Z3RoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbXVsdGlwbGUgb2YgNCkuCisJICovCisJaW93cml0ZTMy X3JlcCh2YS52YWRkciwgc3JjLCBsZW4gPj4gMik7CisjZWxzZQorICAgICAgICB1X2ludDMyX3Qg X19pb21lbSogYWRkciA9IHZhLnZhZGRyOworCisJaWYgKCh1bnNpZ25lZCBsb25nKXNyYyAmIDMp IHsKKwkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQlmYl93cml0ZWwoZ2V0X3VuYWxpZ25lZCgodTMy ICopc3JjKSwgYWRkcik7CisJCQlhZGRyKys7CisJCQlsZW4gLT0gNDsKKwkJCXNyYyArPSA0Owor CQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQlmYl93cml0ZWwoKih1MzIg KilzcmMsIGFkZHIpOworCQkJYWRkcisrOworCQkJbGVuIC09IDQ7CisJCQlzcmMgKz0gNDsKKwkJ fQorCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmFkZHJfYWRkKHZhZGRyX3Qq IHZhLCB1bnNpZ25lZCBsb25nIG9mZnMpIHsKKwl2YS0+dmFkZHIgKz0gb2ZmczsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIF9faW9tZW0qIHZhZGRyX3ZhKHZhZGRyX3QgdmEpIHsKKwlyZXR1cm4g dmEudmFkZHI7Cit9CisKK3N0cnVjdCBteV90aW1taW5nIHsKKwl1bnNpZ25lZCBpbnQgcGl4Y2xv Y2s7CisJaW50IG1ucDsKKwl1bnNpZ25lZCBpbnQgY3J0YzsKKwl1bnNpZ25lZCBpbnQgSERpc3Bs YXk7CisJdW5zaWduZWQgaW50IEhTeW5jU3RhcnQ7CisJdW5zaWduZWQgaW50IEhTeW5jRW5kOwor CXVuc2lnbmVkIGludCBIVG90YWw7CisJdW5zaWduZWQgaW50IFZEaXNwbGF5OworCXVuc2lnbmVk IGludCBWU3luY1N0YXJ0OworCXVuc2lnbmVkIGludCBWU3luY0VuZDsKKwl1bnNpZ25lZCBpbnQg VlRvdGFsOworCXVuc2lnbmVkIGludCBzeW5jOworCWludAkgICAgIGRibHNjYW47CisJaW50CSAg ICAgaW50ZXJsYWNlZDsKKwl1bnNpZ25lZCBpbnQgZGVsYXk7CS8qIENSVEMgZGVsYXkgKi8KK307 CisKK2VudW0geyBNX1NZU1RFTV9QTEwsIE1fUElYRUxfUExMX0EsIE1fUElYRUxfUExMX0IsIE1f UElYRUxfUExMX0MsIE1fVklERU9fUExMIH07CisKK3N0cnVjdCBtYXRyb3hfcGxsX2NhY2hlIHsK Kwl1bnNpZ25lZCBpbnQJdmFsaWQ7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50CW1ucF9rZXk7 CisJCXVuc2lnbmVkIGludAltbnBfdmFsdWU7CisJCSAgICAgIH0gZGF0YVs0XTsKK307CisKK3N0 cnVjdCBtYXRyb3hfcGxsX2xpbWl0cyB7CisJdW5zaWduZWQgaW50CXZjb21pbjsKKwl1bnNpZ25l ZCBpbnQJdmNvbWF4OworfTsKKworc3RydWN0IG1hdHJveF9wbGxfZmVhdHVyZXMgeworCXVuc2ln bmVkIGludAl2Y29fZnJlcV9taW47CisJdW5zaWduZWQgaW50CXJlZl9mcmVxOworCXVuc2lnbmVk IGludAlmZWVkX2Rpdl9taW47CisJdW5zaWduZWQgaW50CWZlZWRfZGl2X21heDsKKwl1bnNpZ25l ZCBpbnQJaW5fZGl2X21pbjsKKwl1bnNpZ25lZCBpbnQJaW5fZGl2X21heDsKKwl1bnNpZ25lZCBp bnQJcG9zdF9zaGlmdF9tYXg7Cit9OworCitzdHJ1Y3QgbWF0cm94ZmJfcGFyCit7CisJdW5zaWdu ZWQgaW50CWZpbmFsX2JwcFNoaWZ0OworCXVuc2lnbmVkIGludAljbWFwX2xlbjsKKwlzdHJ1Y3Qg eworCQl1bnNpZ25lZCBpbnQgYnl0ZXM7CisJCXVuc2lnbmVkIGludCBwaXhlbHM7CisJCXVuc2ln bmVkIGludCBjaHVua3M7CisJCSAgICAgIH0geWRzdG9yZzsKK307CisKK3N0cnVjdCBtYXRyb3hf ZmJfaW5mbzsKKworc3RydWN0IG1hdHJveF9EQUMxMDY0X2ZlYXR1cmVzIHsKKwl1X2ludDhfdAl4 dnJlZmN0cmw7CisJdV9pbnQ4X3QJeG1pc2NjdHJsOworfTsKKworLyogY3VycmVudCBoYXJkd2Fy ZSBzdGF0dXMgKi8KK3N0cnVjdCBtYXZlbnJlZ3MgeworCXVfaW50OF90IHJlZ3NbMjU2XTsKKwlp bnQJIG1vZGU7CisJaW50CSB2bGluZXM7CisJaW50CSB4dGFsOworCWludAkgZnY7CisKKwl1X2lu dDE2X3QgaHRvdGFsOworCXVfaW50MTZfdCBoY29ycjsKK307CisKK3N0cnVjdCBtYXRyb3hfY3J0 YzIgeworCXVfaW50MzJfdCBjdGw7Cit9OworCitzdHJ1Y3QgbWF0cm94X2h3X3N0YXRlIHsKKwl1 X2ludDMyX3QJTVhvcHRpb25SZWc7CisJdW5zaWduZWQgY2hhcglEQUNjbGtbNl07CisJdW5zaWdu ZWQgY2hhcglEQUNyZWdbODBdOworCXVuc2lnbmVkIGNoYXIJTWlzY091dFJlZzsKKwl1bnNpZ25l ZCBjaGFyCURBQ3BhbFs3NjhdOworCXVuc2lnbmVkIGNoYXIJQ1JUQ1syNV07CisJdW5zaWduZWQg Y2hhcglDUlRDRVhUWzldOworCXVuc2lnbmVkIGNoYXIJU0VRWzVdOworCS8qIHVudXNlZCBmb3Ig TUdBIG1vZGUsIGJ1dCB3aG8ga25vd3MuLi4gKi8KKwl1bnNpZ25lZCBjaGFyCUdDVExbOV07CisJ LyogdW51c2VkIGZvciBNR0EgbW9kZSwgYnV0IHdobyBrbm93cy4uLiAqLworCXVuc2lnbmVkIGNo YXIJQVRUUlsyMV07CisKKwkvKiBUVk91dCBvbmx5ICovCisJc3RydWN0IG1hdmVucmVncwltYXZl bjsKKworCXN0cnVjdCBtYXRyb3hfY3J0YzIJY3J0YzI7Cit9OworCitzdHJ1Y3QgbWF0cm94X2Fj Y2VsX2RhdGEgeworI2lmZGVmIENPTkZJR19GQl9NQVRST1hfTUlMTEVOSVVNCisJdW5zaWduZWQg Y2hhcglyYW1kYWNfcmV2OworI2VuZGlmCisJdV9pbnQzMl90CW1fZHdnX3JlY3Q7CisJdV9pbnQz Ml90CW1fb3Btb2RlOworCXVfaW50MzJfdAltX2FjY2VzczsKKwl1X2ludDMyX3QJbV9waXRjaDsK K307CisKK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybDsKK3N0cnVjdCB2NGwyX2NvbnRyb2w7CisKK3N0 cnVjdCBtYXRyb3hfYWx0b3V0IHsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJKCpjb21wdXRl KSh2b2lkKiBhbHRvdXRfZGV2LCBzdHJ1Y3QgbXlfdGltbWluZyogaW5wdXQpOworCWludAkJKCpw cm9ncmFtKSh2b2lkKiBhbHRvdXRfZGV2KTsKKwlpbnQJCSgqc3RhcnQpKHZvaWQqIGFsdG91dF9k ZXYpOworCWludAkJKCp2ZXJpZnltb2RlKSh2b2lkKiBhbHRvdXRfZGV2LCB1X2ludDMyX3QgbW9k ZSk7CisJaW50CQkoKmdldHF1ZXJ5Y3RybCkodm9pZCogYWx0b3V0X2RldiwKKwkJCQkJc3RydWN0 IHY0bDJfcXVlcnljdHJsKiBjdHJsKTsKKwlpbnQJCSgqZ2V0Y3RybCkodm9pZCogYWx0b3V0X2Rl diwgCisJCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCk7CisJaW50CQkoKnNldGN0cmwp KHZvaWQqIGFsdG91dF9kZXYsIAorCQkJCSAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpOwor fTsKKworI2RlZmluZSBNQVRST1hGQl9TUkNfTk9ORQkwCisjZGVmaW5lIE1BVFJPWEZCX1NSQ19D UlRDMQkxCisjZGVmaW5lIE1BVFJPWEZCX1NSQ19DUlRDMgkyCisKK2VudW0gbWdhX2NoaXAgeyBN R0FfMjA2NCwgTUdBXzIxNjQsIE1HQV8xMDY0LCBNR0FfMTE2NCwgTUdBX0cxMDAsIE1HQV9HMjAw LCBNR0FfRzQwMCwgTUdBX0c0NTAsIE1HQV9HNTUwIH07CisKK3N0cnVjdCBtYXRyb3hfYmlvcyB7 CisJdW5zaWduZWQgaW50CWJpb3NfdmFsaWQgOiAxOworCXVuc2lnbmVkIGludAlwaW5zX2xlbjsK Kwl1bnNpZ25lZCBjaGFyCXBpbnNbMTI4XTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHZN YWosIHZNaW4sIHZSZXY7CisJCSAgICAgIH0gdmVyc2lvbjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25l ZCBjaGFyIHN0YXRlLCB0dm91dDsKKwkJICAgICAgfSBvdXRwdXQ7Cit9OworCitzdHJ1Y3QgbWF0 cm94X3N3aXRjaDsKK3N0cnVjdCBtYXRyb3hmYl9kcml2ZXI7CitzdHJ1Y3QgbWF0cm94ZmJfZGhf ZmJfaW5mbzsKKworc3RydWN0IG1hdHJveF92c3luYyB7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2Fp dDsKKwl1bnNpZ25lZCBpbnQJCWNudDsKK307CisKK3N0cnVjdCBtYXRyb3hfZmJfaW5mbyB7CisJ c3RydWN0IGZiX2luZm8JCWZiY29uOworCisJc3RydWN0IGxpc3RfaGVhZAluZXh0X2ZiOworCisJ aW50CQkJZGVhZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZDsKKwl1bnNp Z25lZCBpbnQJCXVzZWNvdW50OworCisJdW5zaWduZWQgaW50CQl1c2VydXNlY291bnQ7CisJdW5z aWduZWQgbG9uZwkJaXJxX2ZsYWdzOworCisJc3RydWN0IG1hdHJveGZiX3BhcgljdXJyOworCXN0 cnVjdCBtYXRyb3hfaHdfc3RhdGUJaHc7CisKKwlzdHJ1Y3QgbWF0cm94X2FjY2VsX2RhdGEgYWNj ZWw7CisKKwlzdHJ1Y3QgcGNpX2RldioJCXBjaWRldjsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBt YXRyb3hfdnN5bmMJdnN5bmM7CisJCXVuc2lnbmVkIGludAlwaXhjbG9jazsKKwkJaW50CQltbnA7 CisJCWludAkJcGFucG9zOworCQkJICAgICAgfSBjcnRjMTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qg bWF0cm94X3ZzeW5jCXZzeW5jOworCQl1bnNpZ25lZCBpbnQgCXBpeGNsb2NrOworCQlpbnQJCW1u cDsKKwlzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbyoJaW5mbzsKKwlzdHJ1Y3Qgcndfc2VtYXBo b3JlCWxvY2s7CisJCQkgICAgICB9IGNydGMyOworCXN0cnVjdCB7CisJc3RydWN0IHJ3X3NlbWFw aG9yZQlsb2NrOworCXN0cnVjdCB7CisJCWludCBicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJh dGlvbiwgaHVlLCBnYW1tYTsKKwkJaW50IHRlc3RvdXQsIGRlZmxpY2tlcjsKKwkJCQl9IHR2b19w YXJhbXM7CisJCQkgICAgICB9IGFsdG91dDsKKyNkZWZpbmUgTUFUUk9YRkJfTUFYX09VVFBVVFMJ CTMKKwlzdHJ1Y3QgeworCXVuc2lnbmVkIGludAkJc3JjOworCXN0cnVjdCBtYXRyb3hfYWx0b3V0 KglvdXRwdXQ7CisJdm9pZCoJCQlkYXRhOworCXVuc2lnbmVkIGludAkJbW9kZTsKKwl1bnNpZ25l ZCBpbnQJCWRlZmF1bHRfc3JjOworCQkJICAgICAgfSBvdXRwdXRzW01BVFJPWEZCX01BWF9PVVRQ VVRTXTsKKworI2RlZmluZSBNQVRST1hGQl9NQVhfRkJfRFJJVkVSUwkJNQorCXN0cnVjdCBtYXRy b3hmYl9kcml2ZXIqIChkcml2ZXJzW01BVFJPWEZCX01BWF9GQl9EUklWRVJTXSk7CisJdm9pZCoJ CQkoZHJpdmVyc19kYXRhW01BVFJPWEZCX01BWF9GQl9EUklWRVJTXSk7CisJdW5zaWduZWQgaW50 CQlkcml2ZXJzX2NvdW50OworCisJc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCWJhc2U7CS8qIHBo eXNpY2FsICovCisJdmFkZHJfdAkJdmJhc2U7CS8qIENQVSB2aWV3ICovCisJdW5zaWduZWQgaW50 CWxlbjsKKwl1bnNpZ25lZCBpbnQJbGVuX3VzYWJsZTsKKwl1bnNpZ25lZCBpbnQJbGVuX21heGlt dW07CisJCSAgICAgIH0gdmlkZW87CisKKwlzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJYmFzZTsJ LyogcGh5c2ljYWwgKi8KKwl2YWRkcl90CQl2YmFzZTsJLyogQ1BVIHZpZXcgKi8KKwl1bnNpZ25l ZCBpbnQJbGVuOworCQkgICAgICB9IG1taW87CisKKwl1bnNpZ25lZCBpbnQJbWF4X3BpeGVsX2Ns b2NrOworCXVuc2lnbmVkIGludAltYXhfcGl4ZWxfY2xvY2tfcGFuZWxsaW5rOworCisJc3RydWN0 IG1hdHJveF9zd2l0Y2gqCWh3X3N3aXRjaDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBtYXRyb3hf cGxsX2ZlYXR1cmVzIHBsbDsKKwkJc3RydWN0IG1hdHJveF9EQUMxMDY0X2ZlYXR1cmVzIERBQzEw NjQ7CisJCQkgICAgICB9IGZlYXR1cmVzOworCXN0cnVjdCB7CisJCXNwaW5sb2NrX3QJREFDOwor CQlzcGlubG9ja190CWFjY2VsOworCQkJICAgICAgfSBsb2NrOworCisJZW51bSBtZ2FfY2hpcAkJ Y2hpcDsKKworCWludAkJCWludGVybGVhdmU7CisJaW50CQkJbWlsbGVuaXVtOworCWludAkJCW1p bGxlbml1bUlJOworCXN0cnVjdCB7CisJCWludAkJY2ZiNDsKKwkJY29uc3QgaW50Kgl2eHJlczsK KwkJaW50CQljcm9zczRNQjsKKwkJaW50CQl0ZXh0OworCQlpbnQJCXBsbnd0OworCQlpbnQJCXNy Y29yZzsKKwkJCSAgICAgIH0gY2FwYWJsZTsKKwlpbnQJCQl3Y19jb29raWU7CisJc3RydWN0IHsK KwkJaW50CQlwcmVjaXNlX3dpZHRoOworCQlpbnQJCW1nYV8yNGJwcF9maXg7CisJCWludAkJbm92 Z2E7CisJCWludAkJbm9iaW9zOworCQlpbnQJCW5vcGNpcmV0cnk7CisJCWludAkJbm9pbml0Owor CQlpbnQJCXNncmFtOworCQlpbnQJCXN1cHBvcnQzMk1COworCisJCWludAkJYWNjZWxlcmF0b3I7 CisJCWludAkJdGV4dF90eXBlX2F1eDsKKwkJaW50CQl2aWRlbzY0Yml0czsKKwkJaW50CQljcnRj MjsKKwkJaW50CQltYXZlbl9jYXBhYmxlOworCQl1bnNpZ25lZCBpbnQJdmdhc3RlcDsKKwkJdW5z aWduZWQgaW50CXRleHRtb2RlOworCQl1bnNpZ25lZCBpbnQJdGV4dHN0ZXA7CisJCXVuc2lnbmVk IGludAl0ZXh0dnJhbTsJLyogY2hhcmFjdGVyIGNlbGxzICovCisJCXVuc2lnbmVkIGludAl5ZHN0 b3JnOwkvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB2aWRlbyBzdGFydCB0byB1c2FibGUgbWVtb3J5 ICovCisJCQkJCQkvKiAwIGV4Y2VwdCBmb3IgNk1CIE1pbGxlbml1bSAqLworCQlpbnQJCW1lbXR5 cGU7CisJCWludAkJZzQ1MGRhYzsKKwkJaW50CQlkZnBfdHlwZTsKKwkJaW50CQlwYW5lbGxpbms7 CS8qIEc0MDAgREZQIHBvc3NpYmxlIChub3QgRzQ1MC9HNTUwKSAqLworCQlpbnQJCWR1YWxoZWFk OworCQl1bnNpZ25lZCBpbnQJZmJSZXNvdXJjZTsKKwkJCSAgICAgIH0gZGV2ZmxhZ3M7CisJc3Ry dWN0IGZiX29wcwkJZmJvcHM7CisJc3RydWN0IG1hdHJveF9iaW9zCWJpb3M7CisJc3RydWN0IHsK KwkJc3RydWN0IG1hdHJveF9wbGxfbGltaXRzCXBpeGVsOworCQlzdHJ1Y3QgbWF0cm94X3BsbF9s aW1pdHMJc3lzdGVtOworCQlzdHJ1Y3QgbWF0cm94X3BsbF9saW1pdHMJdmlkZW87CisJCQkgICAg ICB9IGxpbWl0czsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbWF0cm94X3BsbF9jYWNoZQlwaXhlbDsK KwkJc3RydWN0IG1hdHJveF9wbGxfY2FjaGUJc3lzdGVtOworCQlzdHJ1Y3QgbWF0cm94X3BsbF9j YWNoZQl2aWRlbzsKKwkJCQkgICAgICB9IGNhY2hlOworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJ CQl1bnNpZ25lZCBpbnQJdmlkZW87CisJCQl1bnNpZ25lZCBpbnQJc3lzdGVtOworCQkJCSAgICAg IH0gcGxsOworCQlzdHJ1Y3QgeworCQkJdV9pbnQzMl90CW9wdDsKKwkJCXVfaW50MzJfdAlvcHQy OworCQkJdV9pbnQzMl90CW9wdDM7CisJCQl1X2ludDMyX3QJbWN0bHd0c3Q7CisJCQl1X2ludDMy X3QJbWN0bHd0c3RfY29yZTsKKwkJCXVfaW50MzJfdAltZW1taXNjOworCQkJdV9pbnQzMl90CW1l bXJkYms7CisJCQl1X2ludDMyX3QJbWFjY2VzczsKKwkJCQkgICAgICB9IHJlZzsKKwkJc3RydWN0 IHsKKwkJCXVuc2lnbmVkIGludAlkZHI6MSwKKwkJCSAgICAgICAgICAgICAgICBlbXJzd2VuOjEs CisJCQkJCWRsbDoxOworCQkJCSAgICAgIH0gbWVtb3J5OworCQkJICAgICAgfSB2YWx1ZXM7CisJ dV9pbnQzMl90IGNtYXBbMTZdOworfTsKKworI2RlZmluZSBpbmZvMm1pbmZvKGluZm8pIGNvbnRh aW5lcl9vZihpbmZvLCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8sIGZiY29uKQorCitzdHJ1Y3QgbWF0 cm94X3N3aXRjaCB7CisJaW50CSgqcHJlaW5pdCkoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5m byk7CisJdm9pZAkoKnJlc2V0KShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKTsKKwlpbnQJ KCppbml0KShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBzdHJ1Y3QgbXlfdGltbWluZyop OworCXZvaWQJKCpyZXN0b3JlKShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKTsKK307CisK K3N0cnVjdCBtYXRyb3hmYl9kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwljaGFy KgkJCW5hbWU7CisJdm9pZCoJCQkoKnByb2JlKShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8qIGluZm8p OworCXZvaWQJCQkoKnJlbW92ZSkoc3RydWN0IG1hdHJveF9mYl9pbmZvKiBpbmZvLCB2b2lkKiBk YXRhKTsKK307CisKK2ludCBtYXRyb3hmYl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1hdHJveGZi X2RyaXZlciogZHJ2KTsKK3ZvaWQgbWF0cm94ZmJfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1h dHJveGZiX2RyaXZlciogZHJ2KTsKKworI2RlZmluZSBQQ0lfT1BUSU9OX1JFRwkweDQwCisjZGVm aW5lICAgUENJX09QVElPTl9FTkFCTEVfUk9NCQkweDQwMDAwMDAwCisKKyNkZWZpbmUgUENJX01H QV9JTkRFWAkweDQ0CisjZGVmaW5lIFBDSV9NR0FfREFUQQkweDQ4CisjZGVmaW5lIFBDSV9PUFRJ T04yX1JFRwkweDUwCisjZGVmaW5lIFBDSV9PUFRJT04zX1JFRwkweDU0CisjZGVmaW5lIFBDSV9N RU1NSVNDX1JFRwkweDU4CisKKyNkZWZpbmUgTV9EV0dDVEwJMHgxQzAwCisjZGVmaW5lIE1fTUFD Q0VTUwkweDFDMDQKKyNkZWZpbmUgTV9DVExXVFNUCTB4MUMwOAorCisjZGVmaW5lIE1fUExOV1QJ CTB4MUMxQworCisjZGVmaW5lIE1fQkNPTAkJMHgxQzIwCisjZGVmaW5lIE1fRkNPTAkJMHgxQzI0 CisKKyNkZWZpbmUgTV9TR04JCTB4MUM1OAorI2RlZmluZSBNX0xFTgkJMHgxQzVDCisjZGVmaW5l IE1fQVIwCQkweDFDNjAKKyNkZWZpbmUgTV9BUjEJCTB4MUM2NAorI2RlZmluZSBNX0FSMgkJMHgx QzY4CisjZGVmaW5lIE1fQVIzCQkweDFDNkMKKyNkZWZpbmUgTV9BUjQJCTB4MUM3MAorI2RlZmlu ZSBNX0FSNQkJMHgxQzc0CisjZGVmaW5lIE1fQVI2CQkweDFDNzgKKworI2RlZmluZSBNX0NYQk5E UlkJMHgxQzgwCisjZGVmaW5lIE1fRlhCTkRSWQkweDFDODQKKyNkZWZpbmUgTV9ZRFNUTEVOCTB4 MUM4OAorI2RlZmluZSBNX1BJVENICQkweDFDOEMKKyNkZWZpbmUgTV9ZRFNUCQkweDFDOTAKKyNk ZWZpbmUgTV9ZRFNUT1JHCTB4MUM5NAorI2RlZmluZSBNX1lUT1AJCTB4MUM5OAorI2RlZmluZSBN X1lCT1QJCTB4MUM5QworCisvKiBteXN0aXF1ZSBvbmx5ICovCisjZGVmaW5lIE1fQ0FDSEVGTFVT SAkweDFGRkYKKworI2RlZmluZSBNX0VYRUMJCTB4MDEwMAorCisjZGVmaW5lIE1fRFdHX1RSQVAJ MHgwNAorI2RlZmluZSBNX0RXR19CSVRCTFQJMHgwOAorI2RlZmluZSBNX0RXR19JTE9BRAkweDA5 CisKKyNkZWZpbmUgTV9EV0dfTElORUFSCTB4MDA4MAorI2RlZmluZSBNX0RXR19TT0xJRAkweDA4 MDAKKyNkZWZpbmUgTV9EV0dfQVJaRVJPCTB4MTAwMAorI2RlZmluZSBNX0RXR19TR05aRVJPCTB4 MjAwMAorI2RlZmluZSBNX0RXR19TSElGVFpFUk8JMHg0MDAwCisKKyNkZWZpbmUgTV9EV0dfUkVQ TEFDRQkweDAwMEMwMDAwCisjZGVmaW5lIE1fRFdHX1JFUExBQ0UyCShNX0RXR19SRVBMQUNFIHwg MHg0MCkKKyNkZWZpbmUgTV9EV0dfWE9SCTB4MDAwNjAwMTAKKworI2RlZmluZSBNX0RXR19CRkNP TAkweDA0MDAwMDAwCisjZGVmaW5lIE1fRFdHX0JNT05PV0YJMHgwODAwMDAwMAorCisjZGVmaW5l IE1fRFdHX1RSQU5TQwkweDQwMDAwMDAwCisKKyNkZWZpbmUgTV9GSUZPU1RBVFVTCTB4MUUxMAor I2RlZmluZSBNX1NUQVRVUwkweDFFMTQKKyNkZWZpbmUgTV9JQ0xFQVIJMHgxRTE4CisjZGVmaW5l IE1fSUVOCQkweDFFMUMKKworI2RlZmluZSBNX1ZDT1VOVAkweDFFMjAKKworI2RlZmluZSBNX1JF U0VUCQkweDFFNDAKKyNkZWZpbmUgTV9NRU1SREJLCTB4MUU0NAorCisjZGVmaW5lIE1fQUdQMlBM TAkweDFFNEMKKworI2RlZmluZSBNX09QTU9ERQkweDFFNTQKKyNkZWZpbmUgICAgIE1fT1BNT0RF X0RNQV9HRU5fV1JJVEUJMHgwMAorI2RlZmluZSAgICAgTV9PUE1PREVfRE1BX0JMSVQJCTB4MDQK KyNkZWZpbmUgICAgIE1fT1BNT0RFX0RNQV9WRUNUT1JfV1JJVEUJMHgwOAorI2RlZmluZSAgICAg TV9PUE1PREVfRE1BX0xFCQkweDAwMDAJCS8qIGxpdHRsZSBlbmRpYW4gLSBubyB0cmFuc2Zvcm1h dGlvbiAqLworI2RlZmluZSAgICAgTV9PUE1PREVfRE1BX0JFXzhCUFAJMHgwMDAwCisjZGVmaW5l ICAgICBNX09QTU9ERV9ETUFfQkVfMTZCUFAJMHgwMTAwCisjZGVmaW5lICAgICBNX09QTU9ERV9E TUFfQkVfMzJCUFAJMHgwMjAwCisjZGVmaW5lICAgICBNX09QTU9ERV9ESVJfTEUJCTB4MDAwMDAw CS8qIGxpdHRsZSBlbmRpYW4gLSBubyB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSAgICAgTV9P UE1PREVfRElSX0JFXzhCUFAJMHgwMDAwMDAKKyNkZWZpbmUgICAgIE1fT1BNT0RFX0RJUl9CRV8x NkJQUAkweDAxMDAwMAorI2RlZmluZSAgICAgTV9PUE1PREVfRElSX0JFXzMyQlBQCTB4MDIwMDAw CisKKyNkZWZpbmUgTV9BVFRSX0lOREVYCTB4MUZDMAorI2RlZmluZSBNX0FUVFJfREFUQQkweDFG QzEKKworI2RlZmluZSBNX01JU0NfUkVHCTB4MUZDMgorI2RlZmluZSBNXzNDMl9SRAkweDFGQzIK KworI2RlZmluZSBNX1NFUV9JTkRFWAkweDFGQzQKKyNkZWZpbmUgTV9TRVFfREFUQQkweDFGQzUK KyNkZWZpbmUgICAgIE1fU0VRMQkJMHgwMQorI2RlZmluZSAgICAgICAgTV9TRVExX1NDUk9GRgkJ MHgyMAorCisjZGVmaW5lIE1fTUlTQ19SRUdfUkVBRAkweDFGQ0MKKworI2RlZmluZSBNX0dSQVBI SUNTX0lOREVYIDB4MUZDRQorI2RlZmluZSBNX0dSQVBISUNTX0RBVEEJMHgxRkNGCisKKyNkZWZp bmUgTV9DUlRDX0lOREVYCTB4MUZENAorCisjZGVmaW5lIE1fQVRUUl9SRVNFVAkweDFGREEKKyNk ZWZpbmUgTV8zREFfV1IJMHgxRkRBCisjZGVmaW5lIE1fSU5TVFMxCTB4MUZEQQorCisjZGVmaW5l IE1fRVhUVkdBX0lOREVYCTB4MUZERQorI2RlZmluZSBNX0VYVFZHQV9EQVRBCTB4MUZERgorCisv KiBHMjAwIG9ubHkgKi8KKyNkZWZpbmUgTV9TUkNPUkcJMHgyQ0I0CisjZGVmaW5lIE1fRFNUT1JH CTB4MkNCOAorCisjZGVmaW5lIE1fUkFNREFDX0JBU0UJMHgzQzAwCisKKy8qIGZvcnR1bmF0ZWx5 LCBzYW1lIG9uIFRWUDMwMjYgYW5kIE1HQTEwNjQgKi8KKyNkZWZpbmUgTV9EQUNfUkVHCShNX1JB TURBQ19CQVNFKzApCisjZGVmaW5lIE1fREFDX1ZBTAkoTV9SQU1EQUNfQkFTRSsxKQorI2RlZmlu ZSBNX1BBTEVUVEVfTUFTSwkoTV9SQU1EQUNfQkFTRSsyKQorCisjZGVmaW5lIE1fWF9JTkRFWAkw eDAwCisjZGVmaW5lIE1fWF9EQVRBUkVHCTB4MEEKKworI2RlZmluZSBEQUNfWEdFTklPQ1RSTAkJ MHgyQQorI2RlZmluZSBEQUNfWEdFTklPREFUQQkJMHgyQgorCisjZGVmaW5lIE1fQzJDVEwJCTB4 M0MxMAorCisjZGVmaW5lIE1YX09QVElPTl9CU1dBUCAgICAgICAgIDB4MDAwMDAwMDAKKworI2lm ZGVmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBNX09QTU9ERV80QlBQCShNX09QTU9ERV9ETUFf TEUgfCBNX09QTU9ERV9ESVJfTEUgfCBNX09QTU9ERV9ETUFfQkxJVCkKKyNkZWZpbmUgTV9PUE1P REVfOEJQUAkoTV9PUE1PREVfRE1BX0xFIHwgTV9PUE1PREVfRElSX0xFIHwgTV9PUE1PREVfRE1B X0JMSVQpCisjZGVmaW5lIE1fT1BNT0RFXzE2QlBQCShNX09QTU9ERV9ETUFfTEUgfCBNX09QTU9E RV9ESVJfTEUgfCBNX09QTU9ERV9ETUFfQkxJVCkKKyNkZWZpbmUgTV9PUE1PREVfMjRCUFAJKE1f T1BNT0RFX0RNQV9MRSB8IE1fT1BNT0RFX0RJUl9MRSB8IE1fT1BNT0RFX0RNQV9CTElUKQorI2Rl ZmluZSBNX09QTU9ERV8zMkJQUAkoTV9PUE1PREVfRE1BX0xFIHwgTV9PUE1PREVfRElSX0xFIHwg TV9PUE1PREVfRE1BX0JMSVQpCisjZWxzZQorI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBN X09QTU9ERV80QlBQCShNX09QTU9ERV9ETUFfTEUgfCBNX09QTU9ERV9ESVJfTEUgICAgICAgfCBN X09QTU9ERV9ETUFfQkxJVCkJLyogVE9ETyAqLworI2RlZmluZSBNX09QTU9ERV84QlBQCShNX09Q TU9ERV9ETUFfTEUgfCBNX09QTU9ERV9ESVJfQkVfOEJQUCAgfCBNX09QTU9ERV9ETUFfQkxJVCkK KyNkZWZpbmUgTV9PUE1PREVfMTZCUFAJKE1fT1BNT0RFX0RNQV9MRSB8IE1fT1BNT0RFX0RJUl9C RV8xNkJQUCB8IE1fT1BNT0RFX0RNQV9CTElUKQorI2RlZmluZSBNX09QTU9ERV8yNEJQUAkoTV9P UE1PREVfRE1BX0xFIHwgTV9PUE1PREVfRElSX0JFXzhCUFAgIHwgTV9PUE1PREVfRE1BX0JMSVQp CS8qIFRPRE8sID8zMiAqLworI2RlZmluZSBNX09QTU9ERV8zMkJQUAkoTV9PUE1PREVfRE1BX0xF IHwgTV9PUE1PREVfRElSX0JFXzMyQlBQIHwgTV9PUE1PREVfRE1BX0JMSVQpCisjZWxzZQorI2Vy cm9yICJCeXRlIG9yZGVyaW5nIGhhdmUgdG8gYmUgZGVmaW5lZC4gQ2Fubm90IGNvbnRpbnVlLiIK KyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgbWdhX2luYihhZGRyKQkJbWdhX3JlYWRiKG1pbmZv LT5tbWlvLnZiYXNlLCAoYWRkcikpCisjZGVmaW5lIG1nYV9pbmwoYWRkcikJCW1nYV9yZWFkbCht aW5mby0+bW1pby52YmFzZSwgKGFkZHIpKQorI2RlZmluZSBtZ2Ffb3V0YihhZGRyLHZhbCkJbWdh X3dyaXRlYihtaW5mby0+bW1pby52YmFzZSwgKGFkZHIpLCAodmFsKSkKKyNkZWZpbmUgbWdhX291 dHcoYWRkcix2YWwpCW1nYV93cml0ZXcobWluZm8tPm1taW8udmJhc2UsIChhZGRyKSwgKHZhbCkp CisjZGVmaW5lIG1nYV9vdXRsKGFkZHIsdmFsKQltZ2Ffd3JpdGVsKG1pbmZvLT5tbWlvLnZiYXNl LCAoYWRkciksICh2YWwpKQorI2RlZmluZSBtZ2FfcmVhZHIocG9ydCxpZHgpCShtZ2Ffb3V0Yigo cG9ydCksKGlkeCkpLCBtZ2FfaW5iKChwb3J0KSsxKSkKKyNkZWZpbmUgbWdhX3NldHIoYWRkcixw b3J0LHZhbCkJbWdhX291dHcoYWRkciwgKCh2YWwpPDw4KSB8IChwb3J0KSkKKworI2RlZmluZSBt Z2FfZmlmbyhuKQlkbyB7fSB3aGlsZSAoKG1nYV9pbmwoTV9GSUZPU1RBVFVTKSAmIDB4RkYpIDwg KG4pKQorCisjZGVmaW5lIFdhaXRUaWxsSWRsZSgpCWRvIHsgbWdhX2lubChNX1NUQVRVUyk7IGRv IHt9IHdoaWxlIChtZ2FfaW5sKE1fU1RBVFVTKSAmIDB4MTAwMDApOyB9IHdoaWxlICgwKQorCisv KiBjb2RlIHNwZWVkdXAgKi8KKyNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX01JTExFTklVTQorI2Rl ZmluZSBpc0ludGVybGVhdmUoeCkJICh4LT5pbnRlcmxlYXZlKQorI2RlZmluZSBpc01pbGxlbml1 bSh4KQkgKHgtPm1pbGxlbml1bSkKKyNkZWZpbmUgaXNNaWxsZW5pdW1JSSh4KSAoeC0+bWlsbGVu aXVtSUkpCisjZWxzZQorI2RlZmluZSBpc0ludGVybGVhdmUoeCkgICgwKQorI2RlZmluZSBpc01p bGxlbml1bSh4KQkgKDApCisjZGVmaW5lIGlzTWlsbGVuaXVtSUkoeCkgKDApCisjZW5kaWYKKwor I2RlZmluZSBtYXRyb3hmYl9EQUNfbG9jaygpICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygm bWluZm8tPmxvY2suREFDKQorI2RlZmluZSBtYXRyb3hmYl9EQUNfdW5sb2NrKCkgICAgICAgICAg ICAgICAgIHNwaW5fdW5sb2NrKCZtaW5mby0+bG9jay5EQUMpCisjZGVmaW5lIG1hdHJveGZiX0RB Q19sb2NrX2lycXNhdmUoZmxhZ3MpICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1pbmZvLT5sb2Nr LkRBQywgZmxhZ3MpCisjZGVmaW5lIG1hdHJveGZiX0RBQ191bmxvY2tfaXJxcmVzdG9yZShmbGFn cykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWluZm8tPmxvY2suREFDLCBmbGFncykKK2V4dGVy biB2b2lkIG1hdHJveGZiX0RBQ19vdXQoY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5m bywgaW50IHJlZywKKwkJCSAgICAgaW50IHZhbCk7CitleHRlcm4gaW50IG1hdHJveGZiX0RBQ19p bihjb25zdCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBpbnQgcmVnKTsKK2V4dGVybiB2 b2lkIG1hdHJveGZiX3ZhcjJteShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qIGZ2c2ksIHN0cnVj dCBteV90aW1taW5nKiBtdCk7CitleHRlcm4gaW50IG1hdHJveGZiX3dhaXRfZm9yX3N5bmMoc3Ry dWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgdV9pbnQzMl90IGNydGMpOworZXh0ZXJuIGludCBt YXRyb3hmYl9lbmFibGVfaXJxKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCByZWVu YWJsZSk7CisKKyNpZmRlZiBNQVRST1hGQl9VU0VfU1BJTkxPQ0tTCisjZGVmaW5lIENSSVRCRUdJ TiAgc3Bpbl9sb2NrX2lycXNhdmUoJm1pbmZvLT5sb2NrLmFjY2VsLCBjcml0ZmxhZ3MpOworI2Rl ZmluZSBDUklURU5ECSAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pbmZvLT5sb2NrLmFjY2Vs LCBjcml0ZmxhZ3MpOworI2RlZmluZSBDUklURkxBR1MgIHVuc2lnbmVkIGxvbmcgY3JpdGZsYWdz OworI2Vsc2UKKyNkZWZpbmUgQ1JJVEJFR0lOCisjZGVmaW5lIENSSVRFTkQKKyNkZWZpbmUgQ1JJ VEZMQUdTCisjZW5kaWYKKworI2VuZGlmCS8qIF9fTUFUUk9YRkJfSF9fICovCmRpZmYgLS1naXQg YS9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX2NydGMyLmggYi9kcml2ZXJzL3N0YWdp bmcvbWdha21zL21hdHJveGZiX2NydGMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAwLi4yM2U5MGUyMTA5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdp bmcvbWdha21zL21hdHJveGZiX2NydGMyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyNpZm5kZWYgX19NQVRST1hGQl9DUlRDMl9IX18K KyNkZWZpbmUgX19NQVRST1hGQl9DUlRDMl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+ CisjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorCitzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5m byB7CisJc3RydWN0IGZiX2luZm8JCWZiY29uOworCWludAkJCWZiY29uX3JlZ2lzdGVyZWQ7CisJ aW50ICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7CisKKwlzdHJ1Y3QgbWF0cm94X2Zi X2luZm8qCXByaW1hcnlfZGV2OworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZwliYXNlOwkv KiBwaHlzaWNhbCAqLworCQl2YWRkcl90CQl2YmFzZTsJLyogdmlydHVhbCAqLworCQl1bnNpZ25l ZCBpbnQJbGVuOworCQl1bnNpZ25lZCBpbnQJbGVuX3VzYWJsZTsKKwkJdW5zaWduZWQgaW50CWxl bl9tYXhpbXVtOworCQl1bnNpZ25lZCBpbnQgCW9mZmJhc2U7CisJCXVuc2lnbmVkIGludAlib3Jy b3dlZDsKKwkJCSAgICAgIH0gdmlkZW87CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZwliYXNl OworCQl2YWRkcl90CQl2YmFzZTsKKwkJdW5zaWduZWQgaW50CWxlbjsKKwkJCSAgICAgIH0gbW1p bzsKKworCXVuc2lnbmVkIGludAkJaW50ZXJsYWNlZDoxOworCisJdV9pbnQzMl90IGNtYXBbMTZd OworfTsKKworI2VuZGlmIC8qIF9fTUFUUk9YRkJfQ1JUQzJfSF9fICovCmRpZmYgLS1naXQgYS9k cml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX2c0NTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9t Z2FrbXMvbWF0cm94ZmJfZzQ1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uZjEwOGFlNjZmYzgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21n YWttcy9tYXRyb3hmYl9nNDUwLmMKQEAgLTAsMCArMSw2NDAgQEAKKy8qCisgKgorICogSGFyZHdh cmUgYWNjZWxlcmF0ZWQgTWF0cm94IE1pbGxlbm5pdW0gSSwgSUksIE15c3RpcXVlLCBHMTAwLCBH MjAwLCBHNDAwIGFuZCBHNDUwLgorICoKKyAqIChjKSAxOTk4LTIwMDIgUGV0ciBWYW5kcm92ZWMg PHZhbmRyb3ZlQHZjLmN2dXQuY3o+CisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDAx IE1hdHJveCBHcmFwaGljcyBJbmMuCisgKgorICogVmVyc2lvbjogMS42NSAyMDAyLzA4LzE0Cisg KgorICogU2VlIG1hdHJveGZiX2Jhc2UuYyBmb3IgY29udHJpYnV0b3JzLgorICoKKyAqLworCisj aW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorI2luY2x1ZGUgIm1hdHJveGZiX21pc2MuaCIKKyNp bmNsdWRlICJtYXRyb3hmYl9EQUMxMDY0LmgiCisjaW5jbHVkZSAiZzQ1MF9wbGwuaCIKKyNpbmNs dWRlIDxsaW51eC9tYXRyb3hmYi5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVk ZSAibWF0cm94ZmJfZzQ1MC5oIgorCisvKiBEZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIGNvbnRy b2xzICovCitzdHJ1Y3QgbWN0bCB7CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIGRlc2M7CisJc2l6 ZV90IGNvbnRyb2w7Cit9OworCisjZGVmaW5lIEJMTUlOCTB4RjMKKyNkZWZpbmUgV0xNQVgJMHgz RkYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtY3RsIGc0NTBfY29udHJvbHNbXSA9Cit7CXsgeyBW NEwyX0NJRF9CUklHSFRORVNTLCBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLCAKKwkgICJicmlnaHRu ZXNzIiwKKwkgIDAsIFdMTUFYLUJMTUlOLCAxLCAzNzAtQkxNSU4sIAorCSAgMCwKKwl9LCBvZmZz ZXRvZihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8sIGFsdG91dC50dm9fcGFyYW1zLmJyaWdodG5lc3Mp IH0sCisJeyB7IFY0TDJfQ0lEX0NPTlRSQVNULCBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLCAKKwkg ICJjb250cmFzdCIsCisJICAwLCAxMDIzLCAxLCAxMjcsIAorCSAgMCwKKwl9LCBvZmZzZXRvZihz dHJ1Y3QgbWF0cm94X2ZiX2luZm8sIGFsdG91dC50dm9fcGFyYW1zLmNvbnRyYXN0KSB9LAorCXsg eyBWNEwyX0NJRF9TQVRVUkFUSU9OLCBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgInNhdHVy YXRpb24iLAorCSAgMCwgMjU1LCAxLCAxNjUsIAorCSAgMCwKKwl9LCBvZmZzZXRvZihzdHJ1Y3Qg bWF0cm94X2ZiX2luZm8sIGFsdG91dC50dm9fcGFyYW1zLnNhdHVyYXRpb24pIH0sCisJeyB7IFY0 TDJfQ0lEX0hVRSwgVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICJodWUiLAorCSAgMCwgMjU1 LCAxLCAwLCAKKwkgIDAsCisJfSwgb2Zmc2V0b2Yoc3RydWN0IG1hdHJveF9mYl9pbmZvLCBhbHRv dXQudHZvX3BhcmFtcy5odWUpIH0sCisJeyB7IE1BVFJPWEZCX0NJRF9URVNUT1VULCBWNEwyX0NU UkxfVFlQRV9CT09MRUFOLAorCSAgInRlc3Qgb3V0cHV0IiwKKwkgIDAsIDEsIDEsIDAsIAorCSAg MCwKKwl9LCBvZmZzZXRvZihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8sIGFsdG91dC50dm9fcGFyYW1z LnRlc3RvdXQpIH0sCit9OworCisjZGVmaW5lIEc0NTBDVFJMUyBBUlJBWV9TSVpFKGc0NTBfY29u dHJvbHMpCisKKy8qIFJldHVybjogcG9zaXRpdmUgbnVtYmVyOiBpZCBmb3VuZAorICAgICAgICAg ICAtRUlOVkFMOiAgICAgICAgIGlkIG5vdCBmb3VuZCwgcmV0dXJuIGZhaWx1cmUKKwkgICAtRU5P RU5UOiAgICAgICAgIGlkIG5vdCBmb3VuZCwgY3JlYXRlIGZha2UgZGlzYWJsZWQgY29udHJvbCAq Lworc3RhdGljIGludCBnZXRfY3RybF9pZChfX3UzMiB2NGwyX2lkKSB7CisJaW50IGk7CisKKwlm b3IgKGkgPSAwOyBpIDwgRzQ1MENUUkxTOyBpKyspIHsKKwkJaWYgKHY0bDJfaWQgPCBnNDUwX2Nv bnRyb2xzW2ldLmRlc2MuaWQpIHsKKwkJCWlmIChnNDUwX2NvbnRyb2xzW2ldLmRlc2MuaWQgPT0g MHgwODAwMDAwMCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIC1FTk9F TlQ7CisJCX0KKwkJaWYgKHY0bDJfaWQgPT0gZzQ1MF9jb250cm9sc1tpXS5kZXNjLmlkKSB7CisJ CQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGlu ZSBpbnQgKmdldF9jdHJsX3B0cihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCB1bnNpZ25l ZCBpbnQgaWR4KQoreworCXJldHVybiAoaW50KikoKGNoYXIqKW1pbmZvICsgZzQ1MF9jb250cm9s c1tpZHhdLmNvbnRyb2wpOworfQorCitzdGF0aWMgdm9pZCB0dm9fZmlsbF9kZWZhdWx0cyhzdHJ1 Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCQorCWZvciAo aSA9IDA7IGkgPCBHNDUwQ1RSTFM7IGkrKykgeworCQkqZ2V0X2N0cmxfcHRyKG1pbmZvLCBpKSA9 IGc0NTBfY29udHJvbHNbaV0uZGVzYy5kZWZhdWx0X3ZhbHVlOworCX0KK30KKworc3RhdGljIGlu dCBjdmUyX2dldF9yZWcoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgaW50IHJlZykKK3sK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWw7CisJCisJbWF0cm94ZmJfREFDX2xvY2tf aXJxc2F2ZShmbGFncyk7CisJbWF0cm94ZmJfREFDX291dChtaW5mbywgMHg4NywgcmVnKTsKKwl2 YWwgPSBtYXRyb3hmYl9EQUNfaW4obWluZm8sIDB4ODgpOworCW1hdHJveGZiX0RBQ191bmxvY2tf aXJxcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgY3ZlMl9z ZXRfcmVnKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIGludCByZWcsIGludCB2YWwpCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW1hdHJveGZiX0RBQ19sb2NrX2lycXNhdmUoZmxh Z3MpOworCW1hdHJveGZiX0RBQ19vdXQobWluZm8sIDB4ODcsIHJlZyk7CisJbWF0cm94ZmJfREFD X291dChtaW5mbywgMHg4OCwgdmFsKTsKKwltYXRyb3hmYl9EQUNfdW5sb2NrX2lycXJlc3RvcmUo ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjdmUyX3NldF9yZWcxMChzdHJ1Y3QgbWF0cm94X2Zi X2luZm8gKm1pbmZvLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwltYXRyb3hmYl9EQUNfbG9ja19pcnFzYXZlKGZsYWdzKTsKKwltYXRyb3hmYl9EQUNfb3V0 KG1pbmZvLCAweDg3LCByZWcpOworCW1hdHJveGZiX0RBQ19vdXQobWluZm8sIDB4ODgsIHZhbCA+ PiAyKTsKKwltYXRyb3hmYl9EQUNfb3V0KG1pbmZvLCAweDg3LCByZWcgKyAxKTsKKwltYXRyb3hm Yl9EQUNfb3V0KG1pbmZvLCAweDg4LCB2YWwgJiAzKTsKKwltYXRyb3hmYl9EQUNfdW5sb2NrX2ly cXJlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBnNDUwX2NvbXB1dGVfYndsZXZlbChj b25zdCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLCBpbnQgKmJsLAorCQkJCSBpbnQgKnds KQoreworCWNvbnN0IGludCBiID0gbWluZm8tPmFsdG91dC50dm9fcGFyYW1zLmJyaWdodG5lc3Mg KyBCTE1JTjsKKwljb25zdCBpbnQgYyA9IG1pbmZvLT5hbHRvdXQudHZvX3BhcmFtcy5jb250cmFz dDsKKworCSpibCA9IG1heChiIC0gYywgQkxNSU4pOworCSp3bCA9IG1pbihiICsgYywgV0xNQVgp OworfQorCitzdGF0aWMgaW50IGc0NTBfcXVlcnlfY3RybCh2b2lkKiBtZCwgc3RydWN0IHY0bDJf cXVlcnljdHJsICpwKSB7CisJaW50IGk7CisJCisJaSA9IGdldF9jdHJsX2lkKHAtPmlkKTsKKwlp ZiAoaSA+PSAwKSB7CisJCSpwID0gZzQ1MF9jb250cm9sc1tpXS5kZXNjOworCQlyZXR1cm4gMDsK Kwl9CisJaWYgKGkgPT0gLUVOT0VOVCkgeworCQlzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVl cnljdHJsIGRpc2N0cmwgPSAKKwkJCXsgLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQg fTsKKwkJCQorCQlpID0gcC0+aWQ7CisJCSpwID0gZGlzY3RybDsKKwkJcC0+aWQgPSBpOworCQlz cHJpbnRmKHAtPm5hbWUsICJDdHJsICMlMDhYIiwgaSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1 cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBnNDUwX3NldF9jdHJsKHZvaWQqIG1kLCBzdHJ1 Y3QgdjRsMl9jb250cm9sICpwKSB7CisJaW50IGk7CisJc3RydWN0IG1hdHJveF9mYl9pbmZvICpt aW5mbyA9IG1kOworCQorCWkgPSBnZXRfY3RybF9pZChwLT5pZCk7CisJaWYgKGkgPCAwKSByZXR1 cm4gLUVJTlZBTDsKKworCS8qCisJICogQ2hlY2sgaWYgY2hhbmdlZC4KKwkgKi8KKwlpZiAocC0+ dmFsdWUgPT0gKmdldF9jdHJsX3B0cihtaW5mbywgaSkpIHJldHVybiAwOworCisJLyoKKwkgKiBD aGVjayBsaW1pdHMuCisJICovCisJaWYgKHAtPnZhbHVlID4gZzQ1MF9jb250cm9sc1tpXS5kZXNj Lm1heGltdW0pIHJldHVybiAtRUlOVkFMOworCWlmIChwLT52YWx1ZSA8IGc0NTBfY29udHJvbHNb aV0uZGVzYy5taW5pbXVtKSByZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogU3RvcmUgbmV3IHZh bHVlLgorCSAqLworCSpnZXRfY3RybF9wdHIobWluZm8sIGkpID0gcC0+dmFsdWU7CisKKwlzd2l0 Y2ggKHAtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY2FzZSBWNEwyX0NJ RF9DT05UUkFTVDoKKwkJCXsKKwkJCQlpbnQgYmxhY2tsZXZlbCwgd2hpdGVsZXZlbDsKKwkJCQln NDUwX2NvbXB1dGVfYndsZXZlbChtaW5mbywgJmJsYWNrbGV2ZWwsICZ3aGl0ZWxldmVsKTsKKwkJ CQljdmUyX3NldF9yZWcxMChtaW5mbywgMHgwZSwgYmxhY2tsZXZlbCk7CisJCQkJY3ZlMl9zZXRf cmVnMTAobWluZm8sIDB4MWUsIHdoaXRlbGV2ZWwpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ug VjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWN2ZTJfc2V0X3JlZyhtaW5mbywgMHgyMCwgcC0+dmFs dWUpOworCQkJY3ZlMl9zZXRfcmVnKG1pbmZvLCAweDIyLCBwLT52YWx1ZSk7CisJCQlicmVhazsK KwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQljdmUyX3NldF9yZWcobWluZm8sIDB4MjUsIHAtPnZh bHVlKTsKKwkJCWJyZWFrOworCQljYXNlIE1BVFJPWEZCX0NJRF9URVNUT1VUOgorCQkJeworCQkJ CXVuc2lnbmVkIGNoYXIgdmFsID0gY3ZlMl9nZXRfcmVnKG1pbmZvLCAweDA1KTsKKwkJCQlpZiAo cC0+dmFsdWUpIHZhbCB8PSAgMHgwMjsKKwkJCQllbHNlICAgICAgICAgIHZhbCAmPSB+MHgwMjsK KwkJCQljdmUyX3NldF9yZWcobWluZm8sIDB4MDUsIHZhbCk7CisJCQl9CisJCQlicmVhazsKKwl9 CisJCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnNDUwX2dldF9jdHJsKHZvaWQqIG1k LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpwKSB7CisJaW50IGk7CisJc3RydWN0IG1hdHJveF9mYl9p bmZvICptaW5mbyA9IG1kOworCQorCWkgPSBnZXRfY3RybF9pZChwLT5pZCk7CisJaWYgKGkgPCAw KSByZXR1cm4gLUVJTlZBTDsKKwlwLT52YWx1ZSA9ICpnZXRfY3RybF9wdHIobWluZm8sIGkpOwor CXJldHVybiAwOworfQorCitzdHJ1Y3Qgb3V0cHV0X2Rlc2MgeworCXVuc2lnbmVkIGludAloX3Zp czsKKwl1bnNpZ25lZCBpbnQJaF9mX3BvcmNoOworCXVuc2lnbmVkIGludAloX3N5bmM7CisJdW5z aWduZWQgaW50CWhfYl9wb3JjaDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50CWNocm9tYXNjOwor CXVuc2lnbmVkIGludAlidXJzdDsKKwl1bnNpZ25lZCBpbnQJdl90b3RhbDsKK307CisKK3N0YXRp YyB2b2lkIGNvbXB1dGVSZWdzKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHN0cnVjdCBt YXZlbnJlZ3MgKnIsCisJCQlzdHJ1Y3QgbXlfdGltbWluZyAqbXQsIGNvbnN0IHN0cnVjdCBvdXRw dXRfZGVzYyAqb3V0ZCkKK3sKKwl1X2ludDMyX3QgY2hyb21hc2M7CisJdV9pbnQzMl90IGhsZW47 CisJdV9pbnQzMl90IGhzbDsKKwl1X2ludDMyX3QgaGJwOworCXVfaW50MzJfdCBoZnA7CisJdV9p bnQzMl90IGh2aXM7CisJdW5zaWduZWQgaW50IHBpeGNsb2NrOworCXVuc2lnbmVkIGxvbmcgbG9u ZyBwaWljOworCWludCBtbnA7CisJaW50IG92ZXI7CisJCisJci0+cmVnc1sweDgwXSA9IDB4MDM7 CS8qIHwgMHg0MCBmb3IgU0NBUlQgKi8KKworCWh2aXMgPSAoKG10LT5IRGlzcGxheSA8PCAxKSAr IDMpICYgfjM7CisJCisJaWYgKGh2aXMgPj0gMjA0OCkgeworCQlodmlzID0gMjA0NDsKKwl9CisJ CisJcGlpYyA9IDEwMDAwMDAwMDBVTEwgKiBodmlzOworCWRvX2RpdihwaWljLCBvdXRkLT5oX3Zp cyk7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIldhbnQgJXUga0h6IHBpeGNsb2NrXG4iLCAodW5z aWduZWQgaW50KXBpaWMpOworCQorCW1ucCA9IG1hdHJveGZiX2c0NTBfc2V0Y2xrKG1pbmZvLCBw aWljLCBNX1ZJREVPX1BMTCk7CisJCisJbXQtPm1ucCA9IG1ucDsKKwltdC0+cGl4Y2xvY2sgPSBn NDUwX21ucDJmKG1pbmZvLCBtbnApOworCisJZHByaW50ayhLRVJOX0RFQlVHICJNTlA9JTA4WFxu IiwgbW5wKTsKKworCXBpeGNsb2NrID0gMTAwMDAwMDAwMFUgLyBtdC0+cGl4Y2xvY2s7CisKKwlk cHJpbnRrKEtFUk5fREVCVUcgIkdvdCAldSBwcyBwaXhjbG9ja1xuIiwgcGl4Y2xvY2spOworCisJ cGlpYyA9IG91dGQtPmNocm9tYXNjOworCWRvX2RpdihwaWljLCBtdC0+cGl4Y2xvY2spOworCWNo cm9tYXNjID0gcGlpYzsKKwkKKwlkcHJpbnRrKEtFUk5fREVCVUcgIkNocm9tYSBpcyAlMDhYXG4i LCBjaHJvbWFzYyk7CisKKwlyLT5yZWdzWzBdID0gcGlpYyA+PiAyNDsKKwlyLT5yZWdzWzFdID0g cGlpYyA+PiAxNjsKKwlyLT5yZWdzWzJdID0gcGlpYyA+PiAgODsKKwlyLT5yZWdzWzNdID0gcGlp YyA+PiAgMDsKKwloYnAgPSAoKChvdXRkLT5oX2JfcG9yY2ggKyBwaXhjbG9jaykgLyBwaXhjbG9j aykpICYgfjE7CisJaGZwID0gKCgob3V0ZC0+aF9mX3BvcmNoICsgcGl4Y2xvY2spIC8gcGl4Y2xv Y2spKSAmIH4xOworCWhzbCA9ICgoKG91dGQtPmhfc3luYyArIHBpeGNsb2NrKSAvIHBpeGNsb2Nr KSkgJiB+MTsKKwlobGVuID0gaHZpcyArIGhmcCArIGhzbCArIGhicDsKKwlvdmVyID0gaGxlbiAm IDB4MEY7CisJCisJZHByaW50ayhLRVJOX0RFQlVHICJXTDogdmlzPSV1LCBoZj0ldSwgaHM9JXUs IGhiPSV1LCB0b3RhbD0ldVxuIiwgaHZpcywgaGZwLCBoc2wsIGhicCwgaGxlbik7CisKKwlpZiAo b3ZlcikgeworCQloZnAgLT0gb3ZlcjsKKwkJaGxlbiAtPSBvdmVyOworCQlpZiAob3ZlciA8PSAy KSB7CisJCX0gZWxzZSBpZiAob3ZlciA8IDEwKSB7CisJCQloZnAgKz0gNDsKKwkJCWhsZW4gKz0g NDsKKwkJfSBlbHNlIHsKKwkJCWhmcCArPSAxNjsKKwkJCWhsZW4gKz0gMTY7CisJCX0KKwl9CisK KwkvKiBtYXliZSBjdmUyIGhhcyByZXF1aXJlbWVudCA4MDAgPCBobGVuIDwgMTE4NCAqLworCXIt PnJlZ3NbMHgwOF0gPSBoc2w7CisJci0+cmVnc1sweDA5XSA9IChvdXRkLT5idXJzdCArIHBpeGNs b2NrIC0gMSkgLyBwaXhjbG9jazsJLyogYnVyc3QgbGVuZ3RoICovCisJci0+cmVnc1sweDBBXSA9 IGhicDsKKwlyLT5yZWdzWzB4MkNdID0gaGZwOworCXItPnJlZ3NbMHgzMV0gPSBodmlzIC8gODsK KwlyLT5yZWdzWzB4MzJdID0gaHZpcyAmIDc7CisJCisJZHByaW50ayhLRVJOX0RFQlVHICJQRzog dmlzPSUwNFgsIGhmPSUwMlgsIGhzPSUwMlgsIGhiPSUwMlgsIHRvdGFsPSUwNFhcbiIsIGh2aXMs IGhmcCwgaHNsLCBoYnAsIGhsZW4pOworCisJci0+cmVnc1sweDg0XSA9IDE7CS8qIHggc3luYyBw b2ludCAqLworCXItPnJlZ3NbMHg4NV0gPSAwOworCWh2aXMgPSBodmlzID4+IDE7CisJaGxlbiA9 IGhsZW4gPj4gMTsKKwkKKwlkcHJpbnRrKEtFUk5fREVCVUcgImhsZW49JXUgaHZpcz0ldVxuIiwg aGxlbiwgaHZpcyk7CisKKwltdC0+aW50ZXJsYWNlZCA9IDE7CisKKwltdC0+SERpc3BsYXkgPSBo dmlzICYgfjc7CisJbXQtPkhTeW5jU3RhcnQgPSBtdC0+SERpc3BsYXkgKyA4OworCW10LT5IU3lu Y0VuZCA9IChobGVuICYgfjcpIC0gODsKKwltdC0+SFRvdGFsID0gaGxlbjsKKworCXsKKwkJaW50 IHVwcGVyOworCQl1bnNpZ25lZCBpbnQgdnRvdGFsOworCQl1bnNpZ25lZCBpbnQgdnN5bmNlbmQ7 CisJCXVuc2lnbmVkIGludCB2ZGlzcGxheTsKKwkJCisJCXZ0b3RhbCA9IG10LT5WVG90YWw7CisJ CXZzeW5jZW5kID0gbXQtPlZTeW5jRW5kOworCQl2ZGlzcGxheSA9IG10LT5WRGlzcGxheTsKKwkJ aWYgKHZ0b3RhbCA8IG91dGQtPnZfdG90YWwpIHsKKwkJCXVuc2lnbmVkIGludCB5b3ZyID0gb3V0 ZC0+dl90b3RhbCAtIHZ0b3RhbDsKKwkJCQorCQkJdnN5bmNlbmQgKz0geW92ciA+PiAxOworCQl9 IGVsc2UgaWYgKHZ0b3RhbCA+IG91dGQtPnZfdG90YWwpIHsKKwkJCXZkaXNwbGF5ID0gb3V0ZC0+ dl90b3RhbCAtIDQ7CisJCQl2c3luY2VuZCA9IG91dGQtPnZfdG90YWw7CisJCX0KKwkJdXBwZXIg PSAob3V0ZC0+dl90b3RhbCAtIHZzeW5jZW5kKSA+PiAxOwkvKiBpbiBmaWVsZCBsaW5lcyAqLwor CQlyLT5yZWdzWzB4MTddID0gb3V0ZC0+dl90b3RhbCAvIDQ7CisJCXItPnJlZ3NbMHgxOF0gPSBv dXRkLT52X3RvdGFsICYgMzsKKwkJci0+cmVnc1sweDMzXSA9IHVwcGVyIC0gMTsJLyogdXBwZXIg YmxhbmtpbmcgKi8KKwkJci0+cmVnc1sweDgyXSA9IHVwcGVyOwkJLyogeSBzeW5jIHBvaW50ICov CisJCXItPnJlZ3NbMHg4M10gPSB1cHBlciA+PiA4OworCQkKKwkJbXQtPlZEaXNwbGF5ID0gdmRp c3BsYXk7CisJCW10LT5WU3luY1N0YXJ0ID0gb3V0ZC0+dl90b3RhbCAtIDI7CisJCW10LT5WU3lu Y0VuZCA9IG91dGQtPnZfdG90YWw7CisJCW10LT5WVG90YWwgPSBvdXRkLT52X3RvdGFsOworCX0K K30KKworc3RhdGljIHZvaWQgY3ZlMl9pbml0X1RWZGF0YShpbnQgbm9ybSwgc3RydWN0IG1hdmVu cmVncyogZGF0YSwgY29uc3Qgc3RydWN0IG91dHB1dF9kZXNjKiogb3V0ZCkgeworCXN0YXRpYyBj b25zdCBzdHJ1Y3Qgb3V0cHV0X2Rlc2MgcGFsb3V0ZCA9IHsKKwkJLmhfdmlzCSAgID0gNTIxNDgx NDgsCS8vIHBzCisJCS5oX2ZfcG9yY2ggPSAgMTQwNzQwNywJLy8gcHMKKwkJLmhfc3luYyAgICA9 ICA0NjY2NjY3LAkvLyBwcworCQkuaF9iX3BvcmNoID0gIDU3Nzc3NzgsCS8vIHBzCisJCS5jaHJv bWFzYyAgPSAxOTA0MjI0NzUzNDE4MlVMTCwJLy8gNDQzMzYxOC43NTAgSHoKKwkJLmJ1cnN0ICAg ICA9ICAyNTE4NTE4LAkvLyBwcworCQkudl90b3RhbCAgID0gICAgICA2MjUsCisJfTsKKwlzdGF0 aWMgY29uc3Qgc3RydWN0IG91dHB1dF9kZXNjIG50c2NvdXRkID0geworCQkuaF92aXMgICAgID0g NTI4ODg4ODksCS8vIHBzCisJCS5oX2ZfcG9yY2ggPSAgMTMzMzMzMywJLy8gcHMKKwkJLmhfc3lu YyAgICA9ICA0NjY2NjY3LAkvLyBwcworCQkuaF9iX3BvcmNoID0gIDQ2NjY2NjcsCS8vIHBzCisJ CS5jaHJvbWFzYyAgPSAxNTM3NDAzMDY1OTQ3NVVMTCwJLy8gMzU3OTU0NS40NTQgSHoKKwkJLmJ1 cnN0ICAgICA9ICAyNDE4NDE4LAkvLyBwcworCQkudl90b3RhbCAgID0gICAgICA1MjUsCS8vIGxp bmVzCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWF2ZW5yZWdzIHBhbHJlZ3MgPSB7IHsK KwkJMHgyQSwgMHgwOSwgMHg4QSwgMHhDQiwJLyogMDA6IGNocm9tYSBzdWJjYXJyaWVyICovCisJ CTB4MDAsCisJCTB4MDAsCS8qIHRlc3QgKi8KKwkJMHhGOSwJLyogbW9kaWZpZWQgYnkgY29kZSAo Rjkgd3JpdHRlbi4uLikgKi8KKwkJMHgwMCwJLyogPyBub3Qgd3JpdHRlbiAqLworCQkweDdFLAkv KiAwOCAqLworCQkweDQ0LAkvKiAwOSAqLworCQkweDlDLAkvKiAwQSAqLworCQkweDJFLAkvKiAw QiAqLworCQkweDIxLAkvKiAwQyAqLworCQkweDAwLAkvKiA/IG5vdCB3cml0dGVuICovCisvLwkJ MHgzRiwgMHgwMywgLyogMEUtMEYgKi8KKwkJMHgzQywgMHgwMywKKwkJMHgzQywgMHgwMywgLyog MTAtMTEgKi8KKwkJMHgxQSwJLyogMTIgKi8KKwkJMHgyQSwJLyogMTMgKi8KKwkJMHgxQywgMHgz RCwgMHgxNCwgLyogMTQtMTYgKi8KKwkJMHg5QywgMHgwMSwgLyogMTctMTggKi8KKwkJMHgwMCwJ LyogMTkgKi8KKwkJMHhGRSwJLyogMUEgKi8KKwkJMHg3RSwJLyogMUIgKi8KKwkJMHg2MCwJLyog MUMgKi8KKwkJMHgwNSwJLyogMUQgKi8KKy8vCQkweDg5LCAweDAzLCAvKiAxRS0xRiAqLworCQkw eEFELCAweDAzLAorLy8JCTB4NzIsCS8qIDIwICovCisJCTB4QTUsCisJCTB4MDcsCS8qIDIxICov CisvLwkJMHg3MiwJLyogMjIgKi8KKwkJMHhBNSwKKwkJMHgwMCwJLyogMjMgKi8KKwkJMHgwMCwJ LyogMjQgKi8KKwkJMHgwMCwJLyogMjUgKi8KKwkJMHgwOCwJLyogMjYgKi8KKwkJMHgwNCwJLyog MjcgKi8KKwkJMHgwMCwJLyogMjggKi8KKwkJMHgxQSwJLyogMjkgKi8KKwkJMHg1NSwgMHgwMSwg LyogMkEtMkIgKi8KKwkJMHgyNiwJLyogMkMgKi8KKwkJMHgwNywgMHg3RSwgLyogMkQtMkUgKi8K KwkJMHgwMiwgMHg1NCwgLyogMkYtMzAgKi8KKwkJMHhCMCwgMHgwMCwgLyogMzEtMzIgKi8KKwkJ MHgxNCwJLyogMzMgKi8KKwkJMHg0OSwJLyogMzQgKi8KKwkJMHgwMCwJLyogMzUgd3JpdHRlbiBt dWx0aXBsZSB0aW1lcyAqLworCQkweDAwLAkvKiAzNiBub3Qgd3JpdHRlbiAqLworCQkweEEzLAkv KiAzNyAqLworCQkweEM4LAkvKiAzOCAqLworCQkweDIyLAkvKiAzOSAqLworCQkweDAyLAkvKiAz QSAqLworCQkweDIyLAkvKiAzQiAqLworCQkweDNGLCAweDAzLCAvKiAzQy0zRCAqLworCQkweDAw LAkvKiAzRSB3cml0dGVuIG11bHRpcGxlIHRpbWVzICovCisJCTB4MDAsCS8qIDNGIG5vdCB3cml0 dGVuICovCisJfSB9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWF2ZW5yZWdzIG50c2NyZWdzID0g eyB7CisJCTB4MjEsIDB4RjAsIDB4N0MsIDB4MUYsCS8qIDAwOiBjaHJvbWEgc3ViY2FycmllciAq LworCQkweDAwLAorCQkweDAwLAkvKiB0ZXN0ICovCisJCTB4RjksCS8qIG1vZGlmaWVkIGJ5IGNv ZGUgKEY5IHdyaXR0ZW4uLi4pICovCisJCTB4MDAsCS8qID8gbm90IHdyaXR0ZW4gKi8KKwkJMHg3 RSwJLyogMDggKi8KKwkJMHg0MywJLyogMDkgKi8KKwkJMHg3RSwJLyogMEEgKi8KKwkJMHgzRCwJ LyogMEIgKi8KKwkJMHgwMCwJLyogMEMgKi8KKwkJMHgwMCwJLyogPyBub3Qgd3JpdHRlbiAqLwor CQkweDQxLCAweDAwLCAvKiAwRS0wRiAqLworCQkweDNDLCAweDAwLCAvKiAxMC0xMSAqLworCQkw eDE3LAkvKiAxMiAqLworCQkweDIxLAkvKiAxMyAqLworCQkweDFCLCAweDFCLCAweDI0LCAvKiAx NC0xNiAqLworCQkweDgzLCAweDAxLCAvKiAxNy0xOCAqLworCQkweDAwLAkvKiAxOSAqLworCQkw eDBGLAkvKiAxQSAqLworCQkweDBGLAkvKiAxQiAqLworCQkweDYwLAkvKiAxQyAqLworCQkweDA1 LAkvKiAxRCAqLworCQkvLzB4ODksIDB4MDIsIC8qIDFFLTFGICovCisJCTB4QzAsIDB4MDIsIC8q IDFFLTFGICovCisJCS8vMHg1RiwJLyogMjAgKi8KKwkJMHg5QywJLyogMjAgKi8KKwkJMHgwNCwJ LyogMjEgKi8KKwkJLy8weDVGLAkvKiAyMiAqLworCQkweDlDLAkvKiAyMiAqLworCQkweDAxLAkv KiAyMyAqLworCQkweDAyLAkvKiAyNCAqLworCQkweDAwLAkvKiAyNSAqLworCQkweDBBLAkvKiAy NiAqLworCQkweDA1LAkvKiAyNyAqLworCQkweDAwLAkvKiAyOCAqLworCQkweDEwLAkvKiAyOSAq LworCQkweEZGLCAweDAzLCAvKiAyQS0yQiAqLworCQkweDI0LAkvKiAyQyAqLworCQkweDBGLCAw eDc4LCAvKiAyRC0yRSAqLworCQkweDAwLCAweDAwLCAvKiAyRi0zMCAqLworCQkweEIyLCAweDA0 LCAvKiAzMS0zMiAqLworCQkweDE0LAkvKiAzMyAqLworCQkweDAyLAkvKiAzNCAqLworCQkweDAw LAkvKiAzNSB3cml0dGVuIG11bHRpcGxlIHRpbWVzICovCisJCTB4MDAsCS8qIDM2IG5vdCB3cml0 dGVuICovCisJCTB4QTMsCS8qIDM3ICovCisJCTB4QzgsCS8qIDM4ICovCisJCTB4MTUsCS8qIDM5 ICovCisJCTB4MDUsCS8qIDNBICovCisJCTB4M0IsCS8qIDNCICovCisJCTB4M0MsIDB4MDAsIC8q IDNDLTNEICovCisJCTB4MDAsCS8qIDNFIHdyaXR0ZW4gbXVsdGlwbGUgdGltZXMgKi8KKwkJMHgw MCwJLyogbmV2ZXIgd3JpdHRlbiAqLworCX0gfTsKKworCWlmIChub3JtID09IE1BVFJPWEZCX09V VFBVVF9NT0RFX1BBTCkgeworCQkqZGF0YSA9IHBhbHJlZ3M7CisJCSpvdXRkID0gJnBhbG91dGQ7 CisJfSBlbHNlIHsKKyAgCQkqZGF0YSA9IG50c2NyZWdzOworCQkqb3V0ZCA9ICZudHNjb3V0ZDsK Kwl9CisgCXJldHVybjsKK30KKworI2RlZmluZSBMUih4KSBjdmUyX3NldF9yZWcobWluZm8sICh4 KSwgbS0+cmVnc1soeCldKQorc3RhdGljIHZvaWQgY3ZlMl9pbml0X1RWKHN0cnVjdCBtYXRyb3hf ZmJfaW5mbyAqbWluZm8sCisJCQkgY29uc3Qgc3RydWN0IG1hdmVucmVncyAqbSkKK3sKKwlpbnQg aTsKKworCUxSKDB4ODApOworCUxSKDB4ODIpOyBMUigweDgzKTsKKwlMUigweDg0KTsgTFIoMHg4 NSk7CisJCisJY3ZlMl9zZXRfcmVnKG1pbmZvLCAweDNFLCAweDAxKTsKKwkKKwlmb3IgKGkgPSAw OyBpIDwgMHgzRTsgaSsrKSB7CisJCUxSKGkpOworCX0KKwljdmUyX3NldF9yZWcobWluZm8sIDB4 M0UsIDB4MDApOworfQorCitzdGF0aWMgaW50IG1hdHJveGZiX2c0NTBfY29tcHV0ZSh2b2lkKiBt ZCwgc3RydWN0IG15X3RpbW1pbmcqIG10KSB7CisJc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5m byA9IG1kOworCisJZHByaW50ayhLRVJOX0RFQlVHICJDb21wdXRpbmcsIG1vZGU9JXVcbiIsIG1p bmZvLT5vdXRwdXRzWzFdLm1vZGUpOworCisJaWYgKG10LT5jcnRjID09IE1BVFJPWEZCX1NSQ19D UlRDMiAmJgorCSAgICBtaW5mby0+b3V0cHV0c1sxXS5tb2RlICE9IE1BVFJPWEZCX09VVFBVVF9N T0RFX01PTklUT1IpIHsKKwkJY29uc3Qgc3RydWN0IG91dHB1dF9kZXNjKiBvdXRkOworCisJCWN2 ZTJfaW5pdF9UVmRhdGEobWluZm8tPm91dHB1dHNbMV0ubW9kZSwgJm1pbmZvLT5ody5tYXZlbiwg Jm91dGQpOworCQl7CisJCQlpbnQgYmxhY2tsZXZlbCwgd2hpdGVsZXZlbDsKKwkJCWc0NTBfY29t cHV0ZV9id2xldmVsKG1pbmZvLCAmYmxhY2tsZXZlbCwgJndoaXRlbGV2ZWwpOworCQkJbWluZm8t Pmh3Lm1hdmVuLnJlZ3NbMHgwRV0gPSBibGFja2xldmVsID4+IDI7CisJCQltaW5mby0+aHcubWF2 ZW4ucmVnc1sweDBGXSA9IGJsYWNrbGV2ZWwgJiAzOworCQkJbWluZm8tPmh3Lm1hdmVuLnJlZ3Nb MHgxRV0gPSB3aGl0ZWxldmVsID4+IDI7CisJCQltaW5mby0+aHcubWF2ZW4ucmVnc1sweDFGXSA9 IHdoaXRlbGV2ZWwgJiAzOworCisJCQltaW5mby0+aHcubWF2ZW4ucmVnc1sweDIwXSA9CisJCQlt aW5mby0+aHcubWF2ZW4ucmVnc1sweDIyXSA9IG1pbmZvLT5hbHRvdXQudHZvX3BhcmFtcy5zYXR1 cmF0aW9uOworCisJCQltaW5mby0+aHcubWF2ZW4ucmVnc1sweDI1XSA9IG1pbmZvLT5hbHRvdXQu dHZvX3BhcmFtcy5odWU7CisKKwkJCWlmIChtaW5mby0+YWx0b3V0LnR2b19wYXJhbXMudGVzdG91 dCkgeworCQkJCW1pbmZvLT5ody5tYXZlbi5yZWdzWzB4MDVdIHw9IDB4MDI7CisJCQl9CisJCX0K KwkJY29tcHV0ZVJlZ3MobWluZm8sICZtaW5mby0+aHcubWF2ZW4sIG10LCBvdXRkKTsKKwl9IGVs c2UgaWYgKG10LT5tbnAgPCAwKSB7CisJCS8qIFdlIG11c3QgcHJvZ3JhbSBjbG9ja3MgYmVmb3Jl IENSVEMyLCBvdGhlcndpc2UgaW50ZXJsYWNlZCBtb2RlCisJCSAgIHN0YXJ0dXAgbWF5IGZhaWwg Ki8KKwkJbXQtPm1ucCA9IG1hdHJveGZiX2c0NTBfc2V0Y2xrKG1pbmZvLCBtdC0+cGl4Y2xvY2ss IChtdC0+Y3J0YyA9PSBNQVRST1hGQl9TUkNfQ1JUQzEpID8gTV9QSVhFTF9QTExfQyA6IE1fVklE RU9fUExMKTsKKwkJbXQtPnBpeGNsb2NrID0gZzQ1MF9tbnAyZihtaW5mbywgbXQtPm1ucCk7CisJ fQorCWRwcmludGsoS0VSTl9ERUJVRyAiUGl4Y2xvY2sgPSAldVxuIiwgbXQtPnBpeGNsb2NrKTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRyb3hmYl9nNDUwX3Byb2dyYW0odm9pZCog bWQpIHsKKwlzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvID0gbWQ7CisJCisJaWYgKG1pbmZv LT5vdXRwdXRzWzFdLm1vZGUgIT0gTUFUUk9YRkJfT1VUUFVUX01PREVfTU9OSVRPUikgeworCQlj dmUyX2luaXRfVFYobWluZm8sICZtaW5mby0+aHcubWF2ZW4pOworCX0KKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBtYXRyb3hmYl9nNDUwX3ZlcmlmeV9tb2RlKHZvaWQqIG1kLCB1X2ludDMy X3QgYXJnKSB7CisJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSBNQVRST1hGQl9PVVRQVVRfTU9ERV9Q QUw6CisJCWNhc2UgTUFUUk9YRkJfT1VUUFVUX01PREVfTlRTQzoKKwkJY2FzZSBNQVRST1hGQl9P VVRQVVRfTU9ERV9NT05JVE9SOgorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOwor fQorCitzdGF0aWMgaW50IGc0NTBfZHZpX2NvbXB1dGUodm9pZCogbWQsIHN0cnVjdCBteV90aW1t aW5nKiBtdCkgeworCXN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8gPSBtZDsKKworCWlmICht dC0+bW5wIDwgMCkgeworCQltdC0+bW5wID0gbWF0cm94ZmJfZzQ1MF9zZXRjbGsobWluZm8sIG10 LT5waXhjbG9jaywgKG10LT5jcnRjID09IE1BVFJPWEZCX1NSQ19DUlRDMSkgPyBNX1BJWEVMX1BM TF9DIDogTV9WSURFT19QTEwpOworCQltdC0+cGl4Y2xvY2sgPSBnNDUwX21ucDJmKG1pbmZvLCBt dC0+bW5wKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cm94X2FsdG91 dCBtYXRyb3hmYl9nNDUwX2FsdG91dCA9IHsKKwkubmFtZQkJPSAiU2Vjb25kYXJ5IG91dHB1dCIs CisJLmNvbXB1dGUJPSBtYXRyb3hmYl9nNDUwX2NvbXB1dGUsCisJLnByb2dyYW0JPSBtYXRyb3hm Yl9nNDUwX3Byb2dyYW0sCisJLnZlcmlmeW1vZGUJPSBtYXRyb3hmYl9nNDUwX3ZlcmlmeV9tb2Rl LAorCS5nZXRxdWVyeWN0cmwJPSBnNDUwX3F1ZXJ5X2N0cmwsCisJLmdldGN0cmwJPSBnNDUwX2dl dF9jdHJsLAorCS5zZXRjdHJsCT0gZzQ1MF9zZXRfY3RybCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qg bWF0cm94X2FsdG91dCBtYXRyb3hmYl9nNDUwX2R2aSA9IHsKKwkubmFtZQkJPSAiRFZJIG91dHB1 dCIsCisJLmNvbXB1dGUJPSBnNDUwX2R2aV9jb21wdXRlLAorfTsKKwordm9pZCBtYXRyb3hmYl9n NDUwX2Nvbm5lY3Qoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwlpZiAobWluZm8t PmRldmZsYWdzLmc0NTBkYWMpIHsKKwkJZG93bl93cml0ZSgmbWluZm8tPmFsdG91dC5sb2NrKTsK KwkJdHZvX2ZpbGxfZGVmYXVsdHMobWluZm8pOworCQltaW5mby0+b3V0cHV0c1sxXS5zcmMgPSBt aW5mby0+b3V0cHV0c1sxXS5kZWZhdWx0X3NyYzsKKwkJbWluZm8tPm91dHB1dHNbMV0uZGF0YSA9 IG1pbmZvOworCQltaW5mby0+b3V0cHV0c1sxXS5vdXRwdXQgPSAmbWF0cm94ZmJfZzQ1MF9hbHRv dXQ7CisJCW1pbmZvLT5vdXRwdXRzWzFdLm1vZGUgPSBNQVRST1hGQl9PVVRQVVRfTU9ERV9NT05J VE9SOworCQltaW5mby0+b3V0cHV0c1syXS5zcmMgPSBtaW5mby0+b3V0cHV0c1syXS5kZWZhdWx0 X3NyYzsKKwkJbWluZm8tPm91dHB1dHNbMl0uZGF0YSA9IG1pbmZvOworCQltaW5mby0+b3V0cHV0 c1syXS5vdXRwdXQgPSAmbWF0cm94ZmJfZzQ1MF9kdmk7CisJCW1pbmZvLT5vdXRwdXRzWzJdLm1v ZGUgPSBNQVRST1hGQl9PVVRQVVRfTU9ERV9NT05JVE9SOworCQl1cF93cml0ZSgmbWluZm8tPmFs dG91dC5sb2NrKTsKKwl9Cit9CisKK3ZvaWQgbWF0cm94ZmJfZzQ1MF9zaHV0ZG93bihzdHJ1Y3Qg bWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCWlmIChtaW5mby0+ZGV2ZmxhZ3MuZzQ1MGRhYykg eworCQlkb3duX3dyaXRlKCZtaW5mby0+YWx0b3V0LmxvY2spOworCQltaW5mby0+b3V0cHV0c1sx XS5zcmMgPSBNQVRST1hGQl9TUkNfTk9ORTsKKwkJbWluZm8tPm91dHB1dHNbMV0ub3V0cHV0ID0g TlVMTDsKKwkJbWluZm8tPm91dHB1dHNbMV0uZGF0YSA9IE5VTEw7CisJCW1pbmZvLT5vdXRwdXRz WzFdLm1vZGUgPSBNQVRST1hGQl9PVVRQVVRfTU9ERV9NT05JVE9SOworCQltaW5mby0+b3V0cHV0 c1syXS5zcmMgPSBNQVRST1hGQl9TUkNfTk9ORTsKKwkJbWluZm8tPm91dHB1dHNbMl0ub3V0cHV0 ID0gTlVMTDsKKwkJbWluZm8tPm91dHB1dHNbMl0uZGF0YSA9IE5VTEw7CisJCW1pbmZvLT5vdXRw dXRzWzJdLm1vZGUgPSBNQVRST1hGQl9PVVRQVVRfTU9ERV9NT05JVE9SOworCQl1cF93cml0ZSgm bWluZm8tPmFsdG91dC5sb2NrKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfZzQ1 MF9jb25uZWN0KTsKK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfZzQ1MF9zaHV0ZG93bik7CisKK01P RFVMRV9BVVRIT1IoIihjKSAyMDAwLTIwMDIgUGV0ciBWYW5kcm92ZWMgPHZhbmRyb3ZlQHZjLmN2 dXQuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hdHJveCBHNDUwL0c1NTAgb3V0cHV0IGRy aXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFn aW5nL21nYWttcy9tYXRyb3hmYl9nNDUwLmggYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJv eGZiX2c0NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmI1ZjE3 Yjg2ZWFlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94 ZmJfZzQ1MC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wICovCisjaWZuZGVmIF9fTUFUUk9YRkJfRzQ1MF9IX18KKyNkZWZpbmUgX19NQVRST1hG Ql9HNDUwX0hfXworCisjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorCisjaWZkZWYgQ09ORklH X0ZCX01BVFJPWF9HCit2b2lkIG1hdHJveGZiX2c0NTBfY29ubmVjdChzdHJ1Y3QgbWF0cm94X2Zi X2luZm8gKm1pbmZvKTsKK3ZvaWQgbWF0cm94ZmJfZzQ1MF9zaHV0ZG93bihzdHJ1Y3QgbWF0cm94 X2ZiX2luZm8gKm1pbmZvKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWF0cm94ZmJfZzQ1 MF9jb25uZWN0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pIHsgfTsKK3N0YXRpYyBpbmxp bmUgdm9pZCBtYXRyb3hmYl9nNDUwX3NodXRkb3duKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWlu Zm8pIHsgfTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19NQVRST1hGQl9HNDUwX0hfXyAqLwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9tYXZlbi5oIGIvZHJpdmVy cy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9tYXZlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uZjg5NmI3ODgzNmIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9tYXZlbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisjaWZuZGVmIF9fTUFUUk9YRkJfTUFW RU5fSF9fCisjZGVmaW5lIF9fTUFUUk9YRkJfTUFWRU5fSF9fCisKKyNpbmNsdWRlIDxsaW51eC9p b2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdv LWJpdC5oPgorI2luY2x1ZGUgIm1hdHJveGZiX2Jhc2UuaCIKKworc3RydWN0IGkyY19iaXRfYWRh cHRlciB7CisJc3RydWN0IGkyY19hZGFwdGVyCQlhZGFwdGVyOworCWludAkJCQlpbml0aWFsaXpl ZDsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEJYmFjOworCXN0cnVjdCBtYXRyb3hfZmJfaW5m byoJCW1pbmZvOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAkJZGF0YTsKKwkJdW5zaWduZWQg aW50CQljbG9jazsKKwkJCQkgICAgICB9IG1hc2s7Cit9OworCisjZW5kaWYgLyogX19NQVRST1hG Ql9NQVZFTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZ2FrbXMvbWF0cm94 ZmJfbWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9taXNjLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45OTQ4Y2EyYTMwNDYKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWdha21zL21hdHJveGZiX21pc2MuYwpAQCAtMCww ICsxLDgxNSBAQAorLyoKKyAqCisgKiBIYXJkd2FyZSBhY2NlbGVyYXRlZCBNYXRyb3ggTWlsbGVu bml1bSBJLCBJSSwgTXlzdGlxdWUsIEcxMDAsIEcyMDAgYW5kIEc0MDAKKyAqCisgKiAoYykgMTk5 OC0yMDAyIFBldHIgVmFuZHJvdmVjIDx2YW5kcm92ZUB2Yy5jdnV0LmN6PgorICoKKyAqIFBvcnRp b25zIENvcHlyaWdodCAoYykgMjAwMSBNYXRyb3ggR3JhcGhpY3MgSW5jLgorICoKKyAqIFZlcnNp b246IDEuNjUgMjAwMi8wOC8xNAorICoKKyAqIE1UUlIgc3R1ZmY6IDE5OTggVG9tIFJpbmkgPHRy aW5pQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogQ29udHJpYnV0b3JzOiAibWVuaW9uPyIg PG1lbmlvbkBtaW5kbGVzcy5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIEJldGF0ZXN0aW5n LCBmaXhlcywgaWRlYXMKKyAqCisgKiAgICAgICAgICAgICAgICJLdXJ0IEdhcmxvZmYiIDxnYXJs b2ZmQHN1c2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgIEJldGF0ZXN0aW5nLCBmaXhlcywg aWRlYXMsIHZpZGVvbW9kZXMsIHZpZGVvbW9kZXMgdGltbWluZ3MKKyAqCisgKiAgICAgICAgICAg ICAgICJUb20gUmluaSIgPHRyaW5pQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKiAgICAgICAgICAg ICAgICAgICAgIE1UUlIgc3R1ZmYsIFBQQyBjbGVhbnVwcywgYmV0YXRlc3RpbmcsIGZpeGVzLCBp ZGVhcworICoKKyAqICAgICAgICAgICAgICAgIkJpYmVrIFNhaHUiIDxzY29ycGlvQGRvZGRzLm5l dD4KKyAqICAgICAgICAgICAgICAgICAgICAgQWNjZXNzIGRldmljZSB0aHJvdWdoIHJlYWRifHd8 bCBhbmQgd3JpdGUgYnx3fGwKKyAqICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaXZlIGRlYnVn Z2luZyBzdHVmZgorICoKKyAqICAgICAgICAgICAgICAgIkRhbmllbCBIYXVuIiA8aGF1bmRAdXNh Lm5ldD4KKyAqICAgICAgICAgICAgICAgICAgICAgVGVzdGluZywgaGFyZHdhcmUgY3Vyc29yIGZp eGVzCisgKgorICogICAgICAgICAgICAgICAiU2NvdHQgV29vZCIgPHNhd3N0NDYrQHBpdHQuZWR1 PgorICogICAgICAgICAgICAgICAgICAgICBGaXhlcworICoKKyAqICAgICAgICAgICAgICAgIkdl cmQgS25vcnIiIDxrcmF4ZWxAZ29sZGJhY2guaXNkbi5jcy50dS1iZXJsaW4uZGU+CisgKiAgICAg ICAgICAgICAgICAgICAgIEJldGF0ZXN0aW5nCisgKgorICogICAgICAgICAgICAgICAiS2VsbHkg RnJlbmNoIiA8dGFyZ29uQGhhem1hdC5jb20+CisgKiAgICAgICAgICAgICAgICJGZXJuYW5kbyBI ZXJyZXJhIiA8ZmhlcnJlcmFAZXVyaWVsZWMuZXRzaXQudXBtLmVzPgorICogICAgICAgICAgICAg ICAgICAgICBCZXRhdGVzdGluZywgYnVnIHJlcG9ydGluZworICoKKyAqICAgICAgICAgICAgICAg IlBhYmxvIEJpYW51Y2NpIiA8cGJpYW5AcGNjcC5jb20uYXI+CisgKiAgICAgICAgICAgICAgICAg ICAgIEZpeGVzLCBpZGVhcywgYmV0YXRlc3RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICJJbmFr eSBQZXJleiBHb256YWxleiIgPGluYWt5QHBlbG9uY2hvLmZpcy51Y20uZXM+CisgKiAgICAgICAg ICAgICAgICAgICAgIEZpeGVzLCBlbmhhbmRjZW1lbnRzLCBpZGVhcywgYmV0YXRlc3RpbmcKKyAq CisgKiAgICAgICAgICAgICAgICJSeXVpY2hpIE9pa2F3YSIgPHJvaWthd2FAcnIuaWlpajR1Lm9y LmpwPgorICogICAgICAgICAgICAgICAgICAgICBQUEMgYmV0YXRlc3RpbmcsIFBQQyBzdXBwb3J0 LCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKgorICogICAgICAgICAgICAgICAiUGF1bCBXb21h ciIgPFBhdWxAcHdvbWFyLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAiT3dlbiBXYWxs ZXIiIDxPLldhbGxlckBlZS5xdWIuYWMudWs+CisgKiAgICAgICAgICAgICAgICAgICAgIFBQQyBi ZXRhdGVzdGluZworICoKKyAqICAgICAgICAgICAgICAgIlRob21hcyBQb3JuaW4iIDxwb3JuaW5A Ym9sZXQuZW5zLmZyPgorICogICAgICAgICAgICAgICAgICAgICBBbHBoYSBiZXRhdGVzdGluZwor ICoKKyAqICAgICAgICAgICAgICAgIlBpZXRlciB2YW4gTGV1dmVuIiA8cHZsQGlhZS5ubD4KKyAq ICAgICAgICAgICAgICAgIlVsZiBKYWVuaWNrZS1Sb2Vzc2xlciIgPHVqckBwaHlzaWsucGh5LnR1 LWRyZXNkZW4uZGU+CisgKiAgICAgICAgICAgICAgICAgICAgIEcxMDAgdGVzdGluZworICoKKyAq ICAgICAgICAgICAgICAgIkguIFBldGVyIEFydmluIiA8aHBhQHRyYW5zbWV0YS5jb20+CisgKiAg ICAgICAgICAgICAgICAgICAgIElkZWFzCisgKgorICogICAgICAgICAgICAgICAiQ29ydCBEb3Vn YW4iIDxjb3J0QGNzLm5tdC5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgIENIUlAgZml4ZXMg YW5kIFBSZVAgY2xlYW51cAorICoKKyAqICAgICAgICAgICAgICAgIk1hcmsgVm9qa292aWNoIiA8 bXZvamtvdmlAdWNzZC5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgIEc0MDAgc3VwcG9ydAor ICoKKyAqICAgICAgICAgICAgICAgIkRhdmlkIEMuIEhhbnNlbiIgPGhhdmVibHVlQHVzLmlibS5j b20+CisgKiAgICAgICAgICAgICAgICAgICAgIEZpeGVzCisgKgorICogICAgICAgICAgICAgICAi SWFuIFJvbWFuaWNrIiA8aWRyQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIEZp bmQgUEluUyBkYXRhIGluIEJJT1Mgb24gUG93ZXJQQyBzeXN0ZW1zLgorICoKKyAqIChmb2xsb3dp bmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNvZGUsIGJ1dCBoaXMg Y29kZQorICogIGlzIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyKQorICoKKyAqIEJhc2VkIG9uIGZy YW1lYnVmZmVyIGRyaXZlciBmb3IgVkJFIDIuMCBjb21wbGlhbnQgZ3JhcGhpYyBib2FyZHMKKyAq ICAgICAoYykgMTk5OCBHZXJkIEtub3JyIDxrcmF4ZWxAY3MudHUtYmVybGluLmRlPgorICoKKyAq IChmb2xsb3dpbmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNvZGUs IGJ1dCBoaXMgaWRlYXMKKyAqICB3ZXJlIHVzZWQgd2hlbiB3cml0aW5nIHRoaXMgZHJpdmVyKQor ICoKKyAqCQkgRnJlZVZCRS9BRiAoTWF0cm94KSwgIlNoYXduIEhhcmdyZWF2ZXMiIDxzaGF3bkB0 YWx1bGEuZGVtb24uY28udWs+CisgKgorICovCisKKworI2luY2x1ZGUgIm1hdHJveGZiX21pc2Mu aCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRyb3hm Yi5oPgorCit2b2lkIG1hdHJveGZiX0RBQ19vdXQoY29uc3Qgc3RydWN0IG1hdHJveF9mYl9pbmZv ICptaW5mbywgaW50IHJlZywgaW50IHZhbCkKK3sKKwlEQkdfUkVHKF9fZnVuY19fKQorCW1nYV9v dXRiKE1fUkFNREFDX0JBU0UrTV9YX0lOREVYLCByZWcpOworCW1nYV9vdXRiKE1fUkFNREFDX0JB U0UrTV9YX0RBVEFSRUcsIHZhbCk7Cit9CisKK2ludCBtYXRyb3hmYl9EQUNfaW4oY29uc3Qgc3Ry dWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgaW50IHJlZykKK3sKKwlEQkdfUkVHKF9fZnVuY19f KQorCW1nYV9vdXRiKE1fUkFNREFDX0JBU0UrTV9YX0lOREVYLCByZWcpOworCXJldHVybiBtZ2Ff aW5iKE1fUkFNREFDX0JBU0UrTV9YX0RBVEFSRUcpOworfQorCit2b2lkIG1hdHJveGZiX3ZhcjJt eShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qIHZhciwgc3RydWN0IG15X3RpbW1pbmcqIG10KSB7 CisJdW5zaWduZWQgaW50IHBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKKworCURCRyhfX2Z1bmNf XykKKworCWlmICghcGl4Y2xvY2spIHBpeGNsb2NrID0gMTAwMDA7CS8qIDEwbnMgPSAxMDBNSHog Ki8KKwltdC0+cGl4Y2xvY2sgPSAxMDAwMDAwMDAwIC8gcGl4Y2xvY2s7CisJaWYgKG10LT5waXhj bG9jayA8IDEpIG10LT5waXhjbG9jayA9IDE7CisJbXQtPm1ucCA9IC0xOworCW10LT5kYmxzY2Fu ID0gdmFyLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRTsKKwltdC0+aW50ZXJsYWNlZCA9IHZhci0+ dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCW10LT5IRGlzcGxheSA9IHZhci0+eHJlczsK KwltdC0+SFN5bmNTdGFydCA9IG10LT5IRGlzcGxheSArIHZhci0+cmlnaHRfbWFyZ2luOworCW10 LT5IU3luY0VuZCA9IG10LT5IU3luY1N0YXJ0ICsgdmFyLT5oc3luY19sZW47CisJbXQtPkhUb3Rh bCA9IG10LT5IU3luY0VuZCArIHZhci0+bGVmdF9tYXJnaW47CisJbXQtPlZEaXNwbGF5ID0gdmFy LT55cmVzOworCW10LT5WU3luY1N0YXJ0ID0gbXQtPlZEaXNwbGF5ICsgdmFyLT5sb3dlcl9tYXJn aW47CisJbXQtPlZTeW5jRW5kID0gbXQtPlZTeW5jU3RhcnQgKyB2YXItPnZzeW5jX2xlbjsKKwlt dC0+VlRvdGFsID0gbXQtPlZTeW5jRW5kICsgdmFyLT51cHBlcl9tYXJnaW47CisJbXQtPnN5bmMg PSB2YXItPnN5bmM7Cit9CisKK2ludCBtYXRyb3hmYl9QTExfY2FsY2Nsb2NrKGNvbnN0IHN0cnVj dCBtYXRyb3hfcGxsX2ZlYXR1cmVzKiBwbGwsIHVuc2lnbmVkIGludCBmcmVxLCB1bnNpZ25lZCBp bnQgZm1heCwKKwkJdW5zaWduZWQgaW50KiBpbiwgdW5zaWduZWQgaW50KiBmZWVkLCB1bnNpZ25l ZCBpbnQqIHBvc3QpIHsKKwl1bnNpZ25lZCBpbnQgYmVzdGRpZmYgPSB+MDsKKwl1bnNpZ25lZCBp bnQgYmVzdHZjbyA9IDA7CisJdW5zaWduZWQgaW50IGZ4dGFsID0gcGxsLT5yZWZfZnJlcTsKKwl1 bnNpZ25lZCBpbnQgZndhbnQ7CisJdW5zaWduZWQgaW50IHA7CisKKwlEQkcoX19mdW5jX18pCisK Kwlmd2FudCA9IGZyZXE7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAicG9zdF9z aGlmdF9tYXg6ICVkXG4iLCBwbGwtPnBvc3Rfc2hpZnRfbWF4KTsKKwlwcmludGsoS0VSTl9FUlIg InJlZl9mcmVxOiAlZFxuIiwgcGxsLT5yZWZfZnJlcSk7CisJcHJpbnRrKEtFUk5fRVJSICJmcmVx OiAlZFxuIiwgZnJlcSk7CisJcHJpbnRrKEtFUk5fRVJSICJ2Y29fZnJlcV9taW46ICVkXG4iLCBw bGwtPnZjb19mcmVxX21pbik7CisJcHJpbnRrKEtFUk5fRVJSICJpbl9kaXZfbWluOiAlZFxuIiwg cGxsLT5pbl9kaXZfbWluKTsKKwlwcmludGsoS0VSTl9FUlIgImluX2Rpdl9tYXg6ICVkXG4iLCBw bGwtPmluX2Rpdl9tYXgpOworCXByaW50ayhLRVJOX0VSUiAiZmVlZF9kaXZfbWluOiAlZFxuIiwg cGxsLT5mZWVkX2Rpdl9taW4pOworCXByaW50ayhLRVJOX0VSUiAiZmVlZF9kaXZfbWF4OiAlZFxu IiwgcGxsLT5mZWVkX2Rpdl9tYXgpOworCXByaW50ayhLRVJOX0VSUiAiZm1heDogJWRcbiIsIGZt YXgpOworI2VuZGlmCisJZm9yIChwID0gMTsgcCA8PSBwbGwtPnBvc3Rfc2hpZnRfbWF4OyBwKysp IHsKKwkJaWYgKGZ3YW50ICogMiA+IGZtYXgpCisJCQlicmVhazsKKwkJZndhbnQgKj0gMjsKKwl9 CisJaWYgKGZ3YW50IDwgcGxsLT52Y29fZnJlcV9taW4pIGZ3YW50ID0gcGxsLT52Y29fZnJlcV9t aW47CisJaWYgKGZ3YW50ID4gZm1heCkgZndhbnQgPSBmbWF4OworCWZvciAoOyBwLS0gPiAwOyBm d2FudCA+Pj0gMSwgYmVzdGRpZmYgPj49IDEpIHsKKwkJdW5zaWduZWQgaW50IG07CisKKwkJaWYg KGZ3YW50IDwgcGxsLT52Y29fZnJlcV9taW4pIGJyZWFrOworCQlmb3IgKG0gPSBwbGwtPmluX2Rp dl9taW47IG0gPD0gcGxsLT5pbl9kaXZfbWF4OyBtKyspIHsKKwkJCXVuc2lnbmVkIGludCBkaWZm LCBmdmNvOworCQkJdW5zaWduZWQgaW50IG47CisKKwkJCW4gPSAoZndhbnQgKiAobSArIDEpICsg KGZ4dGFsID4+IDEpKSAvIGZ4dGFsIC0gMTsKKwkJCWlmIChuID4gcGxsLT5mZWVkX2Rpdl9tYXgp CisJCQkJYnJlYWs7CisJCQlpZiAobiA8IHBsbC0+ZmVlZF9kaXZfbWluKQorCQkJCW4gPSBwbGwt PmZlZWRfZGl2X21pbjsKKwkJCWZ2Y28gPSAoZnh0YWwgKiAobiArIDEpKSAvIChtICsgMSk7CisJ CQlpZiAoZnZjbyA8IGZ3YW50KQorCQkJCWRpZmYgPSBmd2FudCAtIGZ2Y287CisJCQllbHNlCisJ CQkJZGlmZiA9IGZ2Y28gLSBmd2FudDsKKwkJCWlmIChkaWZmIDwgYmVzdGRpZmYpIHsKKwkJCQli ZXN0ZGlmZiA9IGRpZmY7CisJCQkJKnBvc3QgPSBwOworCQkJCSppbiA9IG07CisJCQkJKmZlZWQg PSBuOworCQkJCWJlc3R2Y28gPSBmdmNvOworCQkJfQorCQl9CisJfQorCWRwcmludGsoS0VSTl9F UlIgImNsazogJTAyWCAlMDJYICUwMlggJWQgJWQgJWRcbiIsICppbiwgKmZlZWQsICpwb3N0LCBm eHRhbCwgYmVzdHZjbywgZndhbnQpOworCXJldHVybiBiZXN0dmNvOworfQorCitpbnQgbWF0cm94 ZmJfdmdhSFdpbml0KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sIHN0cnVjdCBteV90aW1t aW5nICptKQoreworCXVuc2lnbmVkIGludCBoZCwgaHMsIGhlLCBoYmUsIGh0OworCXVuc2lnbmVk IGludCB2ZCwgdnMsIHZlLCB2dCwgbGM7CisJdW5zaWduZWQgaW50IHdkOworCXVuc2lnbmVkIGlu dCBkaXZpZGVyOworCWludCBpOworCXN0cnVjdCBtYXRyb3hfaHdfc3RhdGUgKiBjb25zdCBodyA9 ICZtaW5mby0+aHc7CisKKwlEQkcoX19mdW5jX18pCisKKwlody0+U0VRWzBdID0gMHgwMDsKKwlo dy0+U0VRWzFdID0gMHgwMTsJLyogb3IgMHgwOSAqLworCWh3LT5TRVFbMl0gPSAweDBGOwkvKiBi aXRwbGFuZXMgKi8KKwlody0+U0VRWzNdID0gMHgwMDsKKwlody0+U0VRWzRdID0gMHgwRTsKKwkv KiBDUlRDIDAuLjcsIDksIDE2Li4xOSwgMjEsIDIyIGFyZSByZXByb2dyYW1tZWQgYnkgTWF0cm94 IE1pbGxlbm5pdW0gY29kZS4uLiBIb3BlIHRoYXQgYnkgTUdBMTA2NCB0b28gKi8KKwlpZiAobS0+ ZGJsc2NhbikgeworCQltLT5WVG90YWwgPDw9IDE7CisJCW0tPlZEaXNwbGF5IDw8PSAxOworCQlt LT5WU3luY1N0YXJ0IDw8PSAxOworCQltLT5WU3luY0VuZCA8PD0gMTsKKwl9CisJaWYgKG0tPmlu dGVybGFjZWQpIHsKKwkJbS0+VlRvdGFsID4+PSAxOworCQltLT5WRGlzcGxheSA+Pj0gMTsKKwkJ bS0+VlN5bmNTdGFydCA+Pj0gMTsKKwkJbS0+VlN5bmNFbmQgPj49IDE7CisJfQorCisJLyogR0NU TCBpcyBpZ25vcmVkIHdoZW4gbm90IHVzaW5nIDB4QTAwMDAgYXBlcnR1cmUgKi8KKwlody0+R0NU TFswXSA9IDB4MDA7CisJaHctPkdDVExbMV0gPSAweDAwOworCWh3LT5HQ1RMWzJdID0gMHgwMDsK Kwlody0+R0NUTFszXSA9IDB4MDA7CisJaHctPkdDVExbNF0gPSAweDAwOworCWh3LT5HQ1RMWzVd ID0gMHg0MDsKKwlody0+R0NUTFs2XSA9IDB4MDU7CisJaHctPkdDVExbN10gPSAweDBGOworCWh3 LT5HQ1RMWzhdID0gMHhGRjsKKworCS8qIFdob2xlIEFUVFIgaXMgaWdub3JlZCBpbiBQb3dlckdy YXBoaWNzIG1vZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJaHctPkFUVFJbaV0g PSBpOworCWh3LT5BVFRSWzE2XSA9IDB4NDE7CisJaHctPkFUVFJbMTddID0gMHhGRjsKKwlody0+ QVRUUlsxOF0gPSAweDBGOworCWh3LT5BVFRSWzE5XSA9IDB4MDA7CisJaHctPkFUVFJbMjBdID0g MHgwMDsKKworCWhkID0gbS0+SERpc3BsYXkgPj4gMzsKKwlocyA9IG0tPkhTeW5jU3RhcnQgPj4g MzsKKwloZSA9IG0tPkhTeW5jRW5kID4+IDM7CisJaHQgPSBtLT5IVG90YWwgPj4gMzsKKwkvKiBz dGFuZGFyZCB0aW1taW5ncyBhcmUgaW4gOHBpeGVscywgYnV0IGZvciBpbnRlcmxlYXZlZCB3ZSBj YW5ub3QgKi8KKwkvKiBkbyBpdCBmb3IgNGJwcCAoYmVjYXVzZSBvZiAoNGJwcCA+PiAxKGludGVy bGVhdmVkKSkvNCA9PSAwKSAqLworCS8qIHVzaW5nIDE2IG9yIG1vcmUgcGl4ZWxzIHBlciB1bml0 IGNhbiBzYXZlIHVzICovCisJZGl2aWRlciA9IG1pbmZvLT5jdXJyLmZpbmFsX2JwcFNoaWZ0Owor CXdoaWxlIChkaXZpZGVyICYgMykgeworCQloZCA+Pj0gMTsKKwkJaHMgPj49IDE7CisJCWhlID4+ PSAxOworCQlodCA+Pj0gMTsKKwkJZGl2aWRlciA8PD0gMTsKKwl9CisJZGl2aWRlciA9IGRpdmlk ZXIgLyA0OworCS8qIGRpdmlkZXIgY2FuIGJlIGZyb20gMSB0byA4ICovCisJd2hpbGUgKGRpdmlk ZXIgPiA4KSB7CisJCWhkIDw8PSAxOworCQlocyA8PD0gMTsKKwkJaGUgPDw9IDE7CisJCWh0IDw8 PSAxOworCQlkaXZpZGVyID4+PSAxOworCX0KKwloZCA9IGhkIC0gMTsKKwlocyA9IGhzIC0gMTsK KwloZSA9IGhlIC0gMTsKKwlodCA9IGh0IC0gMTsKKwl2ZCA9IG0tPlZEaXNwbGF5IC0gMTsKKwl2 cyA9IG0tPlZTeW5jU3RhcnQgLSAxOworCXZlID0gbS0+VlN5bmNFbmQgLSAxOworCXZ0ID0gbS0+ VlRvdGFsIC0gMjsKKwlsYyA9IHZkOworCS8qIEcyMDAgY2Fubm90IHdvcmsgd2l0aCAoaHQgJiA3 KSA9PSA2ICovCisJaWYgKCgoaHQgJiAweDA3KSA9PSAweDA2KSB8fCAoKGh0ICYgMHgwRikgPT0g MHgwNCkpCisJCWh0Kys7CisJaGJlID0gaHQ7CisJd2QgPSBtaW5mby0+ZmJjb24udmFyLnhyZXNf dmlydHVhbCAqIG1pbmZvLT5jdXJyLmZpbmFsX2JwcFNoaWZ0IC8gNjQ7CisKKwlody0+Q1JUQ0VY VFswXSA9IDA7CisJaHctPkNSVENFWFRbNV0gPSAwOworCWlmIChtLT5pbnRlcmxhY2VkKSB7CisJ CWh3LT5DUlRDRVhUWzBdID0gMHg4MDsKKwkJaHctPkNSVENFWFRbNV0gPSAoaHMgKyBoZSAtIGh0 KSA+PiAxOworCQlpZiAoIW0tPmRibHNjYW4pCisJCQl3ZCA8PD0gMTsKKwkJdnQgJj0gfjE7CisJ fQorCWh3LT5DUlRDRVhUWzBdIHw9ICAod2QgJiAweDMwMCkgPj4gNDsKKwlody0+Q1JUQ0VYVFsx XSA9ICgoKGh0IC0gNCkgJiAweDEwMCkgPj4gOCkgfAorCQkJICAoKGhkICAgICAgJiAweDEwMCkg Pj4gNykgfCAvKiBibGFua2luZyAqLworCQkJICAoKGhzICAgICAgJiAweDEwMCkgPj4gNikgfCAv KiBzeW5jIHN0YXJ0ICovCisJCQkgICAoaGJlICAgICAmIDB4MDQwKTsJIC8qIGVuZCBob3IuIGJs YW5raW5nICovCisJLyogRklYTUU6IEVuYWJsZSB2aWRyc3Qgb25seSBvbiBHNDAwLCBhbmQgb25s eSBpZiBUVi1vdXQgaXMgdXNlZCAqLworCWlmIChtaW5mby0+b3V0cHV0c1sxXS5zcmMgPT0gTUFU Uk9YRkJfU1JDX0NSVEMxKQorCQlody0+Q1JUQ0VYVFsxXSB8PSAweDg4OwkJLyogZW5hYmxlIGhv cml6b250YWwgYW5kIHZlcnRpY2FsIHZpZHJzdCAqLworCWh3LT5DUlRDRVhUWzJdID0gICgodnQg JiAweEMwMCkgPj4gMTApIHwKKwkJCSAgKCh2ZCAmIDB4NDAwKSA+PiAgOCkgfAkvKiBkaXNwIGVu ZCAqLworCQkJICAoKHZkICYgMHhDMDApID4+ICA3KSB8CS8qIHZibGFua2luZyBzdGFydCAqLwor CQkJICAoKHZzICYgMHhDMDApID4+ICA1KSB8CisJCQkgICgobGMgJiAweDQwMCkgPj4gIDMpOwor CWh3LT5DUlRDRVhUWzNdID0gKGRpdmlkZXIgLSAxKSB8IDB4ODA7CisJaHctPkNSVENFWFRbNF0g PSAwOworCisJaHctPkNSVENbMF0gPSBodC00OworCWh3LT5DUlRDWzFdID0gaGQ7CisJaHctPkNS VENbMl0gPSBoZDsKKwlody0+Q1JUQ1szXSA9IChoYmUgJiAweDFGKSB8IDB4ODA7CisJaHctPkNS VENbNF0gPSBoczsKKwlody0+Q1JUQ1s1XSA9ICgoaGJlICYgMHgyMCkgPDwgMikgfCAoaGUgJiAw eDFGKTsKKwlody0+Q1JUQ1s2XSA9IHZ0ICYgMHhGRjsKKwlody0+Q1JUQ1s3XSA9ICgodnQgJiAw eDEwMCkgPj4gOCkgfAorCQkgICAgICAoKHZkICYgMHgxMDApID4+IDcpIHwKKwkJICAgICAgKCh2 cyAmIDB4MTAwKSA+PiA2KSB8CisJCSAgICAgICgodmQgJiAweDEwMCkgPj4gNSkgfAorCQkgICAg ICAoKGxjICYgMHgxMDApID4+IDQpIHwKKwkJICAgICAgKCh2dCAmIDB4MjAwKSA+PiA0KSB8CisJ CSAgICAgICgodmQgJiAweDIwMCkgPj4gMykgfAorCQkgICAgICAoKHZzICYgMHgyMDApID4+IDIp OworCWh3LT5DUlRDWzhdID0gMHgwMDsKKwlody0+Q1JUQ1s5XSA9ICgodmQgJiAweDIwMCkgPj4g NCkgfAorCQkgICAgICAoKGxjICYgMHgyMDApID4+IDMpOworCWlmIChtLT5kYmxzY2FuICYmICFt LT5pbnRlcmxhY2VkKQorCQlody0+Q1JUQ1s5XSB8PSAweDgwOworCWZvciAoaSA9IDEwOyBpIDwg MTY7IGkrKykKKwkJaHctPkNSVENbaV0gPSAweDAwOworCWh3LT5DUlRDWzE2XSA9IHZzIC8qICYg MHhGRiAqLzsKKwlody0+Q1JUQ1sxN10gPSAodmUgJiAweDBGKSB8IDB4MjA7CisJaHctPkNSVENb MThdID0gdmQgLyogJiAweEZGICovOworCWh3LT5DUlRDWzE5XSA9IHdkIC8qICYgMHhGRiAqLzsK Kwlody0+Q1JUQ1syMF0gPSAweDAwOworCWh3LT5DUlRDWzIxXSA9IHZkIC8qICYgMHhGRiAqLzsK Kwlody0+Q1JUQ1syMl0gPSAodnQgKyAxKSAvKiAmIDB4RkYgKi87CisJaHctPkNSVENbMjNdID0g MHhDMzsKKwlody0+Q1JUQ1syNF0gPSBsYzsKKwlyZXR1cm4gMDsKK307CisKK3ZvaWQgbWF0cm94 ZmJfdmdhSFdyZXN0b3JlKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJaW50IGk7 CisJc3RydWN0IG1hdHJveF9od19zdGF0ZSAqIGNvbnN0IGh3ID0gJm1pbmZvLT5odzsKKwlDUklU RkxBR1MKKworCURCRyhfX2Z1bmNfXykKKworCWRwcmludGsoS0VSTl9JTkZPICJNaXNjT3V0UmVn OiAlMDJYXG4iLCBody0+TWlzY091dFJlZyk7CisJZHByaW50ayhLRVJOX0lORk8gIlNFUSByZWdz OiAgICIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWRwcmludGsoIiUwMlg6IiwgaHct PlNFUVtpXSk7CisJZHByaW50aygiXG4iKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyAiR0RDIHJlZ3M6 ICAgIik7CisJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJZHByaW50aygiJTAyWDoiLCBody0+ R0NUTFtpXSk7CisJZHByaW50aygiXG4iKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyAiQ1JUQyByZWdz OiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKwkJZHByaW50aygiJTAyWDoiLCBody0+ Q1JUQ1tpXSk7CisJZHByaW50aygiXG4iKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyAiQVRUUiByZWdz OiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykKKwkJZHByaW50aygiJTAyWDoiLCBody0+ QVRUUltpXSk7CisJZHByaW50aygiXG4iKTsKKworCUNSSVRCRUdJTgorCisJbWdhX2luYihNX0FU VFJfUkVTRVQpOworCW1nYV9vdXRiKE1fQVRUUl9JTkRFWCwgMCk7CisJbWdhX291dGIoTV9NSVND X1JFRywgaHctPk1pc2NPdXRSZWcpOworCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisJCW1nYV9z ZXRyKE1fU0VRX0lOREVYLCBpLCBody0+U0VRW2ldKTsKKwltZ2Ffc2V0cihNX0NSVENfSU5ERVgs IDE3LCBody0+Q1JUQ1sxN10gJiAweDdGKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKwkJ bWdhX3NldHIoTV9DUlRDX0lOREVYLCBpLCBody0+Q1JUQ1tpXSk7CisJZm9yIChpID0gMDsgaSA8 IDk7IGkrKykKKwkJbWdhX3NldHIoTV9HUkFQSElDU19JTkRFWCwgaSwgaHctPkdDVExbaV0pOwor CWZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKSB7CisJCW1nYV9pbmIoTV9BVFRSX1JFU0VUKTsKKwkJ bWdhX291dGIoTV9BVFRSX0lOREVYLCBpKTsKKwkJbWdhX291dGIoTV9BVFRSX0lOREVYLCBody0+ QVRUUltpXSk7CisJfQorCW1nYV9vdXRiKE1fUEFMRVRURV9NQVNLLCAweEZGKTsKKwltZ2Ffb3V0 YihNX0RBQ19SRUcsIDB4MDApOworCWZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykKKwkJbWdhX291 dGIoTV9EQUNfVkFMLCBody0+REFDcGFsW2ldKTsKKwltZ2FfaW5iKE1fQVRUUl9SRVNFVCk7CisJ bWdhX291dGIoTV9BVFRSX0lOREVYLCAweDIwKTsKKworCUNSSVRFTkQKK30KKworc3RhdGljIHZv aWQgZ2V0X3BpbnModW5zaWduZWQgY2hhciBfX2lvbWVtKiBwaW5zLCBzdHJ1Y3QgbWF0cm94X2Jp b3MqIGJkKSB7CisJdW5zaWduZWQgaW50IGIwID0gcmVhZGIocGlucyk7CisJCisJaWYgKGIwID09 IDB4MkUgJiYgcmVhZGIocGlucysxKSA9PSAweDQxKSB7CisJCXVuc2lnbmVkIGludCBwaW5zX2xl biA9IHJlYWRiKHBpbnMrMik7CisJCXVuc2lnbmVkIGludCBpOworCQl1bnNpZ25lZCBjaGFyIGNr c3VtOworCQl1bnNpZ25lZCBjaGFyKiBkc3QgPSBiZC0+cGluczsKKworCQlpZiAocGluc19sZW4g PCAzIHx8IHBpbnNfbGVuID4gMTI4KSB7CisJCQlyZXR1cm47CisJCX0KKwkJKmRzdCsrID0gMHgy RTsKKwkJKmRzdCsrID0gMHg0MTsKKwkJKmRzdCsrID0gcGluc19sZW47CisJCWNrc3VtID0gMHgy RSArIDB4NDEgKyBwaW5zX2xlbjsKKwkJZm9yIChpID0gMzsgaSA8IHBpbnNfbGVuOyBpKyspIHsK KwkJCWNrc3VtICs9ICpkc3QrKyA9IHJlYWRiKHBpbnMraSk7CisJCX0KKwkJaWYgKGNrc3VtKSB7 CisJCQlyZXR1cm47CisJCX0KKwkJYmQtPnBpbnNfbGVuID0gcGluc19sZW47CisJfSBlbHNlIGlm IChiMCA9PSAweDQwICYmIHJlYWRiKHBpbnMrMSkgPT0gMHgwMCkgeworCQl1bnNpZ25lZCBpbnQg aTsKKwkJdW5zaWduZWQgY2hhciogZHN0ID0gYmQtPnBpbnM7CisKKwkJKmRzdCsrID0gMHg0MDsK KwkJKmRzdCsrID0gMDsKKwkJZm9yIChpID0gMjsgaSA8IDB4NDA7IGkrKykgeworCQkJKmRzdCsr ID0gcmVhZGIocGlucytpKTsKKwkJfQorCQliZC0+cGluc19sZW4gPSAweDQwOworCX0KK30KKwor c3RhdGljIHZvaWQgZ2V0X2Jpb3NfdmVyc2lvbih1bnNpZ25lZCBjaGFyIF9faW9tZW0gKiB2Ymlv cywgc3RydWN0IG1hdHJveF9iaW9zKiBiZCkgeworCXVuc2lnbmVkIGludCBwY2lyX29mZnNldDsK KwkKKwlwY2lyX29mZnNldCA9IHJlYWRiKHZiaW9zICsgMjQpIHwgKHJlYWRiKHZiaW9zICsgMjUp IDw8IDgpOworCWlmIChwY2lyX29mZnNldCA+PSAyNiAmJiBwY2lyX29mZnNldCA8IDB4RkZFMCAm JgorCSAgICByZWFkYih2YmlvcyArIHBjaXJfb2Zmc2V0ICAgICkgPT0gJ1AnICYmCisJICAgIHJl YWRiKHZiaW9zICsgcGNpcl9vZmZzZXQgKyAxKSA9PSAnQycgJiYKKwkgICAgcmVhZGIodmJpb3Mg KyBwY2lyX29mZnNldCArIDIpID09ICdJJyAmJgorCSAgICByZWFkYih2YmlvcyArIHBjaXJfb2Zm c2V0ICsgMykgPT0gJ1InKSB7CisJCXVuc2lnbmVkIGNoYXIgaDsKKworCQloID0gcmVhZGIodmJp b3MgKyBwY2lyX29mZnNldCArIDB4MTIpOworCQliZC0+dmVyc2lvbi52TWFqID0gKGggPj4gNCkg JiAweEY7CisJCWJkLT52ZXJzaW9uLnZNaW4gPSBoICYgMHhGOworCQliZC0+dmVyc2lvbi52UmV2 ID0gcmVhZGIodmJpb3MgKyBwY2lyX29mZnNldCArIDB4MTMpOworCX0gZWxzZSB7CisJCXVuc2ln bmVkIGNoYXIgaDsKKworCQloID0gcmVhZGIodmJpb3MgKyA1KTsKKwkJYmQtPnZlcnNpb24udk1h aiA9IChoID4+IDQpICYgMHhGOworCQliZC0+dmVyc2lvbi52TWluID0gaCAmIDB4RjsKKwkJYmQt PnZlcnNpb24udlJldiA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfYmlvc19vdXRwdXQo dW5zaWduZWQgY2hhciBfX2lvbWVtKiB2Ymlvcywgc3RydWN0IG1hdHJveF9iaW9zKiBiZCkgewor CXVuc2lnbmVkIGNoYXIgYjsKKwkKKwliID0gcmVhZGIodmJpb3MgKyAweDdGRjEpOworCWlmIChi ID09IDB4RkYpIHsKKwkJYiA9IDA7CisJfQorCWJkLT5vdXRwdXQuc3RhdGUgPSBiOworfQorCitz dGF0aWMgdm9pZCBnZXRfYmlvc190dm91dCh1bnNpZ25lZCBjaGFyIF9faW9tZW0qIHZiaW9zLCBz dHJ1Y3QgbWF0cm94X2Jpb3MqIGJkKSB7CisJdW5zaWduZWQgaW50IGk7CisJCisJLyogQ2hlY2sg Zm9yICdJQk0gLiooVi4uLi5UVk8nIHN0cmluZyAtIGl0IG1lYW5zIFRWTyBCSU9TICovCisJYmQt Pm91dHB1dC50dm91dCA9IDA7CisJaWYgKHJlYWRiKHZiaW9zICsgMHgxRCkgIT0gJ0knIHx8CisJ ICAgIHJlYWRiKHZiaW9zICsgMHgxRSkgIT0gJ0InIHx8CisJICAgIHJlYWRiKHZiaW9zICsgMHgx RikgIT0gJ00nIHx8CisJICAgIHJlYWRiKHZiaW9zICsgMHgyMCkgIT0gJyAnKSB7CisJICAgIAly ZXR1cm47CisJfQorCWZvciAoaSA9IDB4MkQ7IGkgPCAweDJEICsgMTI4OyBpKyspIHsKKwkJdW5z aWduZWQgY2hhciBiID0gcmVhZGIodmJpb3MgKyBpKTsKKwkJCisJCWlmIChiID09ICcoJyAmJiBy ZWFkYih2YmlvcyArIGkgKyAxKSA9PSAnVicpIHsKKwkJCWlmIChyZWFkYih2YmlvcyArIGkgKyA2 KSA9PSAnVCcgJiYKKwkJCSAgICByZWFkYih2YmlvcyArIGkgKyA3KSA9PSAnVicgJiYKKwkJCSAg ICByZWFkYih2YmlvcyArIGkgKyA4KSA9PSAnTycpIHsKKwkJCQliZC0+b3V0cHV0LnR2b3V0ID0g MTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYiA9PSAwKQorCQkJYnJlYWs7CisJfQor fQorCitzdGF0aWMgdm9pZCBwYXJzZV9iaW9zKHVuc2lnbmVkIGNoYXIgX19pb21lbSogdmJpb3Ms IHN0cnVjdCBtYXRyb3hfYmlvcyogYmQpIHsKKwl1bnNpZ25lZCBpbnQgcGluc19vZmZzZXQ7CisJ CisJaWYgKHJlYWRiKHZiaW9zKSAhPSAweDU1IHx8IHJlYWRiKHZiaW9zICsgMSkgIT0gMHhBQSkg eworCQlyZXR1cm47CisJfQorCWJkLT5iaW9zX3ZhbGlkID0gMTsKKwlnZXRfYmlvc192ZXJzaW9u KHZiaW9zLCBiZCk7CisJZ2V0X2Jpb3Nfb3V0cHV0KHZiaW9zLCBiZCk7CisJZ2V0X2Jpb3NfdHZv dXQodmJpb3MsIGJkKTsKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCS8qIE9uIFBvd2VyUEMg Y2FyZHMsIHRoZSBQSW5TIG9mZnNldCBpc24ndCBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUKKwkg KiBCSU9TIGltYWdlLiAgSW5zdGVhZCwgeW91IG11c3Qgc2VhcmNoIHRoZSBlbnRpcmUgQklPUyBp bWFnZSBmb3IKKwkgKiB0aGUgbWFnaWMgUEluUyBzaWduYXR1cmUuCisJICoKKwkgKiBUaGlzIGFj dHVhbGx5IGFwcGxpZXMgdG8gYWxsIE9wZW5GaXJtd2FyZSBiYXNlIGNhcmRzLiAgU2luY2UgdGhl c2UKKwkgKiBjYXJkcyBjb3VsZCBiZSBwdXQgaW4gYSBNSVBTIG9yIFNQQVJDIHN5c3RlbSwgc2hv dWxkIHRoZSBjb25kaXRpb24KKwkgKiBiZSBzb21ldGhpbmcgZGlmZmVyZW50PworCSAqLworCWZv ciAoIHBpbnNfb2Zmc2V0ID0gMCA7IHBpbnNfb2Zmc2V0IDw9IDB4RkY4MCA7IHBpbnNfb2Zmc2V0 KysgKSB7CisJCXVuc2lnbmVkIGNoYXIgaGVhZGVyWzNdOworCisJCWhlYWRlclswXSA9IHJlYWRi KHZiaW9zICsgcGluc19vZmZzZXQpOworCQloZWFkZXJbMV0gPSByZWFkYih2YmlvcyArIHBpbnNf b2Zmc2V0ICsgMSk7CisJCWhlYWRlclsyXSA9IHJlYWRiKHZiaW9zICsgcGluc19vZmZzZXQgKyAy KTsKKwkJaWYgKCAoaGVhZGVyWzBdID09IDB4MkUpICYmIChoZWFkZXJbMV0gPT0gMHg0MSkKKwkJ ICAgICAmJiAoKGhlYWRlclsyXSA9PSAweDQwKSB8fCAoaGVhZGVyWzJdID09IDB4ODApKSApIHsK KwkJCXByaW50ayhLRVJOX0lORk8gIlBJblMgZGF0YSBmb3VuZCBhdCBvZmZzZXQgJXVcbiIsCisJ CQkgICAgICAgcGluc19vZmZzZXQpOworCQkJZ2V0X3BpbnModmJpb3MgKyBwaW5zX29mZnNldCwg YmQpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZWxzZQorCXBpbnNfb2Zmc2V0ID0gcmVhZGIodmJp b3MgKyAweDdGRkMpIHwgKHJlYWRiKHZiaW9zICsgMHg3RkZEKSA8PCA4KTsKKwlpZiAocGluc19v ZmZzZXQgPD0gMHhGRjgwKSB7CisJCWdldF9waW5zKHZiaW9zICsgcGluc19vZmZzZXQsIGJkKTsK Kwl9CisjZW5kaWYKK30KKworc3RhdGljIGludCBwYXJzZV9waW5zMShzdHJ1Y3QgbWF0cm94X2Zi X2luZm8gKm1pbmZvLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG1hdHJveF9iaW9zICpiZCkKK3sK Kwl1bnNpZ25lZCBpbnQgbWF4ZGFjOworCisJc3dpdGNoIChiZC0+cGluc1syMl0pIHsKKwkJY2Fz ZSAwOgkJbWF4ZGFjID0gMTc1MDAwOyBicmVhazsKKwkJY2FzZSAxOgkJbWF4ZGFjID0gMjIwMDAw OyBicmVhazsKKwkJZGVmYXVsdDoJbWF4ZGFjID0gMjQwMDAwOyBicmVhazsKKwl9CisJaWYgKGdl dF91bmFsaWduZWRfbGUxNihiZC0+cGlucyArIDI0KSkgeworCQltYXhkYWMgPSBnZXRfdW5hbGln bmVkX2xlMTYoYmQtPnBpbnMgKyAyNCkgKiAxMDsKKwl9CisJbWluZm8tPmxpbWl0cy5waXhlbC52 Y29tYXggPSBtYXhkYWM7CisJbWluZm8tPnZhbHVlcy5wbGwuc3lzdGVtID0gZ2V0X3VuYWxpZ25l ZF9sZTE2KGJkLT5waW5zICsgMjgpID8KKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KGJkLT5waW5zICsg MjgpICogMTAgOiA1MDAwMDsKKwkvKiBpZ25vcmUgNE1CLCA4TUIsIG1vZHVsZSBjbG9ja3MgKi8K KwltaW5mby0+ZmVhdHVyZXMucGxsLnJlZl9mcmVxID0gMTQzMTg7CisJbWluZm8tPnZhbHVlcy5y ZWcubWN0bHd0c3QJPSAweDAwMDMwMTAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBk ZWZhdWx0X3BpbnMxKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8pCit7CisJLyogTWlsbGVu bml1bSAqLworCW1pbmZvLT5saW1pdHMucGl4ZWwudmNvbWF4CT0gMjIwMDAwOworCW1pbmZvLT52 YWx1ZXMucGxsLnN5c3RlbQk9ICA1MDAwMDsKKwltaW5mby0+ZmVhdHVyZXMucGxsLnJlZl9mcmVx CT0gIDE0MzE4OworCW1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0CT0gMHgwMDAzMDEwMTsKK30K Kworc3RhdGljIGludCBwYXJzZV9waW5zMihzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLAor CQkgICAgICAgY29uc3Qgc3RydWN0IG1hdHJveF9iaW9zICpiZCkKK3sKKwltaW5mby0+bGltaXRz LnBpeGVsLnZjb21heAk9CisJbWluZm8tPmxpbWl0cy5zeXN0ZW0udmNvbWF4CT0gKGJkLT5waW5z WzQxXSA9PSAweEZGKSA/IDIzMDAwMCA6ICgoYmQtPnBpbnNbNDFdICsgMTAwKSAqIDEwMDApOwor CW1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0CT0gKChiZC0+cGluc1s1MV0gJiAweDAxKSA/IDB4 MDAwMDAwMDEgOiAwKSB8CisJCQkJCSAgKChiZC0+cGluc1s1MV0gJiAweDAyKSA/IDB4MDAwMDAx MDAgOiAwKSB8CisJCQkJCSAgKChiZC0+cGluc1s1MV0gJiAweDA0KSA/IDB4MDAwMTAwMDAgOiAw KSB8CisJCQkJCSAgKChiZC0+cGluc1s1MV0gJiAweDA4KSA/IDB4MDAwMjAwMDAgOiAwKTsKKwlt aW5mby0+dmFsdWVzLnBsbC5zeXN0ZW0JPSAoYmQtPnBpbnNbNDNdID09IDB4RkYpID8gNTAwMDAg OiAoKGJkLT5waW5zWzQzXSArIDEwMCkgKiAxMDAwKTsKKwltaW5mby0+ZmVhdHVyZXMucGxsLnJl Zl9mcmVxCT0gMTQzMTg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfcGlu czIoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbykKK3sKKwkvKiBNaWxsZW5uaXVtIElJLCBN eXN0aXF1ZSAqLworCW1pbmZvLT5saW1pdHMucGl4ZWwudmNvbWF4CT0KKwltaW5mby0+bGltaXRz LnN5c3RlbS52Y29tYXgJPSAyMzAwMDA7CisJbWluZm8tPnZhbHVlcy5yZWcubWN0bHd0c3QJPSAw eDAwMDMwMTAxOworCW1pbmZvLT52YWx1ZXMucGxsLnN5c3RlbQk9ICA1MDAwMDsKKwltaW5mby0+ ZmVhdHVyZXMucGxsLnJlZl9mcmVxCT0gIDE0MzE4OworfQorCitzdGF0aWMgaW50IHBhcnNlX3Bp bnMzKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sCisJCSAgICAgICBjb25zdCBzdHJ1Y3Qg bWF0cm94X2Jpb3MgKmJkKQoreworCW1pbmZvLT5saW1pdHMucGl4ZWwudmNvbWF4CT0KKwltaW5m by0+bGltaXRzLnN5c3RlbS52Y29tYXgJPSAoYmQtPnBpbnNbMzZdID09IDB4RkYpID8gMjMwMDAw CQkJOiAoKGJkLT5waW5zWzM2XSArIDEwMCkgKiAxMDAwKTsKKwltaW5mby0+dmFsdWVzLnJlZy5t Y3Rsd3RzdAk9IGdldF91bmFsaWduZWRfbGUzMihiZC0+cGlucyArIDQ4KSA9PSAweEZGRkZGRkZG ID8KKwkJMHgwMTI1MEEyMSA6IGdldF91bmFsaWduZWRfbGUzMihiZC0+cGlucyArIDQ4KTsKKwkv KiBtZW1vcnkgY29uZmlnICovCisJbWluZm8tPnZhbHVlcy5yZWcubWVtcmRiawk9ICgoYmQtPnBp bnNbNTddIDw8IDIxKSAmIDB4MUUwMDAwMDApIHwKKwkJCQkJICAoKGJkLT5waW5zWzU3XSA8PCAy MikgJiAweDAwQzAwMDAwKSB8CisJCQkJCSAgKChiZC0+cGluc1s1Nl0gPDwgIDEpICYgMHgwMDAw MDFFMCkgfAorCQkJCQkgICggYmQtPnBpbnNbNTZdICAgICAgICAmIDB4MDAwMDAwMEYpOworCW1p bmZvLT52YWx1ZXMucmVnLm9wdAkJPSAoYmQtPnBpbnNbNTRdICYgNykgPDwgMTA7CisJbWluZm8t PnZhbHVlcy5yZWcub3B0MgkJPSBiZC0+cGluc1s1OF0gPDwgMTI7CisJbWluZm8tPmZlYXR1cmVz LnBsbC5yZWZfZnJlcQk9IChiZC0+cGluc1s1Ml0gJiAweDIwKSA/IDE0MzE4IDogMjcwMDA7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfcGluczMoc3RydWN0IG1hdHJveF9m Yl9pbmZvICptaW5mbykKK3sKKwkvKiBHMTAwLCBHMjAwICovCisJbWluZm8tPmxpbWl0cy5waXhl bC52Y29tYXgJPQorCW1pbmZvLT5saW1pdHMuc3lzdGVtLnZjb21heAk9IDIzMDAwMDsKKwltaW5m by0+dmFsdWVzLnJlZy5tY3Rsd3RzdAk9IDB4MDEyNTBBMjE7CisJbWluZm8tPnZhbHVlcy5yZWcu bWVtcmRiawk9IDB4MDAwMDAwMDA7CisJbWluZm8tPnZhbHVlcy5yZWcub3B0CQk9IDB4MDAwMDBD MDA7CisJbWluZm8tPnZhbHVlcy5yZWcub3B0MgkJPSAweDAwMDAwMDAwOworCW1pbmZvLT5mZWF0 dXJlcy5wbGwucmVmX2ZyZXEJPSAgMjcwMDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcGluczQo c3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBtYXRy b3hfYmlvcyAqYmQpCit7CisJbWluZm8tPmxpbWl0cy5waXhlbC52Y29tYXgJPSAoYmQtPnBpbnNb IDM5XSA9PSAweEZGKSA/IDIzMDAwMAkJCTogYmQtPnBpbnNbIDM5XSAqIDQwMDA7CisJbWluZm8t PmxpbWl0cy5zeXN0ZW0udmNvbWF4CT0gKGJkLT5waW5zWyAzOF0gPT0gMHhGRikgPyBtaW5mby0+ bGltaXRzLnBpeGVsLnZjb21heAk6IGJkLT5waW5zWyAzOF0gKiA0MDAwOworCW1pbmZvLT52YWx1 ZXMucmVnLm1jdGx3dHN0CT0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJkLT5waW5zICsgNzEpOworCW1p bmZvLT52YWx1ZXMucmVnLm1lbXJkYmsJPSAoKGJkLT5waW5zWzg3XSA8PCAyMSkgJiAweDFFMDAw MDAwKSB8CisJCQkJCSAgKChiZC0+cGluc1s4N10gPDwgMjIpICYgMHgwMEMwMDAwMCkgfAorCQkJ CQkgICgoYmQtPnBpbnNbODZdIDw8ICAxKSAmIDB4MDAwMDAxRTApIHwKKwkJCQkJICAoIGJkLT5w aW5zWzg2XSAgICAgICAgJiAweDAwMDAwMDBGKTsKKwltaW5mby0+dmFsdWVzLnJlZy5vcHQJCT0g KChiZC0+cGluc1s1M10gPDwgMTUpICYgMHgwMDQwMDAwMCkgfAorCQkJCQkgICgoYmQtPnBpbnNb NTNdIDw8IDIyKSAmIDB4MTAwMDAwMDApIHwKKwkJCQkJICAoKGJkLT5waW5zWzUzXSA8PCAgNykg JiAweDAwMDAxQzAwKTsKKwltaW5mby0+dmFsdWVzLnJlZy5vcHQzCQk9IGdldF91bmFsaWduZWRf bGUzMihiZC0+cGlucyArIDY3KTsKKwltaW5mby0+dmFsdWVzLnBsbC5zeXN0ZW0JPSAoYmQtPnBp bnNbIDY1XSA9PSAweEZGKSA/IDIwMDAwMCAJCQk6IGJkLT5waW5zWyA2NV0gKiA0MDAwOworCW1p bmZvLT5mZWF0dXJlcy5wbGwucmVmX2ZyZXEJPSAoYmQtPnBpbnNbIDkyXSAmIDB4MDEpID8gMTQz MTggOiAyNzAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9waW5zNChz dHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCS8qIEc0MDAgKi8KKwltaW5mby0+bGlt aXRzLnBpeGVsLnZjb21heAk9CisJbWluZm8tPmxpbWl0cy5zeXN0ZW0udmNvbWF4CT0gMjUyMDAw OworCW1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0CT0gMHgwNEE0NTBBMTsKKwltaW5mby0+dmFs dWVzLnJlZy5tZW1yZGJrCT0gMHgwMDAwMDBFNzsKKwltaW5mby0+dmFsdWVzLnJlZy5vcHQJCT0g MHgxMDAwMDQwMDsKKwltaW5mby0+dmFsdWVzLnJlZy5vcHQzCQk9IDB4MDE5MEE0MTk7CisJbWlu Zm8tPnZhbHVlcy5wbGwuc3lzdGVtCT0gMjAwMDAwOworCW1pbmZvLT5mZWF0dXJlcy5wbGwucmVm X2ZyZXEJPSAyNzAwMDsKK30KKworc3RhdGljIGludCBwYXJzZV9waW5zNShzdHJ1Y3QgbWF0cm94 X2ZiX2luZm8gKm1pbmZvLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG1hdHJveF9iaW9zICpiZCkK K3sKKwl1bnNpZ25lZCBpbnQgbXVsdDsKKwkKKwltdWx0ID0gYmQtPnBpbnNbNF0/ODAwMDo2MDAw OworCQorCW1pbmZvLT5saW1pdHMucGl4ZWwudmNvbWF4CT0gKGJkLT5waW5zWyAzOF0gPT0gMHhG RikgPyA2MDAwMDAJCQk6IGJkLT5waW5zWyAzOF0gKiBtdWx0OworCW1pbmZvLT5saW1pdHMuc3lz dGVtLnZjb21heAk9IChiZC0+cGluc1sgMzZdID09IDB4RkYpID8gbWluZm8tPmxpbWl0cy5waXhl bC52Y29tYXgJOiBiZC0+cGluc1sgMzZdICogbXVsdDsKKwltaW5mby0+bGltaXRzLnZpZGVvLnZj b21heAk9IChiZC0+cGluc1sgMzddID09IDB4RkYpID8gbWluZm8tPmxpbWl0cy5zeXN0ZW0udmNv bWF4CTogYmQtPnBpbnNbIDM3XSAqIG11bHQ7CisJbWluZm8tPmxpbWl0cy5waXhlbC52Y29taW4J PSAoYmQtPnBpbnNbMTIzXSA9PSAweEZGKSA/IDI1NjAwMAkJCTogYmQtPnBpbnNbMTIzXSAqIG11 bHQ7CisJbWluZm8tPmxpbWl0cy5zeXN0ZW0udmNvbWluCT0gKGJkLT5waW5zWzEyMV0gPT0gMHhG RikgPyBtaW5mby0+bGltaXRzLnBpeGVsLnZjb21pbgk6IGJkLT5waW5zWzEyMV0gKiBtdWx0Owor CW1pbmZvLT5saW1pdHMudmlkZW8udmNvbWluCT0gKGJkLT5waW5zWzEyMl0gPT0gMHhGRikgPyBt aW5mby0+bGltaXRzLnN5c3RlbS52Y29taW4JOiBiZC0+cGluc1sxMjJdICogbXVsdDsKKwltaW5m by0+dmFsdWVzLnBsbC5zeXN0ZW0JPQorCW1pbmZvLT52YWx1ZXMucGxsLnZpZGVvCQk9IChiZC0+ cGluc1sgOTJdID09IDB4RkYpID8gMjg0MDAwCQkJOiBiZC0+cGluc1sgOTJdICogNDAwMDsKKwlt aW5mby0+dmFsdWVzLnJlZy5vcHQJCT0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJkLT5waW5zICsgNDgp OworCW1pbmZvLT52YWx1ZXMucmVnLm9wdDIJCT0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJkLT5waW5z ICsgNTIpOworCW1pbmZvLT52YWx1ZXMucmVnLm9wdDMJCT0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJk LT5waW5zICsgOTQpOworCW1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0CT0gZ2V0X3VuYWxpZ25l ZF9sZTMyKGJkLT5waW5zICsgOTgpOworCW1pbmZvLT52YWx1ZXMucmVnLm1lbW1pc2MJPSBnZXRf dW5hbGlnbmVkX2xlMzIoYmQtPnBpbnMgKyAxMDIpOworCW1pbmZvLT52YWx1ZXMucmVnLm1lbXJk YmsJPSBnZXRfdW5hbGlnbmVkX2xlMzIoYmQtPnBpbnMgKyAxMDYpOworCW1pbmZvLT5mZWF0dXJl cy5wbGwucmVmX2ZyZXEJPSAoYmQtPnBpbnNbMTEwXSAmIDB4MDEpID8gMTQzMTggOiAyNzAwMDsK KwltaW5mby0+dmFsdWVzLm1lbW9yeS5kZHIJPSAoYmQtPnBpbnNbMTE0XSAmIDB4NjApID09IDB4 MjA7CisJbWluZm8tPnZhbHVlcy5tZW1vcnkuZGxsCT0gKGJkLT5waW5zWzExNV0gJiAweDAyKSAh PSAwOworCW1pbmZvLT52YWx1ZXMubWVtb3J5LmVtcnN3ZW4JPSAoYmQtPnBpbnNbMTE1XSAmIDB4 MDEpICE9IDA7CisJbWluZm8tPnZhbHVlcy5yZWcubWFjY2Vzcwk9IG1pbmZvLT52YWx1ZXMubWVt b3J5LmVtcnN3ZW4gPyAweDAwMDA0MDAwIDogMHgwMDAwMDAwMDsKKwlpZiAoYmQtPnBpbnNbMTE1 XSAmIDQpIHsKKwkJbWluZm8tPnZhbHVlcy5yZWcubWN0bHd0c3RfY29yZSA9IG1pbmZvLT52YWx1 ZXMucmVnLm1jdGx3dHN0OworCX0gZWxzZSB7CisJCXVfaW50MzJfdCB3dHN0X3hsYXRbXSA9IHsg MCwgMSwgNSwgNiwgNywgNSwgMiwgMyB9OworCQltaW5mby0+dmFsdWVzLnJlZy5tY3Rsd3RzdF9j b3JlID0gKG1pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0ICYgfjcpIHwKKwkJCQkJCSAgd3RzdF94 bGF0W21pbmZvLT52YWx1ZXMucmVnLm1jdGx3dHN0ICYgN107CisJfQorCW1pbmZvLT5tYXhfcGl4 ZWxfY2xvY2tfcGFuZWxsaW5rID0gYmQtPnBpbnNbNDddICogNDAwMDsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgZGVmYXVsdF9waW5zNShzdHJ1Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZv KQoreworCS8qIE1pbmUgMTZNQiBHNDUwIHdpdGggU0RSQU0gRERSICovCisJbWluZm8tPmxpbWl0 cy5waXhlbC52Y29tYXgJPQorCW1pbmZvLT5saW1pdHMuc3lzdGVtLnZjb21heAk9CisJbWluZm8t PmxpbWl0cy52aWRlby52Y29tYXgJPSA2MDAwMDA7CisJbWluZm8tPmxpbWl0cy5waXhlbC52Y29t aW4JPQorCW1pbmZvLT5saW1pdHMuc3lzdGVtLnZjb21pbgk9CisJbWluZm8tPmxpbWl0cy52aWRl by52Y29taW4JPSAyNTYwMDA7CisJbWluZm8tPnZhbHVlcy5wbGwuc3lzdGVtCT0KKwltaW5mby0+ dmFsdWVzLnBsbC52aWRlbwkJPSAyODQwMDA7CisJbWluZm8tPnZhbHVlcy5yZWcub3B0CQk9IDB4 NDA0QTExNjA7CisJbWluZm8tPnZhbHVlcy5yZWcub3B0MgkJPSAweDAwMDBBQzAwOworCW1pbmZv LT52YWx1ZXMucmVnLm9wdDMJCT0gMHgwMDkwQTQwOTsKKwltaW5mby0+dmFsdWVzLnJlZy5tY3Rs d3RzdF9jb3JlCT0KKwltaW5mby0+dmFsdWVzLnJlZy5tY3Rsd3RzdAk9IDB4MEM4MTQ2MkI7CisJ bWluZm8tPnZhbHVlcy5yZWcubWVtbWlzYwk9IDB4ODAwMDAwMDQ7CisJbWluZm8tPnZhbHVlcy5y ZWcubWVtcmRiawk9IDB4MDEwMDExMDM7CisJbWluZm8tPmZlYXR1cmVzLnBsbC5yZWZfZnJlcQk9 IDI3MDAwOworCW1pbmZvLT52YWx1ZXMubWVtb3J5LmRkcgk9IDE7CisJbWluZm8tPnZhbHVlcy5t ZW1vcnkuZGxsCT0gMTsKKwltaW5mby0+dmFsdWVzLm1lbW9yeS5lbXJzd2VuCT0gMTsKKwltaW5m by0+dmFsdWVzLnJlZy5tYWNjZXNzCT0gMHgwMDAwNDAwMDsKK30KKworc3RhdGljIGludCBtYXRy b3hmYl9zZXRfbGltaXRzKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sCisJCQkgICAgICAg Y29uc3Qgc3RydWN0IG1hdHJveF9iaW9zICpiZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGluc192ZXJz aW9uOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGluc2xlbltdID0geyA2NCwgNjQsIDY0 LCAxMjgsIDEyOCB9OworCisJc3dpdGNoIChtaW5mby0+Y2hpcCkgeworCQljYXNlIE1HQV8yMDY0 OglkZWZhdWx0X3BpbnMxKG1pbmZvKTsgYnJlYWs7CisJCWNhc2UgTUdBXzIxNjQ6CisJCWNhc2Ug TUdBXzEwNjQ6CisJCWNhc2UgTUdBXzExNjQ6CWRlZmF1bHRfcGluczIobWluZm8pOyBicmVhazsK KwkJY2FzZSBNR0FfRzEwMDoKKwkJY2FzZSBNR0FfRzIwMDoJZGVmYXVsdF9waW5zMyhtaW5mbyk7 IGJyZWFrOworCQljYXNlIE1HQV9HNDAwOglkZWZhdWx0X3BpbnM0KG1pbmZvKTsgYnJlYWs7CisJ CWNhc2UgTUdBX0c0NTA6CisJCWNhc2UgTUdBX0c1NTA6CWRlZmF1bHRfcGluczUobWluZm8pOyBi cmVhazsKKwl9CisJaWYgKCFiZC0+Ymlvc192YWxpZCkgeworCQlwcmludGsoS0VSTl9JTkZPICJt YXRyb3hmYjogWW91ciBNYXRyb3ggZGV2aWNlIGRvZXMgbm90IGhhdmUgQklPU1xuIik7CisJCXJl dHVybiAtMTsKKwl9CisJaWYgKGJkLT5waW5zX2xlbiA8IDY0KSB7CisJCXByaW50ayhLRVJOX0lO Rk8gIm1hdHJveGZiOiBCSU9TIG9uIHlvdXIgTWF0cm94IGRldmljZSBkb2VzIG5vdCBjb250YWlu IHBvd2VydXAgaW5mb1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGJkLT5waW5zWzBdID09 IDB4MkUgJiYgYmQtPnBpbnNbMV0gPT0gMHg0MSkgeworCQlwaW5zX3ZlcnNpb24gPSBiZC0+cGlu c1s1XTsKKwkJaWYgKHBpbnNfdmVyc2lvbiA8IDIgfHwgcGluc192ZXJzaW9uID4gNSkgeworCQkJ cHJpbnRrKEtFUk5fSU5GTyAibWF0cm94ZmI6IFVua25vd24gdmVyc2lvbiAoJXUpIG9mIHBvd2Vy dXAgaW5mb1xuIiwgcGluc192ZXJzaW9uKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7 CisJCXBpbnNfdmVyc2lvbiA9IDE7CisJfQorCWlmIChiZC0+cGluc19sZW4gIT0gcGluc2xlbltw aW5zX3ZlcnNpb24gLSAxXSkgeworCQlwcmludGsoS0VSTl9JTkZPICJtYXRyb3hmYjogSW52YWxp ZCBwb3dlcnVwIGluZm9cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXN3aXRjaCAocGluc192ZXJz aW9uKSB7CisJCWNhc2UgMToKKwkJCXJldHVybiBwYXJzZV9waW5zMShtaW5mbywgYmQpOworCQlj YXNlIDI6CisJCQlyZXR1cm4gcGFyc2VfcGluczIobWluZm8sIGJkKTsKKwkJY2FzZSAzOgorCQkJ cmV0dXJuIHBhcnNlX3BpbnMzKG1pbmZvLCBiZCk7CisJCWNhc2UgNDoKKwkJCXJldHVybiBwYXJz ZV9waW5zNChtaW5mbywgYmQpOworCQljYXNlIDU6CisJCQlyZXR1cm4gcGFyc2VfcGluczUobWlu Zm8sIGJkKTsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYXRyb3hmYjogUG93 ZXJ1cCBpbmZvIHZlcnNpb24gJXUgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIsIHBpbnNfdmVyc2lv bik7CisJCQlyZXR1cm4gLTE7CisJfQorfQorCit2b2lkIG1hdHJveGZiX3JlYWRfcGlucyhzdHJ1 Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvKQoreworCXUzMiBvcHQ7CisJdTMyIGJpb3NiYXNlOwor CXUzMiBmYmJhc2U7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtaW5mby0+cGNpZGV2OworCQor CW1lbXNldCgmbWluZm8tPmJpb3MsIDAsIHNpemVvZihtaW5mby0+YmlvcykpOworCXBjaV9yZWFk X2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfT1BUSU9OX1JFRywgJm9wdCk7CisJcGNpX3dyaXRlX2Nv bmZpZ19kd29yZChwZGV2LCBQQ0lfT1BUSU9OX1JFRywgb3B0IHwgUENJX09QVElPTl9FTkFCTEVf Uk9NKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JPTV9BRERSRVNTLCAmYmlv c2Jhc2UpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBtaW5mby0+ZGV2ZmxhZ3MuZmJS ZXNvdXJjZSwgJmZiYmFzZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUk9N X0FERFJFU1MsIChmYmJhc2UgJiBQQ0lfUk9NX0FERFJFU1NfTUFTSykgfCBQQ0lfUk9NX0FERFJF U1NfRU5BQkxFKTsKKwlwYXJzZV9iaW9zKHZhZGRyX3ZhKG1pbmZvLT52aWRlby52YmFzZSksICZt aW5mby0+Ymlvcyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUk9NX0FERFJF U1MsIGJpb3NiYXNlKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9PUFRJT05f UkVHLCBvcHQpOworI2lmZGVmIENPTkZJR19YODYKKwlpZiAoIW1pbmZvLT5iaW9zLmJpb3NfdmFs aWQpIHsKKwkJdW5zaWduZWQgY2hhciBfX2lvbWVtKiBiOworCisJCWIgPSBpb3JlbWFwKDB4MDAw QzAwMDAsIDY1NTM2KTsKKwkJaWYgKCFiKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtYXRyb3hm YjogVW5hYmxlIHRvIG1hcCBsZWdhY3kgQklPU1xuIik7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25l ZCBpbnQgdmVuID0gcmVhZGIoYisweDY0KzApIHwgKHJlYWRiKGIrMHg2NCsxKSA8PCA4KTsKKwkJ CXVuc2lnbmVkIGludCBkZXYgPSByZWFkYihiKzB4NjQrMikgfCAocmVhZGIoYisweDY0KzMpIDw8 IDgpOworCQkJCisJCQlpZiAodmVuICE9IHBkZXYtPnZlbmRvciB8fCBkZXYgIT0gcGRldi0+ZGV2 aWNlKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAibWF0cm94ZmI6IExlZ2FjeSBCSU9TIGlzIGZv ciAlMDRYOiUwNFgsIHdoaWxlIHRoaXMgZGV2aWNlIGlzICUwNFg6JTA0WFxuIiwKKwkJCQkJdmVu LCBkZXYsIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKTsKKwkJCX0gZWxzZSB7CisJCQkJcGFy c2VfYmlvcyhiLCAmbWluZm8tPmJpb3MpOworCQkJfQorCQkJaW91bm1hcChiKTsKKwkJfQorCX0K KyNlbmRpZgorCW1hdHJveGZiX3NldF9saW1pdHMobWluZm8sICZtaW5mby0+Ymlvcyk7CisJcHJp bnRrKEtFUk5fSU5GTyAiUEluUyBtZW10eXBlID0gJXVcbiIsCisJICAgICAgIChtaW5mby0+dmFs dWVzLnJlZy5vcHQgJiAweDFDMDApID4+IDEwKTsKK30KKworRVhQT1JUX1NZTUJPTChtYXRyb3hm Yl9EQUNfaW4pOworRVhQT1JUX1NZTUJPTChtYXRyb3hmYl9EQUNfb3V0KTsKK0VYUE9SVF9TWU1C T0wobWF0cm94ZmJfdmFyMm15KTsKK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfUExMX2NhbGNjbG9j ayk7CitFWFBPUlRfU1lNQk9MKG1hdHJveGZiX3ZnYUhXaW5pdCk7CQkvKiBEQUMxMDY0LCBUaTMw MjYgKi8KK0VYUE9SVF9TWU1CT0wobWF0cm94ZmJfdmdhSFdyZXN0b3JlKTsJCS8qIERBQzEwNjQs IFRpMzAyNiAqLworRVhQT1JUX1NZTUJPTChtYXRyb3hmYl9yZWFkX3BpbnMpOworCitNT0RVTEVf QVVUSE9SKCIoYykgMTk5OS0yMDAyIFBldHIgVmFuZHJvdmVjIDx2YW5kcm92ZUB2Yy5jdnV0LmN6 PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaXNjZWxsYW5lb3VzIHN1cHBvcnQgZm9yIE1hdHJv eCB2aWRlbyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9zdGFnaW5nL21nYWttcy9tYXRyb3hmYl9taXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvbWdh a21zL21hdHJveGZiX21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAuLjljYjY2ODZkMzA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZ2Fr bXMvbWF0cm94ZmJfbWlzYy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wICovCisjaWZuZGVmIF9fTUFUUk9YRkJfTUlTQ19IX18KKyNkZWZpbmUg X19NQVRST1hGQl9NSVNDX0hfXworCisjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgorCisvKiBh bHNvIGZvciBtb2R1bGVzICovCitpbnQgbWF0cm94ZmJfUExMX2NhbGNjbG9jayhjb25zdCBzdHJ1 Y3QgbWF0cm94X3BsbF9mZWF0dXJlcyogcGxsLCB1bnNpZ25lZCBpbnQgZnJlcSwgdW5zaWduZWQg aW50IGZtYXgsCisJdW5zaWduZWQgaW50KiBpbiwgdW5zaWduZWQgaW50KiBmZWVkLCB1bnNpZ25l ZCBpbnQqIHBvc3QpOworc3RhdGljIGlubGluZSBpbnQgUExMX2NhbGNjbG9jayhjb25zdCBzdHJ1 Y3QgbWF0cm94X2ZiX2luZm8gKm1pbmZvLAorCQkJCXVuc2lnbmVkIGludCBmcmVxLCB1bnNpZ25l ZCBpbnQgZm1heCwKKwkJCQl1bnNpZ25lZCBpbnQgKmluLCB1bnNpZ25lZCBpbnQgKmZlZWQsCisJ CQkJdW5zaWduZWQgaW50ICpwb3N0KQoreworCXJldHVybiBtYXRyb3hmYl9QTExfY2FsY2Nsb2Nr KCZtaW5mby0+ZmVhdHVyZXMucGxsLCBmcmVxLCBmbWF4LCBpbiwgZmVlZCwgcG9zdCk7Cit9CisK K2ludCBtYXRyb3hmYl92Z2FIV2luaXQoc3RydWN0IG1hdHJveF9mYl9pbmZvICptaW5mbywgc3Ry dWN0IG15X3RpbW1pbmcqIG0pOwordm9pZCBtYXRyb3hmYl92Z2FIV3Jlc3RvcmUoc3RydWN0IG1h dHJveF9mYl9pbmZvICptaW5mbyk7Cit2b2lkIG1hdHJveGZiX3JlYWRfcGlucyhzdHJ1Y3QgbWF0 cm94X2ZiX2luZm8gKm1pbmZvKTsKKworI2VuZGlmCS8qIF9fTUFUUk9YRkJfTUlTQ19IX18gKi8K LS0gCjIuMjMuMAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs