From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id 69FFC6FABF for ; Tue, 21 Jan 2020 12:53:08 +0000 (UTC) From: Kunal Joshi Date: Tue, 21 Jan 2020 11:24:15 +0530 Message-Id: <1579586055-27583-4-git-send-email-kunal1.joshi@intel.com> In-Reply-To: <1579586055-27583-1-git-send-email-kunal1.joshi@intel.com> References: <1579586055-27583-1-git-send-email-kunal1.joshi@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v3 3/3] tests/kms_color_chamelium: add subtests to validate color 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: Kunal Joshi , ville.syrjala@intel.com, petri.latvala@intel.com, daniel.vetter@intel.com List-ID: VG8gdmFsaWRhdGUgY29sb3Igc3VidGVzdHMgdXNpbmcgY2hhbWVsaXVtLCBzdWJ0ZXN0cyBtb2Rp ZmllZAp0byBkbyBmcmFtZSBkdW1wIGNvbXBhcmlzb24gaW5zdGVhZCBvZiBjcmMgY29tcGFyaXNv bi4KVGVzdHMgcmVxdWlyZSBjaGFtZWxpdW0gYW5kIHdpbGwgdmFsaWRhdGUgY29sb3IgZmVhdHVy ZXMKYXQgcGlwZSBsZXZlbC4KCih2MikKICAgICAgICBDb21wYXJpbmcgZnJhbWVkdW1wIHdpdGgg ZnJhbWVidWZmZXIgcmVmZXJlbmNlIGluc3RlYWQgb2YKICAgICAgICBjb21wYXJpbmcgdHdvIGZy YW1lZHVtcC4KKHYzKQoJTW92ZWQgY29tbW9uIGZ1bmN0aW9ucyB3aXRoIGttc19jb2xvciB0byBs aWIvaWd0X2NvbG9yCgpTaWduZWQtb2ZmLWJ5OiBLdW5hbCBKb3NoaSA8a3VuYWwxLmpvc2hpQGlu dGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogU3dhdGkgU2hhcm1hIDxzd2F0aTIuc2hhcm1hQGludGVs LmNvbT4KU3VnZ2VzdGVkLWJ5OiBVbWEgU2hhbmthciA8dW1hLnNoYW5rYXJAaW50ZWwuY29tPgot LS0KIHRlc3RzL01ha2VmaWxlLmFtICAgICAgICAgICB8ICAgMSArCiB0ZXN0cy9rbXNfY29sb3Jf Y2hhbWVsaXVtLmMgfCA3NTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIDIgZmlsZXMgY2hhbmdlZCwgNzYwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEw MDY0NCB0ZXN0cy9rbXNfY29sb3JfY2hhbWVsaXVtLmMKCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtl ZmlsZS5hbSBiL3Rlc3RzL01ha2VmaWxlLmFtCmluZGV4IGZjMzA1MjQuLjUwZmM5ODkgMTAwNjQ0 Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLmFtCisrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0xMyw2 ICsxMyw3IEBAIGVuZGlmCiBpZiBIQVZFX0NIQU1FTElVTQogVEVTVFNfcHJvZ3MgKz0gXAogCWtt c19jaGFtZWxpdW0gXAorCWttc19jb2xvcl9jaGFtZWxpdW0gXAogCSQoTlVMTCkKIGVuZGlmCiAK ZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc19jb2xvcl9jaGFtZWxpdW0uYyBiL3Rlc3RzL2ttc19jb2xv cl9jaGFtZWxpdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ4NjY2 Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMva21zX2NvbG9yX2NoYW1lbGl1bS5jCkBAIC0wLDAg KzEsNzU5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KKyAq CisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55 IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lh dGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4g dGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0 YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNo LCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBT b2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBp cyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z OgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVk ZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3 YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdB UlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVU IE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBO TyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhF UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisg KiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUg VVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNp bmNsdWRlICJpZ3RfY29sb3IuaCIKKworSUdUX1RFU1RfREVTQ1JJUFRJT04oIlRlc3QgQ29sb3Ig RmVhdHVyZXMgYXQgUGlwZSBsZXZlbCIpOworCisvKgorICogRHJhdyAzIGdyYWRpZW50IHJlY3Rh bmdsZXMgaW4gcmVkLCBncmVlbiBhbmQgYmx1ZSwgd2l0aCBhIG1heGVkIG91dAorICogZGVnYW1t YSBMVVQgYW5kIHZlcmlmeSB3ZSBoYXZlIHRoZSBzYW1lIGZyYW1lIGR1bXAgYXMgZHJhd2luZyBz b2xpZCBjb2xvcgorICogcmVjdGFuZ2xlcyB3aXRoIGxpbmVhciBkZWdhbW1hIExVVC4KKyAqLwor c3RhdGljIHZvaWQgdGVzdF9waXBlX2RlZ2FtbWEoZGF0YV90ICpkYXRhLAorCQkJICAgICAgaWd0 X3BsYW5lX3QgKnByaW1hcnkpCit7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJZ2FtbWFfbHV0 X3QgKmRlZ2FtbWFfbGluZWFyLCAqZGVnYW1tYV9mdWxsOworCWdhbW1hX2x1dF90ICpnYW1tYV9s aW5lYXI7CisJY29sb3JfdCByZWRfZ3JlZW5fYmx1ZVtdID0geworCQl7IDEuMCwgMC4wLCAwLjAg fSwKKwkJeyAwLjAsIDEuMCwgMC4wIH0sCisJCXsgMC4wLCAwLjAsIDEuMCB9CisJfTsKKworCWlu dCBpOworCXN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKKwljaGFyICpjb25uZWN0ZWRfcG9y dHNbNF07CisJYm9vbCB2YWxpZF9vdXRwdXQgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBk YXRhLT5wb3J0X2NvdW50OyBpKyspCisJCWNvbm5lY3RlZF9wb3J0c1tpXSA9CisJCQkoY2hhciAq KSBjaGFtZWxpdW1fcG9ydF9nZXRfbmFtZShkYXRhLT5wb3J0c1tpXSk7CisKKwlpZ3RfcmVxdWly ZShpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocHJpbWFyeS0+cGlwZSwgSUdUX0NSVENfREVHQU1NQV9M VVQpKTsKKwlpZ3RfcmVxdWlyZShpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocHJpbWFyeS0+cGlwZSwg SUdUX0NSVENfR0FNTUFfTFVUKSk7CisKKwlkZWdhbW1hX2xpbmVhciA9IGdlbmVyYXRlX3RhYmxl KGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUsIDEuMCk7CisJZGVnYW1tYV9mdWxsID0gZ2VuZXJhdGVf dGFibGVfbWF4KGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUpOworCisJZ2FtbWFfbGluZWFyID0gZ2Vu ZXJhdGVfdGFibGUoZGF0YS0+Z2FtbWFfbHV0X3NpemUsIDEuMCk7CisKKwlmb3JfZWFjaF92YWxp ZF9vdXRwdXRfb25fcGlwZSgmZGF0YS0+ZGlzcGxheSwKKwkJCQkgICAgICBwcmltYXJ5LT5waXBl LT5waXBlLAorCQkJCSAgICAgIG91dHB1dCkgeworCQlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7CisJ CXN0cnVjdCBpZ3RfZmIgZmJfbW9kZXNldCwgZmIsIGZicmVmOworCQlzdHJ1Y3QgY2hhbWVsaXVt X2ZyYW1lX2R1bXAgKmZyYW1lX2Z1bGxjb2xvcnM7CisJCWludCBmYl9pZCwgZmJfbW9kZXNldF9p ZCwgZmJyZWZfaWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291bnQ7IGkrKykK KwkJCXZhbGlkX291dHB1dCB8PQorCQkJCShzdHJjbXAob3V0cHV0LT5uYW1lLCBjb25uZWN0ZWRf cG9ydHNbaV0pID09IDApOworCQlpZiAoIXZhbGlkX291dHB1dCkKKwkJCWNvbnRpbnVlOworCQll bHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsgaSsrKQorCQkJCWlmIChz dHJjbXAob3V0cHV0LT5uYW1lLAorCQkJCQkgICBjb25uZWN0ZWRfcG9ydHNbaV0pID09IDApCisJ CQkJCXBvcnQgPSBkYXRhLT5wb3J0c1tpXTsKKworCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1 dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7CisJCW1vZGUgPSBpZ3Rfb3V0cHV0X2dldF9tb2RlKG91 dHB1dCk7CisKKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhlIHNpemUgb2YgdGhlIG91 dHB1dC4gKi8KKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkgICAg ICBtb2RlLT5oZGlzcGxheSwKKwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKKwkJCQkgICAgICBE Uk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUs CisJCQkJICAgICAgJmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCk7CisKKwkJZmJfbW9kZXNldF9p ZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCQkgICAgICBtb2RlLT5oZGlzcGxh eSwKKwkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCSAgICAgIERSTV9GT1JNQVRfWFJH Qjg4ODgsCisJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJCSAgICAg ICZmYl9tb2Rlc2V0KTsKKwkJaWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lkKTsKKworCQlmYnJlZl9p ZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCQkgICAgICBtb2RlLT5oZGlzcGxh eSwKKwkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCSAgICAgIERSTV9GT1JNQVRfWFJH Qjg4ODgsCisJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJCSAgICAg ICZmYnJlZik7CisJCWlndF9hc3NlcnQoZmJyZWZfaWQpOworCisJCWlndF9wbGFuZV9zZXRfZmIo cHJpbWFyeSwgJmZiX21vZGVzZXQpOworCQlkaXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKKwkJ ZGlzYWJsZV9kZWdhbW1hKHByaW1hcnktPnBpcGUpOworCQlzZXRfZ2FtbWEoZGF0YSwgcHJpbWFy eS0+cGlwZSwgZ2FtbWFfbGluZWFyKTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNw bGF5KTsKKworCQkvKiBEcmF3IHNvbGlkIGNvbG9ycyB3aXRoIG5vIGRlZ2FtbWEgdHJhbnNmb3Jt YXRpb24uICovCisJCXBhaW50X3JlY3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWUs ICZmYnJlZik7CisKKwkJLyogRHJhdyBhIGdyYWRpZW50IHdpdGggZGVnYW1tYSBMVVQgdG8gcmVt YXAgYWxsCisJCSAqIHZhbHVlcyB0byBtYXggcmVkL2dyZWVuL2JsdWUuCisJCSAqLworCQlwYWlu dF9ncmFkaWVudF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmIpOwor CQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7CisJCXNldF9kZWdhbW1hKGRhdGEsIHBy aW1hcnktPnBpcGUsIGRlZ2FtbWFfZnVsbCk7CisJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ ZGlzcGxheSk7CisJCWNoYW1lbGl1bV9jYXB0dXJlKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgMCwg MCwgMCwgMCwgMSk7CisJCWZyYW1lX2Z1bGxjb2xvcnMgPQorCQkJY2hhbWVsaXVtX3JlYWRfY2Fw dHVyZWRfZnJhbWUoZGF0YS0+Y2hhbWVsaXVtLCAwKTsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGUg ZnJhbWVidWZmZXIgcmVmZXJlbmNlIG9mIHRoZSBzb2Z0d2FyZQorCQkgKiBjb21wdXRlZCBvdXRw dXQgaXMgZXF1YWwgdG8gdGhlIGZyYW1lIGR1bXAgb2YgdGhlIGRlZ2FtbWEKKwkJICogTFVUIHRy YW5zZm9ybWF0aW9uIG91dHB1dC4KKwkJICovCisJCWlndF9hc3NlcnQoY2hhbWVsaXVtX2ZyYW1l X21hdGNoX29yX2R1bXAoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LAorCQkJCQkJCSBmcmFtZV9mdWxs Y29sb3JzLAorCQkJCQkJCSAmZmJyZWYsCisJCQkJCQkJIENIQU1FTElVTV9DSEVDS19BTkFMT0cp KTsKKworCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksIE5VTEwpOworCQlpZ3Rfb3V0cHV0X3Nl dF9waXBlKG91dHB1dCwgUElQRV9OT05FKTsKKwl9CisKKwlmcmVlX2x1dChkZWdhbW1hX2xpbmVh cik7CisJZnJlZV9sdXQoZGVnYW1tYV9mdWxsKTsKKwlmcmVlX2x1dChnYW1tYV9saW5lYXIpOwor fQorCisvKgorICogRHJhdyAzIGdyYWRpZW50IHJlY3RhbmdsZXMgaW4gcmVkLCBncmVlbiBhbmQg Ymx1ZSwgd2l0aCBhIG1heGVkIG91dAorICogZ2FtbWEgTFVUIGFuZCB2ZXJpZnkgd2UgaGF2ZSB0 aGUgc2FtZSBmcmFtZSBkdW1wIGFzIGRyYXdpbmcgc29saWQKKyAqIGNvbG9yIHJlY3RhbmdsZXMu CisgKi8KK3N0YXRpYyB2b2lkIHRlc3RfcGlwZV9nYW1tYShkYXRhX3QgKmRhdGEsCisJCQkgICAg aWd0X3BsYW5lX3QgKnByaW1hcnkpCit7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJZ2FtbWFf bHV0X3QgKmdhbW1hX2Z1bGw7CisJY29sb3JfdCByZWRfZ3JlZW5fYmx1ZVtdID0geworCQl7IDEu MCwgMC4wLCAwLjAgfSwKKwkJeyAwLjAsIDEuMCwgMC4wIH0sCisJCXsgMC4wLCAwLjAsIDEuMCB9 CisJfTsKKworCWludCBpOworCXN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKKwljaGFyICpj b25uZWN0ZWRfcG9ydHNbNF07CisJYm9vbCB2YWxpZF9vdXRwdXQgPSBmYWxzZTsKKworCWZvciAo aSA9IDA7IGkgPCBkYXRhLT5wb3J0X2NvdW50OyBpKyspCisJCWNvbm5lY3RlZF9wb3J0c1tpXSA9 CisJCQkoY2hhciAqKSBjaGFtZWxpdW1fcG9ydF9nZXRfbmFtZShkYXRhLT5wb3J0c1tpXSk7CisK KwlpZ3RfcmVxdWlyZShpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocHJpbWFyeS0+cGlwZSwgSUdUX0NS VENfR0FNTUFfTFVUKSk7CisKKwlnYW1tYV9mdWxsID0gZ2VuZXJhdGVfdGFibGVfbWF4KGRhdGEt PmdhbW1hX2x1dF9zaXplKTsKKworCWZvcl9lYWNoX3ZhbGlkX291dHB1dF9vbl9waXBlKCZkYXRh LT5kaXNwbGF5LAorCQkJCSAgICAgIHByaW1hcnktPnBpcGUtPnBpcGUsCisJCQkJICAgICAgb3V0 cHV0KSB7CisJCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwkJc3RydWN0IGlndF9mYiBmYl9tb2Rl c2V0LCBmYiwgZmJyZWY7CisJCXN0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVtcCAqZnJhbWVfZnVs bGNvbG9yczsKKwkJaW50IGZiX2lkLCBmYl9tb2Rlc2V0X2lkLCBmYnJlZl9pZDsKKworCQlmb3Ig KGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsgaSsrKQorCQkJdmFsaWRfb3V0cHV0IHw9CisJ CQkJKHN0cmNtcChvdXRwdXQtPm5hbWUsIGNvbm5lY3RlZF9wb3J0c1tpXSkgPT0gMCk7CisJCWlm ICghdmFsaWRfb3V0cHV0KQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCWZvciAoaSA9IDA7IGkg PCBkYXRhLT5wb3J0X2NvdW50OyBpKyspCisJCQkJaWYgKHN0cmNtcChvdXRwdXQtPm5hbWUsCisJ CQkJCSAgIGNvbm5lY3RlZF9wb3J0c1tpXSkgPT0gMCkKKwkJCQkJcG9ydCA9IGRhdGEtPnBvcnRz W2ldOworCisJCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBwcmltYXJ5LT5waXBlLT5waXBl KTsKKwkJbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKKworCQkvKiBDcmVhdGUg YSBmcmFtZWJ1ZmZlciBhdCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0LiAqLworCQlmYl9pZCA9IGln dF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAorCQkJ CSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJ CQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCQkgICAgICAmZmIpOworCQlp Z3RfYXNzZXJ0KGZiX2lkKTsKKworCQlmYl9tb2Rlc2V0X2lkID0gaWd0X2NyZWF0ZV9mYihkYXRh LT5kcm1fZmQsCisJCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAorCQkJCQkgICAgICBtb2RlLT52 ZGlzcGxheSwKKwkJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkJICAgICAgTE9D QUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCQkJICAgICAgJmZiX21vZGVzZXQpOworCQlpZ3Rf YXNzZXJ0KGZiX21vZGVzZXRfaWQpOworCisJCWZicmVmX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRh LT5kcm1fZmQsCisJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJICAgICAgbW9kZS0+dmRp c3BsYXksCisJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkgICAgICBMT0NBTF9E Uk1fRk9STUFUX01PRF9OT05FLAorCQkJCSAgICAgICZmYnJlZik7CisJCWlndF9hc3NlcnQoZmJy ZWZfaWQpOworCisJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiX21vZGVzZXQpOworCQlk aXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKKwkJZGlzYWJsZV9kZWdhbW1hKHByaW1hcnktPnBp cGUpOworCQlzZXRfZ2FtbWEoZGF0YSwgcHJpbWFyeS0+cGlwZSwgZ2FtbWFfZnVsbCk7CisJCWln dF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7CisKKwkJLyogRHJhdyBzb2xpZCBjb2xv cnMgd2l0aCBubyBnYW1tYSB0cmFuc2Zvcm1hdGlvbi4gKi8KKwkJcGFpbnRfcmVjdGFuZ2xlcyhk YXRhLCBtb2RlLCByZWRfZ3JlZW5fYmx1ZSwgJmZicmVmKTsKKworCQkvKiBEcmF3IGEgZ3JhZGll bnQgd2l0aCBnYW1tYSBMVVQgdG8gcmVtYXAgYWxsIHZhbHVlcworCQkgKiB0byBtYXggcmVkL2dy ZWVuL2JsdWUuCisJCSAqLworCQlwYWludF9ncmFkaWVudF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUs IHJlZF9ncmVlbl9ibHVlLCAmZmIpOworCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7 CisJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7CisJCWNoYW1lbGl1bV9jYXB0 dXJlKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgMCwgMCwgMCwgMCwgMSk7CisJCWZyYW1lX2Z1bGxj b2xvcnMgPQorCQkJY2hhbWVsaXVtX3JlYWRfY2FwdHVyZWRfZnJhbWUoZGF0YS0+Y2hhbWVsaXVt LCAwKTsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGUgZnJhbWVidWZmZXIgcmVmZXJlbmNlIG9mIHRo ZSBzb2Z0d2FyZSBjb21wdXRlZAorCQkgKiBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlIGZyYW1lIGR1 bXAgb2YgdGhlIGRlZ2FtbWEgTFVUCisJCSAqIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KKwkJICov CisJCWlndF9hc3NlcnQoY2hhbWVsaXVtX2ZyYW1lX21hdGNoX29yX2R1bXAoZGF0YS0+Y2hhbWVs aXVtLCBwb3J0LAorCQkJCQkJCSBmcmFtZV9mdWxsY29sb3JzLAorCQkJCQkJCSAmZmJyZWYsCisJ CQkJCQkJIENIQU1FTElVTV9DSEVDS19BTkFMT0cpKTsKKworCQlpZ3RfcGxhbmVfc2V0X2ZiKHBy aW1hcnksIE5VTEwpOworCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgUElQRV9OT05FKTsK Kwl9CisKKwlmcmVlX2x1dChnYW1tYV9mdWxsKTsKK30KKworLyoKKyAqIERyYXcgMyByZWN0YW5n bGVzIHVzaW5nIGJlZm9yZSBjb2xvcnMgd2l0aCB0aGUgY3RtIG1hdHJpeCBhcHBseSBhbmQgdmVy aWZ5CisgKiB0aGUgZnJhbWUgZHVtcCBpcyBlcXVhbCB0byB1c2luZyBhZnRlciBjb2xvcnMgd2l0 aCBhbiBpZGVudGlmeSBjdG0gbWF0cml4LgorICovCitzdGF0aWMgYm9vbCB0ZXN0X3BpcGVfY3Rt KGRhdGFfdCAqZGF0YSwKKwkJCSAgaWd0X3BsYW5lX3QgKnByaW1hcnksCisJCQkgIGNvbG9yX3Qg KmJlZm9yZSwKKwkJCSAgY29sb3JfdCAqYWZ0ZXIsCisJCQkgIGRvdWJsZSAqY3RtX21hdHJpeCkK K3sKKwlnYW1tYV9sdXRfdCAqZGVnYW1tYV9saW5lYXIsICpnYW1tYV9saW5lYXI7CisJaWd0X291 dHB1dF90ICpvdXRwdXQ7CisKKwlpbnQgaTsKKwlib29sIHJldCA9IHRydWU7CisJc3RydWN0IGNo YW1lbGl1bV9wb3J0ICpwb3J0OworCWNoYXIgKmNvbm5lY3RlZF9wb3J0c1s0XTsKKwlib29sIHZh bGlkX291dHB1dCA9IGZhbHNlOworCisJaWd0X3JlcXVpcmUoaWd0X3BpcGVfb2JqX2hhc19wcm9w KHByaW1hcnktPnBpcGUsIElHVF9DUlRDX0NUTSkpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEt PnBvcnRfY291bnQ7IGkrKykKKwkJY29ubmVjdGVkX3BvcnRzW2ldID0KKwkJCShjaGFyICopIGNo YW1lbGl1bV9wb3J0X2dldF9uYW1lKGRhdGEtPnBvcnRzW2ldKTsKKworCWRlZ2FtbWFfbGluZWFy ID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKwlnYW1tYV9s aW5lYXIgPSBnZW5lcmF0ZV90YWJsZShkYXRhLT5nYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKworCWZv cl9lYWNoX3ZhbGlkX291dHB1dF9vbl9waXBlKCZkYXRhLT5kaXNwbGF5LAorCQkJCSAgICAgIHBy aW1hcnktPnBpcGUtPnBpcGUsCisJCQkJICAgICAgb3V0cHV0KSB7CisJCWRybU1vZGVNb2RlSW5m byAqbW9kZTsKKwkJc3RydWN0IGlndF9mYiBmYl9tb2Rlc2V0LCBmYiwgZmJyZWY7CisJCXN0cnVj dCBjaGFtZWxpdW1fZnJhbWVfZHVtcCAqZnJhbWVfaGFyZHdhcmU7CisJCWludCBmYl9pZCwgZmJf bW9kZXNldF9pZCwgZmJyZWZfaWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291 bnQ7IGkrKykKKwkJCXZhbGlkX291dHB1dCB8PQorCQkJCShzdHJjbXAob3V0cHV0LT5uYW1lLCBj b25uZWN0ZWRfcG9ydHNbaV0pID09IDApOworCQlpZiAoIXZhbGlkX291dHB1dCkKKwkJCWNvbnRp bnVlOworCQllbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsgaSsrKQor CQkJCWlmIChzdHJjbXAob3V0cHV0LT5uYW1lLAorCQkJCQkgICBjb25uZWN0ZWRfcG9ydHNbaV0p ID09IDApCisJCQkJCXBvcnQgPSBkYXRhLT5wb3J0c1tpXTsKKworCQlpZ3Rfb3V0cHV0X3NldF9w aXBlKG91dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7CisJCW1vZGUgPSBpZ3Rfb3V0cHV0X2dl dF9tb2RlKG91dHB1dCk7CisKKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhlIHNpemUg b2YgdGhlIG91dHB1dC4gKi8KKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwK KwkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKKwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKKwkJ CQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkUsCisJCQkJICAgICAgJmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCk7CisKKwkJZmJf bW9kZXNldF9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCQkgICAgICBtb2Rl LT5oZGlzcGxheSwKKwkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCSAgICAgIERSTV9G T1JNQVRfWFJHQjg4ODgsCisJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJ CQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKKwkJaWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lkKTsKKwor CQlmYnJlZl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCSAgICAgIG1vZGUt PmhkaXNwbGF5LAorCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCSAgICAgIERSTV9GT1JN QVRfWFJHQjg4ODgsCisJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCQkg ICAgICAmZmJyZWYpOworCQlpZ3RfYXNzZXJ0KGZicmVmX2lkKTsKKworCQlpZ3RfcGxhbmVfc2V0 X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0KTsKKworCQlpZiAobWVtY21wKGJlZm9yZSwgYWZ0ZXIs IHNpemVvZihjb2xvcl90KSkpIHsKKwkJCXNldF9kZWdhbW1hKGRhdGEsIHByaW1hcnktPnBpcGUs IGRlZ2FtbWFfbGluZWFyKTsKKwkJCXNldF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBlLCBnYW1t YV9saW5lYXIpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBEZWdhbW1hIGFuZCBHYW1tYSBm b3IgY3RtIG1heCB0ZXN0ICovCisJCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7CisJ CQlkaXNhYmxlX2dhbW1hKHByaW1hcnktPnBpcGUpOworCQl9CisKKwkJZGlzYWJsZV9jdG0ocHJp bWFyeS0+cGlwZSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7CisKKwkJ cGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCBhZnRlciwgJmZicmVmKTsKKworCQkvKiBXaXRo IENUTSB0cmFuc2Zvcm1hdGlvbi4gKi8KKwkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCBi ZWZvcmUsICZmYik7CisJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKKwkJc2V0X2N0 bShwcmltYXJ5LT5waXBlLCBjdG1fbWF0cml4KTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRh LT5kaXNwbGF5KTsKKwkJY2hhbWVsaXVtX2NhcHR1cmUoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LCAw LCAwLCAwLCAwLCAxKTsKKwkJZnJhbWVfaGFyZHdhcmUgPQorCQkJY2hhbWVsaXVtX3JlYWRfY2Fw dHVyZWRfZnJhbWUoZGF0YS0+Y2hhbWVsaXVtLCAwKTsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGUg ZnJhbWVidWZmZXIgcmVmZXJlbmNlIG9mIHRoZSBzb2Z0d2FyZQorCQkgKiBjb21wdXRlZCBvdXRw dXQgaXMgZXF1YWwgdG8gdGhlIGZyYW1lIGR1bXAgb2YgdGhlIENUTQorCQkgKiBtYXRyaXggdHJh bnNmb3JtYXRpb24gb3V0cHV0LgorCQkgKi8KKwkJcmV0ICY9IGNoYW1lbGl1bV9mcmFtZV9tYXRj aF9vcl9kdW1wKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwKKwkJCQkJCSAgICAgZnJhbWVfaGFyZHdh cmUsCisJCQkJCQkgICAgICZmYnJlZiwKKwkJCQkJCSAgICAgQ0hBTUVMSVVNX0NIRUNLX0FOQUxP Ryk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxMKTsKKwkJaWd0X291dHB1dF9z ZXRfcGlwZShvdXRwdXQsIFBJUEVfTk9ORSk7CisJfQorCisJZnJlZV9sdXQoZGVnYW1tYV9saW5l YXIpOworCWZyZWVfbHV0KGdhbW1hX2xpbmVhcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0 aWMgdm9pZCB0ZXN0X3BpcGVfbGltaXRlZF9yYW5nZV9jdG0oZGF0YV90ICpkYXRhLAorCQkJCQlp Z3RfcGxhbmVfdCAqcHJpbWFyeSkKK3sKKwlkb3VibGUgbGltaXRlZF9yZXN1bHQgPSAyMzUuMCAv IDI1NS4wOworCWNvbG9yX3QgcmVkX2dyZWVuX2JsdWVfbGltaXRlZFtdID0geworCQl7IGxpbWl0 ZWRfcmVzdWx0LCAwLjAsIDAuMCB9LAorCQl7IDAuMCwgbGltaXRlZF9yZXN1bHQsIDAuMCB9LAor CQl7IDAuMCwgMC4wLCBsaW1pdGVkX3Jlc3VsdCB9CisJfTsKKwljb2xvcl90IHJlZF9ncmVlbl9i bHVlX2Z1bGxbXSA9IHsKKwkJeyAwLjUsIDAuMCwgMC4wIH0sCisJCXsgMC4wLCAwLjUsIDAuMCB9 LAorCQl7IDAuMCwgMC4wLCAwLjUgfQorCX07CisJZG91YmxlIGN0bVtdID0geyAxLjAsIDAuMCwg MC4wLAorCQkJMC4wLCAxLjAsIDAuMCwKKwkJCTAuMCwgMC4wLCAxLjAgfTsKKwlnYW1tYV9sdXRf dCAqZGVnYW1tYV9saW5lYXIsICpnYW1tYV9saW5lYXI7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7 CisJYm9vbCBoYXNfYnJvYWRjYXN0X3JnYl9vdXRwdXQgPSBmYWxzZTsKKworCWludCBpOworCXN0 cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKKwljaGFyICpjb25uZWN0ZWRfcG9ydHNbNF07CisJ Ym9vbCB2YWxpZF9vdXRwdXQgPSBmYWxzZTsKKworCWRlZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVf dGFibGUoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKwlnYW1tYV9saW5lYXIgPSBnZW5l cmF0ZV90YWJsZShkYXRhLT5nYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKworCWZvciAoaSA9IDA7IGkg PCBkYXRhLT5wb3J0X2NvdW50OyBpKyspCisJCWNvbm5lY3RlZF9wb3J0c1tpXSA9CisJCQkoY2hh ciAqKSBjaGFtZWxpdW1fcG9ydF9nZXRfbmFtZShkYXRhLT5wb3J0c1tpXSk7CisKKwlmb3JfZWFj aF92YWxpZF9vdXRwdXRfb25fcGlwZSgmZGF0YS0+ZGlzcGxheSwKKwkJCQkgICAgICBwcmltYXJ5 LT5waXBlLT5waXBlLAorCQkJCSAgICAgIG91dHB1dCkgeworCQlkcm1Nb2RlTW9kZUluZm8gKm1v ZGU7CisJCXN0cnVjdCBpZ3RfZmIgZmJfbW9kZXNldCwgZmIsIGZicmVmOworCQlzdHJ1Y3QgY2hh bWVsaXVtX2ZyYW1lX2R1bXAgKmZyYW1lX2xpbWl0ZWQ7CisJCWludCBmYl9pZCwgZmJfbW9kZXNl dF9pZCwgZmJyZWZfaWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291bnQ7IGkr KykKKwkJCXZhbGlkX291dHB1dCB8PQorCQkJCShzdHJjbXAob3V0cHV0LT5uYW1lLCBjb25uZWN0 ZWRfcG9ydHNbaV0pID09IDApOworCQlpZiAoIXZhbGlkX291dHB1dCkKKwkJCWNvbnRpbnVlOwor CQllbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsgaSsrKQorCQkJCWlm IChzdHJjbXAob3V0cHV0LT5uYW1lLAorCQkJCSAgICBjb25uZWN0ZWRfcG9ydHNbaV0pID09IDAp CisJCQkJCXBvcnQgPSBkYXRhLT5wb3J0c1tpXTsKKworCQlpZiAoIWlndF9vdXRwdXRfaGFzX3By b3Aob3V0cHV0LCBJR1RfQ09OTkVDVE9SX0JST0FEQ0FTVF9SR0IpKQorCQkJY29udGludWU7CisK KwkJaGFzX2Jyb2FkY2FzdF9yZ2Jfb3V0cHV0ID0gdHJ1ZTsKKworCQlpZ3Rfb3V0cHV0X3NldF9w aXBlKG91dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7CisJCW1vZGUgPSBpZ3Rfb3V0cHV0X2dl dF9tb2RlKG91dHB1dCk7CisKKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhlIHNpemUg b2YgdGhlIG91dHB1dC4gKi8KKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwK KwkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKKwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKKwkJ CQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkUsCisJCQkJICAgICAgJmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCk7CisKKwkJZmJf bW9kZXNldF9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCQkgICAgICBtb2Rl LT5oZGlzcGxheSwKKwkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCSAgICAgIERSTV9G T1JNQVRfWFJHQjg4ODgsCisJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJ CQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKKwkJaWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lkKTsKKwor CQlmYnJlZl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCSAgICAgIG1vZGUt PmhkaXNwbGF5LAorCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCSAgICAgIERSTV9GT1JN QVRfWFJHQjg4ODgsCisJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCQkg ICAgICAmZmJyZWYpOworCQlpZ3RfYXNzZXJ0KGZicmVmX2lkKTsKKworCQlpZ3RfcGxhbmVfc2V0 X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0KTsKKworCQlzZXRfZGVnYW1tYShkYXRhLCBwcmltYXJ5 LT5waXBlLCBkZWdhbW1hX2xpbmVhcik7CisJCXNldF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBl LCBnYW1tYV9saW5lYXIpOworCQlzZXRfY3RtKHByaW1hcnktPnBpcGUsIGN0bSk7CisKKwkJaWd0 X291dHB1dF9zZXRfcHJvcF92YWx1ZShvdXRwdXQsCisJCQkJCSAgSUdUX0NPTk5FQ1RPUl9CUk9B RENBU1RfUkdCLAorCQkJCQkgIEJST0FEQ0FTVF9SR0JfRlVMTCk7CisJCXBhaW50X3JlY3Rhbmds ZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWVfbGltaXRlZCwgJmZiKTsKKwkJaWd0X3BsYW5l X3NldF9mYihwcmltYXJ5LCAmZmIpOworCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3Bs YXkpOworCisJCS8qIFNldCB0aGUgb3V0cHV0IGludG8gbGltaXRlZCByYW5nZS4gKi8KKwkJaWd0 X291dHB1dF9zZXRfcHJvcF92YWx1ZShvdXRwdXQsCisJCQkJCSAgSUdUX0NPTk5FQ1RPUl9CUk9B RENBU1RfUkdCLAorCQkJCQkgIEJST0FEQ0FTVF9SR0JfMTZfMjM1KTsKKwkJcGFpbnRfcmVjdGFu Z2xlcyhkYXRhLCBtb2RlLCByZWRfZ3JlZW5fYmx1ZV9mdWxsLCAmZmIpOworCisJCS8qIEFuZCBy ZXNldC4uICovCisJCWlndF9vdXRwdXRfc2V0X3Byb3BfdmFsdWUob3V0cHV0LAorCQkJCQkgIElH VF9DT05ORUNUT1JfQlJPQURDQVNUX1JHQiwKKwkJCQkJICBCUk9BRENBU1RfUkdCX0ZVTEwpOwor CQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksIE5VTEwpOworCQlpZ3Rfb3V0cHV0X3NldF9waXBl KG91dHB1dCwgUElQRV9OT05FKTsKKwkJY2hhbWVsaXVtX2NhcHR1cmUoZGF0YS0+Y2hhbWVsaXVt LCBwb3J0LCAwLCAwLCAwLCAwLCAxKTsKKwkJZnJhbWVfbGltaXRlZCA9CisJCQljaGFtZWxpdW1f cmVhZF9jYXB0dXJlZF9mcmFtZShkYXRhLT5jaGFtZWxpdW0sIDApOworCisKKwkJLyogVmVyaWZ5 IHRoYXQgdGhlIGZyYW1lYnVmZmVyIHJlZmVyZW5jZSBvZiB0aGUgc29mdHdhcmUKKwkJICogY29t cHV0ZWQgb3V0cHV0IGlzIGVxdWFsIHRvIHRoZSBmcmFtZSBkdW1wIG9mIHRoZSBDVE0KKwkJICog bWF0cml4IHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KKwkJICovCisJCWlndF9hc3NlcnQoY2hhbWVs aXVtX2ZyYW1lX21hdGNoX29yX2R1bXAoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LAorCQkJCQkJCSBm cmFtZV9saW1pdGVkLAorCQkJCQkJCSAmZmJyZWYsCisJCQkJCQkJIENIQU1FTElVTV9DSEVDS19B TkFMT0cpKTsKKworCX0KKworCWZyZWVfbHV0KGdhbW1hX2xpbmVhcik7CisJZnJlZV9sdXQoZGVn YW1tYV9saW5lYXIpOworCisJaWd0X3JlcXVpcmUoaGFzX2Jyb2FkY2FzdF9yZ2Jfb3V0cHV0KTsK K30KKworc3RhdGljIHZvaWQKK3J1bl90ZXN0c19mb3JfcGlwZShkYXRhX3QgKmRhdGEsIGVudW0g cGlwZSBwKQoreworCWlndF9waXBlX3QgKnBpcGU7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisJ ZG91YmxlIGRlbHRhOworCWludCBpOworCWNvbG9yX3QgcmVkX2dyZWVuX2JsdWVbXSA9IHsKKwkJ eyAxLjAsIDAuMCwgMC4wIH0sCisJCXsgMC4wLCAxLjAsIDAuMCB9LAorCQl7IDAuMCwgMC4wLCAx LjAgfQorCX07CisKKwlpZ3RfZml4dHVyZSB7CisKKwkJaWd0X3JlcXVpcmUocCA8IGRhdGEtPmRp c3BsYXkubl9waXBlcyk7CisKKwkJcGlwZSA9ICZkYXRhLT5kaXNwbGF5LnBpcGVzW3BdOworCQlp Z3RfcmVxdWlyZShwaXBlLT5uX3BsYW5lcyA+PSAwKTsKKworCQlwcmltYXJ5ID0gaWd0X3BpcGVf Z2V0X3BsYW5lX3R5cGUocGlwZSwgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSk7CisKKwkJaWYgKGln dF9waXBlX29ial9oYXNfcHJvcCgmZGF0YS0+ZGlzcGxheS5waXBlc1twXSwKKwkJCQkJICBJR1Rf Q1JUQ19ERUdBTU1BX0xVVF9TSVpFKSkgeworCQkJZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSA9CisJ CQkJaWd0X3BpcGVfb2JqX2dldF9wcm9wKCZkYXRhLT5kaXNwbGF5LnBpcGVzW3BdLAorCQkJCQkJ SUdUX0NSVENfREVHQU1NQV9MVVRfU0laRSk7CisJCQlpZ3RfYXNzZXJ0X2x0KDAsIGRhdGEtPmRl Z2FtbWFfbHV0X3NpemUpOworCQl9CisKKwkJaWYgKGlndF9waXBlX29ial9oYXNfcHJvcCgmZGF0 YS0+ZGlzcGxheS5waXBlc1twXSwKKwkJCQkJICBJR1RfQ1JUQ19HQU1NQV9MVVRfU0laRSkpIHsK KwkJCWRhdGEtPmdhbW1hX2x1dF9zaXplID0KKwkJCQlpZ3RfcGlwZV9vYmpfZ2V0X3Byb3AoJmRh dGEtPmRpc3BsYXkucGlwZXNbcF0sCisJCQkJCQkgICAgICBJR1RfQ1JUQ19HQU1NQV9MVVRfU0la RSk7CisJCQlpZ3RfYXNzZXJ0X2x0KDAsIGRhdGEtPmdhbW1hX2x1dF9zaXplKTsKKwkJfQorCisJ CWlndF9kaXNwbGF5X3JlcXVpcmVfb3V0cHV0X29uX3BpcGUoJmRhdGEtPmRpc3BsYXksIHApOwor CX0KKworCWRhdGEtPmNvbG9yX2RlcHRoID0gODsKKwlkZWx0YSA9IDEuMCAvICgxIDw8IGRhdGEt PmNvbG9yX2RlcHRoKTsKKworCWlndF9kZXNjcmliZSgiQ29tcGFyZSBhZnRlciBhcHBseWluZyBj dG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0cml4Iik7CisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy1j dG0tcmVkLXRvLWJsdWUiLCBrbXN0ZXN0X3BpcGVfbmFtZShwKSkgeworCQljb2xvcl90IGJsdWVf Z3JlZW5fYmx1ZVtdID0geworCQkJeyAwLjAsIDAuMCwgMS4wIH0sCisJCQl7IDAuMCwgMS4wLCAw LjAgfSwKKwkJCXsgMC4wLCAwLjAsIDEuMCB9CisJCX07CisJCWRvdWJsZSBjdG1bXSA9IHsgMC4w LCAwLjAsIDAuMCwKKwkJCQkwLjAsIDEuMCwgMC4wLAorCQkJCTEuMCwgMC4wLCAxLjAgfTsKKwkJ aWd0X2Fzc2VydCh0ZXN0X3BpcGVfY3RtKGRhdGEsIHByaW1hcnksIHJlZF9ncmVlbl9ibHVlLAor CQkJCQkgYmx1ZV9ncmVlbl9ibHVlLCBjdG0pKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUoIkNvbXBh cmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9z dWJ0ZXN0X2YoInBpcGUtJXMtY3RtLWdyZWVuLXRvLXJlZCIsIGttc3Rlc3RfcGlwZV9uYW1lKHAp KSB7CisJCWNvbG9yX3QgcmVkX3JlZF9ibHVlW10gPSB7CisJCQl7IDEuMCwgMC4wLCAwLjAgfSwK KwkJCXsgMS4wLCAwLjAsIDAuMCB9LAorCQkJeyAwLjAsIDAuMCwgMS4wIH0KKwkJfTsKKwkJZG91 YmxlIGN0bVtdID0geyAxLjAsIDEuMCwgMC4wLAorCQkJCTAuMCwgMC4wLCAwLjAsCisJCQkJMC4w LCAwLjAsIDEuMCB9OworCQlpZ3RfYXNzZXJ0KHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwg cmVkX2dyZWVuX2JsdWUsCisJCQkJCSByZWRfcmVkX2JsdWUsIGN0bSkpOworCX0KKworCWlndF9k ZXNjcmliZSgiQ29tcGFyZSBhZnRlciBhcHBseWluZyBjdG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0 cml4Iik7CisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy1jdG0tYmx1ZS10by1yZWQiLCBrbXN0ZXN0 X3BpcGVfbmFtZShwKSkgeworCQljb2xvcl90IHJlZF9ncmVlbl9yZWRbXSA9IHsKKwkJCXsgMS4w LCAwLjAsIDAuMCB9LAorCQkJeyAwLjAsIDEuMCwgMC4wIH0sCisJCQl7IDEuMCwgMC4wLCAwLjAg fQorCQl9OworCQlkb3VibGUgY3RtW10gPSB7IDEuMCwgMC4wLCAxLjAsCisJCQkJMC4wLCAxLjAs IDAuMCwKKwkJCQkwLjAsIDAuMCwgMC4wIH07CisJCWlndF9hc3NlcnQodGVzdF9waXBlX2N0bShk YXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKKwkJCQkJIHJlZF9ncmVlbl9yZWQsIGN0bSkp OworCX0KKworCS8qIFdlIHRlc3RzIGEgZmV3IHZhbHVlcyBhcm91bmQgdGhlIGV4cGVjdGVkIHJl c3VsdCBiZWNhdXNlCisJICogdGhlIGl0IGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlIHdlJ3JlIGRl YWxpbmcgd2l0aCwgd2UgY2FuCisJICogZWl0aGVyIGdldCBjbGFtcGVkIG9yIHJvdW5kZWQgdmFs dWVzIGFuZCB3ZSBhbHNvIG5lZWQgdG8KKwkgKiBhY2NvdW50IGZvciBvZGQgbnVtYmVyIG9mIGl0 ZW1zIGluIHRoZSBMVVRzLgorCSAqLworCWlndF9kZXNjcmliZSgiQ29tcGFyZSBhZnRlciBhcHBs eWluZyBjdG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0cml4Iik7CisJaWd0X3N1YnRlc3RfZigicGlw ZS0lcy1jdG0tMC0yNSIsIGttc3Rlc3RfcGlwZV9uYW1lKHApKSB7CisJCWNvbG9yX3QgZXhwZWN0 ZWRfY29sb3JzW10gPSB7CisJCQl7IDAuMCwgfSwgeyAwLjAsIH0sIHsgMC4wLCB9CisJCX07CisJ CWRvdWJsZSBjdG1bXSA9IHsgMC4yNSwgMC4wLCAgMC4wLAorCQkJCSAwLjAsICAwLjI1LCAwLjAs CisJCQkJIDAuMCwgIDAuMCwgIDAuMjUgfTsKKwkJYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKwkJ Zm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJZXhwZWN0ZWRfY29sb3JzWzBdLnIgPQorCQkJ CWV4cGVjdGVkX2NvbG9yc1sxXS5nID0KKwkJCQlleHBlY3RlZF9jb2xvcnNbMl0uYiA9CisJCQkJ MC4yNSArIGRlbHRhICogKGkgLSAyKTsKKwkJCXN1Y2Nlc3MgfD0gdGVzdF9waXBlX2N0bShkYXRh LCBwcmltYXJ5LAorCQkJCQkJIHJlZF9ncmVlbl9ibHVlLAorCQkJCQkJIGV4cGVjdGVkX2NvbG9y cywgY3RtKTsKKwkJfQorCQlpZ3RfYXNzZXJ0KHN1Y2Nlc3MpOworCX0KKworCWlndF9kZXNjcmli ZSgiQ29tcGFyZSBhZnRlciBhcHBseWluZyBjdG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0cml4Iik7 CisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy1jdG0tMC01Iiwga21zdGVzdF9waXBlX25hbWUocCkp IHsKKwkJY29sb3JfdCBleHBlY3RlZF9jb2xvcnNbXSA9IHsKKwkJCXsgMC4wLCB9LCB7IDAuMCwg fSwgeyAwLjAsIH0KKwkJfTsKKwkJZG91YmxlIGN0bVtdID0geyAwLjUsIDAuMCwgMC4wLAorCQkJ CSAwLjAsIDAuNSwgMC4wLAorCQkJCSAwLjAsIDAuMCwgMC41IH07CisJCWJvb2wgc3VjY2VzcyA9 IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWV4cGVjdGVkX2NvbG9y c1swXS5yID0KKwkJCQlleHBlY3RlZF9jb2xvcnNbMV0uZyA9CisJCQkJZXhwZWN0ZWRfY29sb3Jz WzJdLmIgPQorCQkJCTAuNSArIGRlbHRhICogKGkgLSAyKTsKKwkJCXN1Y2Nlc3MgfD0gdGVzdF9w aXBlX2N0bShkYXRhLCBwcmltYXJ5LAorCQkJCQkJIHJlZF9ncmVlbl9ibHVlLAorCQkJCQkJIGV4 cGVjdGVkX2NvbG9ycywgY3RtKTsKKwkJfQorCQlpZ3RfYXNzZXJ0KHN1Y2Nlc3MpOworCX0KKwor CWlndF9kZXNjcmliZSgiQ29tcGFyZSBhZnRlciBhcHBseWluZyBjdG0gbWF0cml4ICYgaWRlbnRp dHkgbWF0cml4Iik7CisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy1jdG0tMC03NSIsIGttc3Rlc3Rf cGlwZV9uYW1lKHApKSB7CisJCWNvbG9yX3QgZXhwZWN0ZWRfY29sb3JzW10gPSB7CisJCQl7IDAu MCwgfSwgeyAwLjAsIH0sIHsgMC4wLCB9CisJCX07CisJCWRvdWJsZSBjdG1bXSA9IHsgMC43NSwg MC4wLCAgMC4wLAorCQkJCSAwLjAsICAwLjc1LCAwLjAsCisJCQkJIDAuMCwgIDAuMCwgIDAuNzUg fTsKKwkJYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykg eworCQkJZXhwZWN0ZWRfY29sb3JzWzBdLnIgPQorCQkJCWV4cGVjdGVkX2NvbG9yc1sxXS5nID0K KwkJCQlleHBlY3RlZF9jb2xvcnNbMl0uYiA9CisJCQkJMC43NSArIGRlbHRhICogKGkgLSAzKTsK KwkJCXN1Y2Nlc3MgfD0gdGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LAorCQkJCQkJIHJlZF9n cmVlbl9ibHVlLAorCQkJCQkJIGV4cGVjdGVkX2NvbG9ycywgY3RtKTsKKwkJfQorCQlpZ3RfYXNz ZXJ0KHN1Y2Nlc3MpOworCX0KKworCWlndF9kZXNjcmliZSgiQ29tcGFyZSBhZnRlciBhcHBseWlu ZyBjdG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0cml4Iik7CisJaWd0X3N1YnRlc3RfZigicGlwZS0l cy1jdG0tbWF4Iiwga21zdGVzdF9waXBlX25hbWUocCkpIHsKKwkJY29sb3JfdCBmdWxsX3JnYltd ID0geworCQkJeyAxLjAsIDAuMCwgMC4wIH0sCisJCQl7IDAuMCwgMS4wLCAwLjAgfSwKKwkJCXsg MC4wLCAwLjAsIDEuMCB9CisJCX07CisJCWRvdWJsZSBjdG1bXSA9IHsgMTAwLjAsICAgMC4wLCAg IDAuMCwKKwkJCQkgMC4wLCAgIDEwMC4wLCAgIDAuMCwKKwkJCQkgMC4wLCAgICAgMC4wLCAxMDAu MCB9OworCisJCS8qIENoZXJyeVZpZXcgZ2VuZXJhdGVzIHZhbHVlcyBvbiAxMGJpdHMgdGhhdCB3 ZQorCQkgKiBwcm9kdWNlIHdpdGggYW4gOCBiaXRzIHBlciBjb2xvciBmcmFtZWJ1ZmZlci4KKwkJ ICovCisJCWlndF9yZXF1aXJlKCFJU19DSEVSUllWSUVXKGRhdGEtPmRldmlkKSk7CisKKwkJaWd0 X2Fzc2VydCh0ZXN0X3BpcGVfY3RtKGRhdGEsIHByaW1hcnksIHJlZF9ncmVlbl9ibHVlLAorCQkJ CQkgZnVsbF9yZ2IsIGN0bSkpOworCX0KKworCWlndF9kZXNjcmliZSgiQ29tcGFyZSBhZnRlciBh cHBseWluZyBjdG0gbWF0cml4ICYgaWRlbnRpdHkgbWF0cml4Iik7CisJaWd0X3N1YnRlc3RfZigi cGlwZS0lcy1jdG0tbmVnYXRpdmUiLCBrbXN0ZXN0X3BpcGVfbmFtZShwKSkgeworCQljb2xvcl90 IGFsbF9ibGFja1tdID0geworCQkJeyAwLjAsIDAuMCwgMC4wIH0sCisJCQl7IDAuMCwgMC4wLCAw LjAgfSwKKwkJCXsgMC4wLCAwLjAsIDAuMCB9CisJCX07CisJCWRvdWJsZSBjdG1bXSA9IHsgLTEu MCwgIDAuMCwgIDAuMCwKKwkJCQkgMC4wLCAtMS4wLCAgMC4wLAorCQkJCSAwLjAsICAwLjAsIC0x LjAgfTsKKwkJaWd0X2Fzc2VydCh0ZXN0X3BpcGVfY3RtKGRhdGEsIHByaW1hcnksIHJlZF9ncmVl bl9ibHVlLAorCQkJCQkgYWxsX2JsYWNrLCBjdG0pKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUoIkNv bXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWln dF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3RtLWxpbWl0ZWQtcmFuZ2UiLCBrbXN0ZXN0X3BpcGVfbmFt ZShwKSkKKwkJdGVzdF9waXBlX2xpbWl0ZWRfcmFuZ2VfY3RtKGRhdGEsIHByaW1hcnkpOworCisJ aWd0X2Rlc2NyaWJlKCJDb21wYXJlIG1heGVkIG91dCBnYW1tYSBMVVQgYW5kIHNvbGlkIGNvbG9y IGxpbmVhciBMVVQiKTsKKwlpZ3Rfc3VidGVzdF9mKCJwaXBlLSVzLWRlZ2FtbWEiLCBrbXN0ZXN0 X3BpcGVfbmFtZShwKSkKKwkJdGVzdF9waXBlX2RlZ2FtbWEoZGF0YSwgcHJpbWFyeSk7CisKKwlp Z3RfZGVzY3JpYmUoIkNvbXBhcmUgbWF4ZWQgb3V0IGdhbW1hIExVVCBhbmQgc29saWQgY29sb3Ig bGluZWFyIExVVCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtZ2FtbWEiLCBrbXN0ZXN0X3Bp cGVfbmFtZShwKSkKKwkJdGVzdF9waXBlX2dhbW1hKGRhdGEsIHByaW1hcnkpOworCisJaWd0X2Zp eHR1cmUgeworCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7CisJCWRpc2FibGVfZ2Ft bWEocHJpbWFyeS0+cGlwZSk7CisJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOworCQlpZ3Rf ZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOworCX0KK30KKworaWd0X21haW4KK3sKKwlk YXRhX3QgZGF0YSA9IHt9OworCWVudW0gcGlwZSBwaXBlOworCisJaWd0X2ZpeHR1cmUgeworCQlk YXRhLmRybV9mZCA9IGRybV9vcGVuX2RyaXZlcl9tYXN0ZXIoRFJJVkVSX0FOWSk7CisJCWlmIChp c19pOTE1X2RldmljZShkYXRhLmRybV9mZCkpCisJCQlkYXRhLmRldmlkID0gaW50ZWxfZ2V0X2Ry bV9kZXZpZChkYXRhLmRybV9mZCk7CisJCWRhdGEuY2hhbWVsaXVtID0gY2hhbWVsaXVtX2luaXQo ZGF0YS5kcm1fZmQpOworCQlpZ3RfcmVxdWlyZShkYXRhLmNoYW1lbGl1bSk7CisKKwkJZGF0YS5w b3J0cyA9IGNoYW1lbGl1bV9nZXRfcG9ydHMoZGF0YS5jaGFtZWxpdW0sCisJCQkJCQkgJmRhdGEu cG9ydF9jb3VudCk7CisKKwkJa21zdGVzdF9zZXRfdnRfZ3JhcGhpY3NfbW9kZSgpOworCQlpZ3Rf ZGlzcGxheV9yZXF1aXJlKCZkYXRhLmRpc3BsYXksIGRhdGEuZHJtX2ZkKTsKKwkJaWd0X3JlcXVp cmUoZGF0YS5kaXNwbGF5LmlzX2F0b21pYyk7CisJfQorCisJZm9yX2VhY2hfcGlwZV9zdGF0aWMo cGlwZSkKKwkJaWd0X3N1YnRlc3RfZ3JvdXAKKwkJCXJ1bl90ZXN0c19mb3JfcGlwZSgmZGF0YSwg cGlwZSk7CisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0ZXN0IGNhc2UgZ2FtbWEgbHV0IHNpemUi KTsKKwlpZ3Rfc3VidGVzdF9mKCJwaXBlLWludmFsaWQtZ2FtbWEtbHV0LXNpemVzIikKKwkJaW52 YWxpZF9nYW1tYV9sdXRfc2l6ZXMoJmRhdGEpOworCisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0 ZXN0IGNhc2UgZGVnYW1tYSBsdXQgc2l6ZSIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtaW52YWxp ZC1kZWdhbW1hLWx1dC1zaXplcyIpCisJCWludmFsaWRfZGVnYW1tYV9sdXRfc2l6ZXMoJmRhdGEp OworCisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0ZXN0IGNhc2UgY3RtIG1hdHJpeCBzaXplIik7 CisJaWd0X3N1YnRlc3RfZigicGlwZS1pbnZhbGlkLWN0bS1tYXRyaXgtc2l6ZXMiKQorCQlpbnZh bGlkX2N0bV9tYXRyaXhfc2l6ZXMoJmRhdGEpOworCisJaWd0X2ZpeHR1cmUgeworCQlpZ3RfZGlz cGxheV9maW5pKCZkYXRhLmRpc3BsYXkpOworCX0KK30KLS0gCjIuNy40CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppZ3QtZGV2IG1haWxpbmcgbGlzdApp Z3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK