From mboxrd@z Thu Jan 1 00:00:00 1970 From: Manasi Navare Subject: [PATCH v2 i-g-t] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Wed, 7 Dec 2016 14:04:52 -0800 Message-ID: <1481148292-25848-1-git-send-email-manasi.d.navare@intel.com> References: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id ED2F36E1B9 for ; Wed, 7 Dec 2016 22:02:44 +0000 (UTC) In-Reply-To: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: Daniel Vetter List-Id: intel-gfx@lists.freedesktop.org VGhpcyBpcyB0aGUgdXNlcnNwYWNlIGNvbXBvbmVudCBvZiB0aGUgRGlzcGxheXBvcnQgQ29tcGxp YW5jZQp0ZXN0aW5nIHNvZnR3YXJlIHJlcXVpcmVkIGZvciBjb21wbGlhbmNlIHRlc3Rpbmcgb2Yg dGhlIEk5MTUKRGlzcGxheSBQb3J0IGRyaXZlci4gVGhpcyBtdXN0IGJlIHJ1bm5pbmcgaW4gb3Jk ZXIgdG8gc3VjY2Vzc2Z1bGx5CmNvbXBsZXRlIERpc3BsYXkgUG9ydCBjb21wbGlhbmNlIHRlc3Rp bmcuIFRoaXMgYXBwIGFuZCB0aGUga2VybmVsCmNvZGUgdGhhdCBhY2NvbXBhbmllcyBpdCBoYXMg YmVlbiB3cml0dGVuIHRvIHNhdGlmeSB0aGUgcmVxdWlyZW1lbnRzCm9mIHRoZSBEaXNwbGF5cG9y dCBMaW5rIENUUyAxLjIgcmV2MS4xIHNwZWNpZmljYXRpb24gZnJvbSBWRVNBLgpOb3RlIHRoYXQg dGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGVEUCBjb21wbGlhbmNlIHRlc3Rpbmcu ClRoaXMgdXRpbGl0eSBoYXMgYW4gYXV0b21hdGlvbiBzdXBwb3J0IGZvciB0aGUgTGluayB0cmFp bmluZyB0ZXN0cwooNC4zLjEuMS4gLSA0LjMuMi4zKSwgRURJRCB0ZXN0cyAoNC4yLjIuMwotIDQu Mi4yLjYpIGFuZCBWaWRlbyBQYXR0ZXJuIGdlbmVyYXRpb24gdGVzdHMgKDQuMy4zLjEpIGZyb20g Q1RTCnNwZWNpZmljYXRpb24gMS4yIFJldiAxLjEuCgpUaGlzIHRvb2wgaGFzIHRoZSBzdXBwb3J0 IGZvciByZXNwb25kaW5nIHRvIHRoZSBob3RwbHVnIHVldmVudHMKc2VudCBieSBjb21wbGlhbmNl IHRlc3R0aW5nIHVuaXQgYWZ0ZXIgZWFjaCB0ZXN0LgoKVGhlIExpbnV4IERVVCBydW5uaW5nIHRo aXMgdXRpbGl0eSBtdXN0IGJlIGluIHRleHQgKGNvbnNvbGUpIG1vZGUKYW5kIGNhbm5vdCBoYXZl IGFueSBvdGhlciBkaXNwbGF5IG1hbmFnZXIgcnVubmluZy4gU2luY2UgdGhpcyB1c2VzCnN5c2Zz IG5vZGVzIGZvciBrZXJuZWwgaW50ZXJhY3Rpb24sIHRoaXMgdXRpbGl0eSBzaG91bGQgYmUgcnVu IGFzClJvb3QuIE9uY2UgdGhpcyB1c2VyIGFwcGxpY2F0aW9uIGlzIHVwIGFuZCBydW5uaW5nLCB3 YWl0aW5nIGZvcgp0ZXN0IHJlcXVlc3RzLCB0aGUgdGVzdCBhcHBsaWFuY2Ugc29mdHdhcmUgb24g dGhlIHdpbmRvd3MgaG9zdApjYW4gbm93IGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgY29tcGxpYW5j ZSB0ZXN0cy4KClRoaXMgYXBwIGlzIGJhc2VkIG9uIHNvbWUgcHJpb3Igd29yayBkb25lIGluIEFw cmlsIDIwMTUgKGJ5ClRvZGQgUHJldml0ZSA8dHByZXZpdGVAZ21haWwuY29tPikKCnYyOgoqIEFk ZCBtb2RlIHVuc2V0IG9uIGhvdHBsdWcgdWV2ZW50IG9uIGRpc2Nvbm5lY3QgKE1hbmFzaSBOYXZh cmUpCgpDYzogUGV0cmkgTGF0dmFsYSA8cGV0cmkubGF0dmFsYUBpbnRlbC5jb20+CkNjOiBNYXJp dXMgVmxhZCA8bWFyaXVzLmMudmxhZEBpbnRlbC5jb20+CkNjOiBEYW5pZWwgVmV0dGVyIDxkYW5p ZWwudmV0dGVyQGZmd2xsLmNoPgpTaWduZWQtb2ZmLWJ5OiBNYW5hc2kgTmF2YXJlIDxtYW5hc2ku ZC5uYXZhcmVAaW50ZWwuY29tPgotLS0KIHRvb2xzL01ha2VmaWxlLmFtICAgICAgICAgICAgICAg ICAgIHwgICAgMyArLQogdG9vbHMvTWFrZWZpbGUuc291cmNlcyAgICAgICAgICAgICAgfCAgICA3 ICsKIHRvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuYyAgICAgICAgIHwgMTA2MCArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5oICAg ICAgICAgfCAgIDM1ICsrCiB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlX2hvdHBsdWcuYyB8ICAx MjMgKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAxMjI3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmgKIGNyZWF0ZSBtb2RlIDEw MDY0NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlX2hvdHBsdWcuYwoKZGlmZiAtLWdpdCBhL3Rv b2xzL01ha2VmaWxlLmFtIGIvdG9vbHMvTWFrZWZpbGUuYW0KaW5kZXggMThmODZmNi4uZWFjNmQ2 NCAxMDA2NDQKLS0tIGEvdG9vbHMvTWFrZWZpbGUuYW0KKysrIGIvdG9vbHMvTWFrZWZpbGUuYW0K QEAgLTEzLDcgKzEzLDcgQEAgQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikgLUkkKHRvcF9z cmNkaXIpL2xpYgogQU1fQ0ZMQUdTID0gJChERUJVR19DRkxBR1MpICQoRFJNX0NGTEFHUykgJChQ Q0lBQ0NFU1NfQ0ZMQUdTKSAkKENXQVJORkxBR1MpIFwKIAkgICAgJChDQUlST19DRkxBR1MpICQo TElCVU5XSU5EX0NGTEFHUykgLURQS0dEQVRBRElSPVwiJChwa2dkYXRhZGlyKVwiIFwKIAkgICAg JChXRVJST1JfQ0ZMQUdTKQotTERBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmludGVsX3Rv b2xzLmxhCitMREFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaW50ZWxfdG9vbHMubGEgJChH TElCX0xJQlMpCiBBTV9MREZMQUdTID0gLVdsLC0tYXMtbmVlZGVkCiAKIApAQCAtMjQsNiArMjQs NyBAQCBtb2R1bGVkaXIgPSAkKGxpYmRpcikKIGludGVsX2F1YmR1bXBfbGFfTERGTEFHUyA9IC1t b2R1bGUgLWF2b2lkLXZlcnNpb24gLW5vLXVuZGVmaW5lZAogaW50ZWxfYXViZHVtcF9sYV9TT1VS Q0VTID0gYXViZHVtcC5jCiBpbnRlbF9hdWJkdW1wX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGly KS9saWIvbGliaW50ZWxfdG9vbHMubGEgLWxkbAoraW50ZWxfZHBfY29tcGxpYW5jZV9sYV9MSUJB REQgPSAkKExEQUREKQogCiBiaW5fU0NSSVBUUyA9IGludGVsX2F1YmR1bXAKIENMRUFORklMRVMg PSAkKGJpbl9TQ1JJUFRTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcyBiL3Rv b2xzL01ha2VmaWxlLnNvdXJjZXMKaW5kZXggYmU1ODg3MS4uMDljMDY2NyAxMDA2NDQKLS0tIGEv dG9vbHMvTWFrZWZpbGUuc291cmNlcworKysgYi90b29scy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0x Myw2ICsxMyw3IEBAIHRvb2xzX3Byb2dfbGlzdHMgPQkJXAogCWludGVsX2Jpb3NfcmVhZGVyCVwK IAlpbnRlbF9kaXNwbGF5X2NyYwlcCiAJaW50ZWxfZGlzcGxheV9wb2xsZXIJXAorCWludGVsX2Rw X2NvbXBsaWFuY2UJXAogCWludGVsX2ZvcmNld2FrZWQJXAogCWludGVsX2dwdV9mcmVxdWVuY3kJ XAogCWludGVsX2Zpcm13YXJlX2RlY29kZQlcCkBAIC01NSwzICs1Niw5IEBAIGludGVsX2wzX3Bh cml0eV9TT1VSQ0VTID0JXAogCWludGVsX2wzX3Bhcml0eS5oCVwKIAlpbnRlbF9sM191ZGV2X2xp c3RlbmVyLmMKIAoraW50ZWxfZHBfY29tcGxpYW5jZV9TT1VSQ0VTID0gXAorICAgICAgICBpbnRl bF9kcF9jb21wbGlhbmNlLmMgXAorICAgICAgICBpbnRlbF9kcF9jb21wbGlhbmNlLmggXAorICAg ICAgICBpbnRlbF9kcF9jb21wbGlhbmNlX2hvdHBsdWcuYyBcCisgICAgICAgICQoTlVMTCkKKwpk aWZmIC0tZ2l0IGEvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5jIGIvdG9vbHMvaW50ZWxfZHBf Y29tcGxpYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2QzZjQK LS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKQEAgLTAsMCAr MSwxMDYwIEBACisvKgorICogQ29weXJpZ2h0ID8gMjAxNC0yMDE1IEludGVsIENvcnBvcmF0aW9u CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFs IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs aW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVi bGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0 aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz aW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGlu Y2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBT b2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5H IEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisg KiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAg SU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO RworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIERp c3BsYXlwb3J0IENvbXBsaWFuY2UgVGVzdGluZyBBcHBsaWNhdGlvbgorICoKKyAqIFRoaXMgaXMg dGhlIHVzZXJzcGFjZSBjb21wb25lbnQgb2YgdGhlIERpc3BsYXlwb3J0IENvbXBsaWFuY2UgdGVz dGluZworICogc29mdHdhcmUgcmVxdWlyZWQgZm9yIGNvbXBsaWFuY2UgdGVzdGluZyBvZiB0aGUg STkxNSBEaXNwbGF5IFBvcnQgZHJpdmVyLgorICogVGhpcyBtdXN0IGJlIHJ1bm5pbmcgaW4gb3Jk ZXIgdG8gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlIERpc3BsYXkgUG9ydAorICogY29tcGxpYW5jZSB0 ZXN0aW5nLiBUaGlzIGFwcCBhbmQgdGhlIGtlcm5lbCBjb2RlIHRoYXQgYWNjb21wYW5pZXMgaXQg aGFzIGJlZW4KKyAqIHdyaXR0ZW4gdG8gc2F0aWZ5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIERp c3BsYXlwb3J0IExpbmsgQ1RTIDEuMiByZXYxLjEKKyAqIHNwZWNpZmljYXRpb24gZnJvbSBWRVNB LiBOb3RlIHRoYXQgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGVEUAorICogY29t cGxpYW5jZSB0ZXN0aW5nLgorICoKKyAqIENvbXBsaWFuY2UgVGVzdGluZyByZXF1aXJlcyBzZXZl cmFsIGNvbXBvbmVudHM6CisgKiAgIC0gQSBrZXJuZWwgYnVpbGQgdGhhdCBjb250YWlucyB0aGUg cGF0Y2ggc2V0IGZvciBEUCBjb21wbGlhbmNlIHN1cHBvcnQKKyAqICAgLSBBIERpc3BsYXlwb3J0 IENvbXBsaWFuY2UgVGVzdGluZyBhcHBsaWFuY2Ugc3VjaCBhcyBVbmlncmFmLURQUjEyMAorICog ICAtIFRoaXMgdXNlciBhcHBsaWNhdGlvbgorICogICAtIEEgd2luZG93cyBob3N0IG1hY2hpbmUg dG8gcnVuIHRoZSBEUFIgdGVzdCBzb2Z0d2FyZQorICogICAtIFJvb3QgYWNjZXNzIG9uIHRoZSBE VVQgZHVlIHRvIHRoZSB1c2Ugb2Ygc3lzZnMgdXRpbGl0eQorICoKKyAqIFRlc3QgU2V0dXA6Cisg KiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHRoZSB3aW5kb3dzIGhvc3QsIHRlc3Qg YXBwbGlhbmNlIGFuZCBEVVQKKyAqIGJlIGZyZXNobHkgcmVzdGFydGVkIGJlZm9yZSBhbnkgdGVz dGluZyBiZWdpbnMgdG8gZW5zdXJlIHRoYXQgYW55IHByZXZpb3VzCisgKiBjb25maWd1cmF0aW9u cyBhbmQgc2V0dGluZ3Mgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggdGVzdCBwcm9jZXNzLiBSZWZl ciB0bworICogdGhlIHRlc3QgYXBwbGlhbmNlIGRvY3VtZW50YXRpb24gZm9yIHNldHVwLCBzb2Z0 d2FyZSBpbnN0YWxsYXRpb24gYW5kCisgKiBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhhdCBkZXZp Y2UuCisgKgorICogVGhlIExpbnV4IERVVCBtdXN0IGJlIGluIHRleHQgKGNvbnNvbGUpIG1vZGUg YW5kIGNhbm5vdCBoYXZlIGFueSBvdGhlcgorICogZGlzcGxheSBtYW5hZ2VyIHJ1bm5pbmcuIFlv dSBtdXN0IGJlIGxvZ2dlZCBpbiBhcyByb290IHRvIHJ1biB0aGlzIHVzZXIgYXBwLgorICogT25j ZSB0aGUgdXNlciBhcHBsaWNhdGlvbiBpcyB1cCBhbmQgcnVubmluZywgd2FpdGluZyBmb3IgdGVz dCByZXF1ZXN0cywgdGhlCisgKiBzb2Z0d2FyZSBvbiB0aGUgd2luZG93cyBob3N0IGNhbiBub3cg YmUgdXNlZCB0byBleGVjdXRlIHRoZSBjb21wbGlhbmNlIHRlc3RzLgorICoKKyAqIFRoaXMgdXNl cnNwYWNlIGFwcGxpY2F0aW9uIHN1cHBvcnRzIGZvbGxvd2luZyB0ZXN0cyBmcm9tIHRoZSBEUCBD VFMgU3BlYworICogUmV2IDEuMToKKyAqICAgLSBMaW5rIFRyYWluaW5nIFRlc3RzOiBTdXBwb3J0 cyB0ZXN0cyA0LjMuMS4xIHRvIDQuMy4yLjMKKyAqICAgLSBFRElEIFRlc3RzOiBTdXBwb3J0cyBF RElEIHJlYWQgKDQuMi4yLjMpLEVESUQgUmVhZCBmYWlsdXJlIGFuZCBjb3JydXB0aW9uCisgKiAg ICAgZGV0ZWN0aW9uIHRlc3RzICg0LjIuMi40LCA0LjIuMi41LCA0LjIuMi42KQorICogICAtIFZp ZGVvIFBhdHRlcm4gZ2VuZXJhdGlvbiB0ZXN0czogVGhpcyBzdXBwb3J0cyBvbmx5IHRoZSAyNCBh bmQgMThicHAgY29sb3IKKyAqICAgICByYW1wIHRlc3QgcGF0dGVybiAoNC4zLjMuMSkuCisgKgor ICogQ29ubmVjdGlvbnMgKHJlcXVpcmVkKToKKyAqICAgLSBUZXN0IEFwcGxpYW5jZSBjb25uZWN0 ZWQgdG8gdGhlIGV4dGVybmFsIERpc3BsYXlwb3J0IGNvbm5lY3RvciBvbiB0aGUgRFVUCisgKiAg IC0gVGVzdCBBcHBsaWFuY2UgTW9uaXRvciBPdXQgY29ubmVjdGVkIHRvIERpc3BsYXlwb3J0IGNv bm5lY3RvciBvbiB0aGUKKyAqIG1vbml0b3IKKyAqICAgLSBUZXN0IGFwcGxpYW5jZSBjb25uZWN0 ZWQgdG8gdGhlIFdpbmRvd3MgSG9zdCB2aWEgVVNCCisgKgorICogRGVidWdmcyBGaWxlczoKKyAq IFRoZSBmaWxlIHJvb3QgZm9yIGFsbCAgdGhlIGRlYnVnZnMgZmlsZToKKyAqIC9zeXMva2VybmVs L2RlYnVnL2RyaS8wLworICoKKyAqIFRoZSBzcGVjaWZpYyBmaWxlcyBhcmUgYXMgZm9sbG93czoK KyAqCisgKiBpOTE1X2RwX3Rlc3RfYWN0aXZlCisgKiBBIHNpbXBsZSBmbGFnIHRoYXQgaW5kaWNh dGVzIHdoZXRoZXIgb3Igbm90IGNvbXBsaWFuY2UgdGVzdGluZyBpcyBjdXJyZW50bHkKKyAqIGFj dGl2ZSBpbiB0aGUga2VybmVsLiBUaGlzIGZsYWcgaXMgcG9sbGVkIGJ5IHVzZXJzcGFjZSBhbmQg b25jZSBzZXQsIGludm9rZXMKKyAqIHRoZSB0ZXN0IGhhbmRsZXIgaW4gdGhlIHVzZXIgYXBwLiBU aGlzIGZsYWcgaXMgc2V0IGJ5IHRoZSB0ZXN0IGhhbmRsZXIgaW4gdGhlCisgKiBrZXJuZWwgYWZ0 ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXJzIHJlcXVlc3RlZCBieSB0aGUgdGVzdCBhcHBsaWFuY2Uu CisgKgorICogaTkxNV9kcF90ZXN0X2RhdGEKKyAqIFRlc3QgZGF0YSBpcyB1c2VkIGJ5IHRoZSBr ZXJuZWwgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIGFwcC4gRWc6IEluCisgKiBjYXNl IG9mIEVESUQgdGVzdHMsIHRoZSBkYXRhIHRoYXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB1c2Vyc3Bh Y2UgaXMgdGhlIHZpZGVvCisgKiBtb2RlIHRvIGJlIHNldCBmb3IgdGhlIHRlc3QuCisgKiBJbiBj YXNlIG9mIHZpZGVvIHBhdHRlcm4gdGVzdCwgdGhlIGRhdGEgdGhhdCBpcyBkZWxpdmVyZWQgdG8g dGhlIHVzZXJzcGFjZSBpcworICogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHRlc3QgcGF0 dGVybiBhbmQgdGhlIGJpdHMgcGVyIGNvbG9yIHZhbHVlLgorICoKKyAqIGk5MTVfZHBfdGVzdF90 eXBlCisgKiBUaGUgdGVzdCB0eXBlIHZhcmlhYmxlIGluc3RydWN0cyB0aGUgdXNlciBhcHAgYXMg dG8gd2hhdCB0aGUgcmVxdWVzdGVkIHRlc3QKKyAqIHdhcyBmcm9tIHRoZSBzaW5rIGRldmljZS4g VGhlc2UgdmFsdWVzIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgYXBwbGljYXRpb24ncworICog bWFpbiBpbXBsZW1lbnRhdGlvbiBmaWxlIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZh bHVlcyBkZWZpbmVkIGluIHRoZQorICoga2VybmVsJ3MgZHJtX2RwX2hlbHBlci5oIGZpbGUuCisg KiBUaGlzIGFwcCBpcyBiYXNlZCBvbiBzb21lIHByaW9yIHdvcmsgc3VibWl0dGVkIGluIEFwcmls IDIwMTUgYnkgVG9kZCBQcmV2aXRlCisgKiAoPHRwcmV2aXRlQGdtYWlsLmNvbT4pCisgKgorICoK KyAqIFRoaXMgdG9vbCBjYW4gYmUgcnVuIGFzOgorICogLi9pbnRlbF9kcF9jb21wbGlhbmNlICBJ dCB3aWxsIHdhaXQgdGlsbCB5b3Ugc3RhcnQgY29tcGxpYW5jZSBzdWl0ZSBmcm9tCisgKiBEUFIg MTIwLgorICogLi9pbnRlbF9kcF9jb21wbGlhbmNlIC1oICBUaGlzIHdpbGwgb3BlbiB0aGUgaGVs cAorICogLi9pbnRlbF9kcF9jb21wbGlhbmNlIC1pICBUaGlzIHdpbGwgcHJvdmlkZSBpbmZvcm1h dGlvbiBhYm91dCBjdXJyZW50CisgKiBjb25uZWN0b3JzL0NSVENzLiBUaGlzIGNhbiBiZSB1c2Vk IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKyAqCisgKiBBdXRob3JzOgorICogICAgTWFuYXNpIE5h dmFyZSA8bWFuYXNpLmQubmF2YXJlQGludGVsLmNvbT4KKyAqCisgKiBFbGVtZW50cyBvZiB0aGUg bW9kZXNldCBjb2RlIGFkYXB0ZWQgZnJvbSBEYXZpZCBIZXJybWFubidzCisgKiBEUk0gbW9kZXNl dCBleGFtcGxlCisgKgorICovCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSA8ZXJybm8uaD4K KyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50 Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRl IDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4K KyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUg PHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVj dC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUg PGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiaW50ZWxfZHBfY29tcGxp YW5jZS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKy8q IFVzZXIgSW5wdXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSEVMUF9ERVNDUklQVElPTiAxCisK Ky8qIERlYnVnZnMgZmlsZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJTlRFTF9EUF9URVNUX1RZ UEVfRklMRQkJImk5MTVfZHBfdGVzdF90eXBlIgorI2RlZmluZSBJTlRFTF9EUF9URVNUX0FDVElW RV9GSUxFCSJpOTE1X2RwX3Rlc3RfYWN0aXZlIgorI2RlZmluZSBJTlRFTF9EUF9URVNUX0RBVEFf RklMRQkJImk5MTVfZHBfdGVzdF9kYXRhIgorCisvKiBEUk0gZGVmaW5pdGlvbnMgLSBtdXN0IGJl IGtlcHQgaW4gc3luYyB3aXRoIHRoZSBEUk0gaGVhZGVyICovCisjZGVmaW5lIERQX1RFU1RfTElO S19UUkFJTklORwkJKDEgPDwgMCkKKyNkZWZpbmUgRFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRFUk4J KDEgPDwgMSkKKyNkZWZpbmUgRFBfVEVTVF9MSU5LX0VESURfUkVBRAkJKDEgPDwgMikKKyNkZWZp bmUgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4JKDEgPDwgMykgLyogRFBDRCA+PSAxLjEg Ki8KKworI2RlZmluZSBEUF9DT01QTElBTkNFX1RFU1RfVFlQRV9NQVNLCShEUF9URVNUX0xJTktf VFJBSU5JTkcgICAgICB8CVwKKwkJCQkJIERQX1RFU1RfTElOS19WSURFT19QQVRURVJOIHwJXAor CQkJCQkgRFBfVEVTVF9MSU5LX0VESURfUkVBRCAgICAgfAlcCisJCQkJCSBEUF9URVNUX0xJTktf UEhZX1RFU1RfUEFUVEVSTikKKworLyogTk9URTogVGhlc2UgbXVzdCBiZSBrZXB0IGluIHN5bmMg d2l0aCB0aGUgZGVmaW5pdGlvbnMgaW4gaW50ZWxfZHAuYyAqLworI2RlZmluZSBJTlRFTF9EUF9F RElEX1NISUZUX01BU0sJMAorI2RlZmluZSBJTlRFTF9EUF9FRElEX09LCQkoMCA8PCBJTlRFTF9E UF9FRElEX1NISUZUX01BU0spCisjZGVmaW5lIElOVEVMX0RQX0VESURfQ09SUlVQVAkJKDEgPDwg SU5URUxfRFBfRURJRF9TSElGVF9NQVNLKQorI2RlZmluZSBJTlRFTF9EUF9SRVNPTFVUSU9OX1NI SUZUX01BU0sJMAorI2RlZmluZSBJTlRFTF9EUF9SRVNPTFVUSU9OX1BSRUZFUlJFRAkoMSA8PCBJ TlRFTF9EUF9SRVNPTFVUSU9OX1NISUZUX01BU0spCisjZGVmaW5lIElOVEVMX0RQX1JFU09MVVRJ T05fU1RBTkRBUkQJKDIgPDwgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLKQorI2RlZmlu ZSBJTlRFTF9EUF9SRVNPTFVUSU9OX0ZBSUxTQUZFCSgzIDw8IElOVEVMX0RQX1JFU09MVVRJT05f U0hJRlRfTUFTSykKKyNkZWZpbmUgRFBfQ09NUExJQU5DRV9WSURFT19NT0RFX01BU0sJKElOVEVM X0RQX1JFU09MVVRJT05fUFJFRkVSUkVECXxcCisJCQkJCSBJTlRFTF9EUF9SRVNPTFVUSU9OX1NU QU5EQVJECXxcCisJCQkJCSBJTlRFTF9EUF9SRVNPTFVUSU9OX0ZBSUxTQUZFKQorCisvKiBHbG9i YWwgZmlsZSBwb2ludGVycyBmb3IgdGhlIHN5c2ZzIGZpbGVzICovCitGSUxFICp0ZXN0X2FjdGl2 ZV9mcCwgKnRlc3RfZGF0YV9mcCwgKnRlc3RfdHlwZV9mcDsKKworYm9vbCB2aWRlb19wYXR0ZXJu X2ZsYWc7CisKKy8qIFZpZGVvIHBhdHRlcm4gdGVzdCBnbG9iYWxzICovCit1aW50MTZfdCBoZGlz cGxheTsKK3VpbnQxNl90IHZkaXNwbGF5OwordWludDhfdCBiaXRkZXB0aDsKKworc3RhdGljIGlu dCB0aW9fZmQ7CitzdHJ1Y3QgdGVybWlvcyBzYXZlZF90aW87CisKK2RybU1vZGVSZXMgKnJlc291 cmNlczsKK2ludCBkcm1fZmQsIG1vZGVzOwordWludDY0X3QgdGlsaW5nID0gTE9DQUxfRFJNX0ZP Uk1BVF9NT0RfTk9ORTsKK3VpbnQzMl90IGRlcHRoID0gMjQsIHN0cmlkZSwgYnBwOworaW50IHNw ZWNpZmllZF9tb2RlX251bSA9IC0xLCBzcGVjaWZpZWRfZGlzcF9pZCA9IC0xOworaW50IHdpZHRo LCBoZWlnaHQ7Cit1aW50MzJfdCB0ZXN0X2NydGM7Cit1aW50MzJfdCB0ZXN0X2Nvbm5lY3Rvcl9p ZDsKK2VudW0geworCUlOVEVMX01PREVfSU5WQUxJRCA9IC0xLAorCUlOVEVMX01PREVfTk9ORSA9 IDAsCisJSU5URUxfTU9ERV9QUkVGRVJSRUQsCisJSU5URUxfTU9ERV9TVEFOREFSRCwKKwlJTlRF TF9NT0RFX0ZBSUxTQUZFLAorCUlOVEVMX01PREVfVklERU9fUEFUVEVSTl9URVNUCit9IGludGVs X2Rpc3BsYXlfbW9kZTsKKworc3RydWN0IHRlc3RfdmlkZW9fcGF0dGVybiB7CisJdWludDE2X3Qg aGRpc3BsYXk7CisJdWludDE2X3QgdmRpc3BsYXk7CisJdWludDhfdCBiaXRkZXB0aDsKKwl1aW50 MzJfdCBmYjsKKwl1aW50MzJfdCBzaXplOworCXN0cnVjdCBpZ3RfZmIgZmJfcGF0dGVybjsKKwlk cm1Nb2RlTW9kZUluZm8gbW9kZTsKKwl1aW50MzJfdCAqcGl4bWFwOworfTsKKworc3RydWN0IGNv bm5lY3RvciB7CisJdWludDMyX3QgaWQ7CisJaW50IG1vZGVfdmFsaWQ7CisJZHJtTW9kZU1vZGVJ bmZvIG1vZGUsIG1vZGVfc3RhbmRhcmQsIG1vZGVfcHJlZmVycmVkLCBtb2RlX2ZhaWxzYWZlOwor CWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgY3J0YzsKKwkvKiBTdGFuZGFyZCBh bmQgcHJlZmVycmVkIGZyYW1lIGJ1ZmZlciovCisJdWludDMyX3QgZmIsIGZiX3dpZHRoLCBmYl9o ZWlnaHQsIGZiX3NpemU7CisJdWludDhfdCAqcGl4bWFwOworCXN0cnVjdCBpZ3RfZmIgZmJfdmlk ZW9fcGF0dGVybjsKKwkvKiBGYWlsc2FmZSBmcmFtZWJ1ZmZlciAtIG5vdGUgdGhpcyBpcyBhIDE2 LWJpdCBidWZmZXIgKi8KKwl1aW50MzJfdCBmYWlsc2FmZV9mYiwgZmFpbHNhZmVfd2lkdGgsIGZh aWxzYWZlX2hlaWdodDsKKwl1aW50MzJfdCBmYWlsc2FmZV9zaXplOworCXVpbnQ4X3QgKmZhaWxz YWZlX3BpeG1hcDsKKwlzdHJ1Y3QgaWd0X2ZiIGZiX2ZhaWxzYWZlX3BhdHRlcm47CisJc3RydWN0 IHRlc3RfdmlkZW9fcGF0dGVybiB0ZXN0X3BhdHRlcm47Cit9OworCitzdGF0aWMgdm9pZCBjbGVh cl90ZXN0X2FjdGl2ZSh2b2lkKQoreworCXJld2luZCh0ZXN0X2FjdGl2ZV9mcCk7CisJZnByaW50 Zih0ZXN0X2FjdGl2ZV9mcCwgIiVkIiwgMCk7CisJZmZsdXNoKHRlc3RfYWN0aXZlX2ZwKTsKK30K Kworc3RhdGljIHZvaWQgc2V0dXBfZGVidWdmc19maWxlcyh2b2lkKQoreworCXRlc3RfdHlwZV9m cCA9IGlndF9kZWJ1Z2ZzX2ZvcGVuKElOVEVMX0RQX1RFU1RfVFlQRV9GSUxFLCAiciIpOworCWln dF9yZXF1aXJlKHRlc3RfdHlwZV9mcCk7CisKKwl0ZXN0X2RhdGFfZnAgPSBpZ3RfZGVidWdmc19m b3BlbihJTlRFTF9EUF9URVNUX0RBVEFfRklMRSwgInIiKTsKKwlpZ3RfcmVxdWlyZSh0ZXN0X2Rh dGFfZnApOworCisJdGVzdF9hY3RpdmVfZnAgPSBpZ3RfZGVidWdmc19mb3BlbihJTlRFTF9EUF9U RVNUX0FDVElWRV9GSUxFLCAidysiKTsKKwlpZ3RfcmVxdWlyZSh0ZXN0X2FjdGl2ZV9mcCk7CisK KwkvKiBSZXNldCB0aGUgYWN0aXZlIGZsYWcgZm9yIHNhZmV0eSAqLworCWNsZWFyX3Rlc3RfYWN0 aXZlKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90ZXN0X3R5cGUodm9pZCkKK3sK Kwl1bnNpZ25lZCBsb25nIHRlc3RfdHlwZTsKKworCWlmICghdGVzdF90eXBlX2ZwKQorCQlmcHJp bnRmKHN0ZGVyciwgIkludmFsaWQgVGVzdCBUeXBlIEZpbGUgcG9pbnRyXHJcbiIpOworCXJld2lu ZCh0ZXN0X3R5cGVfZnApOworCWZzY2FuZih0ZXN0X3R5cGVfZnAsICIlMDJseCIsICZ0ZXN0X3R5 cGUpOworCWlmICh0ZXN0X3R5cGUgPD0gMCkgeworCQlpZ3Rfd2FybigiVGVzdCB0eXBlIHJlYWQg ZmFpbGVkIC0gJTAybHhcclxuIiwgdGVzdF90eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0 dXJuIHRlc3RfdHlwZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3Rlc3RfZWRpZF9k YXRhKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0ZXN0X2RhdGE7CisKKwlpZiAoIXRlc3RfZGF0 YV9mcCkKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFRlc3QgZGF0YSBGaWxlIFBvaW50ZXJc clxuIik7CisKKwlyZXdpbmQodGVzdF9kYXRhX2ZwKTsKKwlmc2NhbmYodGVzdF9kYXRhX2ZwLCAi JWx4IiwgJnRlc3RfZGF0YSk7CisJaWYgKHRlc3RfZGF0YSA8PSAwKSB7CisJCWlndF93YXJuKCJU ZXN0IGRhdGEgcmVhZCBmYWlsZWQgLSAlbHhcclxuIiwgdGVzdF9kYXRhKTsKKwkJcmV0dXJuIDA7 CisJfQorCisJcmV0dXJuIHRlc3RfZGF0YTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3Rlc3Rfdmlk ZW9wYXR0ZXJuX2RhdGEodm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCXVpbnQxNl90IHZpZGVv X3BhdHRlcm5fdmFsdWVbM107CisJY2hhciB2aWRlb19wYXR0ZXJuX2F0dHJpYnV0ZVsxNV07CisK KwlpZiAoIXRlc3RfZGF0YV9mcCkKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFRlc3QgZGF0 YSBGaWxlIHBvaW50ZXJcclxuIik7CisKKwlyZXdpbmQodGVzdF9kYXRhX2ZwKTsKKwl3aGlsZSAo IWZlb2YodGVzdF9kYXRhX2ZwKSAmJiBjb3VudCA8IDMpCisJCWZzY2FuZih0ZXN0X2RhdGFfZnAs ICIlcyAldVxuIiwgdmlkZW9fcGF0dGVybl9hdHRyaWJ1dGUsCisJCSAgICAgICAodW5zaWduZWQg aW50ICopJnZpZGVvX3BhdHRlcm5fdmFsdWVbY291bnQrK10pOworCisJaGRpc3BsYXkgPSB2aWRl b19wYXR0ZXJuX3ZhbHVlWzBdOworCXZkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsK KwliaXRkZXB0aCA9IHZpZGVvX3BhdHRlcm5fdmFsdWVbMl07CisJaWd0X2luZm8oIkhkaXNwbGF5 ID0gJWRcclxuIiwgaGRpc3BsYXkpOworCWlndF9pbmZvKCJWZGlzcGxheSA9ICVkXHJcbiIsIHZk aXNwbGF5KTsKKwlpZ3RfaW5mbygiQml0RGVwdGggPSAldVxyXG4iLCBiaXRkZXB0aCk7CisKK30K Kworc3RhdGljIGludCBwcm9jZXNzX3Rlc3RfcmVxdWVzdChpbnQgdGVzdF90eXBlKQoreworCWlu dCBtb2RlOworCXVuc2lnbmVkIGxvbmcgdGVzdF9kYXRhX2VkaWQ7CisJaW50IHN0YXR1cyA9IDA7 CisKKwlzd2l0Y2ggKHRlc3RfdHlwZSkgeworCWNhc2UgRFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRF Uk46CisJCXZpZGVvX3BhdHRlcm5fZmxhZyA9IHRydWU7CisJCWdldF90ZXN0X3ZpZGVvcGF0dGVy bl9kYXRhKCk7CisJCW1vZGUgPSBJTlRFTF9NT0RFX1ZJREVPX1BBVFRFUk5fVEVTVDsKKwkJYnJl YWs7CisJY2FzZSBEUF9URVNUX0xJTktfRURJRF9SRUFEOgorCQl0ZXN0X2RhdGFfZWRpZCA9IGdl dF90ZXN0X2VkaWRfZGF0YSgpOworCQltb2RlID0gKHRlc3RfZGF0YV9lZGlkICYgRFBfQ09NUExJ QU5DRV9WSURFT19NT0RFX01BU0spID4+CisJCQlJTlRFTF9EUF9SRVNPTFVUSU9OX1NISUZUX01B U0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gdGVzdCB0eXBlICovCisJCWZw cmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0IHJlcXVlc3QuIElnbm9yZWQuXHJcbiIpOworCQli cmVhazsKKwl9CisJc3RhdHVzID0gdXBkYXRlX2Rpc3BsYXkobW9kZSwgdHJ1ZSk7CisKKwkvKiBS ZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsdXJlICovCisJcmV0dXJuIHN0YXR1czsK K30KKworc3RhdGljIHZvaWQgZHVtcF9jb25uZWN0b3JzX2ZkKGludCBkcm1mZCkKK3sKKwlpbnQg aSwgajsKKworCWRybU1vZGVSZXMgKm1vZGVfcmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291cmNl cyhkcm1mZCk7CisKKwlpZiAoIW1vZGVfcmVzb3VyY2VzKSB7CisJCWlndF93YXJuKCJkcm1Nb2Rl R2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsK Kwl9CisKKwlpZ3RfaW5mbygiQ29ubmVjdG9yczpcbiIpOworCWlndF9pbmZvKCJpZFx0ZW5jb2Rl clx0c3RhdHVzXHRcdHR5cGVcdHNpemUgKG1tKVx0bW9kZXNcbiIpOworCWZvciAoaSA9IDA7IGkg PCBtb2RlX3Jlc291cmNlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKSB7CisJCWRybU1vZGVDb25u ZWN0b3IgKmNvbm5lY3RvcjsKKworCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yQ3Vy cmVudChkcm1mZCwKKwkJCQkJCSAgICAgICBtb2RlX3Jlc291cmNlcy0+Y29ubmVjdG9yc1tpXSk7 CisJCWlmICghY29ubmVjdG9yKSB7CisJCQlpZ3Rfd2FybigiY291bGQgbm90IGdldCBjb25uZWN0 b3IgJWk6ICVzXG4iLCBtb2RlX3Jlc291cmNlcy0+Y29ubmVjdG9yc1tpXSwgc3RyZXJyb3IoZXJy bm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWd0X2luZm8oIiVkXHQlZFx0JXNcdCVzXHQl ZHglZFx0XHQlZFxuIiwgY29ubmVjdG9yLT5jb25uZWN0b3JfaWQsIGNvbm5lY3Rvci0+ZW5jb2Rl cl9pZCwga21zdGVzdF9jb25uZWN0b3Jfc3RhdHVzX3N0cihjb25uZWN0b3ItPmNvbm5lY3Rpb24p LCBrbXN0ZXN0X2Nvbm5lY3Rvcl90eXBlX3N0cihjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSwg Y29ubmVjdG9yLT5tbVdpZHRoLCBjb25uZWN0b3ItPm1tSGVpZ2h0LCBjb25uZWN0b3ItPmNvdW50 X21vZGVzKTsKKworCQlpZiAoIWNvbm5lY3Rvci0+Y291bnRfbW9kZXMpCisJCQljb250aW51ZTsK KworCQlpZ3RfaW5mbygiICBtb2RlczpcbiIpOworCQlpZ3RfaW5mbygiICBuYW1lIHJlZnJlc2gg KEh6KSBoZGlzcCBoc3MgaHNlIGh0b3QgdmRpc3AgIiJ2c3MgdnNlIHZ0b3QgZmxhZ3MgdHlwZSBj bG9ja1xuIik7CisJCWZvciAoaiA9IDA7IGogPCBjb25uZWN0b3ItPmNvdW50X21vZGVzOyBqKysp IHsKKwkJCWlndF9pbmZvKCJbJWRdIiwgaik7CisJCQlrbXN0ZXN0X2R1bXBfbW9kZSgmY29ubmVj dG9yLT5tb2Rlc1tqXSk7CisJCX0KKworCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3Ip OworCX0KKwlpZ3RfaW5mbygiXG4iKTsKKworCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVz b3VyY2VzKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jcnRjc19mZChpbnQgZHJtZmQpCit7CisJ aW50IGk7CisJZHJtTW9kZVJlcyAqbW9kZV9yZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2Vz KGRybWZkKTsKKworCWlndF9pbmZvKCJDUlRDczpcbiIpOworCWlndF9pbmZvKCJpZFx0ZmJcdHBv c1x0c2l6ZVxuIik7CisJZm9yIChpID0gMDsgaSA8IG1vZGVfcmVzb3VyY2VzLT5jb3VudF9jcnRj czsgaSsrKSB7CisJCWRybU1vZGVDcnRjICpjcnRjOworCisJCWNydGMgPSBkcm1Nb2RlR2V0Q3J0 Yyhkcm1mZCwgbW9kZV9yZXNvdXJjZXMtPmNydGNzW2ldKTsKKwkJaWYgKCFjcnRjKSB7CisJCQlp Z3Rfd2FybigiY291bGQgbm90IGdldCBjcnRjICVpOiAlc1xuIiwgbW9kZV9yZXNvdXJjZXMtPmNy dGNzW2ldLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJaWd0X2luZm8o IiVkXHQlZFx0KCVkLCVkKVx0KCVkeCVkKVxuIiwgY3J0Yy0+Y3J0Y19pZCwgY3J0Yy0+YnVmZmVy X2lkLCBjcnRjLT54LCBjcnRjLT55LCBjcnRjLT53aWR0aCwgY3J0Yy0+aGVpZ2h0KTsKKwkJa21z dGVzdF9kdW1wX21vZGUoJmNydGMtPm1vZGUpOworCisJCWRybU1vZGVGcmVlQ3J0YyhjcnRjKTsK Kwl9CisJaWd0X2luZm8oIlxuIik7CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhtb2RlX3Jlc291 cmNlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5mbyh2b2lkKQoreworCWR1bXBfY29ubmVj dG9yc19mZChkcm1fZmQpOworCWR1bXBfY3J0Y3NfZmQoZHJtX2ZkKTsKK30KKworc3RhdGljIGlu dCBzZXR1cF9mcmFtZWJ1ZmZlcnMoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKK3sKKworCWRw X2Nvbm4tPmZiID0gaWd0X2NyZWF0ZV9mYihkcm1fZmQsCisJCQkJICAgIGRwX2Nvbm4tPmZiX3dp ZHRoLCBkcF9jb25uLT5mYl9oZWlnaHQsCisJCQkJICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJ CQkJICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJICAgICZkcF9jb25uLT5mYl92 aWRlb19wYXR0ZXJuKTsKKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPmZiKTsKKworCS8qIE1hcCB0aGUg bWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLwor CWRwX2Nvbm4tPnBpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJtX2ZkLAorCQkJCQlkcF9jb25uLT5m Yl92aWRlb19wYXR0ZXJuLmdlbV9oYW5kbGUsCisJCQkJCWRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRl cm4uc2l6ZSwKKwkJCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJZ2VtX3NldF9kb21haW4o ZHJtX2ZkLCBkcF9jb25uLT5mYl92aWRlb19wYXR0ZXJuLmdlbV9oYW5kbGUsCisJCSAgICAgICBJ OTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsKKwlkcF9jb25uLT5mYl9z aXplID0gZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVybi5zaXplOworCisJLyogQWZ0ZXIgZmlsbGlu ZyB0aGUgZGV2aWNlIG1lbW9yeSB3aXRoIDBzIGl0IG5lZWRzIHRvIGJlIHVubWFwcGVkICovCisJ bWVtc2V0KGRwX2Nvbm4tPnBpeG1hcCwgMCwgZHBfY29ubi0+ZmJfc2l6ZSk7CisJbXVubWFwKGRw X2Nvbm4tPnBpeG1hcCwgZHBfY29ubi0+ZmJfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBzZXR1cF9mYWlsc2FmZV9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9j b25uKQoreworCisJZHBfY29ubi0+ZmFpbHNhZmVfZmIgPSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwK KwkJCQkJICAgICBkcF9jb25uLT5mYWlsc2FmZV93aWR0aCwKKwkJCQkJICAgICBkcF9jb25uLT5m YWlsc2FmZV9oZWlnaHQsCisJCQkJCSAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkJICAg ICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJCQkgICAgICZkcF9jb25uLT5mYl9mYWls c2FmZV9wYXR0ZXJuKTsKKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPmZhaWxzYWZlX2ZiKTsKKworCS8q IE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBz cGFjZSAqLworCWRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJtX2Zk LAorCQkJCQkJIGRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4uZ2VtX2hhbmRsZSwKKwkJCQkJ CSBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLnNpemUsCisJCQkJCQkgUFJPVF9SRUFEIHwg UFJPVF9XUklURSk7CisJZ2VtX3NldF9kb21haW4oZHJtX2ZkLCBkcF9jb25uLT5mYl9mYWlsc2Fm ZV9wYXR0ZXJuLmdlbV9oYW5kbGUsCisJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1 X0dFTV9ET01BSU5fR1RUKTsKKwlkcF9jb25uLT5mYWlsc2FmZV9zaXplID0gZHBfY29ubi0+ZmJf ZmFpbHNhZmVfcGF0dGVybi5zaXplOworCisJLyogQWZ0ZXIgZmlsbGluZyB0aGUgZGV2aWNlIGZy YW1lYnVmZmVyIHRoZSBtYXBwZWQgbWVtb3J5IG5lZWRzIHRvIGJlIGZyZWVkICovCisJbWVtc2V0 KGRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCwgMCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSk7CisJ bXVubWFwKGRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSk7 CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHNldHVwX3ZpZGVvX3BhdHRlcm5fZnJh bWVidWZmZXIoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKK3sKKwl1aW50MzJfdCAgdmlkZW9f d2lkdGgsIHZpZGVvX2hlaWdodDsKKworCXZpZGVvX3dpZHRoID0gZHBfY29ubi0+dGVzdF9wYXR0 ZXJuLmhkaXNwbGF5OworCXZpZGVvX2hlaWdodCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi52ZGlz cGxheTsKKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmIgPSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwK KwkJCQkJCSB2aWRlb193aWR0aCwgdmlkZW9faGVpZ2h0LAorCQkJCQkJIERSTV9GT1JNQVRfWFJH Qjg4ODgsCisJCQkJCQkgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCQkJCSAmZHBfY29u bi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4pOworCWlndF9hc3NlcnQoZHBfY29ubi0+dGVzdF9w YXR0ZXJuLmZiKTsKKworCS8qIE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhl IHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLworCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAg PSBnZW1fbW1hcF9fZ3R0KGRybV9mZCwKKwkJCQkJCSAgICAgZHBfY29ubi0+dGVzdF9wYXR0ZXJu LmZiX3BhdHRlcm4uZ2VtX2hhbmRsZSwKKwkJCQkJCSAgICAgZHBfY29ubi0+dGVzdF9wYXR0ZXJu LmZiX3BhdHRlcm4uc2l6ZSwKKwkJCQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJ Z2VtX3NldF9kb21haW4oZHJtX2ZkLCBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5n ZW1faGFuZGxlLAorCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlO X0dUVCk7CisKKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6ZSA9IGRwX2Nvbm4tPnRlc3RfcGF0 dGVybi5mYl9wYXR0ZXJuLnNpemU7CisKKwltZW1zZXQoZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnBp eG1hcCwgMCwgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnNpemUpOworCXJldHVybiAwOworCit9CisK K3N0YXRpYyBpbnQgZmlsbF9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQor eworCXVpbnQzMl90IHRpbGVfaGVpZ2h0LCB0aWxlX3dpZHRoLCB2aWRlb193aWR0aCwgdmlkZW9f aGVpZ2h0OworCXVpbnQzMl90ICpyZWRfcHRyLCAqZ3JlZW5fcHRyLCAqYmx1ZV9wdHIsICp3aGl0 ZV9wdHIsICpzcmNfcHRyLCAqZHN0X3B0cjsKKwlpbnQgeCwgeTsKKwlpbnQzMl90IHBpeGVsX3Zh bDsKKworCXZpZGVvX3dpZHRoID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmhkaXNwbGF5OworCXZp ZGVvX2hlaWdodCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi52ZGlzcGxheTsKKworCXRpbGVfaGVp Z2h0ID0gNjQ7CisJdGlsZV93aWR0aCA9IDEgPDwgIChkcF9jb25uLT50ZXN0X3BhdHRlcm4uYml0 ZGVwdGgpOworCisJcmVkX3B0ciA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXA7CisJZ3Jl ZW5fcHRyID0gcmVkX3B0ciArICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0KTsKKwlibHVlX3B0 ciA9IGdyZWVuX3B0ciArICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0KTsKKwl3aGl0ZV9wdHIg PSBibHVlX3B0ciArICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0KTsKKwl4ID0gMDsKKworCS8q IEZpbGwgdGhlIGZyYW1lIGJ1ZmZlciB3aXRoIHZpZGVvIHBhdHRlcm4gZnJvbSBDVFMgMy4xLjUg Ki8KKwl3aGlsZSAoeCA8IHZpZGVvX3dpZHRoKSB7CisJCWZvciAocGl4ZWxfdmFsID0gMDsgcGl4 ZWxfdmFsIDwgMjU2OworCQkgICAgIHBpeGVsX3ZhbCA9IHBpeGVsX3ZhbCArICgyNTYgLyB0aWxl X3dpZHRoKSkgeworCQkJcmVkX3B0clt4XSA9IHBpeGVsX3ZhbCA8PCAxNjsKKwkJCWdyZWVuX3B0 clt4XSA9IHBpeGVsX3ZhbCA8PCA4OworCQkJYmx1ZV9wdHJbeF0gPSBwaXhlbF92YWwgPDwgMDsK KwkJCXdoaXRlX3B0clt4XSA9IHJlZF9wdHJbeF0gfCBncmVlbl9wdHJbeF0gfCBibHVlX3B0clt4 XTsKKwkJCWlmICgrK3ggPj0gdmlkZW9fd2lkdGgpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJZm9y ICh5ID0gMDsgeSA8IHZpZGVvX2hlaWdodDsgeSsrKSB7CisJCWlmICh5ID09IDAgfHwgeSA9PSA2 NCB8fCB5ID09IDEyOCB8fCB5ID09IDE5MikKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKCh5IC8g dGlsZV9oZWlnaHQpICUgNCkgeworCQljYXNlIDA6CisJCQlzcmNfcHRyID0gcmVkX3B0cjsKKwkJ CWJyZWFrOworCQljYXNlIDE6CisJCQlzcmNfcHRyID0gZ3JlZW5fcHRyOworCQkJYnJlYWs7CisJ CWNhc2UgMjoKKwkJCXNyY19wdHIgPSBibHVlX3B0cjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJ CQlzcmNfcHRyID0gd2hpdGVfcHRyOworCQkJYnJlYWs7CisJCX0KKwkJZHN0X3B0ciA9IGRwX2Nv bm4tPnRlc3RfcGF0dGVybi5waXhtYXAgKyAoeSAqIHZpZGVvX3dpZHRoKTsKKwkJbWVtY3B5KGRz dF9wdHIsIHNyY19wdHIsICh2aWRlb193aWR0aCAqIDQpKTsKKwl9CisJbXVubWFwKGRwX2Nvbm4t PnRlc3RfcGF0dGVybi5waXhtYXAsCisJICAgICAgIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXpl KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdGVzdF9tb2RlKHN0cnVjdCBjb25u ZWN0b3IgKmRwX2Nvbm4pCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJYm9vbCBmb3VuZF9z dGQgPSBmYWxzZSwgZm91bmRfZnMgPSBmYWxzZTsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjID0gZHBf Y29ubi0+Y29ubmVjdG9yOworCisJLyogSWdub3JlIGFueSBkaXNjb25uZWN0ZWQgZGV2aWNlcyAq LworCWlmIChjLT5jb25uZWN0aW9uICE9IERSTV9NT0RFX0NPTk5FQ1RFRCkgeworCQlpZ3Rfd2Fy bigiQ29ubmVjdG9yICV1IGRpc2Nvbm5lY3RlZFxyXG4iLCBjLT5jb25uZWN0b3JfaWQpOworCQly ZXR1cm4gLUVOT0VOVDsKKwl9CisJaWd0X2luZm8oIkNvbm5lY3RvciBTZXR1cDpcclxuIik7CisJ LyogU2V0dXAgcHJlZmVycmVkIG1vZGUgLSBzaG91bGQgYmUgbW9kZVswXSBpbiB0aGUgbGlzdCAq LworCWRwX2Nvbm4tPm1vZGVfcHJlZmVycmVkID0gYy0+bW9kZXNbMF07CisJZHBfY29ubi0+ZmJf d2lkdGggPSBjLT5tb2Rlc1swXS5oZGlzcGxheTsKKwlkcF9jb25uLT5mYl9oZWlnaHQgPSBjLT5t b2Rlc1swXS52ZGlzcGxheTsKKworCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5tb2RlID0gYy0+bW9k ZXNbMF07CisJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUuaGRpc3BsYXkgPSBjLT5tb2Rlc1sw XS5oZGlzcGxheTsKKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4ubW9kZS52ZGlzcGxheSA9IGMtPm1v ZGVzWzBdLnZkaXNwbGF5OworCisJaWd0X2luZm8oIlByZWZlcnJlZCBtb2RlIChtb2RlIDApIGZv ciBjb25uZWN0b3IgJXUgaXMgJXV4JXVcclxuIiwKKwkJIGRwX2Nvbm4tPmlkLCBjLT5tb2Rlc1sw XS5oZGlzcGxheSwgYy0+bW9kZXNbMF0udmRpc3BsYXkpOworCWZmbHVzaChzdGRpbik7CisKKwlm b3IgKGkgPSAxOyBpIDwgYy0+Y291bnRfbW9kZXM7IGkrKykgeworCQkvKiBTdGFuZGFyZCBtb2Rl IGlzIDgwMHg2MDBANjAgKi8KKwkJaWYgKGMtPm1vZGVzW2ldLmhkaXNwbGF5ID09IDgwMCAmJgor CQkgICAgYy0+bW9kZXNbaV0udmRpc3BsYXkgPT0gNjAwICYmCisJCSAgICBjLT5tb2Rlc1tpXS52 cmVmcmVzaCA9PSA2MCAmJgorCQkgICAgZm91bmRfc3RkID09IGZhbHNlKSB7CisJCQlkcF9jb25u LT5tb2RlX3N0YW5kYXJkID0gYy0+bW9kZXNbaV07CisJCQlpZ3RfaW5mbygiU3RhbmRhcmQgbW9k ZSAoJWQpIGZvciBjb25uZWN0b3IgJXUgaXMgJXV4JXVcclxuIiwKKwkJCQkgaSwKKwkJCQkgYy0+ Y29ubmVjdG9yX2lkLAorCQkJCSBjLT5tb2Rlc1tpXS5oZGlzcGxheSwKKwkJCQkgYy0+bW9kZXNb aV0udmRpc3BsYXkpOworCQkJZm91bmRfc3RkID0gdHJ1ZTsKKwkJfQorCQkvKiBGYWlsc2FmZSBt b2RlIGlzIDY0MHg0ODBANjAgKi8KKwkJaWYgKGMtPm1vZGVzW2ldLmhkaXNwbGF5ID09IDY0MCAm JgorCQkgICAgYy0+bW9kZXNbaV0udmRpc3BsYXkgPT0gNDgwICYmCisJCSAgICBjLT5tb2Rlc1tp XS52cmVmcmVzaCA9PSA2MCAmJgorCQkgICAgZm91bmRfZnMgPT0gZmFsc2UpIHsKKwkJCWRwX2Nv bm4tPm1vZGVfZmFpbHNhZmUgPSBjLT5tb2Rlc1tpXTsKKwkJCWRwX2Nvbm4tPmZhaWxzYWZlX3dp ZHRoID0gYy0+bW9kZXNbaV0uaGRpc3BsYXk7CisJCQlkcF9jb25uLT5mYWlsc2FmZV9oZWlnaHQg PSBjLT5tb2Rlc1tpXS52ZGlzcGxheTsKKwkJCWlndF9pbmZvKCJGYWlsc2FmZSBtb2RlICglZCkg Zm9yIGNvbm5lY3RvciAldSBpcyAldXgldVxyXG4iLAorCQkJCSBpLAorCQkJCSBjLT5jb25uZWN0 b3JfaWQsCisJCQkJIGMtPm1vZGVzW2ldLmhkaXNwbGF5LAorCQkJCSBjLT5tb2Rlc1tpXS52ZGlz cGxheSk7CisJCQlmb3VuZF9mcyA9IHRydWU7CisJCX0KKwl9CisKKwlyZXQgPSBzZXR1cF9mcmFt ZWJ1ZmZlcnMoZHBfY29ubik7CisJaWYgKHJldCkgeworCQlpZ3Rfd2FybigiQ3JlYXRlIGZyYW1l YnVmZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVkICglZClcclxuIiwKKwkJCSBjLT5jb25uZWN0 b3JfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGZvdW5kX2ZzKSB7CisJCXJl dCA9IHNldHVwX2ZhaWxzYWZlX2ZyYW1lYnVmZmVyKGRwX2Nvbm4pOworCQlpZiAocmV0KSB7CisJ CQlpZ3Rfd2FybigiQ3JlYXRlIGZhaWxzYWZlIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUi CisJCQkJICJmYWlsZWQgKCVkKVxyXG4iLAorCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7CisJ CQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHZpZGVvX3BhdHRlcm5fZmxhZykgeworCQlk cF9jb25uLT50ZXN0X3BhdHRlcm4uaGRpc3BsYXkgPSBoZGlzcGxheTsKKwkJZHBfY29ubi0+dGVz dF9wYXR0ZXJuLnZkaXNwbGF5ID0gdmRpc3BsYXk7CisJCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5i aXRkZXB0aCA9IGJpdGRlcHRoOworCQlyZXQgPSBzZXR1cF92aWRlb19wYXR0ZXJuX2ZyYW1lYnVm ZmVyKGRwX2Nvbm4pOworCQlpZiAocmV0KSB7CisJCQlpZ3Rfd2FybigiQ3JlYXRlIGZyYW1lYnVm ZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVkICglZClcclxuIiwKKwkJCQkgYy0+Y29ubmVjdG9y X2lkLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBmaWxsX2ZyYW1lYnVmZmVy KGRwX2Nvbm4pOworCQlpZiAocmV0KSB7CisJCQlpZ3Rfd2FybigiRmlsbCBmcmFtZWJ1ZmZlciBm b3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIsCisJCQkJIGMtPmNvbm5lY3Rvcl9pZCwg cmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0 aWMgaW50IHNldF92aWRlbyhpbnQgbW9kZSwgc3RydWN0IGNvbm5lY3RvciAqdGVzdF9jb25uZWN0 b3IpCit7CisJZHJtTW9kZU1vZGVJbmZvICpyZXF1ZXN0ZWRfbW9kZTsKKwl1aW50MzJfdCByZXF1 aXJlZF9mYl9pZDsKKwlzdHJ1Y3QgaWd0X2ZiIHJlcXVpcmVkX2ZiOworCWludCByZXQgPSAwOwor CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBJTlRFTF9NT0RFX05PTkU6CisJCWlndF9pbmZvKCJO T05FXHJcbiIpOworCQlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIHRlc3RfY29ubmVjdG9y LT5jcnRjLAorCQkJCSAgICAgLTEsIDAsIDAsIE5VTEwsIDAsIE5VTEwpOworCQlnb3RvIG91dDsK KwljYXNlIElOVEVMX01PREVfUFJFRkVSUkVEOgorCQlpZ3RfaW5mbygiUFJFRkVSUkVEXHJcbiIp OworCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfcHJlZmVycmVkOwor CQlyZXF1aXJlZF9mYl9pZCA9IHRlc3RfY29ubmVjdG9yLT5mYjsKKwkJcmVxdWlyZWRfZmIgPSB0 ZXN0X2Nvbm5lY3Rvci0+ZmJfdmlkZW9fcGF0dGVybjsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9N T0RFX1NUQU5EQVJEOgorCQlpZ3RfaW5mbygiU1RBTkRBUkRcclxuIik7CisJCXJlcXVlc3RlZF9t b2RlID0gICZ0ZXN0X2Nvbm5lY3Rvci0+bW9kZV9zdGFuZGFyZDsKKwkJcmVxdWlyZWRfZmJfaWQg PSB0ZXN0X2Nvbm5lY3Rvci0+ZmI7CisJCXJlcXVpcmVkX2ZiID0gdGVzdF9jb25uZWN0b3ItPmZi X3ZpZGVvX3BhdHRlcm47CisJCWJyZWFrOworCWNhc2UgSU5URUxfTU9ERV9GQUlMU0FGRToKKwkJ aWd0X2luZm8oIkZBSUxTQUZFXHJcbiIpOworCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25u ZWN0b3ItPm1vZGVfZmFpbHNhZmU7CisJCXJlcXVpcmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3It PmZhaWxzYWZlX2ZiOworCQlyZXF1aXJlZF9mYiA9IHRlc3RfY29ubmVjdG9yLT5mYl9mYWlsc2Fm ZV9wYXR0ZXJuOworCQlicmVhazsKKwljYXNlIElOVEVMX01PREVfVklERU9fUEFUVEVSTl9URVNU OgorCQlpZ3RfaW5mbygiVklERU8gUEFUVEVSTiBURVNUXHJcbiIpOworCQlyZXF1ZXN0ZWRfbW9k ZSA9ICZ0ZXN0X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLm1vZGU7CisJCXJlcXVpcmVkX2ZiX2lk ID0gdGVzdF9jb25uZWN0b3ItPnRlc3RfcGF0dGVybi5mYjsKKwkJcmVxdWlyZWRfZmIgPSB0ZXN0 X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm47CisJCWJyZWFrOworCWNhc2UgSU5U RUxfTU9ERV9JTlZBTElEOgorCWRlZmF1bHQ6CisJCWlndF93YXJuKCJJTlZBTElEISAoJTA4eCkg TW9kZSBzZXQgYWJvcnRlZCFcclxuIiwgbW9kZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZ3Rf aW5mbygiQ1JUQygldSk6IiwgdGVzdF9jb25uZWN0b3ItPmNydGMpOworCWttc3Rlc3RfZHVtcF9t b2RlKHJlcXVlc3RlZF9tb2RlKTsKKwlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIHRlc3Rf Y29ubmVjdG9yLT5jcnRjLCByZXF1aXJlZF9mYl9pZCwgMCwgMCwKKwkJCSAgICAgJnRlc3RfY29u bmVjdG9yLT5pZCwgMSwgcmVxdWVzdGVkX21vZGUpOworCWlmIChyZXQpIHsKKwkJaWd0X3dhcm4o ImZhaWxlZCB0byBzZXQgbW9kZSAoJWR4JWRAJWRIeik6ICVzXG4iLAorCQkJIHJlcXVlc3RlZF9t b2RlLT5oZGlzcGxheSwgcmVxdWVzdGVkX21vZGUtPnZkaXNwbGF5LAorCQkJIHJlcXVlc3RlZF9t b2RlLT52cmVmcmVzaCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQs ICZyZXF1aXJlZF9mYik7CisKKwl9CisJLyogS2VlcCB0aGUgcGF0dGVybiBvbiBvdXRwdXQgbGlu ZXMgZm9yIGF0bGVhc3QgMC41IHNlY3MgZm9yCisJICogRFBSLTEyMCB0byBkZXRlY3QgaXQuCisJ ICovCisJdXNsZWVwKDEwMDAwMDApOworCitvdXQ6CisJaWYgKHJldCkgeworCQlpZ3Rfd2Fybigi RmFpbGVkIHRvIHNldCBDUlRDIGZvciBjb25uZWN0b3IgJXVcclxuIiwKKwkJCSB0ZXN0X2Nvbm5l Y3Rvci0+aWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9kZWZh dWx0X21vZGUoc3RydWN0IGNvbm5lY3RvciAqYywgYm9vbCBzZXRfbW9kZSkKK3sKKwl1bnNpZ25l ZCBpbnQgZmJfaWQgPSAwOworCXN0cnVjdCBpZ3RfZmIgZmJfaW5mbzsKKwlpbnQgcmV0ID0gMDsK KworCWlmICghc2V0X21vZGUpIHsKKwkJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBjLT5j cnRjLCAwLCAwLCAwLAorCQkJCSAgICAgTlVMTCwgMCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQlp Z3Rfd2FybigiZmFpbGVkIHRvIHVuc2V0IG1vZGUiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlj LT5tb2RlID0gYy0+Y29ubmVjdG9yLT5tb2Rlc1swXTsKKworCXdpZHRoID0gYy0+bW9kZS5oZGlz cGxheTsKKwloZWlnaHQgPSBjLT5tb2RlLnZkaXNwbGF5OworCisJZmJfaWQgPSBpZ3RfY3JlYXRl X3BhdHRlcm5fZmIoZHJtX2ZkLCB3aWR0aCwgaGVpZ2h0LAorCQkJCSAgICAgIERSTV9GT1JNQVRf WFJHQjg4ODgsCisJCQkJICAgICAgdGlsaW5nLCAmZmJfaW5mbyk7CisKKwlpZ3RfaW5mbygiQ1JU QygldSk6WyVkXSIsIGMtPmNydGMsIDApOworCWttc3Rlc3RfZHVtcF9tb2RlKCZjLT5tb2RlKTsK Kwlkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIGMtPmNydGMsIC0xLCAwLCAwLCBOVUxMLCAwLCBOVUxM KTsKKwlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIGMtPmNydGMsIGZiX2lkLCAwLCAwLAor CQkJICAgICAmYy0+aWQsIDEsICZjLT5tb2RlKTsKKwlpZiAocmV0KSB7CisJCWlndF93YXJuKCJm YWlsZWQgdG8gc2V0IG1vZGUgKCVkeCVkQCVkSHopOiAlc1xuIiwgd2lkdGgsIGhlaWdodCwgYy0+ bW9kZS52cmVmcmVzaCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQs ICZmYl9pbmZvKTsKKworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBm aW5kX2NydGNfZm9yX2Nvbm5lY3Rvcihkcm1Nb2RlQ29ubmVjdG9yICpjKQoreworCWRybU1vZGVF bmNvZGVyICplOworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzOworCWludCBpLCBqOworCisJZm9y IChpID0gMDsgaSA8IGMtPmNvdW50X2VuY29kZXJzOyBpKyspIHsKKwkJZSA9IGRybU1vZGVHZXRF bmNvZGVyKGRybV9mZCwgYy0+ZW5jb2RlcnNbaV0pOworCQlwb3NzaWJsZV9jcnRjcyA9IGUtPnBv c3NpYmxlX2NydGNzOworCQlkcm1Nb2RlRnJlZUVuY29kZXIoZSk7CisKKwkJZm9yIChqID0gMDsg cG9zc2libGVfY3J0Y3MgPj4gajsgaisrKQorCQkJaWYgKHBvc3NpYmxlX2NydGNzICYgKDEgPDwg aikpCisJCQkJcmV0dXJuIHJlc291cmNlcy0+Y3J0Y3Nbal07CisJfQorCXJldHVybiAwOworfQor CisvKgorICogUmUtcHJvYmUgY29ubmVjdG9ycyBhbmQgZG8gYSBtb2Rlc2V0IGJhc2VkIG9uIHRl c3QgcmVxdWVzdCBvcgorICogaW4gY2FzZSBvZiBhIGhvdHBsdWcgdWV2ZW50LgorICoKKyAqIEBt b2RlOiBWaWRlbyBtb2RlIHJlcXVlc3RlZCBieSB0aGUgdGVzdAorICogQGlzX2NvbXBsaWFuY2Vf dGVzdDogMTogSWYgaXQgaXMgYSBjb21wbGlhbmNlIHRlc3QKKyAqICAgICAgICAgICAgICAgICAg ICAgIDA6IElmIGl0IGlzIGEgaG90cGx1ZyBldmVudAorICoKKyAqIFJldHVybnM6CisgKiAwOiBP biBTdWNjZXNzCisgKiAtMTogT24gZmFpbHVyZQorICovCitpbnQgdXBkYXRlX2Rpc3BsYXkoaW50 IG1vZGUsIGJvb2wgaXNfY29tcGxpYW5jZV90ZXN0KQoreworCXN0cnVjdCBjb25uZWN0b3IgKmNv bm5lY3RvcnMsICpjb25uOworCWludCBjbnQsIHJldCA9IDA7CisJYm9vbCBzZXRfbW9kZTsKKwor CXJlc291cmNlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZHJtX2ZkKTsKKwlpZiAoIXJlc291cmNl cykgeworCQlpZ3Rfd2FybigiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQ6ICVzXG4iLCBzdHJl cnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29ubmVjdG9ycyA9IGNhbGxvYyhy ZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnMsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjb25uZWN0 b3IpKTsKKwlpZiAoIWNvbm5lY3RvcnMpCisJCXJldHVybiAtMTsKKworCS8qIEZpbmQgYW55IGNv bm5lY3RlZCBkaXNwbGF5cyAqLworCWZvciAoY250ID0gMDsgY250IDwgcmVzb3VyY2VzLT5jb3Vu dF9jb25uZWN0b3JzOyBjbnQrKykgeworCisJCWNvbm4gPSAmY29ubmVjdG9yc1tjbnRdOworCQlk cm1Nb2RlQ29ubmVjdG9yICpjOworCisJCWNvbm4tPmlkID0gcmVzb3VyY2VzLT5jb25uZWN0b3Jz W2NudF07CisJCWMgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGRybV9mZCwgY29ubi0+aWQpOworCQlp ZiAoYy0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0ICYm CisJCSAgICBjLT5jb25uZWN0aW9uID09IERSTV9NT0RFX0NPTk5FQ1RFRCkgeworCQkJdGVzdF9j b25uZWN0b3JfaWQgPSBjLT5jb25uZWN0b3JfaWQ7CisJCQljb25uLT5jb25uZWN0b3IgPSBjOwor CQkJY29ubi0+Y3J0YyA9IGZpbmRfY3J0Y19mb3JfY29ubmVjdG9yKGMpOworCQkJdGVzdF9jcnRj ID0gY29ubi0+Y3J0YzsKKwkJCXNldF9tb2RlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9IGVsc2Ug aWYgKGMtPmNvbm5lY3Rvcl9pZCA9PSB0ZXN0X2Nvbm5lY3Rvcl9pZCAmJgorCQkJICAgYy0+Y29u bmVjdGlvbiA9PSBEUk1fTU9ERV9ESVNDT05ORUNURUQpIHsKKwkJCWNvbm4tPmNvbm5lY3RvciA9 IGM7CisJCQljb25uLT5jcnRjID0gdGVzdF9jcnRjOworCQkJc2V0X21vZGUgPSBmYWxzZTsKKwkJ CWJyZWFrOworCQl9CisJfQorCisJaWYgKGNudCA9PSByZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3Rv cnMpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChpc19jb21wbGlhbmNl X3Rlc3QpIHsKKwkJc2V0X3Rlc3RfbW9kZShjb25uKTsKKwkJcmV0ID0gc2V0X3ZpZGVvKElOVEVM X01PREVfTk9ORSwgY29ubik7CisJCXJldCA9IHNldF92aWRlbyhtb2RlLCBjb25uKTsKKworCX0g ZWxzZQorCQlyZXQgPSBzZXRfZGVmYXVsdF9tb2RlKGNvbm4sIHNldF9tb2RlKTsKKworIGVycjoK Kwlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uLT5jb25uZWN0b3IpOworCS8qIEVycm9yIGNvbmRp dGlvbiBpZiBubyBjb25uZWN0ZWQgZGlzcGxheXMgKi8KKwlmcmVlKGNvbm5lY3RvcnMpOworCWRy bU1vZGVGcmVlUmVzb3VyY2VzKHJlc291cmNlcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IGNvbnN0IGNoYXIgb3B0c3RyW10gPSAiaGkiOworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9f KChub3JldHVybikpIHVzYWdlKGNoYXIgKm5hbWUsIGNoYXIgb3B0KQoreworCWlndF9pbmZvKCJ1 c2FnZTogJXMgWy1oaV1cbiIsIG5hbWUpOworCWlndF9pbmZvKCJcdC1pXHRkdW1wIGluZm9cbiIp OworCWlndF9pbmZvKCJcdERlZmF1bHQgaXMgdG8gcmVzcG9uZCB0byBEUFItMTIwIHRlc3RzLlxu Iik7CisJZXhpdCgob3B0ICE9ICdoJykgPyAtMSA6IDApOworfQorCitzdGF0aWMgdm9pZCBjbGVh bnVwX2RlYnVnZnModm9pZCkKK3sKKwlmY2xvc2UodGVzdF9hY3RpdmVfZnApOworCWZjbG9zZSh0 ZXN0X2RhdGFfZnApOworCWZjbG9zZSh0ZXN0X3R5cGVfZnApOworfQorCitzdGF0aWMgdm9pZCBf X2F0dHJpYnV0ZV9fKChub3JldHVybikpIGNsZWFudXBfYW5kX2V4aXQoaW50IHJldCkKK3sKKwlj bGVhbnVwX2RlYnVnZnMoKTsKKwljbG9zZShkcm1fZmQpOworCWlndF9pbmZvKCJDb21wbGlhbmNl IHRlc3RpbmcgQXBwbGljYXRpb24gRXhpdGluZ1xuIik7CisJZXhpdChyZXQpOworfQorCitzdGF0 aWMgdm9pZCBjbGVhbnVwX3Rlc3Qodm9pZCkKK3sKKwl2aWRlb19wYXR0ZXJuX2ZsYWcgPSBmYWxz ZTsKKwloZGlzcGxheSA9IDA7CisJdmRpc3BsYXkgPSAwOworCWJpdGRlcHRoID0gMDsKK30KKwor c3RhdGljIHZvaWQgcmVhZF90ZXN0X3JlcXVlc3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRl c3RfdHlwZTsKKworCXRlc3RfdHlwZSA9IGdldF90ZXN0X3R5cGUoKTsKKwlwcm9jZXNzX3Rlc3Rf cmVxdWVzdCh0ZXN0X3R5cGUpOworCWNsZWFudXBfdGVzdCgpOworCWNsZWFyX3Rlc3RfYWN0aXZl KCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiB0ZXN0X2hhbmRsZXIoR0lPQ2hhbm5lbCAqc291cmNl LCBHSU9Db25kaXRpb24gY29uZGl0aW9uLAorCQkJICAgICBncG9pbnRlciBkYXRhKQoreworCXVu c2lnbmVkIGxvbmcgdGVzdF9hY3RpdmU7CisKKwlyZXdpbmQodGVzdF9hY3RpdmVfZnApOworCWZz Y2FuZih0ZXN0X2FjdGl2ZV9mcCwgIiVseCIsICZ0ZXN0X2FjdGl2ZSk7CisJaWYgKHRlc3RfYWN0 aXZlKQorCQlyZWFkX3Rlc3RfcmVxdWVzdCgpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMg Z2Jvb2xlYW4gaW5wdXRfZXZlbnQoR0lPQ2hhbm5lbCAqc291cmNlLCBHSU9Db25kaXRpb24gY29u ZGl0aW9uLAorCQkJCWdwb2ludGVyIGRhdGEpCit7CisJZ2NoYXIgYnVmWzJdOworCWdzaXplIGNv dW50OworCisJY291bnQgPSByZWFkKGdfaW9fY2hhbm5lbF91bml4X2dldF9mZChzb3VyY2UpLCBi dWYsIHNpemVvZihidWYpKTsKKwlpZiAoYnVmWzBdID09ICdxJyAmJiAoY291bnQgPT0gMSB8fCBi dWZbMV0gPT0gJ1xuJykpIHsKKwkJY2xlYW51cF9hbmRfZXhpdCgwKTsKKwl9CisKKwlyZXR1cm4g VFJVRTsKK30KKworc3RhdGljIHZvaWQgZW50ZXJfZXhlY19wYXRoKGNoYXIgKiphcmd2KQorewor CWNoYXIgKmV4ZWNfcGF0aCA9IE5VTEw7CisJY2hhciAqcG9zID0gTlVMTDsKKwlzaG9ydCBsZW5f cGF0aCA9IDA7CisJaW50IHJldDsKKworCWxlbl9wYXRoID0gc3RybGVuKGFyZ3ZbMF0pOworCWV4 ZWNfcGF0aCA9IChjaGFyICopIG1hbGxvYyhsZW5fcGF0aCk7CisKKwltZW1jcHkoZXhlY19wYXRo LCBhcmd2WzBdLCBsZW5fcGF0aCk7CisJcG9zID0gc3RycmNocihleGVjX3BhdGgsICcvJyk7CisJ aWYgKHBvcyAhPSBOVUxMKQorCQkqKHBvcysxKSA9ICdcMCc7CisKKwlyZXQgPSBjaGRpcihleGVj X3BhdGgpOworCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKwlmcmVlKGV4ZWNfcGF0aCk7Cit9CisK K3N0YXRpYyB2b2lkIHJlc3RvcmVfdGVybWlvX21vZGUoaW50IHNpZykKK3sKKwl0Y3NldGF0dHIo dGlvX2ZkLCBUQ1NBTk9XLCAmc2F2ZWRfdGlvKTsKKwljbG9zZSh0aW9fZmQpOworfQorCitzdGF0 aWMgdm9pZCBzZXRfdGVybWlvX21vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgdGVybWlvcyB0aW87CisK KwkvKiBkb24ndCBhdHRlbXB0IHRvIHNldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIGlmIG5vdCBpbiB0 aGUgZm9yZWdyb3VuZAorCSAqIHByb2Nlc3MgZ3JvdXAKKwkgKi8KKwlpZiAoZ2V0cGdycCgpICE9 IHRjZ2V0cGdycChTVERPVVRfRklMRU5PKSkKKwkJcmV0dXJuOworCisJdGlvX2ZkID0gZHVwKFNU RElOX0ZJTEVOTyk7CisJdGNnZXRhdHRyKHRpb19mZCwgJnNhdmVkX3Rpbyk7CisJaWd0X2luc3Rh bGxfZXhpdF9oYW5kbGVyKHJlc3RvcmVfdGVybWlvX21vZGUpOworCXRpbyA9IHNhdmVkX3RpbzsK Kwl0aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworCXRjc2V0YXR0cih0aW9fZmQsIFRD U0FOT1csICZ0aW8pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJ aW50IGM7CisJaW50IHJldCA9IDA7CisJR0lPQ2hhbm5lbCAqc3RkaW5jaGFubmVsLCAqdGVzdGFj dGl2ZV9jaGFubmVsOworCUdNYWluTG9vcCAqbWFpbmxvb3A7CisJYm9vbCBvcHRfZHVtcF9pbmZv ID0gZmFsc2U7CisJc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKKwkJeyJoZWxwLWRlc2Ny aXB0aW9uIiwgMCwgMCwgSEVMUF9ERVNDUklQVElPTn0sCisJCXsiaGVscCIsIDAsIDAsICdoJ30s CisJfTsKKworCWlndF9za2lwX29uX3NpbXVsYXRpb24oKTsKKworCWVudGVyX2V4ZWNfcGF0aChh cmd2KTsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIG9wdHN0ciwgbG9u Z19vcHRzLCBOVUxMKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2knOgorCQkJ b3B0X2R1bXBfaW5mbyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBIRUxQX0RFU0NSSVBUSU9O OgorCQkJaWd0X2luZm8oIkRQIENvbXBsaWFuY2UgVGVzdCBTdWl0ZSB1c2luZyBEUFItMTIwXG4i KTsKKwkJCWlndF9pbmZvKCJFRElEIFRlc3RzXG4iKTsKKwkJCWlndF9pbmZvKCJWaWRlbyBQYXR0 ZXJuIEdlbmVyYXRpb24gVGVzdHNcbiIpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZh dWx0OgorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ2gnOgorCQkJdXNhZ2UoYXJndlsw XSwgYyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNldF90ZXJtaW9fbW9kZSgpOworCisJaWd0 X2luZm8oIioqKioqKioqKioqKipEUCBDb21wbGlhbmNlIFRlc3RpbmcgdXNpbmcgRFBSLTEyMCoq KioqKioqKioqKipcbiIpOworCWlndF9pbmZvKCJXYWl0aW5nIGZvciBUZXN0IFJlcXVlc3QgSW5w dXQuLi4uLi5cbiIpOworCWRybV9mZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfQU5ZKTsKKwor CWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKKwlzZXR1cF9kZWJ1Z2ZzX2ZpbGVzKCk7 CisJY2xlYW51cF90ZXN0KCk7CisKKwlpZiAob3B0X2R1bXBfaW5mbykgeworCQlkdW1wX2luZm8o KTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJLyogR2V0IHRoZSBEUCBjb25uZWN0b3IgSUQg YW5kIENSVEMgKi8KKwlpZiAodXBkYXRlX2Rpc3BsYXkoMCwgZmFsc2UpKSB7CisJCWlndF93YXJu KCJGYWlsZWQgdG8gc2V0IGRlZmF1bHQgbW9kZVxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91 dF9jbG9zZTsKKwl9CisKKwltYWlubG9vcCA9IGdfbWFpbl9sb29wX25ldyhOVUxMLCBGQUxTRSk7 CisJaWYgKCFtYWlubG9vcCkgeworCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBnbGliIG1h aW5sb29wXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmICgh aW50ZWxfZHBfY29tcGxpYW5jZV9zZXR1cF9ob3RwbHVnKCkpIHsKKwkJaWd0X3dhcm4oImZhaWxl ZCB0byBpbml0aWFsaXplIGhvdHBsdWcgc3VwcG9ydFxuIik7CisJCWdvdG8gb3V0X21haW5sb29w OworCX0KKworCXRlc3RhY3RpdmVfY2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91bml4X25ldyhmaWxl bm8odGVzdF9hY3RpdmVfZnApKTsKKwlpZiAoIXRlc3RhY3RpdmVfY2hhbm5lbCkgeworCQlpZ3Rf d2FybigiZmFpbGVkIHRvIGNyZWF0ZSBUZXN0IEFjdGl2ZSBHSU8gY2hhbm5lbFxuIik7CisJCWdv dG8gb3V0X2Nsb3NlOworCX0KKworCXJldCA9IGdfaW9fYWRkX3dhdGNoKHRlc3RhY3RpdmVfY2hh bm5lbCwgR19JT19JTiB8IEdfSU9fRVJSLCB0ZXN0X2hhbmRsZXIsCisJCQkgICAgIE5VTEwpOwor CWlmIChyZXQgPCAwKSB7CisJCWlndF93YXJuKCJmYWlsZWQgdG8gYWRkIHdhdGNoIG9uIHVkZXYg R0lPIGNoYW5uZWxcbiIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlzdGRpbmNoYW5uZWwg PSBnX2lvX2NoYW5uZWxfdW5peF9uZXcoMCk7CisJaWYgKCFzdGRpbmNoYW5uZWwpIHsKKwkJaWd0 X3dhcm4oImZhaWxlZCB0byBjcmVhdGUgc3RkaW4gR0lPIGNoYW5uZWxcbiIpOworCQlnb3RvIG91 dF9ob3RwbHVnOworCX0KKworCXJldCA9IGdfaW9fYWRkX3dhdGNoKHN0ZGluY2hhbm5lbCwgR19J T19JTiB8IEdfSU9fRVJSLCBpbnB1dF9ldmVudCwKKwkJCSAgICAgTlVMTCk7CisJaWYgKHJldCA8 IDApIHsKKwkJaWd0X3dhcm4oImZhaWxlZCB0byBhZGQgd2F0Y2ggb24gc3RkaW4gR0lPIGNoYW5u ZWxcbiIpOworCQlnb3RvIG91dF9zdGRpbzsKKwl9CisKKwlyZXQgPSAwOworCisJZ19tYWluX2xv b3BfcnVuKG1haW5sb29wKTsKKworb3V0X3N0ZGlvOgorCWdfaW9fY2hhbm5lbF9zaHV0ZG93bihz dGRpbmNoYW5uZWwsIFRSVUUsIE5VTEwpOworb3V0X2hvdHBsdWc6CisJaW50ZWxfZHBfY29tcGxp YW5jZV9jbGVhbnVwX2hvdHBsdWcoKTsKK291dF9tYWlubG9vcDoKKwlnX21haW5fbG9vcF91bnJl ZihtYWlubG9vcCk7CitvdXRfY2xvc2U6CisJY2xlYW51cF9kZWJ1Z2ZzKCk7CisJY2xvc2UoZHJt X2ZkKTsKKworCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKworCWlndF9pbmZvKCJDb21wbGlhbmNl IHRlc3RpbmcgYXBwbGljYXRpb24gZXhpdGluZy5cbiIpOworCWlndF9leGl0KCk7Cit9CmRpZmYg LS1naXQgYS90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmggYi90b29scy9pbnRlbF9kcF9jb21w bGlhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMWUyZgotLS0g L2Rldi9udWxsCisrKyBiL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaApAQCAtMCwwICsxLDM1 IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIE1hbmFzaSBO YXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBo ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK KyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZp bGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0 IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRz IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGlj ZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNv LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUg Y29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNs dWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29m dHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBC VVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICog RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4g Tk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJ QUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwor ICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhF IFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNs dWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgor I2luY2x1ZGUgPGdsaWIuaD4KKworZXh0ZXJuIGludCBkcm1fZmQ7CisKK2dib29sZWFuIGludGVs X2RwX2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1Zyh2b2lkKTsKK3ZvaWQgaW50ZWxfZHBfY29tcGxp YW5jZV9jbGVhbnVwX2hvdHBsdWcodm9pZCk7CisKKy8qIGNhbGxlZCBieSB0aGUgaG90cGx1ZyBj b2RlICovCitpbnQgdXBkYXRlX2Rpc3BsYXkoaW50IG1vZGUsIGJvb2wgaXNfY29tcGxpYW5jZV90 ZXN0KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIGIv dG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uZDQ4OTAyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ludGVsX2Rw X2NvbXBsaWFuY2VfaG90cGx1Zy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0 IDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNA aW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAor ICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5n IHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwg bWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBj b3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUK KyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZU V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBF WFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICog QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN QUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MK KyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSA8 c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lu Y2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJpbnRlbF9kcF9jb21wbGlhbmNlLmgiCisj aW5jbHVkZSA8bGlidWRldi5oPgorc3RhdGljIHN0cnVjdCB1ZGV2X21vbml0b3IgKnVldmVudF9t b25pdG9yOworc3RhdGljIHN0cnVjdCB1ZGV2ICp1ZGV2Oworc3RhdGljIEdJT0NoYW5uZWwgKnVk ZXZjaGFubmVsOworCitzdGF0aWMgZ2Jvb2xlYW4gaG90cGx1Z19ldmVudChHSU9DaGFubmVsICpz b3VyY2UsIEdJT0NvbmRpdGlvbiBjb25kaXRpb24sCisJCQkgICAgICBncG9pbnRlciBkYXRhKQor eworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2OworCWRldl90IHVkZXZfZGV2bnVtOworCXN0cnVj dCBzdGF0IHM7CisJY29uc3QgY2hhciAqaG90cGx1ZzsKKworCWRldiA9IHVkZXZfbW9uaXRvcl9y ZWNlaXZlX2RldmljZSh1ZXZlbnRfbW9uaXRvcik7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0Owor CisJdWRldl9kZXZudW0gPSB1ZGV2X2RldmljZV9nZXRfZGV2bnVtKGRldik7CisJZnN0YXQoZHJt X2ZkLCAmcyk7CisKKwlob3RwbHVnID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVlKGRl diwgIkhPVFBMVUciKTsKKworCWlmIChtZW1jbXAoJnMuc3RfcmRldiwgJnVkZXZfZGV2bnVtLCBz aXplb2YoZGV2X3QpKSA9PSAwICYmCisJICAgIGhvdHBsdWcgJiYgYXRvaShob3RwbHVnKSA9PSAx KQorCQl1cGRhdGVfZGlzcGxheSgwLCBmYWxzZSk7CisKKwl1ZGV2X2RldmljZV91bnJlZihkZXYp Oworb3V0OgorCXJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIGludGVsX2RwX2NvbXBsaWFu Y2Vfc2V0dXBfaG90cGx1Zyh2b2lkKQoreworCWludCByZXQ7CisKKwl1ZGV2ID0gdWRldl9uZXco KTsKKwlpZiAoIXVkZXYpIHsKKwkJaWd0X3dhcm4oImZhaWxlZCB0byBjcmVhdGUgdWRldiBvYmpl Y3RcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwl1ZXZlbnRfbW9uaXRvciA9IHVkZXZfbW9uaXRv cl9uZXdfZnJvbV9uZXRsaW5rKHVkZXYsICJ1ZGV2Iik7CisJaWYgKCF1ZXZlbnRfbW9uaXRvcikg eworCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IGV2ZW50IG1vbml0b3JcbiIpOwor CQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB1ZGV2X21vbml0b3JfZmlsdGVyX2FkZF9tYXRjaF9z dWJzeXN0ZW1fZGV2dHlwZSh1ZXZlbnRfbW9uaXRvciwKKwkJCQkJCQkgICAgICAiZHJtIiwKKwkJ CQkJCQkgICAgICAiZHJtX21pbm9yIik7CisJaWYgKHJldCA8IDApIHsKKwkJaWd0X3dhcm4oImZh aWxlZCB0byBmaWx0ZXIgZm9yIGRybSBldmVudHNcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwly ZXQgPSB1ZGV2X21vbml0b3JfZW5hYmxlX3JlY2VpdmluZyh1ZXZlbnRfbW9uaXRvcik7CisJaWYg KHJldCA8IDApIHsKKwkJaWd0X3dhcm4oImZhaWxlZCB0byBlbmFibGUgdWRldiBldmVudCByZWNl cHRpb25cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwl1ZGV2Y2hhbm5lbCA9CisJCWdfaW9fY2hh bm5lbF91bml4X25ldyh1ZGV2X21vbml0b3JfZ2V0X2ZkKHVldmVudF9tb25pdG9yKSk7CisJaWYg KCF1ZGV2Y2hhbm5lbCkgeworCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IEdJTyBj aGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ19pb19hZGRfd2F0Y2godWRl dmNoYW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VSUiwgaG90cGx1Z19ldmVudCwKKwkJCSAgICAgdWRl dik7CisJaWYgKHJldCA8IDApIHsKKwkJaWd0X3dhcm4oImZhaWxlZCB0byBhZGQgd2F0Y2ggb24g dWRldiBHSU8gY2hhbm5lbFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiBUUlVFOwor CitvdXQ6CisJaW50ZWxfZHBfY29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcoKTsKKwlyZXR1cm4g RkFMU0U7Cit9CisKK3ZvaWQgaW50ZWxfZHBfY29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcodm9p ZCkKK3sKKwlpZiAodWRldmNoYW5uZWwpCisJCWdfaW9fY2hhbm5lbF9zaHV0ZG93bih1ZGV2Y2hh bm5lbCwgVFJVRSwgTlVMTCk7CisJaWYgKHVldmVudF9tb25pdG9yKQorCQl1ZGV2X21vbml0b3Jf dW5yZWYodWV2ZW50X21vbml0b3IpOworCWlmICh1ZGV2KQorCQl1ZGV2X3VucmVmKHVkZXYpOwor fQotLSAKMS45LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo=