From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x22b.google.com (mail-wm0-x22b.google.com [IPv6:2a00:1450:400c:c09::22b]) by gabe.freedesktop.org (Postfix) with ESMTPS id B7B0888DF5 for ; Thu, 29 Mar 2018 18:46:35 +0000 (UTC) Received: by mail-wm0-x22b.google.com with SMTP id l16so13369836wmh.3 for ; Thu, 29 Mar 2018 11:46:35 -0700 (PDT) From: Tvrtko Ursulin Date: Thu, 29 Mar 2018 19:46:22 +0100 Message-Id: <20180329184622.10480-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: <63199548-08b6-446f-4185-082a87287ed3@intel.com> References: <63199548-08b6-446f-4185-082a87287ed3@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v3] intel-gpu-top: Rewrite the tool to be safe to use List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Tvrtko Ursulin , Eero Tamminen , Intel-gfx@lists.freedesktop.org List-ID: RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KCnYyOgogKiBTb3J0IGVuZ2luZXMgYnkgY2xhc3MgYW5kIGluc3Rh bmNlLgogKiBEbyBub3Qgd2FpdCBmb3Igb25lIHNhbXBsaW5nIHBlcmlvZCB0byBkaXNwbGF5IHNv bWV0aGluZyBvbiBzY3JlZW4uCiAqIE1vdmUgY29kZSBvdXQgb2YgdGhlIGFzc2VydHMuIChSaW5h dCBJYnJhZ2ltb3YpCiAqIENvbnRpbnVvdXNseSBhZGFwdCB0byB0ZXJtaW5hbCBzaXplLiAoUmlu YXQgSWJncmFnaW1vdikKCnYzOgogKiBDaGFuZ2UgbGF5b3V0IGFuZCBwcmVjaXNpb24gb2Ygc29t ZSBmaWVsZC4gKENocmlzIFdpbHNvbikKIEVlcm8gVGFtbWluZW46CiAqIFVzZSBtb3JlIHVzZXIg ZnJpZW5kbHkgZW5naW5lIG5hbWVzLgogKiBEb24ndCBlcnJvciBvdXQgaWYgYSBjb3VudGVyIGlz IG1pc3NpbmcuCiAqIEFkZCBJTUMgcmVhZC93cml0ZSBiYW5kd2lkdGguCiAqIFJlcG9ydCBtaW5p bXVtIHJlcXVpcmVkIGtlcm5lbCB2ZXJzaW9uLgoKU2lnbmVkLW9mZi1ieTogVHZydGtvIFVyc3Vs aW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hy aXMtd2lsc29uLmNvLnVrPgpDYzogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJs aW5AaW50ZWwuY29tPgpDYzogUGV0cmkgTGF0dmFsYSA8cGV0cmkubGF0dmFsYUBpbnRlbC5jb20+ CkNjOiBFZXJvIFRhbW1pbmVuIDxlZXJvLnQudGFtbWluZW5AaW50ZWwuY29tPgpDYzogUmluYXQg SWJyYWdpbW92IDxpYnJhZ2ltb3ZyaW5hdEBtYWlsLnJ1PgpSZXZpZXdlZC1ieTogTGlvbmVsIExh bmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPiAjIHYxClJldmlld2VkLWJ5 OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4gIyB2MC41Ci0tLQogbGli L2lndF9wZXJmLmMgICAgICAgIHwgICAgNiArCiBsaWIvaWd0X3BlcmYuaCAgICAgICAgfCAgICAx ICsKIHRvb2xzL01ha2VmaWxlLmFtICAgICB8ICAgIDIgKwogdG9vbHMvaW50ZWxfZ3B1X3RvcC5j IHwgMTIxNiArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiB0b29scy9tZXNvbi5idWlsZCAgICAgfCAgICA2ICstCiA1IGZpbGVzIGNoYW5nZWQsIDY1NyBp bnNlcnRpb25zKCspLCA1NzQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9wZXJm LmMgYi9saWIvaWd0X3BlcmYuYwppbmRleCA5OWQ4MmVhNTFjOWIuLmUzZGVjMmNjMjljNyAxMDA2 NDQKLS0tIGEvbGliL2lndF9wZXJmLmMKKysrIGIvbGliL2lndF9wZXJmLmMKQEAgLTY5LDMgKzY5 LDkgQEAgaW50IGlndF9wZXJmX29wZW4odWludDY0X3QgdHlwZSwgdWludDY0X3QgY29uZmlnKQog CXJldHVybiBfcGVyZl9vcGVuKHR5cGUsIGNvbmZpZywgLTEsCiAJCQkgIFBFUkZfRk9STUFUX1RP VEFMX1RJTUVfRU5BQkxFRCk7CiB9CisKK2ludCBpZ3RfcGVyZl9vcGVuX2dyb3VwKHVpbnQ2NF90 IHR5cGUsIHVpbnQ2NF90IGNvbmZpZywgaW50IGdyb3VwKQoreworCXJldHVybiBfcGVyZl9vcGVu KHR5cGUsIGNvbmZpZywgZ3JvdXAsCisJCQkgIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxF RCB8IFBFUkZfRk9STUFUX0dST1VQKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9pZ3RfcGVyZi5oIGIv bGliL2lndF9wZXJmLmgKaW5kZXggNjE0ZWE1ZDIzZmE2Li5lMDA3MThmNDc2OWEgMTAwNjQ0Ci0t LSBhL2xpYi9pZ3RfcGVyZi5oCisrKyBiL2xpYi9pZ3RfcGVyZi5oCkBAIC01NSw1ICs1NSw2IEBA IHVpbnQ2NF90IGk5MTVfdHlwZV9pZCh2b2lkKTsKIGludCBwZXJmX2k5MTVfb3Blbih1aW50NjRf dCBjb25maWcpOwogaW50IHBlcmZfaTkxNV9vcGVuX2dyb3VwKHVpbnQ2NF90IGNvbmZpZywgaW50 IGdyb3VwKTsKIGludCBpZ3RfcGVyZl9vcGVuKHVpbnQ2NF90IHR5cGUsIHVpbnQ2NF90IGNvbmZp Zyk7CitpbnQgaWd0X3BlcmZfb3Blbl9ncm91cCh1aW50NjRfdCB0eXBlLCB1aW50NjRfdCBjb25m aWcsIGludCBncm91cCk7CiAKICNlbmRpZiAvKiBJOTE1X1BFUkZfSCAqLwpkaWZmIC0tZ2l0IGEv dG9vbHMvTWFrZWZpbGUuYW0gYi90b29scy9NYWtlZmlsZS5hbQppbmRleCAwOWI2ZGJjYzNlY2Uu LmEwYjAxNmRkZDdmZiAxMDA2NDQKLS0tIGEvdG9vbHMvTWFrZWZpbGUuYW0KKysrIGIvdG9vbHMv TWFrZWZpbGUuYW0KQEAgLTI4LDYgKzI4LDggQEAgaW50ZWxfYXViZHVtcF9sYV9MREZMQUdTID0g LW1vZHVsZSAtYXZvaWQtdmVyc2lvbiAtbm8tdW5kZWZpbmVkCiBpbnRlbF9hdWJkdW1wX2xhX1NP VVJDRVMgPSBhdWJkdW1wLmMKIGludGVsX2F1YmR1bXBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRk aXIpL2xpYi9saWJpbnRlbF90b29scy5sYSAtbGRsCiAKK2ludGVsX2dwdV90b3BfTERBREQgPSAk KHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9wZXJmLmxhCisKIGJpbl9TQ1JJUFRTID0gaW50ZWxf YXViZHVtcAogQ0xFQU5GSUxFUyA9ICQoYmluX1NDUklQVFMpCiAKZGlmZiAtLWdpdCBhL3Rvb2xz L2ludGVsX2dwdV90b3AuYyBiL3Rvb2xzL2ludGVsX2dwdV90b3AuYwppbmRleCAwOThlNmNlM2Zm ODYuLjQ2YTNkYjQyZDNkNiAxMDA2NDQKLS0tIGEvdG9vbHMvaW50ZWxfZ3B1X3RvcC5jCisrKyBi L3Rvb2xzL2ludGVsX2dwdV90b3AuYwpAQCAtMSw2ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQg wqkgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29y cG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE4IEludGVsIENvcnBvcmF0aW9uCiAgKgogICog UGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz b24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0xOCw3MDEgKzE3LDc3MiBA QAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVO VC4gIElOIE5PIEVWRU5UIFNIQUxMCiAgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogICogTElBQklMSVRZ LCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0g KiBBdXRob3JzOgotICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KLSAqICAgIEV1 Z2VuaSBEb2Rvbm92IDxldWdlbmkuZG9kb25vdkBpbnRlbC5jb20+Ci0gKgorICogRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhF UiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgogICovCiAKLSNpbmNsdWRlICJjb25maWcu aCIKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVk ZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnIuaD4KLSNpbmNs dWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy93 YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5j bHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+ Ci0jaWZkZWYgSEFWRV9URVJNSU9TX0gKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jZW5kaWYKLSNp bmNsdWRlICJpbnRlbF9pby5oIgotI2luY2x1ZGUgImluc3Rkb25lLmgiCi0jaW5jbHVkZSAiaW50 ZWxfcmVnLmgiCi0jaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgotI2luY2x1ZGUgImRybXRlc3Qu aCIKLQotI2RlZmluZSAgRk9SQ0VXQUtFCSAgICAweEExOEMKLSNkZWZpbmUgIEZPUkNFV0FLRV9B Q0sJICAgIDB4MTMwMDkwCi0KLSNkZWZpbmUgU0FNUExFU19QRVJfU0VDICAgICAgICAgICAgIDEw MDAwCi0jZGVmaW5lIFNBTVBMRVNfVE9fUEVSQ0VOVF9SQVRJTyAgICAoU0FNUExFU19QRVJfU0VD IC8gMTAwKQotCi0jZGVmaW5lIE1BWF9OVU1fVE9QX0JJVFMgICAgICAgICAgICAxMDAKLQotI2Rl ZmluZSBIQVNfU1RBVFNfUkVHUyhkZXZpZCkJCUlTXzk2NShkZXZpZCkKLQotc3RydWN0IHRvcF9i aXQgewotCXN0cnVjdCBpbnN0ZG9uZV9iaXQgKmJpdDsKLQlpbnQgY291bnQ7Ci19IHRvcF9iaXRz W01BWF9OVU1fVE9QX0JJVFNdOwotc3RydWN0IHRvcF9iaXQgKnRvcF9iaXRzX3NvcnRlZFtNQVhf TlVNX1RPUF9CSVRTXTsKLQotc3RhdGljIHVpbnQzMl90IGluc3Rkb25lLCBpbnN0ZG9uZTE7Ci0K LXN0YXRpYyBjb25zdCBjaGFyICpiYXJzW10gPSB7Ci0JIiAiLAotCSLilo8iLAotCSLilo4iLAot CSLilo0iLAotCSLilowiLAotCSLilosiLAotCSLilooiLAotCSLilokiLAotCSLilogiCi19Owor I2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3Rk Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUg PGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4K KyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpbmNsdWRlICJpZ3Rf cGVyZi5oIgogCi1lbnVtIHN0YXRzX2NvdW50cyB7Ci0JSUFfVkVSVElDRVMsCi0JSUFfUFJJTUlU SVZFUywKLQlWU19JTlZPQ0FUSU9OLAotCUdTX0lOVk9DQVRJT04sCi0JR1NfUFJJTUlUSVZFUywK LQlDTF9JTlZPQ0FUSU9OLAotCUNMX1BSSU1JVElWRVMsCi0JUFNfSU5WT0NBVElPTiwKLQlQU19E RVBUSCwKLQlTVEFUU19DT1VOVAorc3RydWN0IHBtdV9wYWlyIHsKKwl1aW50NjRfdCBjdXI7CisJ dWludDY0X3QgcHJldjsKIH07CiAKLWNvbnN0IHVpbnQzMl90IHN0YXRzX3JlZ3NbU1RBVFNfQ09V TlRdID0gewotCUlBX1ZFUlRJQ0VTX0NPVU5UX1FXLAotCUlBX1BSSU1JVElWRVNfQ09VTlRfUVcs Ci0JVlNfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlHU19JTlZPQ0FUSU9OX0NPVU5UX1FXLAotCUdT X1BSSU1JVElWRVNfQ09VTlRfUVcsCi0JQ0xfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlDTF9QUklN SVRJVkVTX0NPVU5UX1FXLAotCVBTX0lOVk9DQVRJT05fQ09VTlRfUVcsCi0JUFNfREVQVEhfQ09V TlRfUVcsCitzdHJ1Y3QgcG11X2NvdW50ZXIgeworCWJvb2wgcHJlc2VudDsKKwl1aW50NjRfdCBj b25maWc7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgcG11X3BhaXIgdmFsOwogfTsKIAot Y29uc3QgY2hhciAqc3RhdHNfcmVnX25hbWVzW1NUQVRTX0NPVU5UXSA9IHsKLQkidmVydCBmZXRj aCIsCi0JInByaW0gZmV0Y2giLAotCSJWUyBpbnZvY2F0aW9ucyIsCi0JIkdTIGludm9jYXRpb25z IiwKLQkiR1MgcHJpbXMiLAotCSJDTCBpbnZvY2F0aW9ucyIsCi0JIkNMIHByaW1zIiwKLQkiUFMg aW52b2NhdGlvbnMiLAotCSJQUyBkZXB0aCBwYXNzIiwKK3N0cnVjdCBlbmdpbmUgeworCWNvbnN0 IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGlzcGxheV9uYW1lOworCisJdW5zaWduZWQgaW50 IGNsYXNzOworCXVuc2lnbmVkIGludCBpbnN0YW5jZTsKKworCXN0cnVjdCBwbXVfY291bnRlciBi dXN5OworCXN0cnVjdCBwbXVfY291bnRlciB3YWl0OworCXN0cnVjdCBwbXVfY291bnRlciBzZW1h OwogfTsKIAotdWludDY0X3Qgc3RhdHNbU1RBVFNfQ09VTlRdOwotdWludDY0X3QgbGFzdF9zdGF0 c1tTVEFUU19DT1VOVF07CitzdHJ1Y3QgZW5naW5lcyB7CisJdW5zaWduZWQgaW50IG51bV9lbmdp bmVzOworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJRElSICpyb290OworCWludCBmZDsK KwlzdHJ1Y3QgcG11X3BhaXIgdHM7CisKKwlpbnQgcmFwbF9mZDsKKwlkb3VibGUgcmFwbF9zY2Fs ZTsKKworCWludCBpbWNfZmQ7CisJZG91YmxlIGltY19yZWFkc19zY2FsZTsKKwljb25zdCBjaGFy ICppbWNfcmVhZHNfdW5pdDsKKwlkb3VibGUgaW1jX3dyaXRlc19zY2FsZTsKKwljb25zdCBjaGFy ICppbWNfd3JpdGVzX3VuaXQ7CisKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgZnJlcV9yZXE7CisJc3Ry dWN0IHBtdV9jb3VudGVyIGZyZXFfYWN0OworCXN0cnVjdCBwbXVfY291bnRlciBpcnE7CisJc3Ry dWN0IHBtdV9jb3VudGVyIHJjNjsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgcmFwbDsKKwlzdHJ1Y3Qg cG11X2NvdW50ZXIgaW1jX3JlYWRzOworCXN0cnVjdCBwbXVfY291bnRlciBpbWNfd3JpdGVzOwor CisJc3RydWN0IGVuZ2luZSBlbmdpbmU7Cit9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0 dGltZSh2b2lkKQorc3RhdGljIHVpbnQ2NF90CitnZXRfcG11X2NvbmZpZyhpbnQgZGlyZmQsIGNv bnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNvdW50ZXIpCiB7Ci0gICAgc3RydWN0IHRpbWV2 YWwgdDsKLSAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotICAgIHJldHVybiAodC50dl91c2Vj ICsgKHQudHZfc2VjICogMTAwMDAwMCkpOwotfQorCWNoYXIgYnVmWzEyOF0sICpwOworCWludCBm ZCwgcmV0OwogCi1zdGF0aWMgaW50Ci10b3BfYml0c19zb3J0KGNvbnN0IHZvaWQgKmEsIGNvbnN0 IHZvaWQgKmIpCi17Ci0Jc3RydWN0IHRvcF9iaXQgKiBjb25zdCAqYml0X2EgPSBhOwotCXN0cnVj dCB0b3BfYml0ICogY29uc3QgKmJpdF9iID0gYjsKLQlpbnQgYV9jb3VudCA9ICgqYml0X2EpLT5j b3VudDsKLQlpbnQgYl9jb3VudCA9ICgqYml0X2IpLT5jb3VudDsKKwlyZXQgPSBzbnByaW50Zihi dWYsIHNpemVvZihidWYpLCAiJXMtJXMiLCBuYW1lLCBjb3VudGVyKTsKKwlpZiAocmV0IDwgMCB8 fCByZXQgPT0gc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtMTsKIAotCWlmIChhX2NvdW50IDwgYl9j b3VudCkKLQkJcmV0dXJuIDE7Ci0JZWxzZSBpZiAoYV9jb3VudCA9PSBiX2NvdW50KQotCQlyZXR1 cm4gMDsKLQllbHNlCisJZmQgPSBvcGVuYXQoZGlyZmQsIGJ1ZiwgT19SRE9OTFkpOworCWlmIChm ZCA8IDApCiAJCXJldHVybiAtMTsKLX0KIAotc3RhdGljIHZvaWQKLXVwZGF0ZV9pZGxlX2JpdChz dHJ1Y3QgdG9wX2JpdCAqdG9wX2JpdCkKLXsKLQl1aW50MzJfdCByZWdfdmFsOworCXJldCA9IHJl YWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDw9IDApCisJ CXJldHVybiAtMTsKIAotCWlmICh0b3BfYml0LT5iaXQtPnJlZyA9PSBJTlNURE9ORV8xKQotCQly ZWdfdmFsID0gaW5zdGRvbmUxOwotCWVsc2UKLQkJcmVnX3ZhbCA9IGluc3Rkb25lOworCXAgPSBp bmRleChidWYsICcwJyk7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CiAKLQlpZiAoKHJlZ192YWwg JiB0b3BfYml0LT5iaXQtPmJpdCkgPT0gMCkKLQkJdG9wX2JpdC0+Y291bnQrKzsKKwlyZXR1cm4g c3RydG91bChwLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQKLXByaW50X2Nsb2NrKGNvbnN0 IGNoYXIgKm5hbWUsIGludCBjbG9jaykgewotCWlmIChjbG9jayA9PSAtMSkKLQkJcHJpbnRmKCIl cyBjbG9jazogdW5rbm93biIsIG5hbWUpOworI2RlZmluZSBlbmdpbmVfcHRyKGVuZ2luZXMsIG4p IFwKKwkoKHN0cnVjdCBlbmdpbmUgKikoKHVuc2lnbmVkIGNoYXIgKikoJmVuZ2luZXMtPmVuZ2lu ZSkgKyAobikgKiBzaXplb2Yoc3RydWN0IGVuZ2luZSkpKQorCitzdGF0aWMgY29uc3QgY2hhciAq Y2xhc3NfZGlzcGxheV9uYW1lKHVuc2lnbmVkIGludCBjbGFzcykKK3sKKwlzd2l0Y2ggKGNsYXNz KSB7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVI6CisJCXJldHVybiAiUmVuZGVyLzNE IjsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX0NPUFk6CisJCXJldHVybiAiQmxpdHRlciI7CisJ Y2FzZSBJOTE1X0VOR0lORV9DTEFTU19WSURFTzoKKwkJcmV0dXJuICJWaWRlbyI7CisJY2FzZSBJ OTE1X0VOR0lORV9DTEFTU19WSURFT19FTkhBTkNFOgorCQlyZXR1cm4gIlZpZGVvRW5oYW5jZSI7 CisJZGVmYXVsdDoKKwkJcmV0dXJuICJbdW5rbm93bl0iOworCX0KK30KKworc3RhdGljIGludCBl bmdpbmVfY21wKGNvbnN0IHZvaWQgKl9fYSwgY29uc3Qgdm9pZCAqX19iKQoreworCWNvbnN0IHN0 cnVjdCBlbmdpbmUgKmEgPSAoc3RydWN0IGVuZ2luZSAqKV9fYTsKKwljb25zdCBzdHJ1Y3QgZW5n aW5lICpiID0gKHN0cnVjdCBlbmdpbmUgKilfX2I7CisKKwlpZiAoYS0+Y2xhc3MgIT0gYi0+Y2xh c3MpCisJCXJldHVybiBhLT5jbGFzcyAtIGItPmNsYXNzOwogCWVsc2UKLQkJcHJpbnRmKCIlcyBj bG9jazogJWQgTWh6IiwgbmFtZSwgY2xvY2spOworCQlyZXR1cm4gYS0+aW5zdGFuY2UgLSBiLT5p bnN0YW5jZTsKIH0KIAotc3RhdGljIGludAotcHJpbnRfY2xvY2tfaW5mbyhzdHJ1Y3QgcGNpX2Rl dmljZSAqcGNpX2RldikKK3N0YXRpYyBzdHJ1Y3QgZW5naW5lcyAqZGlzY292ZXJfZW5naW5lcyh2 b2lkKQogewotCXVpbnQzMl90IGRldmlkID0gcGNpX2Rldi0+ZGV2aWNlX2lkOwotCXVpbnQxNl90 IGdjZmdjOworCWNvbnN0IGNoYXIgKnN5c2ZzX3Jvb3QgPSAiL3N5cy9kZXZpY2VzL2k5MTUvZXZl bnRzIjsKKwlzdHJ1Y3QgZW5naW5lcyAqZW5naW5lczsKKwlzdHJ1Y3QgZGlyZW50ICpkZW50Owor CWludCByZXQgPSAwOworCURJUiAqZDsKIAotCWlmIChJU19HTTQ1KGRldmlkKSkgewotCQlpbnQg Y29yZV9jbG9jayA9IC0xOworCWVuZ2luZXMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbmdpbmVz KSk7CisJaWYgKCFlbmdpbmVzKQorCQlyZXR1cm4gTlVMTDsKIAotCQlwY2lfZGV2aWNlX2NmZ19y ZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCW1lbXNldChlbmdpbmVzLCAw LCBzaXplb2YoKmVuZ2luZXMpKTsKIAotCQlzd2l0Y2ggKGdjZmdjICYgMHhmKSB7Ci0JCWNhc2Ug ODoKLQkJCWNvcmVfY2xvY2sgPSAyNjY7Ci0JCQlicmVhazsKLQkJY2FzZSA5OgotCQkJY29yZV9j bG9jayA9IDMyMDsKLQkJCWJyZWFrOwotCQljYXNlIDExOgotCQkJY29yZV9jbG9jayA9IDQwMDsK LQkJCWJyZWFrOwotCQljYXNlIDEzOgotCQkJY29yZV9jbG9jayA9IDUzMzsKLQkJCWJyZWFrOwot CQl9Ci0JCXByaW50X2Nsb2NrKCJjb3JlIiwgY29yZV9jbG9jayk7Ci0JfSBlbHNlIGlmIChJU185 NjUoZGV2aWQpICYmIElTX01PQklMRShkZXZpZCkpIHsKLQkJaW50IHJlbmRlcl9jbG9jayA9IC0x LCBzYW1wbGVyX2Nsb2NrID0gLTE7CisJZW5naW5lcy0+bnVtX2VuZ2luZXMgPSAwOwogCi0JCXBj aV9kZXZpY2VfY2ZnX3JlYWRfdTE2KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7CisJZCA9 IG9wZW5kaXIoc3lzZnNfcm9vdCk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKIAotCQlzd2l0 Y2ggKGdjZmdjICYgMHhmKSB7Ci0JCWNhc2UgMjoKLQkJCXJlbmRlcl9jbG9jayA9IDI1MDsgc2Ft cGxlcl9jbG9jayA9IDI2NzsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZW5kZXJfY2xvY2sg PSAzMjA7IHNhbXBsZXJfY2xvY2sgPSAzMzM7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJcmVu ZGVyX2Nsb2NrID0gNDAwOyBzYW1wbGVyX2Nsb2NrID0gNDQ0OwotCQkJYnJlYWs7Ci0JCWNhc2Ug NToKLQkJCXJlbmRlcl9jbG9jayA9IDUwMDsgc2FtcGxlcl9jbG9jayA9IDUzMzsKKwl3aGlsZSAo KGRlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCWNvbnN0IGNoYXIgKmVuZHN3aXRoID0g Ii1idXN5IjsKKwkJY29uc3QgdW5zaWduZWQgaW50IGVuZGxlbiA9IHN0cmxlbihlbmRzd2l0aCk7 CisJCXN0cnVjdCBlbmdpbmUgKmVuZ2luZSA9CisJCQkJZW5naW5lX3B0cihlbmdpbmVzLCBlbmdp bmVzLT5udW1fZW5naW5lcyk7CisJCWNoYXIgYnVmWzI1Nl07CisKKwkJaWYgKGRlbnQtPmRfdHlw ZSAhPSBEVF9SRUcpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybGVuKGRlbnQtPmRfbmFtZSkg Pj0gc2l6ZW9mKGJ1ZikpIHsKKwkJCXJldCA9IC0xOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwcmlu dF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJcHJpbnRmKCIgICIpOwotCQlwcmlu dF9jbG9jaygic2FtcGxlciIsIHNhbXBsZXJfY2xvY2spOwotCX0gZWxzZSBpZiAoSVNfOTQ1KGRl dmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJfY2xvY2sgPSAtMSwgZGlz cGxheV9jbG9jayA9IC0xOworCQlzdHJjcHkoYnVmLCBkZW50LT5kX25hbWUpOwogCi0JCXBjaV9k ZXZpY2VfY2ZnX3JlYWRfdTE2KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7CisJCS8qIHh4 eE4tYnVzeSAqLworCQlpZiAoc3RybGVuKGJ1ZikgPCAoZW5kbGVuICsgNCkpCisJCQljb250aW51 ZTsKKwkJaWYgKHN0cmNtcCgmYnVmW3N0cmxlbihidWYpIC0gZW5kbGVuXSwgZW5kc3dpdGgpKQor CQkJY29udGludWU7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4NykgewotCQljYXNlIDA6Ci0JCQly ZW5kZXJfY2xvY2sgPSAxNjY7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcmVuZGVyX2Nsb2Nr ID0gMjAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXJlbmRlcl9jbG9jayA9IDI1MDsKLQkJ CWJyZWFrOwotCQljYXNlIDU6Ci0JCQlyZW5kZXJfY2xvY2sgPSA0MDA7CisJCW1lbXNldChlbmdp bmUsIDAsIHNpemVvZigqZW5naW5lKSk7CisKKwkJYnVmW3N0cmxlbihidWYpIC0gZW5kbGVuXSA9 IDA7CisJCWVuZ2luZS0+bmFtZSA9IHN0cmR1cChidWYpOworCQlpZiAoIWVuZ2luZS0+bmFtZSkg eworCQkJcmV0ID0gLTE7CiAJCQlicmVhazsKIAkJfQogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcw KSB7Ci0JCWNhc2UgMDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAyMDA7Ci0JCQlicmVhazsKLQkJY2Fz ZSA0OgotCQkJZGlzcGxheV9jbG9jayA9IDMyMDsKKwkJZW5naW5lLT5idXN5LmNvbmZpZyA9IGdl dF9wbXVfY29uZmlnKGRpcmZkKGQpLCBlbmdpbmUtPm5hbWUsCisJCQkJCQkgICAgICJidXN5Iik7 CisJCWlmIChlbmdpbmUtPmJ1c3kuY29uZmlnID09IC0xKSB7CisJCQlyZXQgPSAtMTsKIAkJCWJy ZWFrOwogCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8IDcpKQotCQkgICAgZGlzcGxheV9jbG9jayA9 IDEzMzsKIAotCQlwcmludF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJcHJpbnRm KCIgICIpOwotCQlwcmludF9jbG9jaygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwotCX0gZWxz ZSBpZiAoSVNfOTE1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJf Y2xvY2sgPSAtMSwgZGlzcGxheV9jbG9jayA9IC0xOworCQllbmdpbmUtPmNsYXNzID0gKGVuZ2lu ZS0+YnVzeS5jb25maWcgJgorCQkJCSAoX19JOTE1X1BNVV9PVEhFUigwKSAtIDEpKSA+PgorCQkJ CUk5MTVfUE1VX0NMQVNTX1NISUZUOwogCi0JCXBjaV9kZXZpY2VfY2ZnX3JlYWRfdTE2KHBjaV9k ZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7CisJCWVuZ2luZS0+aW5zdGFuY2UgPSAoZW5naW5lLT5i dXN5LmNvbmZpZyA+PgorCQkJCSAgICBJOTE1X1BNVV9TQU1QTEVfQklUUykgJgorCQkJCSAgICAo KDEgPDwgSTkxNV9QTVVfU0FNUExFX0lOU1RBTkNFX0JJVFMpIC0gMSk7CiAKLQkJc3dpdGNoIChn Y2ZnYyAmIDB4NykgewotCQljYXNlIDA6Ci0JCQlyZW5kZXJfY2xvY2sgPSAxNjA7Ci0JCQlicmVh azsKLQkJY2FzZSAxOgotCQkJcmVuZGVyX2Nsb2NrID0gMTkwOwotCQkJYnJlYWs7Ci0JCWNhc2Ug NDoKLQkJCXJlbmRlcl9jbG9jayA9IDMzMzsKKwkJcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2Yo YnVmKSwgIiVzLyV1IiwKKwkJCSAgICAgICBjbGFzc19kaXNwbGF5X25hbWUoZW5naW5lLT5jbGFz cyksCisJCQkgICAgICAgZW5naW5lLT5pbnN0YW5jZSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA9 PSBzaXplb2YoYnVmKSkgeworCQkJcmV0ID0gLTE7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoZ2Nm Z2MgJiAoMSA8PCAxMykpCi0JCSAgICByZW5kZXJfY2xvY2sgPSAxMzM7CisJCXJldCA9IDA7CiAK LQkJc3dpdGNoIChnY2ZnYyAmIDB4NzApIHsKLQkJY2FzZSAwOgotCQkJZGlzcGxheV9jbG9jayA9 IDE5MDsKKwkJZW5naW5lLT5kaXNwbGF5X25hbWUgPSBzdHJkdXAoYnVmKTsKKwkJaWYgKCFlbmdp bmUtPmRpc3BsYXlfbmFtZSkgeworCQkJcmV0ID0gLTE7CiAJCQlicmVhazsKLQkJY2FzZSA0Ogot CQkJZGlzcGxheV9jbG9jayA9IDMzMzsKKwkJfQorCisJCWVuZ2luZXMtPm51bV9lbmdpbmVzKys7 CisJCWVuZ2luZXMgPSByZWFsbG9jKGVuZ2luZXMsIHNpemVvZihzdHJ1Y3QgZW5naW5lcykgKwor CQkJCSAgZW5naW5lcy0+bnVtX2VuZ2luZXMgKiBzaXplb2Yoc3RydWN0IGVuZ2luZSkpOworCQlp ZiAoIWVuZ2luZXMpIHsKKwkJCXJldCA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQotCQlpZiAo Z2NmZ2MgJiAoMSA8PCA3KSkKLQkJICAgIGRpc3BsYXlfY2xvY2sgPSAxMzM7CisJfQogCi0JCXBy aW50X2Nsb2NrKCJyZW5kZXIiLCByZW5kZXJfY2xvY2spOwotCQlwcmludGYoIiAgIik7Ci0JCXBy aW50X2Nsb2NrKCJkaXNwbGF5IiwgZGlzcGxheV9jbG9jayk7CisJaWYgKHJldCkKKwkJZnJlZShl bmdpbmVzKTsKKwllbHNlIHsKKwkJcXNvcnQoZW5naW5lX3B0cihlbmdpbmVzLCAwKSwgZW5naW5l cy0+bnVtX2VuZ2luZXMsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgZW5naW5lKSwgZW5naW5lX2Nt cCk7CisKKwkJZW5naW5lcy0+cm9vdCA9IGQ7CiAJfQogCisJcmV0dXJuIHJldCA9PSAwID8gZW5n aW5lcyA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbGVuYW1lX3RvX2J1Zihjb25zdCBjaGFy ICpmaWxlbmFtZSwgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSkKK3sKKwlpbnQgZmQ7 CisJc3NpemVfdCByZXQ7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAo ZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSByZWFkKGZkLCBidWYsIGJ1ZnNpemUgLSAx KTsKKwljbG9zZShmZCk7CisJaWYgKHJldCA8IDEpCisJCXJldHVybiAtMTsKKworCWJ1ZltyZXRd ID0gJ1wwJzsKIAotCXByaW50ZigiXG4iKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7CiB9CiAK LSNkZWZpbmUgU1RBVFNfTEVOICgyMCkKLSNkZWZpbmUgUEVSQ0VOVEFHRV9CQVJfRU5ECSg3OSAt IFNUQVRTX0xFTikKK3N0YXRpYyB1aW50NjRfdCBmaWxlbmFtZV90b191NjQoY29uc3QgY2hhciAq ZmlsZW5hbWUsIGludCBiYXNlKQoreworCWNoYXIgYnVmWzY0XSwgKmI7CiAKLXN0YXRpYyB2b2lk Ci1wcmludF9wZXJjZW50YWdlX2JhcihmbG9hdCBwZXJjZW50LCBpbnQgY3VyX2xpbmVfbGVuKQor CWlmIChmaWxlbmFtZV90b19idWYoZmlsZW5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQlyZXR1 cm4gMDsKKworCS8qCisJICogSGFuZGxlIGJvdGggc2luZ2xlIGludGVnZXIgYW5kIGtleT12YWx1 ZSBmb3JtYXRzIGJ5IHNraXBwaW5nCisJICogbGVhZGluZyBub24tZGlnaXRzLgorCSAqLworCWIg PSBidWY7CisJd2hpbGUgKCpiICYmICFpc2RpZ2l0KCpiKSkKKwkJYisrOworCisJcmV0dXJuIHN0 cnRvdWxsKGIsIE5VTEwsIGJhc2UpOworfQorCitzdGF0aWMgZG91YmxlIGZpbGVuYW1lX3RvX2Rv dWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlpbnQgYmFyX2F2YWlsX2xlbiA9IChQRVJD RU5UQUdFX0JBUl9FTkQgLSBjdXJfbGluZV9sZW4gLSAxKSAqIDg7Ci0JaW50IGJhcl9sZW4gPSBi YXJfYXZhaWxfbGVuICogKHBlcmNlbnQgKyAuNSkgLyAxMDAuMDsKLQlpbnQgaTsKKwljaGFyICpv bGRsb2NhbGU7CisJY2hhciBidWZbODBdOworCWRvdWJsZSB2OwogCi0JZm9yIChpID0gYmFyX2xl bjsgaSA+PSA4OyBpIC09IDgpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOwotCQljdXJfbGlu ZV9sZW4rKzsKLQl9Ci0JaWYgKGkpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbaV0pOwotCQljdXJf bGluZV9sZW4rKzsKLQl9CisJaWYgKGZpbGVuYW1lX3RvX2J1ZihmaWxlbmFtZSwgYnVmLCBzaXpl b2YoYnVmKSkpCisJCXJldHVybiAwOworCisJb2xkbG9jYWxlID0gc2V0bG9jYWxlKExDX0FMTCwg IkMiKTsKKwl2ID0gc3RydG9kKGJ1ZiwgTlVMTCk7CisJc2V0bG9jYWxlKExDX0FMTCwgb2xkbG9j YWxlKTsKIAotCS8qIE5COiBXZSBjYW4ndCB1c2UgYSBmaWVsZCB3aWR0aCB3aXRoIHV0Zjggc28g d2UgbWFudWFsbHkKLQkqIGd1YXJhbnRlZSBhIGZpZWxkIHdpdGggb2YgNDUgY2hhcnMgZm9yIGFu eSBiYXIuICovCi0JcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQgLSBjdXJfbGluZV9s ZW4sICIiKTsKKwlyZXR1cm4gdjsKIH0KIAotc3RydWN0IHJpbmcgewotCWNvbnN0IGNoYXIgKm5h bWU7Ci0JdWludDMyX3QgbW1pbzsKLQlpbnQgaGVhZCwgdGFpbCwgc2l6ZTsKLQl1aW50NjRfdCBm dWxsOwotCWludCBpZGxlOwotfTsKK3N0YXRpYyB1aW50NjRfdCByYXBsX3R5cGVfaWQodm9pZCkK K3sKKwlyZXR1cm4gZmlsZW5hbWVfdG9fdTY0KCIvc3lzL2RldmljZXMvcG93ZXIvdHlwZSIsIDEw KTsKK30KIAotc3RhdGljIHVpbnQzMl90IHJpbmdfcmVhZChzdHJ1Y3QgcmluZyAqcmluZywgdWlu dDMyX3QgcmVnKQorc3RhdGljIHVpbnQ2NF90IHJhcGxfZ3B1X3Bvd2VyKHZvaWQpCiB7Ci0JcmV0 dXJuIElOUkVHKHJpbmctPm1taW8gKyByZWcpOworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9z eXMvZGV2aWNlcy9wb3dlci9ldmVudHMvZW5lcmd5LWdwdSIsIDApOwogfQogCi1zdGF0aWMgdm9p ZCByaW5nX2luaXQoc3RydWN0IHJpbmcgKnJpbmcpCitzdGF0aWMgZG91YmxlIHJhcGxfZ3B1X3Bv d2VyX3NjYWxlKHZvaWQpCiB7Ci0JcmluZy0+c2l6ZSA9ICgoKHJpbmdfcmVhZChyaW5nLCBSSU5H X0xFTikgJiBSSU5HX05SX1BBR0VTKSA+PiAxMikgKyAxKSAqIDQwOTY7CisJcmV0dXJuIGZpbGVu YW1lX3RvX2RvdWJsZSgiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2ZW50cy9lbmVyZ3ktZ3B1LnNjYWxl Iik7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdfcmVzZXQoc3RydWN0IHJpbmcgKnJpbmcpCitzdGF0 aWMgdWludDY0X3QgaW1jX3R5cGVfaWQodm9pZCkKIHsKLQlyaW5nLT5pZGxlID0gcmluZy0+ZnVs bCA9IDA7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9kZXZpY2VzL3VuY29yZV9pbWMv dHlwZSIsIDEwKTsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19zYW1wbGUoc3RydWN0IHJpbmcgKnJp bmcpCitzdGF0aWMgdWludDY0X3QgaW1jX2RhdGFfcmVhZHModm9pZCkKIHsKLQlpbnQgZnVsbDsK KwlyZXR1cm4gZmlsZW5hbWVfdG9fdTY0KCIvc3lzL2RldmljZXMvdW5jb3JlX2ltYy9ldmVudHMv ZGF0YV9yZWFkcyIsIDApOworfQogCi0JaWYgKCFyaW5nLT5zaXplKQotCQlyZXR1cm47CitzdGF0 aWMgZG91YmxlIGltY19kYXRhX3JlYWRzX3NjYWxlKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1l X3RvX2RvdWJsZSgiL3N5cy9kZXZpY2VzL3VuY29yZV9pbWMvZXZlbnRzL2RhdGFfcmVhZHMuc2Nh bGUiKTsKK30KIAotCXJpbmctPmhlYWQgPSByaW5nX3JlYWQocmluZywgUklOR19IRUFEKSAmIEhF QURfQUREUjsKLQlyaW5nLT50YWlsID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfVEFJTCkgJiBUQUlM X0FERFI7CitzdGF0aWMgY29uc3QgY2hhciAqaW1jX2RhdGFfcmVhZHNfdW5pdCh2b2lkKQorewor CWNoYXIgYnVmWzMyXTsKIAotCWlmIChyaW5nLT50YWlsID09IHJpbmctPmhlYWQpCi0JCXJpbmct PmlkbGUrKzsKKwlpZiAoZmlsZW5hbWVfdG9fYnVmKCIvc3lzL2RldmljZXMvdW5jb3JlX2ltYy9l dmVudHMvZGF0YV9yZWFkcy51bml0IiwKKwkJCSAgICBidWYsIHNpemVvZihidWYpKSA9PSAwKQor CQlyZXR1cm4gc3RyZHVwKGJ1Zik7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KIAotCWZ1bGwg PSByaW5nLT50YWlsIC0gcmluZy0+aGVhZDsKLQlpZiAoZnVsbCA8IDApCi0JCWZ1bGwgKz0gcmlu Zy0+c2l6ZTsKLQlyaW5nLT5mdWxsICs9IGZ1bGw7CitzdGF0aWMgdWludDY0X3QgaW1jX2RhdGFf d3JpdGVzKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9kZXZpY2VzL3Vu Y29yZV9pbWMvZXZlbnRzL2RhdGFfd3JpdGVzIiwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdf cHJpbnRfaGVhZGVyKEZJTEUgKm91dCwgc3RydWN0IHJpbmcgKnJpbmcpCitzdGF0aWMgZG91Ymxl IGltY19kYXRhX3dyaXRlc19zY2FsZSh2b2lkKQogewotICAgIGZwcmludGYob3V0LCAiJS42cyUl XHRvcHNcdCIsCi0gICAgICAgICAgICByaW5nLT5uYW1lCi0gICAgICAgICAgKTsKKwlyZXR1cm4g ZmlsZW5hbWVfdG9fZG91YmxlKCIvc3lzL2RldmljZXMvdW5jb3JlX2ltYy9ldmVudHMvZGF0YV93 cml0ZXMuc2NhbGUiKTsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19wcmludChzdHJ1Y3QgcmluZyAq cmluZywgdW5zaWduZWQgbG9uZyBzYW1wbGVzX3Blcl9zZWMpCitzdGF0aWMgY29uc3QgY2hhciAq aW1jX2RhdGFfd3JpdGVzX3VuaXQodm9pZCkKIHsKLQlpbnQgcGVyY2VudF9idXN5LCBsZW47CisJ Y2hhciBidWZbMzJdOworCisJaWYgKGZpbGVuYW1lX3RvX2J1ZigiL3N5cy9kZXZpY2VzL3VuY29y ZV9pbWMvZXZlbnRzL2RhdGFfd3JpdGVzLnVuaXQiLAorCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikp ID09IDApCisJCXJldHVybiBzdHJkdXAoYnVmKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQor CisjZGVmaW5lIF9vcGVuX3BtdShjbnQsIHBtdSwgZmQpIFwKKyh7IFwKKwlpbnQgZmRfXzsgXAor XAorCWZkX18gPSBwZXJmX2k5MTVfb3Blbl9ncm91cCgocG11KS0+Y29uZmlnLCAoZmQpKTsgXAor CWlmIChmZF9fID49IDApIHsgXAorCQlpZiAoKGZkKSA9PSAtMSkgXAorCQkJKGZkKSA9IGZkX187 IFwKKwkJKHBtdSktPnByZXNlbnQgPSB0cnVlOyBcCisJCShwbXUpLT5pZHggPSAoY250KSsrOyBc CisJfSBcCitcCisJZmRfXzsgXAorfSkKKworI2RlZmluZSBfb3Blbl9pbWMoY250LCBwbXUsIGZk KSBcCisoeyBcCisJaW50IGZkX187IFwKK1wKKwlmZF9fID0gaWd0X3BlcmZfb3Blbl9ncm91cChp bWNfdHlwZV9pZCgpLCAocG11KS0+Y29uZmlnLCAoZmQpKTsgXAorCWlmIChmZF9fID49IDApIHsg XAorCQlpZiAoKGZkKSA9PSAtMSkgXAorCQkJKGZkKSA9IGZkX187IFwKKwkJKHBtdSktPnByZXNl bnQgPSB0cnVlOyBcCisJCShwbXUpLT5pZHggPSAoY250KSsrOyBcCisJfSBcCitcCisJZmRfXzsg XAorfSkKKworc3RhdGljIGludCBwbXVfaW5pdChzdHJ1Y3QgZW5naW5lcyAqZW5naW5lcykKK3sK Kwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZmQ7CisKKwllbmdpbmVzLT5mZCA9IC0xOworCWVuZ2lu ZXMtPm51bV9jb3VudGVycyA9IDA7CisKKwllbmdpbmVzLT5pcnEuY29uZmlnID0gSTkxNV9QTVVf SU5URVJSVVBUUzsKKwlmZCA9IF9vcGVuX3BtdShlbmdpbmVzLT5udW1fY291bnRlcnMsICZlbmdp bmVzLT5pcnEsIGVuZ2luZXMtPmZkKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CiAKLQlp ZiAoIXJpbmctPnNpemUpCisJZW5naW5lcy0+ZnJlcV9yZXEuY29uZmlnID0gSTkxNV9QTVVfUkVR VUVTVEVEX0ZSRVFVRU5DWTsKKwlfb3Blbl9wbXUoZW5naW5lcy0+bnVtX2NvdW50ZXJzLCAmZW5n aW5lcy0+ZnJlcV9yZXEsIGVuZ2luZXMtPmZkKTsKKworCWVuZ2luZXMtPmZyZXFfYWN0LmNvbmZp ZyA9IEk5MTVfUE1VX0FDVFVBTF9GUkVRVUVOQ1k7CisJX29wZW5fcG11KGVuZ2luZXMtPm51bV9j b3VudGVycywgJmVuZ2luZXMtPmZyZXFfYWN0LCBlbmdpbmVzLT5mZCk7CisKKwllbmdpbmVzLT5y YzYuY29uZmlnID0gSTkxNV9QTVVfUkM2X1JFU0lERU5DWTsKKwlfb3Blbl9wbXUoZW5naW5lcy0+ bnVtX2NvdW50ZXJzLCAmZW5naW5lcy0+cmM2LCBlbmdpbmVzLT5mZCk7CisKKwlmb3IgKGkgPSAw OyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXM7IGkrKykgeworCQlzdHJ1Y3QgZW5naW5lICplbmdp bmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHBtdV9j b3VudGVyICpwbXU7CisJCQljb25zdCBjaGFyICpjb3VudGVyOworCQkJYm9vbCBvcHRpb25hbDsK KwkJfSAqY250LCBjb3VudGVyc1tdID0geworCQkJeyAucG11ID0gJmVuZ2luZS0+YnVzeSwgLmNv dW50ZXIgPSAiYnVzeSIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPndhaXQsIC5jb3VudGVyID0g IndhaXQiIH0sCisJCQl7IC5wbXUgPSAmZW5naW5lLT5zZW1hLCAuY291bnRlciA9ICJzZW1hIiwg Lm9wdGlvbmFsID0gdHJ1ZSB9LAorCQkJeyAucG11ID0gTlVMTCwgLmNvdW50ZXIgPSBOVUxMIH0s CisJCX07CisKKwkJZm9yIChjbnQgPSBjb3VudGVyczsgY250LT5wbXU7IGNudCsrKSB7CisJCQlp ZiAoIWNudC0+cG11LT5jb25maWcpCisJCQkJY250LT5wbXUtPmNvbmZpZyA9CisJCQkJCWdldF9w bXVfY29uZmlnKGRpcmZkKGVuZ2luZXMtPnJvb3QpLAorCQkJCQkJICAgICAgIGVuZ2luZS0+bmFt ZSwKKwkJCQkJCSAgICAgICBjbnQtPmNvdW50ZXIpOworCQkJZmQgPSBfb3Blbl9wbXUoZW5naW5l cy0+bnVtX2NvdW50ZXJzLCBjbnQtPnBtdSwKKwkJCQkgICAgICAgZW5naW5lcy0+ZmQpOworCQkJ aWYgKGZkIDwgMCAmJiAhY250LT5vcHRpb25hbCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisK KwllbmdpbmVzLT5yYXBsX2ZkID0gLTE7CisJaWYgKHJhcGxfdHlwZV9pZCgpKSB7CisJCWVuZ2lu ZXMtPnJhcGxfc2NhbGUgPSByYXBsX2dwdV9wb3dlcl9zY2FsZSgpOworCQlpZiAoZW5naW5lcy0+ cmFwbF9zY2FsZSAhPSBOQU4pCisJCQllbmdpbmVzLT5yYXBsX3NjYWxlICo9IDFlMzsgLyogZnJv bSBuYW5vIHRvIG1pY3JvICovCisKKwkJZW5naW5lcy0+cmFwbC5jb25maWcgPSByYXBsX2dwdV9w b3dlcigpOworCQlpZiAoIWVuZ2luZXMtPnJhcGwuY29uZmlnKQorCQkJcmV0dXJuIC0xOworCisJ CWVuZ2luZXMtPnJhcGxfZmQgPSBpZ3RfcGVyZl9vcGVuKHJhcGxfdHlwZV9pZCgpLAorCQkJCQkJ IGVuZ2luZXMtPnJhcGwuY29uZmlnKTsKKwkJaWYgKGVuZ2luZXMtPnJhcGxfZmQgPCAwKQorCQkJ cmV0dXJuIC0xOworCisJCWVuZ2luZXMtPnJhcGwucHJlc2VudCA9IHRydWU7CisJfQorCisJZW5n aW5lcy0+aW1jX2ZkID0gLTE7CisJaWYgKGltY190eXBlX2lkKCkpIHsKKwkJdW5zaWduZWQgaW50 IG51bSA9IDA7CisKKwkJZW5naW5lcy0+aW1jX3JlYWRzX3NjYWxlID0gaW1jX2RhdGFfcmVhZHNf c2NhbGUoKTsKKwkJZW5naW5lcy0+aW1jX3dyaXRlc19zY2FsZSA9IGltY19kYXRhX3dyaXRlc19z Y2FsZSgpOworCisJCWVuZ2luZXMtPmltY19yZWFkc191bml0ID0gaW1jX2RhdGFfcmVhZHNfdW5p dCgpOworCQlpZiAoIWVuZ2luZXMtPmltY19yZWFkc191bml0KQorCQkJcmV0dXJuIC0xOworCisJ CWVuZ2luZXMtPmltY193cml0ZXNfdW5pdCA9IGltY19kYXRhX3dyaXRlc191bml0KCk7CisJCWlm ICghZW5naW5lcy0+aW1jX3dyaXRlc191bml0KQorCQkJcmV0dXJuIC0xOworCisJCWVuZ2luZXMt PmltY19yZWFkcy5jb25maWcgPSBpbWNfZGF0YV9yZWFkcygpOworCQlpZiAoIWVuZ2luZXMtPmlt Y19yZWFkcy5jb25maWcpCisJCQlyZXR1cm4gLTE7CisKKwkJZW5naW5lcy0+aW1jX3dyaXRlcy5j b25maWcgPSBpbWNfZGF0YV93cml0ZXMoKTsKKwkJaWYgKCFlbmdpbmVzLT5pbWNfd3JpdGVzLmNv bmZpZykKKwkJCXJldHVybiAtMTsKKworCQlmZCA9IF9vcGVuX2ltYyhudW0sICZlbmdpbmVzLT5p bWNfcmVhZHMsIGVuZ2luZXMtPmltY19mZCk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gLTE7 CisJCWZkID0gX29wZW5faW1jKG51bSwgJmVuZ2luZXMtPmltY193cml0ZXMsIGVuZ2luZXMtPmlt Y19mZCk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJZW5naW5lcy0+aW1jX3Jl YWRzLnByZXNlbnQgPSB0cnVlOworCQllbmdpbmVzLT5pbWNfd3JpdGVzLnByZXNlbnQgPSB0cnVl OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDY0X3QgcG11X3JlYWRfbXVsdGko aW50IGZkLCB1bnNpZ25lZCBpbnQgbnVtLCB1aW50NjRfdCAqdmFsKQoreworCXVpbnQ2NF90IGJ1 ZlsyICsgbnVtXTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzc2l6ZV90IGxlbjsKKworCW1lbXNldChi dWYsIDAsIHNpemVvZihidWYpKTsKKworCWxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1Zikp OworCWFzc2VydChsZW4gPT0gc2l6ZW9mKGJ1ZikpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsg aSsrKQorCQl2YWxbaV0gPSBidWZbMiArIGldOworCisJcmV0dXJuIGJ1ZlsxXTsKK30KKworc3Rh dGljIGRvdWJsZSBfX3BtdV9jYWxjKHN0cnVjdCBwbXVfcGFpciAqcCwgZG91YmxlIGQsIGRvdWJs ZSB0LCBkb3VibGUgcykKK3sKKwlkb3VibGUgdjsKKworCXYgPSBwLT5jdXIgLSBwLT5wcmV2Owor CXYgLz0gZDsKKwl2IC89IHQ7CisJdiAqPSBzOworCisJaWYgKHMgPT0gMTAwLjAgJiYgdiA+IDEw MC4wKQorCQl2ID0gMTAwLjA7CisKKwlyZXR1cm4gdjsKK30KKworI3ByYWdtYSBHQ0MgZGlhZ25v c3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZm9ybWF0LW5vbmxp dGVyYWwiCitzdGF0aWMgdm9pZCBwbXVfY2FsYyhzdHJ1Y3QgcG11X2NvdW50ZXIgKmNudCwKKwkJ ICAgICBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZzeiwgY29uc3QgY2hhciAqZm10LAorCQkg ICAgIGRvdWJsZSBkLCBkb3VibGUgdCwgZG91YmxlIHMpCit7CisJZG91YmxlIHZhbDsKKwlpbnQg bGVuOworCisJaWYgKCFjbnQtPnByZXNlbnQpIHsKKwkJc3RybmNweShidWYsICItLS0iLCBidWZz eik7CiAJCXJldHVybjsKKwl9CiAKLQlwZXJjZW50X2J1c3kgPSAxMDAgLSAxMDAgKiByaW5nLT5p ZGxlIC8gc2FtcGxlc19wZXJfc2VjOworCXZhbCA9IF9fcG11X2NhbGMoJmNudC0+dmFsLCBkLCB0 LCBzKTsKIAotCWxlbiA9IHByaW50ZigiJTI1cyBidXN5OiAlM2QlJTogIiwgcmluZy0+bmFtZSwg cGVyY2VudF9idXN5KTsKLQlwcmludF9wZXJjZW50YWdlX2JhciAocGVyY2VudF9idXN5LCBsZW4p OwotCXByaW50ZigiJTI0cyBzcGFjZTogJWQvJWRcbiIsCi0JCSAgIHJpbmctPm5hbWUsCi0JCSAg IChpbnQpKHJpbmctPmZ1bGwgLyBzYW1wbGVzX3Blcl9zZWMpLAotCQkgICByaW5nLT5zaXplKTsK KwlsZW4gPSBzbnByaW50ZihidWYsIGJ1ZnN6LCBmbXQsIHZhbCk7CisJaWYgKGxlbiA8IDAgfHwg bGVuID09IGJ1ZnN6KSB7CisJCXN0cm5jcHkoYnVmLCAiWFhYIiwgYnVmc3opOworCQlyZXR1cm47 CisJfQogfQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKIAotc3RhdGljIHZvaWQgcmluZ19s b2coc3RydWN0IHJpbmcgKnJpbmcsIHVuc2lnbmVkIGxvbmcgc2FtcGxlc19wZXJfc2VjLAotCQlG SUxFICpvdXRwdXQpCitzdGF0aWMgdWludDY0X3QgX19wbXVfcmVhZF9zaW5nbGUoaW50IGZkLCB1 aW50NjRfdCAqdHMpCiB7Ci0JaWYgKHJpbmctPnNpemUpCi0JCWZwcmludGYob3V0cHV0LCAiJTNk XHQlZFx0IiwKLQkJCShpbnQpKDEwMCAtIDEwMCAqIHJpbmctPmlkbGUgLyBzYW1wbGVzX3Blcl9z ZWMpLAotCQkJKGludCkocmluZy0+ZnVsbCAvIHNhbXBsZXNfcGVyX3NlYykpOwotCWVsc2UKLQkJ ZnByaW50ZihvdXRwdXQsICItMVx0LTFcdCIpOworCXVpbnQ2NF90IGRhdGFbMl0gPSB7IH07CisJ c3NpemVfdCBsZW47CisKKwlsZW4gPSByZWFkKGZkLCBkYXRhLCBzaXplb2YoZGF0YSkpOworCWFz c2VydChsZW4gPT0gc2l6ZW9mKGRhdGEpKTsKKworCWlmICh0cykKKwkJKnRzID0gZGF0YVsxXTsK KworCXJldHVybiBkYXRhWzBdOwogfQogCitzdGF0aWMgdWludDY0X3QgcG11X3JlYWRfc2luZ2xl KGludCBmZCkKK3sKKwlyZXR1cm4gX19wbXVfcmVhZF9zaW5nbGUoZmQsIE5VTEwpOworfQorCitz dGF0aWMgdm9pZCBfX3VwZGF0ZV9zYW1wbGUoc3RydWN0IHBtdV9jb3VudGVyICpjb3VudGVyLCB1 aW50NjRfdCB2YWwpCit7CisJY291bnRlci0+dmFsLnByZXYgPSBjb3VudGVyLT52YWwuY3VyOwor CWNvdW50ZXItPnZhbC5jdXIgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zYW1wbGUo c3RydWN0IHBtdV9jb3VudGVyICpjb3VudGVyLCB1aW50NjRfdCAqdmFsKQoreworCWlmIChjb3Vu dGVyLT5wcmVzZW50KQorCQlfX3VwZGF0ZV9zYW1wbGUoY291bnRlciwgdmFsW2NvdW50ZXItPmlk eF0pOworfQorCitzdGF0aWMgdm9pZCBwbXVfc2FtcGxlKHN0cnVjdCBlbmdpbmVzICplbmdpbmVz KQoreworCWNvbnN0IGludCBudW1fdmFsID0gZW5naW5lcy0+bnVtX2NvdW50ZXJzOworCXVpbnQ2 NF90IHZhbFsyICsgbnVtX3ZhbF07CisJdW5zaWduZWQgaW50IGk7CisKKwllbmdpbmVzLT50cy5w cmV2ID0gZW5naW5lcy0+dHMuY3VyOworCisJaWYgKGVuZ2luZXMtPnJhcGxfZmQgPj0gMCkKKwkJ X191cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5yYXBsLAorCQkJCXBtdV9yZWFkX3NpbmdsZShlbmdp bmVzLT5yYXBsX2ZkKSk7CisKKwlpZiAoZW5naW5lcy0+aW1jX2ZkID49IDApIHsKKwkJcG11X3Jl YWRfbXVsdGkoZW5naW5lcy0+aW1jX2ZkLCAyLCB2YWwpOworCQl1cGRhdGVfc2FtcGxlKCZlbmdp bmVzLT5pbWNfcmVhZHMsIHZhbCk7CisJCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmltY193cml0 ZXMsIHZhbCk7CisJfQorCisJZW5naW5lcy0+dHMuY3VyID0gcG11X3JlYWRfbXVsdGkoZW5naW5l cy0+ZmQsIG51bV92YWwsIHZhbCk7CisKKwl1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5mcmVxX3Jl cSwgdmFsKTsKKwl1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5mcmVxX2FjdCwgdmFsKTsKKwl1cGRh dGVfc2FtcGxlKCZlbmdpbmVzLT5pcnEsIHZhbCk7CisJdXBkYXRlX3NhbXBsZSgmZW5naW5lcy0+ cmM2LCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzOyBpKysp IHsKKwkJc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsKKwor CQl1cGRhdGVfc2FtcGxlKCZlbmdpbmUtPmJ1c3ksIHZhbCk7CisJCXVwZGF0ZV9zYW1wbGUoJmVu Z2luZS0+c2VtYSwgdmFsKTsKKwkJdXBkYXRlX3NhbXBsZSgmZW5naW5lLT53YWl0LCB2YWwpOwor CX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJhcnNbXSA9IHsgIiAiLCAi4paPIiwgIuKWjiIs ICLilo0iLCAi4paMIiwgIuKWiyIsICLilooiLCAi4paJIiwgIuKWiCIgfTsKKworc3RhdGljIHZv aWQKK3ByaW50X3BlcmNlbnRhZ2VfYmFyKGRvdWJsZSBwZXJjZW50LCBpbnQgbWF4X2xlbikKK3sK KwlpbnQgYmFyX2xlbiA9IHBlcmNlbnQgKiAoOCAqIChtYXhfbGVuIC0gMikpIC8gMTAwLjA7CisJ aW50IGk7CisKKwlwdXRjaGFyKCd8Jyk7CisKKwlmb3IgKGkgPSBiYXJfbGVuOyBpID49IDg7IGkg LT0gOCkKKwkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOworCWlmIChpKQorCQlwcmludGYoIiVzIiwg YmFyc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG1heF9sZW4gLSAyIC0gKGJhcl9sZW4gKyA3 KSAvIDgpOyBpKyspCisJCXB1dGNoYXIoJyAnKTsKKworCXB1dGNoYXIoJ3wnKTsKK30KKworI2Rl ZmluZSBERUZBVUxUX1BFUklPRF9NUyAoMTAwMCkKKwogc3RhdGljIHZvaWQKIHVzYWdlKGNvbnN0 IGNoYXIgKmFwcG5hbWUpCiB7CiAJcHJpbnRmKCJpbnRlbF9ncHVfdG9wIC0gRGlzcGxheSBhIHRv cC1saWtlIHN1bW1hcnkgb2YgSW50ZWwgR1BVIHVzYWdlXG4iCi0JCQkiXG4iCi0JCQkidXNhZ2U6 ICVzIFtwYXJhbWV0ZXJzXVxuIgotCQkJIlxuIgotCQkJIlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVy cyBhcHBseTpcbiIKLQkJCSJbLXMgPHNhbXBsZXM+XSAgICAgICBzYW1wbGVzIHBlciBzZWNvbmRz IChkZWZhdWx0ICVkKVxuIgotCQkJIlstZSA8Y29tbWFuZD5dICAgICAgIGNvbW1hbmQgdG8gcHJv ZmlsZVxuIgotCQkJIlstbyA8ZmlsZT5dICAgICAgICAgIG91dHB1dCBzdGF0aXN0aWNzIHRvIGZp bGUuIElmIGZpbGUgaXMgJy0nLCIKLQkJCSIgICAgICAgICAgICAgICAgICAgICBydW4gaW4gYmF0 Y2ggbW9kZSBhbmQgb3V0cHV0IHN0YXRpc3RpY3MgdG8gc3RkaW8gb25seSBcbiIKLQkJCSJbLWhd ICAgICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBzY3JlZW5cbiIKLQkJCSJcbiIsCi0JCQlh cHBuYW1lLAotCQkJU0FNUExFU19QRVJfU0VDCi0JCSAgKTsKLQlyZXR1cm47CisJCSJcbiIKKwkJ IlVzYWdlOiAlcyBbcGFyYW1ldGVyc11cbiIKKwkJIlxuIgorCQkiXHRUaGUgZm9sbG93aW5nIHBh cmFtZXRlcnMgYXJlIG9wdGlvbmFsOlxuIgorCQkiXHRbLXMgPHNhbXBsZXM+XSAgICAgICByZWZy ZXNoIHBlcmlvZCBpbiBtcyAoZGVmYXVsdCAldW1zKVxuIgorCQkiXHRbLWhdICAgICAgICAgICAg ICAgICBzaG93IHRoaXMgaGVscCB0ZXh0XG4iCisJCSJcbiIsCisJCWFwcG5hbWUsIERFRkFVTFRf UEVSSU9EX01TKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCXVp bnQzMl90IGRldmlkOwotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2OwotCXN0cnVjdCByaW5n IHJlbmRlcl9yaW5nID0gewotCQkubmFtZSA9ICJyZW5kZXIiLAotCQkubW1pbyA9IDB4MjAzMCwK LQl9LCBic2RfcmluZyA9IHsKLQkJLm5hbWUgPSAiYml0c3RyZWFtIiwKLQkJLm1taW8gPSAweDQw MzAsCi0JfSwgYnNkNl9yaW5nID0gewotCQkubmFtZSA9ICJiaXRzdHJlYW0iLAotCQkubW1pbyA9 IDB4MTIwMzAsCi0JfSwgYmx0X3JpbmcgPSB7Ci0JCS5uYW1lID0gImJsaXR0ZXIiLAotCQkubW1p byA9IDB4MjIwMzAsCi0JfTsKLQlpbnQgaSwgY2g7Ci0JaW50IHNhbXBsZXNfcGVyX3NlYyA9IFNB TVBMRVNfUEVSX1NFQzsKLQlGSUxFICpvdXRwdXQgPSBOVUxMOwotCWRvdWJsZSBlbGFwc2VkX3Rp bWU9MDsKLQlpbnQgcHJpbnRfaGVhZGVycz0xOwotCXBpZF90IGNoaWxkX3BpZD0tMTsKLQlpbnQg Y2hpbGRfc3RhdDsKLQljaGFyICpjbWQ9TlVMTDsKLQlpbnQgaW50ZXJhY3RpdmU9MTsKLQotCS8q IFBhcnNlIG9wdGlvbnM/ICovCi0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpv OmU6aCIpKSAhPSAtMSkgeworCXVuc2lnbmVkIGludCBwZXJpb2RfdXMgPSBERUZBVUxUX1BFUklP RF9NUyAqIDEwMDA7CisJaW50IGNvbl93ID0gLTEsIGNvbl9oID0gLTE7CisJc3RydWN0IGVuZ2lu ZXMgKmVuZ2luZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCwgY2g7CisKKwkvKiBQYXJz ZSBvcHRpb25zICovCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpoIikpICE9 IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnZSc6IGNtZCA9IHN0cmR1cChvcHRhcmcp OwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOiBzYW1wbGVzX3Blcl9zZWMgPSBhdG9pKG9wdGFyZyk7 Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2VjIDwgMTAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJF cnJvcjogc2FtcGxlcyBwZXIgc2Vjb25kIG11c3QgYmUgPj0gMTAwXG4iKTsKLQkJCQlleGl0KDEp OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkJaWYgKCFzdHJjbXAob3B0YXJnLCAi LSIpKSB7Ci0JCQkJLyogUnVubmluZyBpbiBub24taW50ZXJhY3RpdmUgbW9kZSAqLwotCQkJCWlu dGVyYWN0aXZlID0gMDsKLQkJCQlvdXRwdXQgPSBzdGRvdXQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJ b3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAidyIpOwotCQkJaWYgKCFvdXRwdXQpCi0JCQl7Ci0JCQkJ cGVycm9yKCJmb3BlbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9CisJCWNhc2UgJ3MnOgorCQkJcGVy aW9kX3VzID0gYXRvaShvcHRhcmcpICogMTAwMDsKIAkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJ CXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhpdCgwKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJ ZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGZsYWcgJWMhXG4iLCAoY2hhcilvcHRvcHQpOworCQkJ ZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wdGlvbiAlYyFcbiIsIChjaGFyKW9wdG9wdCk7CiAJ CQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4aXQoMSk7Ci0JCQlicmVhazsKIAkJfQogCX0KIAotCXBj aV9kZXYgPSBpbnRlbF9nZXRfcGNpX2RldmljZSgpOwotCWRldmlkID0gcGNpX2Rldi0+ZGV2aWNl X2lkOwotCWludGVsX21taW9fdXNlX3BjaV9iYXIocGNpX2Rldik7Ci0JaW5pdF9pbnN0ZG9uZV9k ZWZpbml0aW9ucyhkZXZpZCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIGEgY29tbWFuZCB0byBydW4/ICov Ci0JaWYgKGNtZCAhPSBOVUxMKSB7Ci0JCWlmIChvdXRwdXQpIHsKLQkJCWZwcmludGYob3V0cHV0 LCAiIyBQcm9maWxpbmc6ICVzXG4iLCBjbWQpOwotCQkJZmZsdXNoKG91dHB1dCk7Ci0JCX0KLQkJ Y2hpbGRfcGlkID0gZm9yaygpOwotCQlpZiAoY2hpbGRfcGlkIDwgMCkgewotCQkJcGVycm9yKCJm b3JrIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkX3BpZCA9PSAwKSB7Ci0J CQlpbnQgcmVzOwotCQkJcmVzID0gc3lzdGVtKGNtZCk7Ci0JCQlpZiAocmVzIDwgMCkKLQkJCQlw ZXJyb3IoInJ1bm5pbmcgY29tbWFuZCIpOwotCQkJaWYgKG91dHB1dCkgewotCQkJCWZmbHVzaChv dXRwdXQpOwotCQkJCWZwcmludGYob3V0cHV0LCAiIyAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRc biIsIGNtZCwgcmVzKTsKLQkJCQlmZmx1c2gob3V0cHV0KTsKLQkJCX0KLQkJCWZyZWUoY21kKTsK LQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKGNtZCk7Ci0JCX0KLQl9Ci0KLQlmb3Ig KGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewotCQl0b3BfYml0c1tpXS5iaXQg PSAmaW5zdGRvbmVfYml0c1tpXTsKLQkJdG9wX2JpdHNbaV0uY291bnQgPSAwOwotCQl0b3BfYml0 c19zb3J0ZWRbaV0gPSAmdG9wX2JpdHNbaV07CisJZW5naW5lcyA9IGRpc2NvdmVyX2VuZ2luZXMo KTsKKwlpZiAoIWVuZ2luZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRmFpbGVkIHRvIGRl dGVjdCBlbmdpbmVzISBLZXJuZWwgNC4xNiBvciBuZXdlcj9cbiIpOworCQlyZXR1cm4gMTsKIAl9 CiAKLQkvKiBHcmFiIGFjY2VzcyB0byB0aGUgcmVnaXN0ZXJzICovCi0JaW50ZWxfcmVnaXN0ZXJf YWNjZXNzX2luaXQocGNpX2RldiwgMCwgLTEpOwotCi0JcmluZ19pbml0KCZyZW5kZXJfcmluZyk7 Ci0JaWYgKElTX0dFTjQoZGV2aWQpIHx8IElTX0dFTjUoZGV2aWQpKQotCQlyaW5nX2luaXQoJmJz ZF9yaW5nKTsKLQlpZiAoSVNfR0VONihkZXZpZCkgfHwgSVNfR0VONyhkZXZpZCkpIHsKLQkJcmlu Z19pbml0KCZic2Q2X3JpbmcpOwotCQlyaW5nX2luaXQoJmJsdF9yaW5nKTsKKwlyZXQgPSBwbXVf aW5pdChlbmdpbmVzKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkZhaWxl ZCB0byBpbml0aWFsaXplIFBNVSEgS2VybmVsIDQuMTYgb3IgbmV3ZXI/XG4iKTsKKwkJcmV0dXJu IDE7CiAJfQogCi0JLyogSW5pdGlhbGl6ZSBHUFUgc3RhdHMgKi8KLQlpZiAoSEFTX1NUQVRTX1JF R1MoZGV2aWQpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTVEFUU19DT1VOVDsgaSsrKSB7Ci0JCQl1 aW50MzJfdCBzdGF0c19oaWdoLCBzdGF0c19sb3csIHN0YXRzX2hpZ2hfMjsKLQotCQkJZG8gewot CQkJCXN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0JCQkJc3RhdHNfbG93 ID0gSU5SRUcoc3RhdHNfcmVnc1tpXSk7Ci0JCQkJc3RhdHNfaGlnaF8yID0gSU5SRUcoc3RhdHNf cmVnc1tpXSArIDQpOwotCQkJfSB3aGlsZSAoc3RhdHNfaGlnaCAhPSBzdGF0c19oaWdoXzIpOwot Ci0JCQlsYXN0X3N0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRzX2hpZ2ggPDwgMzIgfAotCQkJCXN0 YXRzX2xvdzsKLQkJfQotCX0KKwlwbXVfc2FtcGxlKGVuZ2luZXMpOwogCiAJZm9yICg7Oykgewot CQlpbnQgajsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHQxLCB0aSwgdGYsIHQyOwotCQl1bnNpZ25l ZCBsb25nIGxvbmcgZGVmX3NsZWVwID0gMTAwMDAwMCAvIHNhbXBsZXNfcGVyX3NlYzsKLQkJdW5z aWduZWQgbG9uZyBsb25nIGxhc3Rfc2FtcGxlc19wZXJfc2VjID0gc2FtcGxlc19wZXJfc2VjOwot CQl1bnNpZ25lZCBzaG9ydCBpbnQgbWF4X2xpbmVzOworCQlkb3VibGUgdDsKKyNkZWZpbmUgQlVG U1ogMTYKKwkJY2hhciBmcmVxW0JVRlNaXTsKKwkJY2hhciBmYWN0W0JVRlNaXTsKKwkJY2hhciBp cnFbQlVGU1pdOworCQljaGFyIHJjNltCVUZTWl07CisJCWNoYXIgcG93ZXJbQlVGU1pdOworCQlj aGFyIHJlYWRzW0JVRlNaXTsKKwkJY2hhciB3cml0ZXNbQlVGU1pdOwogCQlzdHJ1Y3Qgd2luc2l6 ZSB3czsKLQkJY2hhciBjbGVhcl9zY3JlZW5bXSA9IHsweDFiLCAnWycsICdIJywKLQkJCQkgICAg ICAgMHgxYiwgJ1snLCAnSicsCi0JCQkJICAgICAgIDB4MH07Ci0JCWludCBwZXJjZW50OwotCQlp bnQgbGVuOwotCi0JCXQxID0gZ2V0dGltZSgpOwotCi0JCXJpbmdfcmVzZXQoJnJlbmRlcl9yaW5n KTsKLQkJcmluZ19yZXNldCgmYnNkX3JpbmcpOwotCQlyaW5nX3Jlc2V0KCZic2Q2X3JpbmcpOwot CQlyaW5nX3Jlc2V0KCZibHRfcmluZyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNhbXBsZXNfcGVy X3NlYzsgaSsrKSB7Ci0JCQlsb25nIGxvbmcgaW50ZXJ2YWw7Ci0JCQl0aSA9IGdldHRpbWUoKTsK LQkJCWlmIChJU185NjUoZGV2aWQpKSB7Ci0JCQkJaW5zdGRvbmUgPSBJTlJFRyhJTlNURE9ORV9J OTY1KTsKLQkJCQlpbnN0ZG9uZTEgPSBJTlJFRyhJTlNURE9ORV8xKTsKLQkJCX0gZWxzZQotCQkJ CWluc3Rkb25lID0gSU5SRUcoSU5TVERPTkUpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgbnVtX2lu c3Rkb25lX2JpdHM7IGorKykKLQkJCQl1cGRhdGVfaWRsZV9iaXQoJnRvcF9iaXRzW2pdKTsKLQot CQkJcmluZ19zYW1wbGUoJnJlbmRlcl9yaW5nKTsKLQkJCXJpbmdfc2FtcGxlKCZic2RfcmluZyk7 Ci0JCQlyaW5nX3NhbXBsZSgmYnNkNl9yaW5nKTsKLQkJCXJpbmdfc2FtcGxlKCZibHRfcmluZyk7 Ci0KLQkJCXRmID0gZ2V0dGltZSgpOwotCQkJaWYgKHRmIC0gdDEgPj0gMTAwMDAwMCkgewotCQkJ CS8qIFdlIGFyZSBvdXQgb2Ygc3luYywgYmFpbCBvdXQgKi8KLQkJCQlsYXN0X3NhbXBsZXNfcGVy X3NlYyA9IGkrMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludGVydmFsID0gZGVmX3NsZWVwIC0g KHRmIC0gdGkpOwotCQkJaWYgKGludGVydmFsID4gMCkKLQkJCQl1c2xlZXAoaW50ZXJ2YWwpOwot CQl9Ci0KLQkJaWYgKEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJZm9yIChpID0gMDsgaSA8 IFNUQVRTX0NPVU5UOyBpKyspIHsKLQkJCQl1aW50MzJfdCBzdGF0c19oaWdoLCBzdGF0c19sb3cs IHN0YXRzX2hpZ2hfMjsKKwkJaW50IGxpbmVzID0gMDsKIAotCQkJCWRvIHsKLQkJCQkJc3RhdHNf aGlnaCA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCQkJc3RhdHNfbG93ID0gSU5SRUco c3RhdHNfcmVnc1tpXSk7Ci0JCQkJCXN0YXRzX2hpZ2hfMiA9IElOUkVHKHN0YXRzX3JlZ3NbaV0g KyA0KTsKLQkJCQl9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7Ci0KLQkJCQlz dGF0c1tpXSA9ICh1aW50NjRfdClzdGF0c19oaWdoIDw8IDMyIHwKLQkJCQkJc3RhdHNfbG93Owot CQkJfQorCQkvKiBVcGRhdGUgdGVybWluYWwgc2l6ZS4gKi8KKwkJaWYgKGlvY3RsKDAsIFRJT0NH V0lOU1osICZ3cykgIT0gLTEpIHsKKwkJCWNvbl93ID0gd3Mud3NfY29sOworCQkJY29uX2ggPSB3 cy53c19yb3c7CiAJCX0KIAotCQlxc29ydCh0b3BfYml0c19zb3J0ZWQsIG51bV9pbnN0ZG9uZV9i aXRzLAotCQkgICAgICBzaXplb2Yoc3RydWN0IHRvcF9iaXQgKiksIHRvcF9iaXRzX3NvcnQpOwot Ci0JCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCB0byB0aGUgdGVybWluYWwg aGVpZ2h0IHNvIHRoZQotCQkgKiBtb3N0IGltcG9ydGFudCBpbmZvIChhdCB0aGUgdG9wKSB3aWxs IHN0YXkgb24gc2NyZWVuLiAqLwotCQltYXhfbGluZXMgPSAtMTsKLQkJaWYgKGlvY3RsKDAsIFRJ T0NHV0lOU1osICZ3cykgIT0gLTEpCi0JCQltYXhfbGluZXMgPSB3cy53c19yb3cgLSA2OyAvKiBl eGNsdWRlIGhlYWRlciBsaW5lcyAqLwotCQlpZiAobWF4X2xpbmVzID49IG51bV9pbnN0ZG9uZV9i aXRzKQotCQkJbWF4X2xpbmVzID0gbnVtX2luc3Rkb25lX2JpdHM7Ci0KLQkJdDIgPSBnZXR0aW1l KCk7Ci0JCWVsYXBzZWRfdGltZSArPSAodDIgLSB0MSkgLyAxMDAwMDAwLjA7Ci0KLQkJaWYgKGlu dGVyYWN0aXZlKSB7Ci0JCQlwcmludGYoIiVzIiwgY2xlYXJfc2NyZWVuKTsKLQkJCXByaW50X2Ns b2NrX2luZm8ocGNpX2Rldik7Ci0KLQkJCXJpbmdfcHJpbnQoJnJlbmRlcl9yaW5nLCBsYXN0X3Nh bXBsZXNfcGVyX3NlYyk7Ci0JCQlyaW5nX3ByaW50KCZic2RfcmluZywgbGFzdF9zYW1wbGVzX3Bl cl9zZWMpOwotCQkJcmluZ19wcmludCgmYnNkNl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYyk7 Ci0JCQlyaW5nX3ByaW50KCZibHRfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCi0JCQlw cmludGYoIlxuJTMwcyAgJXNcbiIsICJ0YXNrIiwgInBlcmNlbnQgYnVzeSIpOwotCQkJZm9yIChp ID0gMDsgaSA8IG1heF9saW5lczsgaSsrKSB7Ci0JCQkJaWYgKHRvcF9iaXRzX3NvcnRlZFtpXS0+ Y291bnQgPiAwKSB7Ci0JCQkJCXBlcmNlbnQgPSAodG9wX2JpdHNfc29ydGVkW2ldLT5jb3VudCAq IDEwMCkgLwotCQkJCQkJbGFzdF9zYW1wbGVzX3Blcl9zZWM7Ci0JCQkJCWxlbiA9IHByaW50Zigi JTMwczogJTNkJSU6ICIsCi0JCQkJCQkJIHRvcF9iaXRzX3NvcnRlZFtpXS0+Yml0LT5uYW1lLAot CQkJCQkJCSBwZXJjZW50KTsKLQkJCQkJcHJpbnRfcGVyY2VudGFnZV9iYXIgKHBlcmNlbnQsIGxl bik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQs ICIiKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdT KGRldmlkKSkgewotCQkJCQlwcmludGYoIiUxM3M6ICVsbHUgKCVsbGQvc2VjKSIsCi0JCQkJCQkg ICBzdGF0c19yZWdfbmFtZXNbaV0sCi0JCQkJCQkgICAobG9uZyBsb25nKXN0YXRzW2ldLAotCQkJ CQkJICAgKGxvbmcgbG9uZykoc3RhdHNbaV0gLSBsYXN0X3N0YXRzW2ldKSk7Ci0JCQkJCWxhc3Rf c3RhdHNbaV0gPSBzdGF0c1tpXTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIXRvcF9iaXRzX3Nv cnRlZFtpXS0+Y291bnQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcHJpbnRmKCJcbiIpOwot CQkJfQotCQl9Ci0JCWlmIChvdXRwdXQpIHsKLQkJCS8qIFByaW50IGhlYWRlcnMgZm9yIGNvbHVt bnMgYXQgZmlyc3QgcnVuICovCi0JCQlpZiAocHJpbnRfaGVhZGVycykgewotCQkJCWZwcmludGYo b3V0cHV0LCAiIyB0aW1lXHQiKTsKLQkJCQlyaW5nX3ByaW50X2hlYWRlcihvdXRwdXQsICZyZW5k ZXJfcmluZyk7Ci0JCQkJcmluZ19wcmludF9oZWFkZXIob3V0cHV0LCAmYnNkX3JpbmcpOwotCQkJ CXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJzZDZfcmluZyk7Ci0JCQkJcmluZ19wcmludF9o ZWFkZXIob3V0cHV0LCAmYmx0X3JpbmcpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RP UF9CSVRTOyBpKyspIHsKLQkJCQkJaWYgKGkgPCBTVEFUU19DT1VOVCAmJiBIQVNfU1RBVFNfUkVH UyhkZXZpZCkpIHsKLQkJCQkJCWZwcmludGYob3V0cHV0LCAiJS42c1x0IiwKLQkJCQkJCQkgICBz dGF0c19yZWdfbmFtZXNbaV0KLQkJCQkJCQkgICApOwotCQkJCQl9Ci0JCQkJCWlmICghdG9wX2Jp dHNbaV0uY291bnQpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZnByaW50ZihvdXRwdXQs ICJcbiIpOwotCQkJCXByaW50X2hlYWRlcnMgPSAwOwotCQkJfQotCi0JCQkvKiBQcmludCBzdGF0 aXN0aWNzICovCi0JCQlmcHJpbnRmKG91dHB1dCwgIiUuMmZcdCIsIGVsYXBzZWRfdGltZSk7Ci0J CQlyaW5nX2xvZygmcmVuZGVyX3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjLCBvdXRwdXQpOwot CQkJcmluZ19sb2coJmJzZF9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJ CXJpbmdfbG9nKCZic2Q2X3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjLCBvdXRwdXQpOwotCQkJ cmluZ19sb2coJmJsdF9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQotCQkJ Zm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVE9QX0JJVFM7IGkrKykgewotCQkJCWlmIChpIDwgU1RB VFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQkJCWZwcmludGYob3V0cHV0 LCAiJSJQUkl1NjQiXHQiLAotCQkJCQkJICAgc3RhdHNbaV0gLSBsYXN0X3N0YXRzW2ldKTsKLQkJ CQkJbGFzdF9zdGF0c1tpXSA9IHN0YXRzW2ldOwotCQkJCX0KLQkJCQkJaWYgKCF0b3BfYml0c1tp XS5jb3VudCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZnByaW50ZihvdXRwdXQsICJcbiIp OwotCQkJZmZsdXNoKG91dHB1dCk7CisJCXBtdV9zYW1wbGUoZW5naW5lcyk7CisJCXQgPSAoZG91 YmxlKShlbmdpbmVzLT50cy5jdXIgLSBlbmdpbmVzLT50cy5wcmV2KSAvIDFlOTsKKworCQlwcmlu dGYoIlwwMzNbSFwwMzNbSiIpOworCisJCXBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX3JlcSwgZnJl cSwgQlVGU1osICIlNC4wZiIsIDEuMCwgdCwgMSk7CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5mcmVx X2FjdCwgZmFjdCwgQlVGU1osICIlNC4wZiIsIDEuMCwgdCwgMSk7CisJCXBtdV9jYWxjKCZlbmdp bmVzLT5pcnEsIGlycSwgQlVGU1osICIlOC4wZiIsIDEuMCwgdCwgMSk7CisJCXBtdV9jYWxjKCZl bmdpbmVzLT5yYzYsIHJjNiwgQlVGU1osICIlMy4wZiIsIDFlOSwgdCwgMTAwKTsKKwkJcG11X2Nh bGMoJmVuZ2luZXMtPnJhcGwsIHBvd2VyLCBCVUZTWiwgIiU2LjBmIiwgMS4wLCB0LAorCQkJIGVu Z2luZXMtPnJhcGxfc2NhbGUpOworCQlwbXVfY2FsYygmZW5naW5lcy0+aW1jX3JlYWRzLCByZWFk cywgQlVGU1osICIlNi4wZiIsIDEuMCwgdCwKKwkJCSBlbmdpbmVzLT5pbWNfcmVhZHNfc2NhbGUp OworCQlwbXVfY2FsYygmZW5naW5lcy0+aW1jX3dyaXRlcywgd3JpdGVzLCBCVUZTWiwgIiU2LjBm IiwgMS4wLCB0LAorCQkJIGVuZ2luZXMtPmltY193cml0ZXNfc2NhbGUpOworCisJCXByaW50Zigi aW50ZWwtZ3B1LXRvcCAtICVzLyVzIE1IejsgICVzJSUgUkM2OyAlc21XOyAlcyBpcnFzL3NcbiIs CisJCSAgICAgICBmYWN0LCBmcmVxLCByYzYsIHBvd2VyLCBpcnEpOworCQlsaW5lcysrOworCisJ CXByaW50ZigiXG4iKTsKKwkJbGluZXMrKzsKKworCQlwcmludGYoIiUxNnMgJXMgJXMvc1xuIiwK KwkJICAgICAgICJJTUMgcmVhZHM6IiwgcmVhZHMsIGVuZ2luZXMtPmltY19yZWFkc191bml0KTsK KwkJbGluZXMrKzsKKworCQlwcmludGYoIiUxNnMgJXMgJXMvc1xuIiwKKwkJICAgICAgICJJTUMg d3JpdGVzOiIsIHdyaXRlcywgZW5naW5lcy0+aW1jX3dyaXRlc191bml0KTsKKwkJbGluZXMrKzsK KworCQlwcmludGYoIlxuIik7CisJCWxpbmVzKys7CisKKwkJZm9yIChpID0gMDsgaSA8IGVuZ2lu ZXMtPm51bV9lbmdpbmVzICYmIGxpbmVzIDwgY29uX2g7IGkrKykgeworCQkJc3RydWN0IGVuZ2lu ZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsKKwkJCXVuc2lnbmVkIGludCBtYXhf dyA9IGNvbl93IC0gMTsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCQljaGFyIHNlbWFbQlVGU1pd OworCQkJY2hhciB3YWl0W0JVRlNaXTsKKwkJCWNoYXIgYnVzeVtCVUZTWl07CisJCQljaGFyIGJ1 ZlsxMjhdOworCQkJZG91YmxlIHZhbDsKKworCQkJcG11X2NhbGMoJmVuZ2luZS0+c2VtYSwgc2Vt YSwgQlVGU1osICIlMy4wZiIsIDFlOSwgdCwKKwkJCQkgMTAwKTsKKwkJCXBtdV9jYWxjKCZlbmdp bmUtPndhaXQsIHdhaXQsIEJVRlNaLCAiJTMuMGYiLCAxZTksIHQsCisJCQkJIDEwMCk7CisJCQls ZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlJSBzZW1hLCAlcyUlIHdhaXQiLAor CQkJCSAgICAgICBzZW1hLCB3YWl0KTsKKworCQkJcG11X2NhbGMoJmVuZ2luZS0+YnVzeSwgYnVz eSwgQlVGU1osICIlNi4yZiIsIDFlOSwgdCwKKwkJCQkgMTAwKTsKKwkJCWxlbiArPSBwcmludGYo IiUxNnMgJXMlJSAiLCBlbmdpbmUtPmRpc3BsYXlfbmFtZSwgYnVzeSk7CisKKwkJCXZhbCA9IF9f cG11X2NhbGMoJmVuZ2luZS0+YnVzeS52YWwsIDFlOSwgdCwgMTAwKTsKKwkJCXByaW50X3BlcmNl bnRhZ2VfYmFyKHZhbCwgbWF4X3cgLSBsZW4pOworCisJCQlwcmludGYoIiVzXG4iLCBidWYpOwor CisJCQlsaW5lcysrOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IG51bV9pbnN0ZG9uZV9iaXRz OyBpKyspIHsKLQkJCXRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgPSAwOwotCi0JCQlpZiAoaSA8 IFNUQVRTX0NPVU5UKQotCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tpXTsKLQkJfQorCQlwcmlu dGYoIlxuIik7CiAKLQkJLyogQ2hlY2sgaWYgY2hpbGQgaGFzIGdvbmUgKi8KLQkJaWYgKGNoaWxk X3BpZCA+IDApIHsKLQkJCWludCByZXM7Ci0JCQlpZiAoKHJlcyA9IHdhaXRwaWQoY2hpbGRfcGlk LCAmY2hpbGRfc3RhdCwgV05PSEFORykpID09IC0xKSB7Ci0JCQkJcGVycm9yKCJ3YWl0cGlkIik7 Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWlmIChyZXMgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJ CWlmIChXSUZFWElURUQoY2hpbGRfc3RhdCkpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJdXNsZWVwKHBl cmlvZF91cyk7CiAJfQogCi0JZmNsb3NlKG91dHB1dCk7Ci0KLQlpbnRlbF9yZWdpc3Rlcl9hY2Nl c3NfZmluaSgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQg Yi90b29scy9tZXNvbi5idWlsZAppbmRleCBiZDJkMzEzZDUxNTYuLmE5MThlZWIwYmVmMSAxMDA2 NDQKLS0tIGEvdG9vbHMvbWVzb24uYnVpbGQKKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKQEAgLTIz LDcgKzIzLDYgQEAgdG9vbHNfcHJvZ3MgPSBbCiAJJ2ludGVsX2dwdV9mcmVxdWVuY3knLAogCSdp bnRlbF9maXJtd2FyZV9kZWNvZGUnLAogCSdpbnRlbF9ncHVfdGltZScsCi0JJ2ludGVsX2dwdV90 b3AnLAogCSdpbnRlbF9ndHQnLAogCSdpbnRlbF9ndWNfbG9nZ2VyJywKIAknaW50ZWxfaW5mb2Zy YW1lcycsCkBAIC0xMTcsNiArMTE2LDExIEBAIHNoYXJlZF9saWJyYXJ5KCdpbnRlbF9hdWJkdW1w JywgJ2F1YmR1bXAuYycsCiAJICAgICAgIG5hbWVfcHJlZml4IDogJycsCiAJICAgICAgIGluc3Rh bGwgOiB0cnVlKQogCitleGVjdXRhYmxlKCdpbnRlbF9ncHVfdG9wJywgJ2ludGVsX2dwdV90b3Au YycsCisJICAgaW5zdGFsbCA6IHRydWUsCisJICAgaW5zdGFsbF9ycGF0aCA6IHJwYXRoZGlyLAor CSAgIGRlcGVuZGVuY2llcyA6IHRvb2xfZGVwcyArIFsgbGliX2lndF9wZXJmIF0pCisKIGNvbmZf ZGF0YSA9IGNvbmZpZ3VyYXRpb25fZGF0YSgpCiBjb25mX2RhdGEuc2V0KCdwcmVmaXgnLCBwcmVm aXgpCiBjb25mX2RhdGEuc2V0KCdleGVjX3ByZWZpeCcsICcke3ByZWZpeH0nKQotLSAKMi4xNC4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppZ3QtZGV2 IG1haWxpbmcgbGlzdAppZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK