LyoKICogbGludXgvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCiAqCiAqIERyaXZlciBmb3Igb25ib2FyZCBVQVJUcyBvbiB0aGUgU2Ftc3VuZyBTM0MyNFhYCiAqCiAqIEJhc2VkIG9uIGRyaXZlcnMvY2hhci9zZXJpYWwuYyBhbmQgZHJpdmVycy9jaGFyLzIxMjg1LmMKICoKICogQmVuIERvb2tzLCAoYykgMjAwMy0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcwogKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLwogKgogKiBDaGFuZ2Vsb2c6CiAqCiAqIDIyLUp1bC0yMDA0ICBCSkQgIEZpbmlzaGVkIG9mZiBkZXZpY2UgcmV3cml0ZQogKgogKiAyMS1KdWwtMjAwNCAgQkpEICBUaGFua3MgdG8gPGhlcmJldEAxM3RoZmxvb3IuYXQ+IGZvciBwb2ludGluZyBvdXQKICogICAgICAgICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBiYXVkIHJhdGUgYW5kIGxvc3Mgb2YgSVIgc2V0dGluZ3MuIFVwZGF0ZQogKiAgICAgICAgICAgICAgICAgICB0byBhZGQgY29uZmlndXJhdGlvbiB2aWEgcGxhdGZvcm1fZGV2aWNlIHN0cnVjdHVyZQogKgogKiAyOC1TZXAtMjAwNCAgQkpEICBSZS13cml0ZSBmb3IgdGhlIGZvbGxvd2luZyBpdGVtcwogKgkJICAgICAtIFMzQzI0MTAgYW5kIFMzQzI0NDAgc2VyaWFsIHN1cHBvcnQKICoJCSAgICAgLSBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQKICoJCSAgICAgLSBGaXggY29uc29sZSB2aWEgSXJEQSBkZXZpY2VzCiAqCQkgICAgIC0gU3lzUmVxIChIZXJiZXJ0IFD2dHpsKQogKgkJICAgICAtIEJyZWFrIGNoYXJhY3RlciBoYW5kbGluZyAoSGVyYmVydCBQ9nR6bCkKICoJCSAgICAgLSBzcGluLWxvY2sgaW5pdGlhbGlzYXRpb24gKERpbWl0cnkgQW5kcmljKQogKgkJICAgICAtIGFkZGVkIGNsb2NrIGNvbnRyb2wKICoJCSAgICAgLSB1cGRhdGVkIGluaXQgY29kZSB0byB1c2UgcGxhdGZvcm1fZGV2aWNlIGluZm8KICoKICogMDYtTWFyLTIwMDUgIEJKRCAgQWRkIHMzYzI0NDAgZmNsayBjbG9jayBzb3VyY2UKICoKICogMDktTWFyLTIwMDUgIEJKRCAgQWRkIHMzYzI0MDAgc3VwcG9ydAogKgogKiAxMC1NYXItMjAwNSAgTENWUiBDaGFuZ2VkIFMzQzI0MTBfVkFfVUFSVCB0byBTM0MyNFhYX1ZBX1VBUlQKKi8KCi8qIE5vdGUgb24gMjQ0MCBmY2xrIGNsb2NrIHNvdXJjZSBoYW5kbGluZwogKgogKiBXaGlsc3QgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBmY2xrIGFzIGNsb2NrIHNvdXJjZSwgdGhlIG1ldGhvZAogKiBvZiBwcm9wZXJseSBzd2l0Y2hpbmcgdG9vL2Zyb20gdGhpcyBpcyBjdXJyZW50bHkgdW4taW1wbGVtZW50ZWQsIHNvCiAqIHdoaWNoZXZlciB3YXkgaXMgY29uZmlndXJlZCBhdCBzdGFydHVwIGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHVzZWQuCiovCgovKiBIb3RlIG9uIDI0MTAgZXJyb3IgaGFuZGxpbmcKICoKICogVGhlIHMzYzI0MTAgbWFudWFsIGhhcyBhIGxvdmUvaGF0ZSBhZmZhaXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlCiAqIFVFUlNUQVQgcmVnaXN0ZXIgaW4gdGhlIFVBUlQgYmxvY2tzLCBhbmQga2VlcHMgbWFya2luZyBzb21lIG9mIHRoZQogKiBlcnJvciBiaXRzIGFzIHJlc2VydmVkLiBIYXZpbmcgY2hlY2tlZCB3aXRoIHRoZSBzM2MyNDEweDAxLAogKiBpdCBjb3BlcyB3aXRoIEJSRUFLcyBwcm9wZXJseSwgc28gSSBhbSBoYXBweSB0byBpZ25vcmUgdGhlIFJFU0VSVkVECiAqIGZlYXR1cmUgZnJvbSB0aGUgbGF0dGVyIHZlcnNpb25zIG9mIHRoZSBtYW51YWwuCiAqCiAqIElmIGl0IGJlY29tZXMgYXBhcnJlbnQgdGhhdCBsYXR0ZXIgdmVyc2lvbnMgb2YgdGhlIDI0MTAgcmVtb3ZlIHRoZXNlCiAqIGJpdHMsIHRoZW4gYWN0aW9uIHdpbGwgaGF2ZSB0byBiZSB0YWtlbiB0byBkaWZmZXJlbnRpYXRlIHRoZSB2ZXJzaW9ucwogKiBhbmQgY2hhbmdlIHRoZSBwb2xpY3kgb24gQlJFQUsKICoKICogQkpELCAwNC1Ob3YtMjAwNAoqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgoKI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQojZGVmaW5lIFNVUFBPUlRfU1lTUlEKI2VuZGlmCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgojaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KCiNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KCiNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CgovKiBzdHJ1Y3R1cmVzICovCgpzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gewoJY2hhcgkJCSpuYW1lOwoJdW5zaWduZWQgaW50CQl0eXBlOwoJdW5zaWduZWQgaW50CQlmaWZvc2l6ZTsKCXVuc2lnbmVkIGxvbmcJCXJ4X2ZpZm9tYXNrOwoJdW5zaWduZWQgbG9uZwkJcnhfZmlmb3NoaWZ0OwoJdW5zaWduZWQgbG9uZwkJcnhfZmlmb2Z1bGw7Cgl1bnNpZ25lZCBsb25nCQl0eF9maWZvbWFzazsKCXVuc2lnbmVkIGxvbmcJCXR4X2ZpZm9zaGlmdDsKCXVuc2lnbmVkIGxvbmcJCXR4X2ZpZm9mdWxsOwoKCS8qIGNsb2NrIHNvdXJjZSBjb250cm9sICovCgoJaW50ICgqZ2V0X2Nsa3NyYykoc3RydWN0IHVhcnRfcG9ydCAqLCBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKTsKCWludCAoKnNldF9jbGtzcmMpKHN0cnVjdCB1YXJ0X3BvcnQgKiwgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsayk7CgoJLyogdWFydCBjb250cm9scyAqLwoJaW50ICgqcmVzZXRfcG9ydCkoc3RydWN0IHVhcnRfcG9ydCAqLCBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICopOwp9OwoKc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0IHsKCXVuc2lnbmVkIGNoYXIJCQlyeF9jbGFpbWVkOwoJdW5zaWduZWQgY2hhcgkJCXR4X2NsYWltZWQ7CgoJc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvCSppbmZvOwoJc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMJKmNsa3NyYzsKCXN0cnVjdCBjbGsJCQkqY2xrOwoJc3RydWN0IGNsawkJCSpiYXVkY2xrOwoJc3RydWN0IHVhcnRfcG9ydAkJcG9ydDsKfTsKCgovKiBjb25maWd1cmF0aW9uIGRlZmluZXMgKi8KCiNpZiAwCiNpZiAxCi8qIHNlbmQgZGVidWcgdG8gdGhlIGxvdy1sZXZlbCBvdXRwdXQgcm91dGluZXMgKi8KCmV4dGVybiB2b2lkIHByaW50YXNjaWkoY29uc3QgY2hhciAqKTsKCnN0YXRpYyB2b2lkCnMzYzI0eHhfc2VyaWFsX2RiZyhjb25zdCBjaGFyICpmbXQsIC4uLikKewoJdmFfbGlzdCB2YTsKCWNoYXIgYnVmZlsyNTZdOwoKCXZhX3N0YXJ0KHZhLCBmbXQpOwoJdnNwcmludGYoYnVmZiwgZm10LCB2YSk7Cgl2YV9lbmQodmEpOwoKCXByaW50YXNjaWkoYnVmZik7Cn0KCiNkZWZpbmUgZGJnKHguLi4pIHMzYzI0eHhfc2VyaWFsX2RiZyh4KQoKI2Vsc2UKI2RlZmluZSBkYmcoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgInMzYzI0eHg6ICIpOwojZW5kaWYKI2Vsc2UgLyogbm8gZGVidWcgKi8KI2RlZmluZSBkYmcoeC4uLikgZG8ge30gd2hpbGUoMCkKI2VuZGlmCgovKiBVQVJUIG5hbWUgYW5kIGRldmljZSBkZWZpbml0aW9ucyAqLwoKI2RlZmluZSBTM0MyNFhYX1NFUklBTF9OQU1FCSJ0dHlTQUMiCiNkZWZpbmUgUzNDMjRYWF9TRVJJQUxfREVWRlMgICAgInR0cy8iCiNkZWZpbmUgUzNDMjRYWF9TRVJJQUxfTUFKT1IJMjA0CiNkZWZpbmUgUzNDMjRYWF9TRVJJQUxfTUlOT1IJNjQKCgovKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwoKI2RlZmluZSBzM2MyNHh4X2Rldl90b19wb3J0KF9fZGV2KSAoc3RydWN0IHVhcnRfcG9ydCAqKWRldl9nZXRfZHJ2ZGF0YShfX2RldikKI2RlZmluZSBzM2MyNHh4X2Rldl90b19jZmcoX19kZXYpIChzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICopKChfX2RldiktPnBsYXRmb3JtX2RhdGEpCgovKiB3ZSBjYW4gc3VwcG9ydCAzIHVhcnRzLCBidXQgbm90IGFsd2F5cyB1c2UgdGhlbSAqLwoKI2lmZGVmIENPTkZJR19DUFVfUzNDMjQwMAojZGVmaW5lIE5SX1BPUlRTICgyKQojZWxzZQojZGVmaW5lIE5SX1BPUlRTICgzKQojZW5kaWYKCi8qIHBvcnQgaXJxIG51bWJlcnMgKi8KCiNkZWZpbmUgVFhfSVJRKHBvcnQpICgocG9ydCktPmlycSArIDEpCiNkZWZpbmUgUlhfSVJRKHBvcnQpICgocG9ydCktPmlycSkKCi8qIHJlZ2lzdGVyIGFjY2VzcyBjb250cm9scyAqLwoKI2RlZmluZSBwb3J0YWRkcihwb3J0LCByZWcpICgocG9ydCktPm1lbWJhc2UgKyAocmVnKSkKCiNkZWZpbmUgcmRfcmVnYihwb3J0LCByZWcpIChfX3Jhd19yZWFkYihwb3J0YWRkcihwb3J0LCByZWcpKSkKI2RlZmluZSByZF9yZWdsKHBvcnQsIHJlZykgKF9fcmF3X3JlYWRsKHBvcnRhZGRyKHBvcnQsIHJlZykpKQoKI2RlZmluZSB3cl9yZWdiKHBvcnQsIHJlZywgdmFsKSBcCiAgZG8geyBfX3Jhd193cml0ZWIodmFsLCBwb3J0YWRkcihwb3J0LCByZWcpKTsgfSB3aGlsZSgwKQoKI2RlZmluZSB3cl9yZWdsKHBvcnQsIHJlZywgdmFsKSBcCiAgZG8geyBfX3Jhd193cml0ZWwodmFsLCBwb3J0YWRkcihwb3J0LCByZWcpKTsgfSB3aGlsZSgwKQoKLyogbWFjcm9zIHRvIGNoYW5nZSBvbmUgdGhpbmcgdG8gYW5vdGhlciAqLwoKI2RlZmluZSB0eF9lbmFibGVkKHBvcnQpICgocG9ydCktPnVudXNlZFswXSkKI2RlZmluZSByeF9lbmFibGVkKHBvcnQpICgocG9ydCktPnVudXNlZFsxXSkKCi8qIGZsYWcgdG8gaWdub3JlIGFsbCBjaGFyYWN0ZXJzIGNvbW1pbmcgaW4gKi8KI2RlZmluZSBSWFNUQVRfRFVNTVlfUkVBRCAoMHgxMDAwMDAwMCkKCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICp0b19vdXJwb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCXJldHVybiBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0LCBwb3J0KTsKfQoKLyogdHJhbnNsYXRlIGEgcG9ydCB0byB0aGUgZGV2aWNlIG5hbWUgKi8KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqczNjMjR4eF9zZXJpYWxfcG9ydG5hbWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJcmV0dXJuIHRvX3BsYXRmb3JtX2RldmljZShwb3J0LT5kZXYpLT5uYW1lOwp9CgpzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX3R4ZW1wdHlfbm9maWZvKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCXJldHVybiAocmRfcmVnbChwb3J0LCBTM0MyNDEwX1VUUlNUQVQpICYgUzNDMjQxMF9VVFJTVEFUX1RYRSk7Cn0KCnN0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3J4X2VuYWJsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaW50IHVjb24sIHVmY29uOwoJaW50IGNvdW50ID0gMTAwMDA7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKCgl3aGlsZSAoLS1jb3VudCAmJiAhczNjMjR4eF9zZXJpYWxfdHhlbXB0eV9ub2ZpZm8ocG9ydCkpCgkJdWRlbGF5KDEwMCk7CgoJdWZjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUZDT04pOwoJdWZjb24gfD0gUzNDMjQxMF9VRkNPTl9SRVNFVFJYOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCB1ZmNvbik7CgoJdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKCXVjb24gfD0gUzNDMjQxMF9VQ09OX1JYSVJRTU9ERTsKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCB1Y29uKTsKCglyeF9lbmFibGVkKHBvcnQpID0gMTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfcnhfZGlzYWJsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaW50IHVjb247CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKCgl1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoJdWNvbiAmPSB+UzNDMjQxMF9VQ09OX1JYSVJRTU9ERTsKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCB1Y29uKTsKCglyeF9lbmFibGVkKHBvcnQpID0gMDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7CglpZiAodHhfZW5hYmxlZChwb3J0KSkgewoJCWRpc2FibGVfaXJxKFRYX0lSUShwb3J0KSk7CgkJdHhfZW5hYmxlZChwb3J0KSA9IDA7CgkJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0NPTlNfRkxPVykKCQkJczNjMjR4eF9zZXJpYWxfcnhfZW5hYmxlKHBvcnQpOwoJfQp9CgpzdGF0aWMgdm9pZCBzM2MyNHh4X3NlcmlhbF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7CglpZiAoIXR4X2VuYWJsZWQocG9ydCkpIHsKCQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfQ09OU19GTE9XKQoJCQlzM2MyNHh4X3NlcmlhbF9yeF9kaXNhYmxlKHBvcnQpOwoKCQllbmFibGVfaXJxKFRYX0lSUShwb3J0KSk7CgkJdHhfZW5hYmxlZChwb3J0KSA9IDE7Cgl9Cn0KCgpzdGF0aWMgdm9pZCBzM2MyNHh4X3NlcmlhbF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCWlmIChyeF9lbmFibGVkKHBvcnQpKSB7CgkJZGJnKCJzM2MyNHh4X3NlcmlhbF9zdG9wX3J4OiBwb3J0PSVwXG4iLCBwb3J0KTsKCQlkaXNhYmxlX2lycShSWF9JUlEocG9ydCkpOwoJCXJ4X2VuYWJsZWQocG9ydCkgPSAwOwoJfQp9CgpzdGF0aWMgdm9pZCBzM2MyNHh4X3NlcmlhbF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqczNjMjR4eF9wb3J0X3RvX2luZm8oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJcmV0dXJuIHRvX291cnBvcnQocG9ydCktPmluZm87Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqczNjMjR4eF9wb3J0X3RvX2NmZyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7CglpZiAocG9ydC0+ZGV2ID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJcmV0dXJuIChzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICopcG9ydC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwp9CgpzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX3J4X2ZpZm9jbnQoc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0LAoJCQkJICAgICB1bnNpZ25lZCBsb25nIHVmc3RhdCkKewoJc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvICppbmZvID0gb3VycG9ydC0+aW5mbzsKCglpZiAodWZzdGF0ICYgaW5mby0+cnhfZmlmb2Z1bGwpCgkJcmV0dXJuIGluZm8tPmZpZm9zaXplOwoKCXJldHVybiAodWZzdGF0ICYgaW5mby0+cnhfZmlmb21hc2spID4+IGluZm8tPnJ4X2ZpZm9zaGlmdDsKfQoKCi8qID8gLSB3aGVyZSBoYXMgcGFyaXR5IGdvbmU/PyAqLwojZGVmaW5lIFMzQzI0MTBfVUVSU1RBVF9QQVJJVFkgKDB4MTAwMCkKCnN0YXRpYyBpcnFyZXR1cm5fdApzM2MyNHh4X3NlcmlhbF9yeF9jaGFycyhpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKm91cnBvcnQgPSBkZXZfaWQ7CglzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJm91cnBvcnQtPnBvcnQ7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwoJdW5zaWduZWQgaW50IHVmY29uLCBjaCwgZmxhZywgdWZzdGF0LCB1ZXJzdGF0OwoJaW50IG1heF9jb3VudCA9IDY0OwoKCXdoaWxlIChtYXhfY291bnQtLSA+IDApIHsKCQl1ZmNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTik7CgkJdWZzdGF0ID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VGU1RBVCk7CgoJCWlmIChzM2MyNHh4X3NlcmlhbF9yeF9maWZvY250KG91cnBvcnQsIHVmc3RhdCkgPT0gMCkKCQkJYnJlYWs7CgoJCXVlcnN0YXQgPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUVSU1RBVCk7CgkJY2ggPSByZF9yZWdiKHBvcnQsIFMzQzI0MTBfVVJYSCk7CgoJCWlmIChwb3J0LT5mbGFncyAmIFVQRl9DT05TX0ZMT1cpIHsKCQkJaW50IHR4ZSA9IHMzYzI0eHhfc2VyaWFsX3R4ZW1wdHlfbm9maWZvKHBvcnQpOwoKCQkJaWYgKHJ4X2VuYWJsZWQocG9ydCkpIHsKCQkJCWlmICghdHhlKSB7CgkJCQkJcnhfZW5hYmxlZChwb3J0KSA9IDA7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAodHhlKSB7CgkJCQkJdWZjb24gfD0gUzNDMjQxMF9VRkNPTl9SRVNFVFJYOwoJCQkJCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgdWZjb24pOwoJCQkJCXJ4X2VuYWJsZWQocG9ydCkgPSAxOwoJCQkJCWdvdG8gb3V0OwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJCS8qIGluc2VydCB0aGUgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlciAqLwoKCQlmbGFnID0gVFRZX05PUk1BTDsKCQlwb3J0LT5pY291bnQucngrKzsKCgkJaWYgKHVubGlrZWx5KHVlcnN0YXQgJiBTM0MyNDEwX1VFUlNUQVRfQU5ZKSkgewoJCQlkYmcoInJ4ZXJyOiBwb3J0IGNoPTB4JTAyeCwgcnhzPTB4JTA4eFxuIiwKCQkJICAgIGNoLCB1ZXJzdGF0KTsKCgkJCS8qIGNoZWNrIGZvciBicmVhayAqLwoJCQlpZiAodWVyc3RhdCAmIFMzQzI0MTBfVUVSU1RBVF9CUkVBSykgewoJCQkJZGJnKCJicmVhayFcbiIpOwoJCQkJcG9ydC0+aWNvdW50LmJyaysrOwoJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQoJCQkJICAgIGdvdG8gaWdub3JlX2NoYXI7CgkJCX0KCgkJCWlmICh1ZXJzdGF0ICYgUzNDMjQxMF9VRVJTVEFUX0ZSQU1FKQoJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CgkJCWlmICh1ZXJzdGF0ICYgUzNDMjQxMF9VRVJTVEFUX09WRVJSVU4pCgkJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOwoKCQkJdWVyc3RhdCAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOwoKCQkJaWYgKHVlcnN0YXQgJiBTM0MyNDEwX1VFUlNUQVRfQlJFQUspCgkJCQlmbGFnID0gVFRZX0JSRUFLOwoJCQllbHNlIGlmICh1ZXJzdGF0ICYgUzNDMjQxMF9VRVJTVEFUX1BBUklUWSkKCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwoJCQllbHNlIGlmICh1ZXJzdGF0ICYgKCBTM0MyNDEwX1VFUlNUQVRfRlJBTUUgfCBTM0MyNDEwX1VFUlNUQVRfT1ZFUlJVTikpCgkJCQlmbGFnID0gVFRZX0ZSQU1FOwoJCX0KCgkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gsIHJlZ3MpKQoJCQlnb3RvIGlnbm9yZV9jaGFyOwoKCQl1YXJ0X2luc2VydF9jaGFyKHBvcnQsIHVlcnN0YXQsIFMzQzI0MTBfVUVSU1RBVF9PVkVSUlVOLCBjaCwgZmxhZyk7CgoJaWdub3JlX2NoYXI6CgkJY29udGludWU7Cgl9Cgl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoKIG91dDoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKc3RhdGljIGlycXJldHVybl90IHMzYzI0eHhfc2VyaWFsX3R4X2NoYXJzKGludCBpcnEsIHZvaWQgKmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gaWQ7CglzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJm91cnBvcnQtPnBvcnQ7CglzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+aW5mby0+eG1pdDsKCWludCBjb3VudCA9IDI1NjsKCglpZiAocG9ydC0+eF9jaGFyKSB7CgkJd3JfcmVnYihwb3J0LCBTM0MyNDEwX1VUWEgsIHBvcnQtPnhfY2hhcik7CgkJcG9ydC0+aWNvdW50LnR4Kys7CgkJcG9ydC0+eF9jaGFyID0gMDsKCQlnb3RvIG91dDsKCX0KCgkvKiBpZiB0aGVyZSBpc250IGFueXRoaW5nIG1vcmUgdG8gdHJhbnNtaXQsIG9yIHRoZSB1YXJ0IGlzIG5vdwoJICogc3RvcHBlZCwgZGlzYWJsZSB0aGUgdWFydCBhbmQgZXhpdAoJKi8KCglpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZChwb3J0KSkgewoJCXMzYzI0eHhfc2VyaWFsX3N0b3BfdHgocG9ydCk7CgkJZ290byBvdXQ7Cgl9CgoJLyogdHJ5IGFuZCBkcmFpbiB0aGUgYnVmZmVyLi4uICovCgoJd2hpbGUgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgJiYgY291bnQtLSA+IDApIHsKCQlpZiAocmRfcmVnbChwb3J0LCBTM0MyNDEwX1VGU1RBVCkgJiBvdXJwb3J0LT5pbmZvLT50eF9maWZvZnVsbCkKCQkJYnJlYWs7CgoJCXdyX3JlZ2IocG9ydCwgUzNDMjQxMF9VVFhILCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOwoJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CgkJcG9ydC0+aWNvdW50LnR4Kys7Cgl9CgoJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQoJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwoKCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCgkJczNjMjR4eF9zZXJpYWxfc3RvcF90eChwb3J0KTsKCiBvdXQ6CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgczNjMjR4eF9zZXJpYWxfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvICppbmZvID0gczNjMjR4eF9wb3J0X3RvX2luZm8ocG9ydCk7Cgl1bnNpZ25lZCBsb25nIHVmc3RhdCA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VRlNUQVQpOwoJdW5zaWduZWQgbG9uZyB1ZmNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTik7CgoJaWYgKHVmY29uICYgUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSkgewoJCWlmICgodWZzdGF0ICYgaW5mby0+dHhfZmlmb21hc2spICE9IDAgfHwKCQkgICAgKHVmc3RhdCAmIGluZm8tPnR4X2ZpZm9mdWxsKSkKCQkJcmV0dXJuIDA7CgoJCXJldHVybiAxOwoJfQoKCXJldHVybiBzM2MyNHh4X3NlcmlhbF90eGVtcHR5X25vZmlmbyhwb3J0KTsKfQoKLyogbm8gbW9kZW0gY29udHJvbCBsaW5lcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHMzYzI0eHhfc2VyaWFsX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgl1bnNpZ25lZCBpbnQgdW1zdGF0ID0gcmRfcmVnYihwb3J0LFMzQzI0MTBfVU1TVEFUKTsKCglpZiAodW1zdGF0ICYgUzNDMjQxMF9VTVNUQVRfQ1RTKQoJCXJldHVybiBUSU9DTV9DQVIgfCBUSU9DTV9EU1IgfCBUSU9DTV9DVFM7CgllbHNlCgkJcmV0dXJuIFRJT0NNX0NBUiB8IFRJT0NNX0RTUjsKfQoKc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKewoJLyogdG9kbyAtIHBvc3NpYmx5IHJlbW92ZSBBRkMgYW5kIGRvIG1hbnVhbCBDVFMgKi8KfQoKc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCB1Y29uOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CgoJdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKCglpZiAoYnJlYWtfc3RhdGUpCgkJdWNvbiB8PSBTM0MyNDEwX1VDT05fU0JSRUFLOwoJZWxzZQoJCXVjb24gJj0gflMzQzI0MTBfVUNPTl9TQlJFQUs7CgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sIHVjb24pOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKCglpZiAob3VycG9ydC0+dHhfY2xhaW1lZCkgewoJCWZyZWVfaXJxKFRYX0lSUShwb3J0KSwgb3VycG9ydCk7CgkJdHhfZW5hYmxlZChwb3J0KSA9IDA7CgkJb3VycG9ydC0+dHhfY2xhaW1lZCA9IDA7Cgl9CgoJaWYgKG91cnBvcnQtPnJ4X2NsYWltZWQpIHsKCQlmcmVlX2lycShSWF9JUlEocG9ydCksIG91cnBvcnQpOwoJCW91cnBvcnQtPnJ4X2NsYWltZWQgPSAwOwoJCXJ4X2VuYWJsZWQocG9ydCkgPSAwOwoJfQp9CgoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCAqb3VycG9ydCA9IHRvX291cnBvcnQocG9ydCk7CglpbnQgcmV0OwoKCWRiZygiczNjMjR4eF9zZXJpYWxfc3RhcnR1cDogcG9ydD0lcCAoJTA4bHgsJXApXG4iLAoJICAgIHBvcnQtPm1hcGJhc2UsIHBvcnQtPm1lbWJhc2UpOwoKCXJ4X2VuYWJsZWQocG9ydCkgPSAxOwoKCXJldCA9IHJlcXVlc3RfaXJxKFJYX0lSUShwb3J0KSwKCQkJICBzM2MyNHh4X3NlcmlhbF9yeF9jaGFycywgMCwKCQkJICBzM2MyNHh4X3NlcmlhbF9wb3J0bmFtZShwb3J0KSwgb3VycG9ydCk7CgoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGlycSAlZFxuIiwgUlhfSVJRKHBvcnQpKTsKCQlyZXR1cm4gcmV0OwoJfQoKCW91cnBvcnQtPnJ4X2NsYWltZWQgPSAxOwoKCWRiZygicmVxdWVzdGluZyB0eCBpcnEuLi5cbiIpOwoKCXR4X2VuYWJsZWQocG9ydCkgPSAxOwoKCXJldCA9IHJlcXVlc3RfaXJxKFRYX0lSUShwb3J0KSwKCQkJICBzM2MyNHh4X3NlcmlhbF90eF9jaGFycywgMCwKCQkJICBzM2MyNHh4X3NlcmlhbF9wb3J0bmFtZShwb3J0KSwgb3VycG9ydCk7CgoJaWYgKHJldCkgewoJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdldCBpcnEgJWRcbiIsIFRYX0lSUShwb3J0KSk7CgkJZ290byBlcnI7Cgl9CgoJb3VycG9ydC0+dHhfY2xhaW1lZCA9IDE7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9zdGFydHVwIG9rXG4iKTsKCgkvKiB0aGUgcG9ydCByZXNldCBjb2RlIHNob3VsZCBoYXZlIGRvbmUgdGhlIGNvcnJlY3QKCSAqIHJlZ2lzdGVyIHNldHVwIGZvciB0aGUgcG9ydCBjb250cm9scyAqLwoKCXJldHVybiByZXQ7CgogZXJyOgoJczNjMjR4eF9zZXJpYWxfc2h1dGRvd24ocG9ydCk7CglyZXR1cm4gcmV0Owp9CgovKiBwb3dlciBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KCnN0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3BtKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBsZXZlbCwKCQkJICAgICAgdW5zaWduZWQgaW50IG9sZCkKewoJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKCglzd2l0Y2ggKGxldmVsKSB7CgljYXNlIDM6CgkJaWYgKCFJU19FUlIob3VycG9ydC0+YmF1ZGNsaykgJiYgb3VycG9ydC0+YmF1ZGNsayAhPSBOVUxMKQoJCQljbGtfZGlzYWJsZShvdXJwb3J0LT5iYXVkY2xrKTsKCgkJY2xrX2Rpc2FibGUob3VycG9ydC0+Y2xrKTsKCQlicmVhazsKCgljYXNlIDA6CgkJY2xrX2VuYWJsZShvdXJwb3J0LT5jbGspOwoKCQlpZiAoIUlTX0VSUihvdXJwb3J0LT5iYXVkY2xrKSAmJiBvdXJwb3J0LT5iYXVkY2xrICE9IE5VTEwpCgkJCWNsa19lbmFibGUob3VycG9ydC0+YmF1ZGNsayk7CgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgInMzYzI0eHhfc2VyaWFsOiB1bmtub3duIHBtICVkXG4iLCBsZXZlbCk7Cgl9Cn0KCi8qIGJhdWQgcmF0ZSBjYWxjdWxhdGlvbgogKgogKiBUaGUgVUFSVHMgb24gdGhlIFMzQzI0MTAvUzNDMjQ0MCBjYW4gdGFrZSB0aGVpciBjbG9ja3MgZnJvbSBhIG51bWJlcgogKiBvZiBkaWZmZXJlbnQgc291cmNlcywgaW5jbHVkaW5nIHRoZSBwZXJpcGhlcmFsIGNsb2NrICgicGNsayIpIGFuZCBhbgogKiBleHRlcm5hbCBjbG9jayAoInVjbGsiKS4gVGhlIFMzQzI0NDAgYWxzbyBhZGRzIHRoZSBjb3JlIGNsb2NrICgiZmNsayIpCiAqIHdpdGggYSBwcm9ncmFtbWFibGUgZXh0cmEgZGl2aXNvci4KICoKICogVGhlIGZvbGxvd2luZyBjb2RlIGdvZXMgdGhyb3VnaCB0aGUgY2xvY2sgc291cmNlcywgYW5kIGNhbGN1bGF0ZXMgdGhlCiAqIGJhdWQgY2xvY2tzIChhbmQgdGhlIHJlc3VsdGFudCBhY3R1YWwgYmF1ZCByYXRlcykgYW5kIHRoZW4gdHJpZXMgdG8KICogcGljayB0aGUgY2xvc2VzdCBvbmUgYW5kIHNlbGVjdCB0aGF0LgogKgoqLwoKCiNkZWZpbmUgTUFYX0NMS1MgKDgpCgpzdGF0aWMgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgdG1wX2Nsa3NyYyA9IHsKCS5uYW1lCQk9ICJwY2xrIiwKCS5taW5fYmF1ZAk9IDAsCgkubWF4X2JhdWQJPSAwLAoJLmRpdmlzb3IJPSAxLAp9OwoKc3RhdGljIGlubGluZSBpbnQKczNjMjR4eF9zZXJpYWxfZ2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjICpjKQp7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gKmluZm8gPSBzM2MyNHh4X3BvcnRfdG9faW5mbyhwb3J0KTsKCglyZXR1cm4gKGluZm8tPmdldF9jbGtzcmMpKHBvcnQsIGMpOwp9CgpzdGF0aWMgaW5saW5lIGludApzM2MyNHh4X3NlcmlhbF9zZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmMpCnsKCXN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqaW5mbyA9IHMzYzI0eHhfcG9ydF90b19pbmZvKHBvcnQpOwoKCXJldHVybiAoaW5mby0+c2V0X2Nsa3NyYykocG9ydCwgYyk7Cn0KCnN0cnVjdCBiYXVkX2NhbGMgewoJc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMJKmNsa3NyYzsKCXVuc2lnbmVkIGludAkJCSBjYWxjOwoJdW5zaWduZWQgaW50CQkJIHF1b3Q7CglzdHJ1Y3QgY2xrCQkJKnNyYzsKfTsKCnN0YXRpYyBpbnQgczNjMjR4eF9zZXJpYWxfY2FsY2JhdWQoc3RydWN0IGJhdWRfY2FsYyAqY2FsYywKCQkJCSAgIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCgkJCQkgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrc3JjLAoJCQkJICAgdW5zaWduZWQgaW50IGJhdWQpCnsKCXVuc2lnbmVkIGxvbmcgcmF0ZTsKCgljYWxjLT5zcmMgPSBjbGtfZ2V0KHBvcnQtPmRldiwgY2xrc3JjLT5uYW1lKTsKCWlmIChjYWxjLT5zcmMgPT0gTlVMTCB8fCBJU19FUlIoY2FsYy0+c3JjKSkKCQlyZXR1cm4gMDsKCglyYXRlID0gY2xrX2dldF9yYXRlKGNhbGMtPnNyYyk7CglyYXRlIC89IGNsa3NyYy0+ZGl2aXNvcjsKCgljYWxjLT5jbGtzcmMgPSBjbGtzcmM7CgljYWxjLT5xdW90ID0gKHJhdGUgKyAoOCAqIGJhdWQpKSAvICgxNiAqIGJhdWQpOwoJY2FsYy0+Y2FsYyA9IChyYXRlIC8gKGNhbGMtPnF1b3QgKiAxNikpOwoKCWNhbGMtPnF1b3QtLTsKCXJldHVybiAxOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IHMzYzI0eHhfc2VyaWFsX2dldGNsayhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJCSAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKipjbGtzcmMsCgkJCQkJICBzdHJ1Y3QgY2xrICoqY2xrLAoJCQkJCSAgdW5zaWduZWQgaW50IGJhdWQpCnsKCXN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZyA9IHMzYzI0eHhfcG9ydF90b19jZmcocG9ydCk7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrcDsKCXN0cnVjdCBiYXVkX2NhbGMgcmVzW01BWF9DTEtTXTsKCXN0cnVjdCBiYXVkX2NhbGMgKnJlc3B0ciwgKmJlc3QsICpzcHRyOwoJaW50IGk7CgoJY2xrcCA9IGNmZy0+Y2xvY2tzOwoJYmVzdCA9IE5VTEw7CgoJaWYgKGNmZy0+Y2xvY2tzX3NpemUgPCAyKSB7CgkJaWYgKGNmZy0+Y2xvY2tzX3NpemUgPT0gMCkKCQkJY2xrcCA9ICZ0bXBfY2xrc3JjOwoKCQkvKiBjaGVjayB0byBzZWUgaWYgd2UncmUgc291cmNpbmcgZmNsaywgYW5kIGlmIHNvIHdlJ3JlCgkJICogZ29pbmcgdG8gaGF2ZSB0byB1cGRhdGUgdGhlIGNsb2NrIHNvdXJjZQoJCSAqLwoKCQlpZiAoc3RyY21wKGNsa3AtPm5hbWUsICJmY2xrIikgPT0gMCkgewoJCQlzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyBzcmM7CgoJCQlzM2MyNHh4X3NlcmlhbF9nZXRzb3VyY2UocG9ydCwgJnNyYyk7CgoJCQkvKiBjaGVjayB0aGF0IHRoZSBwb3J0IGFscmVhZHkgdXNpbmcgZmNsaywgYW5kIGlmCgkJCSAqIG5vdCwgdGhlbiByZS1zZWxlY3QgZmNsawoJCQkgKi8KCgkJCWlmIChzdHJjbXAoc3JjLm5hbWUsIGNsa3AtPm5hbWUpID09IDApIHsKCQkJCXMzYzI0eHhfc2VyaWFsX3NldHNvdXJjZShwb3J0LCBjbGtwKTsKCQkJCXMzYzI0eHhfc2VyaWFsX2dldHNvdXJjZShwb3J0LCAmc3JjKTsKCQkJfQoKCQkJY2xrcC0+ZGl2aXNvciA9IHNyYy5kaXZpc29yOwoJCX0KCgkJczNjMjR4eF9zZXJpYWxfY2FsY2JhdWQocmVzLCBwb3J0LCBjbGtwLCBiYXVkKTsKCQliZXN0ID0gcmVzOwoJCXJlc3B0ciA9IGJlc3QgKyAxOwoJfSBlbHNlIHsKCQlyZXNwdHIgPSByZXM7CgoJCWZvciAoaSA9IDA7IGkgPCBjZmctPmNsb2Nrc19zaXplOyBpKyssIGNsa3ArKykgewoJCQlpZiAoczNjMjR4eF9zZXJpYWxfY2FsY2JhdWQocmVzcHRyLCBwb3J0LCBjbGtwLCBiYXVkKSkKCQkJCXJlc3B0cisrOwoJCX0KCX0KCgkvKiBvaywgd2Ugbm93IG5lZWQgdG8gc2VsZWN0IHRoZSBiZXN0IGNsb2NrIHdlIGZvdW5kICovCgoJaWYgKCFiZXN0KSB7CgkJdW5zaWduZWQgaW50IGRldmlhdGlvbiA9ICgxPDwzMCl8KCgxPDwzMCktMSk7CgkJaW50IGNhbGNfZGV2aWF0aW9uOwoKCQlmb3IgKHNwdHIgPSByZXM7IHNwdHIgPCByZXNwdHI7IHNwdHIrKykgewoJCQlwcmludGsoS0VSTl9ERUJVRwoJCQkgICAgICAgImZvdW5kIGNsayAlcCAoJXMpIHF1b3QgJWQsIGNhbGMgJWRcbiIsCgkJCSAgICAgICBzcHRyLT5jbGtzcmMsIHNwdHItPmNsa3NyYy0+bmFtZSwKCQkJICAgICAgIHNwdHItPnF1b3QsIHNwdHItPmNhbGMpOwoKCQkJY2FsY19kZXZpYXRpb24gPSBiYXVkIC0gc3B0ci0+Y2FsYzsKCQkJaWYgKGNhbGNfZGV2aWF0aW9uIDwgMCkKCQkJCWNhbGNfZGV2aWF0aW9uID0gLWNhbGNfZGV2aWF0aW9uOwoKCQkJaWYgKGNhbGNfZGV2aWF0aW9uIDwgZGV2aWF0aW9uKSB7CgkJCQliZXN0ID0gc3B0cjsKCQkJCWRldmlhdGlvbiA9IGNhbGNfZGV2aWF0aW9uOwoJCQl9CgkJfQoKCQlwcmludGsoS0VSTl9ERUJVRyAiYmVzdCAlcCAoZGV2aWF0aW9uICVkKVxuIiwgYmVzdCwgZGV2aWF0aW9uKTsKCX0KCglwcmludGsoS0VSTl9ERUJVRyAic2VsZWN0ZWQgY2xvY2sgJXAgKCVzKSBxdW90ICVkLCBjYWxjICVkXG4iLAoJICAgICAgIGJlc3QtPmNsa3NyYywgYmVzdC0+Y2xrc3JjLT5uYW1lLCBiZXN0LT5xdW90LCBiZXN0LT5jYWxjKTsKCgkvKiBzdG9yZSByZXN1bHRzIHRvIHBhc3MgYmFjayAqLwoKCSpjbGtzcmMgPSBiZXN0LT5jbGtzcmM7CgkqY2xrICAgID0gYmVzdC0+c3JjOwoKCXJldHVybiBiZXN0LT5xdW90Owp9CgpzdGF0aWMgdm9pZCBzM2MyNHh4X3NlcmlhbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJICAgICAgIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAoJCQkJICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCnsKCXN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZyA9IHMzYzI0eHhfcG9ydF90b19jZmcocG9ydCk7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKm91cnBvcnQgPSB0b19vdXJwb3J0KHBvcnQpOwoJc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsa3NyYyA9IE5VTEw7CglzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBiYXVkLCBxdW90OwoJdW5zaWduZWQgaW50IHVsY29uOwoJdW5zaWduZWQgaW50IHVtY29uOwoKCS8qCgkgKiBXZSBkb24ndCBzdXBwb3J0IG1vZGVtIGNvbnRyb2wgbGluZXMuCgkgKi8KCXRlcm1pb3MtPmNfY2ZsYWcgJj0gfihIVVBDTCB8IENNU1BBUik7Cgl0ZXJtaW9zLT5jX2NmbGFnIHw9IENMT0NBTDsKCgkvKgoJICogQXNrIHRoZSBjb3JlIHRvIGNhbGN1bGF0ZSB0aGUgZGl2aXNvciBmb3IgdXMuCgkgKi8KCgliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgMTE1MjAwKjgpOwoKCWlmIChiYXVkID09IDM4NDAwICYmIChwb3J0LT5mbGFncyAmIFVQRl9TUERfTUFTSykgPT0gVVBGX1NQRF9DVVNUKQoJCXF1b3QgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKCWVsc2UKCQlxdW90ID0gczNjMjR4eF9zZXJpYWxfZ2V0Y2xrKHBvcnQsICZjbGtzcmMsICZjbGssIGJhdWQpOwoKCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkICB0byBjaGFuZ2UgY2xvY2sgc291cmNlICovCgoJaWYgKG91cnBvcnQtPmNsa3NyYyAhPSBjbGtzcmMgfHwgb3VycG9ydC0+YmF1ZGNsayAhPSBjbGspIHsKCQlzM2MyNHh4X3NlcmlhbF9zZXRzb3VyY2UocG9ydCwgY2xrc3JjKTsKCgkJaWYgKG91cnBvcnQtPmJhdWRjbGsgIT0gTlVMTCAmJiAhSVNfRVJSKG91cnBvcnQtPmJhdWRjbGspKSB7CgkJCWNsa19kaXNhYmxlKG91cnBvcnQtPmJhdWRjbGspOwoJCQlvdXJwb3J0LT5iYXVkY2xrICA9IE5VTEw7CgkJfQoKCQljbGtfZW5hYmxlKGNsayk7CgoJCW91cnBvcnQtPmNsa3NyYyA9IGNsa3NyYzsKCQlvdXJwb3J0LT5iYXVkY2xrID0gY2xrOwoJfQoKCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CgljYXNlIENTNToKCQlkYmcoImNvbmZpZzogNWJpdHMvY2hhclxuIik7CgkJdWxjb24gPSBTM0MyNDEwX0xDT05fQ1M1OwoJCWJyZWFrOwoJY2FzZSBDUzY6CgkJZGJnKCJjb25maWc6IDZiaXRzL2NoYXJcbiIpOwoJCXVsY29uID0gUzNDMjQxMF9MQ09OX0NTNjsKCQlicmVhazsKCWNhc2UgQ1M3OgoJCWRiZygiY29uZmlnOiA3Yml0cy9jaGFyXG4iKTsKCQl1bGNvbiA9IFMzQzI0MTBfTENPTl9DUzc7CgkJYnJlYWs7CgljYXNlIENTODoKCWRlZmF1bHQ6CgkJZGJnKCJjb25maWc6IDhiaXRzL2NoYXJcbiIpOwoJCXVsY29uID0gUzNDMjQxMF9MQ09OX0NTODsKCQlicmVhazsKCX0KCgkvKiBwcmVzZXJ2ZSBvcmlnaW5hbCBsY29uIElSIHNldHRpbmdzICovCgl1bGNvbiB8PSAoY2ZnLT51bGNvbiAmIFMzQzI0MTBfTENPTl9JUk0pOwoKCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQoJCXVsY29uIHw9IFMzQzI0MTBfTENPTl9TVE9QQjsKCgl1bWNvbiA9ICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgPyBTM0MyNDEwX1VNQ09NX0FGQyA6IDA7CgoJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpIHsKCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKCQkJdWxjb24gfD0gUzNDMjQxMF9MQ09OX1BPREQ7CgkJZWxzZQoJCQl1bGNvbiB8PSBTM0MyNDEwX0xDT05fUEVWRU47Cgl9IGVsc2UgewoJCXVsY29uIHw9IFMzQzI0MTBfTENPTl9QTk9ORTsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwoKCWRiZygic2V0dGluZyB1bGNvbiB0byAlMDh4LCBicmRkaXYgdG8gJWRcbiIsIHVsY29uLCBxdW90KTsKCgl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUxDT04sIHVsY29uKTsKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQlJESVYsIHF1b3QpOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VNQ09OLCB1bWNvbik7CgoJZGJnKCJ1YXJ0OiB1bGNvbiA9IDB4JTA4eCwgdWNvbiA9IDB4JTA4eCwgdWZjb24gPSAweCUwOHhcbiIsCgkgICAgcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VMQ09OKSwKCSAgICByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiksCgkgICAgcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OKSk7CgoJLyoKCSAqIFVwZGF0ZSB0aGUgcGVyLXBvcnQgdGltZW91dC4KCSAqLwoJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKCgkvKgoJICogV2hpY2ggY2hhcmFjdGVyIHN0YXR1cyBmbGFncyBhcmUgd2UgaW50ZXJlc3RlZCBpbj8KCSAqLwoJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IFMzQzI0MTBfVUVSU1RBVF9PVkVSUlVOOwoJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IFMzQzI0MTBfVUVSU1RBVF9GUkFNRSB8IFMzQzI0MTBfVUVSU1RBVF9QQVJJVFk7CgoJLyoKCSAqIFdoaWNoIGNoYXJhY3RlciBzdGF0dXMgZmxhZ3Mgc2hvdWxkIHdlIGlnbm9yZT8KCSAqLwoJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQoJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBTM0MyNDEwX1VFUlNUQVRfT1ZFUlJVTjsKCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLICYmIHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCgkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFMzQzI0MTBfVUVSU1RBVF9GUkFNRTsKCgkvKgoJICogSWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENSRUFEIGlzIG5vdCBzZXQuCgkgKi8KCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQoJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBSWFNUQVRfRFVNTVlfUkVBRDsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICpzM2MyNHh4X3NlcmlhbF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCXN3aXRjaCAocG9ydC0+dHlwZSkgewoJY2FzZSBQT1JUX1MzQzI0MTA6CgkJcmV0dXJuICJTM0MyNDEwIjsKCWNhc2UgUE9SVF9TM0MyNDQwOgoJCXJldHVybiAiUzNDMjQ0MCI7CglkZWZhdWx0OgoJCXJldHVybiBOVUxMOwoJfQp9CgojZGVmaW5lIE1BUF9TSVpFICgweDEwMCkKCnN0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7CglyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgTUFQX1NJWkUpOwp9CgpzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgljb25zdCBjaGFyICpuYW1lID0gczNjMjR4eF9zZXJpYWxfcG9ydG5hbWUocG9ydCk7CglyZXR1cm4gcmVxdWVzdF9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIE1BUF9TSVpFLCBuYW1lKSA/IDAgOiAtRUJVU1k7Cn0KCnN0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKewoJc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvICppbmZvID0gczNjMjR4eF9wb3J0X3RvX2luZm8ocG9ydCk7CgoJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSAmJgoJICAgIHMzYzI0eHhfc2VyaWFsX3JlcXVlc3RfcG9ydChwb3J0KSA9PSAwKQoJCXBvcnQtPnR5cGUgPSBpbmZvLT50eXBlOwp9CgovKgogKiB2ZXJpZnkgdGhlIG5ldyBzZXJpYWxfc3RydWN0IChmb3IgVElPQ1NTRVJJQUwpLgogKi8Kc3RhdGljIGludApzM2MyNHh4X3NlcmlhbF92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQp7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gKmluZm8gPSBzM2MyNHh4X3BvcnRfdG9faW5mbyhwb3J0KTsKCglpZiAoc2VyLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBzZXItPnR5cGUgIT0gaW5mby0+dHlwZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglyZXR1cm4gMDsKfQoKCiNpZmRlZiBDT05GSUdfU0VSSUFMX1MzQzI0MTBfQ09OU09MRQoKc3RhdGljIHN0cnVjdCBjb25zb2xlIHMzYzI0eHhfc2VyaWFsX2NvbnNvbGU7CgojZGVmaW5lIFMzQzI0WFhfU0VSSUFMX0NPTlNPTEUgJnMzYzI0eHhfc2VyaWFsX2NvbnNvbGUKI2Vsc2UKI2RlZmluZSBTM0MyNFhYX1NFUklBTF9DT05TT0xFIE5VTEwKI2VuZGlmCgpzdGF0aWMgc3RydWN0IHVhcnRfb3BzIHMzYzI0eHhfc2VyaWFsX29wcyA9IHsKCS5wbQkJPSBzM2MyNHh4X3NlcmlhbF9wbSwKCS50eF9lbXB0eQk9IHMzYzI0eHhfc2VyaWFsX3R4X2VtcHR5LAoJLmdldF9tY3RybAk9IHMzYzI0eHhfc2VyaWFsX2dldF9tY3RybCwKCS5zZXRfbWN0cmwJPSBzM2MyNHh4X3NlcmlhbF9zZXRfbWN0cmwsCgkuc3RvcF90eAk9IHMzYzI0eHhfc2VyaWFsX3N0b3BfdHgsCgkuc3RhcnRfdHgJPSBzM2MyNHh4X3NlcmlhbF9zdGFydF90eCwKCS5zdG9wX3J4CT0gczNjMjR4eF9zZXJpYWxfc3RvcF9yeCwKCS5lbmFibGVfbXMJPSBzM2MyNHh4X3NlcmlhbF9lbmFibGVfbXMsCgkuYnJlYWtfY3RsCT0gczNjMjR4eF9zZXJpYWxfYnJlYWtfY3RsLAoJLnN0YXJ0dXAJPSBzM2MyNHh4X3NlcmlhbF9zdGFydHVwLAoJLnNodXRkb3duCT0gczNjMjR4eF9zZXJpYWxfc2h1dGRvd24sCgkuc2V0X3Rlcm1pb3MJPSBzM2MyNHh4X3NlcmlhbF9zZXRfdGVybWlvcywKCS50eXBlCQk9IHMzYzI0eHhfc2VyaWFsX3R5cGUsCgkucmVsZWFzZV9wb3J0CT0gczNjMjR4eF9zZXJpYWxfcmVsZWFzZV9wb3J0LAoJLnJlcXVlc3RfcG9ydAk9IHMzYzI0eHhfc2VyaWFsX3JlcXVlc3RfcG9ydCwKCS5jb25maWdfcG9ydAk9IHMzYzI0eHhfc2VyaWFsX2NvbmZpZ19wb3J0LAoJLnZlcmlmeV9wb3J0CT0gczNjMjR4eF9zZXJpYWxfdmVyaWZ5X3BvcnQsCn07CgoKc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzM2MyNHh4X3VhcnRfZHJ2ID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmRldl9uYW1lCT0gInMzYzI0MTBfc2VyaWFsIiwKCS5ucgkJPSAzLAoJLmNvbnMJCT0gUzNDMjRYWF9TRVJJQUxfQ09OU09MRSwKCS5kcml2ZXJfbmFtZQk9IFMzQzI0WFhfU0VSSUFMX05BTUUsCgkuZGV2ZnNfbmFtZQk9IFMzQzI0WFhfU0VSSUFMX0RFVkZTLAoJLm1ham9yCQk9IFMzQzI0WFhfU0VSSUFMX01BSk9SLAoJLm1pbm9yCQk9IFMzQzI0WFhfU0VSSUFMX01JTk9SLAp9OwoKc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCBzM2MyNHh4X3NlcmlhbF9wb3J0c1tOUl9QT1JUU10gPSB7CglbMF0gPSB7CgkJLnBvcnQgPSB7CgkJCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKCQkJLmlycQkJPSBJUlFfUzNDVUFSVF9SWDAsCgkJCS51YXJ0Y2xrCT0gMCwKCQkJLmZpZm9zaXplCT0gMTYsCgkJCS5vcHMJCT0gJnMzYzI0eHhfc2VyaWFsX29wcywKCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAoJCQkubGluZQkJPSAwLAoJCX0KCX0sCglbMV0gPSB7CgkJLnBvcnQgPSB7CgkJCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKCQkJLmlycQkJPSBJUlFfUzNDVUFSVF9SWDEsCgkJCS51YXJ0Y2xrCT0gMCwKCQkJLmZpZm9zaXplCT0gMTYsCgkJCS5vcHMJCT0gJnMzYzI0eHhfc2VyaWFsX29wcywKCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAoJCQkubGluZQkJPSAxLAoJCX0KCX0sCiNpZiBOUl9QT1JUUyA+IDIKCglbMl0gPSB7CgkJLnBvcnQgPSB7CgkJCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKCQkJLmlycQkJPSBJUlFfUzNDVUFSVF9SWDIsCgkJCS51YXJ0Y2xrCT0gMCwKCQkJLmZpZm9zaXplCT0gMTYsCgkJCS5vcHMJCT0gJnMzYzI0eHhfc2VyaWFsX29wcywKCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAoJCQkubGluZQkJPSAyLAoJCX0KCX0KI2VuZGlmCn07CgovKiBzM2MyNHh4X3NlcmlhbF9yZXNldHBvcnQKICoKICogd3JhcHBlciB0byBjYWxsIHRoZSBzcGVjaWZpYyByZXNldCBmb3IgdGhpcyBwb3J0IChyZXNldCB0aGUgZmlmb3MKICogYW5kIHRoZSBzZXR0aW5ncykKKi8KCnN0YXRpYyBpbmxpbmUgaW50IHMzYzI0eHhfc2VyaWFsX3Jlc2V0cG9ydChzdHJ1Y3QgdWFydF9wb3J0ICogcG9ydCwKCQkJCQkgICBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcpCnsKCXN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqaW5mbyA9IHMzYzI0eHhfcG9ydF90b19pbmZvKHBvcnQpOwoKCXJldHVybiAoaW5mby0+cmVzZXRfcG9ydCkocG9ydCwgY2ZnKTsKfQoKLyogczNjMjR4eF9zZXJpYWxfaW5pdF9wb3J0CiAqCiAqIGluaXRpYWxpc2UgYSBzaW5nbGUgc2VyaWFsIHBvcnQgZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlIGdpdmVuCiAqLwoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9pbml0X3BvcnQoc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0LAoJCQkJICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqaW5mbywKCQkJCSAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0ZGV2KQp7CglzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJm91cnBvcnQtPnBvcnQ7CglzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmc7CglzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKCglkYmcoInMzYzI0eHhfc2VyaWFsX2luaXRfcG9ydDogcG9ydD0lcCwgcGxhdGRldj0lcFxuIiwgcG9ydCwgcGxhdGRldik7CgoJaWYgKHBsYXRkZXYgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT0RFVjsKCgljZmcgPSBzM2MyNHh4X2Rldl90b19jZmcoJnBsYXRkZXYtPmRldik7CgoJaWYgKHBvcnQtPm1hcGJhc2UgIT0gMCkKCQlyZXR1cm4gMDsKCglpZiAoY2ZnLT5od3BvcnQgPiAzKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIHNldHVwIGluZm8gZm9yIHBvcnQgKi8KCXBvcnQtPmRldgk9ICZwbGF0ZGV2LT5kZXY7CglvdXJwb3J0LT5pbmZvCT0gaW5mbzsKCgkvKiBjb3B5IHRoZSBpbmZvIGluIGZyb20gcHJvdmlkZWQgc3RydWN0dXJlICovCglvdXJwb3J0LT5wb3J0LmZpZm9zaXplID0gaW5mby0+Zmlmb3NpemU7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9pbml0X3BvcnQ6ICVwIChodyAlZCkuLi5cbiIsIHBvcnQsIGNmZy0+aHdwb3J0KTsKCglwb3J0LT51YXJ0Y2xrID0gMTsKCglpZiAoY2ZnLT51YXJ0X2ZsYWdzICYgVVBGX0NPTlNfRkxPVykgewoJCWRiZygiczNjMjR4eF9zZXJpYWxfaW5pdF9wb3J0OiBlbmFibGluZyBmbG93IGNvbnRyb2xcbiIpOwoJCXBvcnQtPmZsYWdzIHw9IFVQRl9DT05TX0ZMT1c7Cgl9CgoJLyogc29ydCBvdXIgdGhlIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIGFkZHJlc3NlcyBmb3IgZWFjaCBVQVJUICovCgoJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBsYXRkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKCWlmIChyZXMgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGZpbmQgbWVtb3J5IHJlc291cmNlIGZvciB1YXJ0XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglkYmcoInJlc291cmNlICVwICglbHguLiVseClcbiIsIHJlcywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOwoKCXBvcnQtPm1hcGJhc2UJPSByZXMtPnN0YXJ0OwoJcG9ydC0+bWVtYmFzZQk9IFMzQzI0WFhfVkFfVUFSVCArIChyZXMtPnN0YXJ0IC0gUzNDMjRYWF9QQV9VQVJUKTsKCXBvcnQtPmlycQk9IHBsYXRmb3JtX2dldF9pcnEocGxhdGRldiwgMCk7CglpZiAocG9ydC0+aXJxIDwgMCkKCQlwb3J0LT5pcnEgPSAwOwoKCW91cnBvcnQtPmNsawk9IGNsa19nZXQoJnBsYXRkZXYtPmRldiwgInVhcnQiKTsKCglkYmcoInBvcnQ6IG1hcD0lMDh4LCBtZW09JTA4eCwgaXJxPSVkLCBjbG9jaz0lbGRcbiIsCgkgICAgcG9ydC0+bWFwYmFzZSwgcG9ydC0+bWVtYmFzZSwgcG9ydC0+aXJxLCBwb3J0LT51YXJ0Y2xrKTsKCgkvKiByZXNldCB0aGUgZmlmb3MgKGFuZCBzZXR1cCB0aGUgdWFydCkgKi8KCXMzYzI0eHhfc2VyaWFsX3Jlc2V0cG9ydChwb3J0LCBjZmcpOwoJcmV0dXJuIDA7Cn0KCi8qIERldmljZSBkcml2ZXIgc2VyaWFsIHBvcnQgcHJvYmUgKi8KCnN0YXRpYyBpbnQgcHJvYmVfaW5kZXggPSAwOwoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCgkJCQlzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gKmluZm8pCnsKCXN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCAqb3VycG9ydDsKCWludCByZXQ7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9wcm9iZSglcCwgJXApICVkXG4iLCBkZXYsIGluZm8sIHByb2JlX2luZGV4KTsKCglvdXJwb3J0ID0gJnMzYzI0eHhfc2VyaWFsX3BvcnRzW3Byb2JlX2luZGV4XTsKCXByb2JlX2luZGV4Kys7CgoJZGJnKCIlczogaW5pdGlhbGlzaW5nIHBvcnQgJXAuLi5cbiIsIF9fRlVOQ1RJT05fXywgb3VycG9ydCk7CgoJcmV0ID0gczNjMjR4eF9zZXJpYWxfaW5pdF9wb3J0KG91cnBvcnQsIGluZm8sIGRldik7CglpZiAocmV0IDwgMCkKCQlnb3RvIHByb2JlX2VycjsKCglkYmcoIiVzOiBhZGRpbmcgcG9ydFxuIiwgX19GVU5DVElPTl9fKTsKCXVhcnRfYWRkX29uZV9wb3J0KCZzM2MyNHh4X3VhcnRfZHJ2LCAmb3VycG9ydC0+cG9ydCk7CglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsICZvdXJwb3J0LT5wb3J0KTsKCglyZXR1cm4gMDsKCiBwcm9iZV9lcnI6CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBzM2MyNHh4X2Rldl90b19wb3J0KCZkZXYtPmRldik7CgoJaWYgKHBvcnQpCgkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnMzYzI0eHhfdWFydF9kcnYsIHBvcnQpOwoKCXJldHVybiAwOwp9CgovKiBVQVJUIHBvd2VyIG1hbmFnZW1lbnQgY29kZSAqLwoKI2lmZGVmIENPTkZJR19QTQoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gczNjMjR4eF9kZXZfdG9fcG9ydCgmZGV2LT5kZXYpOwoKCWlmIChwb3J0KQoJCXVhcnRfc3VzcGVuZF9wb3J0KCZzM2MyNHh4X3VhcnRfZHJ2LCBwb3J0KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gczNjMjR4eF9kZXZfdG9fcG9ydCgmZGV2LT5kZXYpOwoJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKCglpZiAocG9ydCkgewoJCWNsa19lbmFibGUob3VycG9ydC0+Y2xrKTsKCQlzM2MyNHh4X3NlcmlhbF9yZXNldHBvcnQocG9ydCwgczNjMjR4eF9wb3J0X3RvX2NmZyhwb3J0KSk7CgkJY2xrX2Rpc2FibGUob3VycG9ydC0+Y2xrKTsKCgkJdWFydF9yZXN1bWVfcG9ydCgmczNjMjR4eF91YXJ0X2RydiwgcG9ydCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbHNlCiNkZWZpbmUgczNjMjR4eF9zZXJpYWxfc3VzcGVuZCBOVUxMCiNkZWZpbmUgczNjMjR4eF9zZXJpYWxfcmVzdW1lICBOVUxMCiNlbmRpZgoKc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydiwKCQkJICAgICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqaW5mbykKewoJZGJnKCJzM2MyNHh4X3NlcmlhbF9pbml0KCVwLCVwKVxuIiwgZHJ2LCBpbmZvKTsKCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoZHJ2KTsKfQoKCi8qIG5vdyBjb21lcyB0aGUgY29kZSB0byBpbml0aWFsaXNlIGVpdGhlciB0aGUgczNjMjQxMCBvciBzM2MyNDQwIHNlcmlhbAogKiBwb3J0IGluZm9ybWF0aW9uCiovCgovKiBjcHUgc3BlY2lmaWMgdmFyaWF0aW9ucyBvbiB0aGUgc2VyaWFsIHBvcnQgc3VwcG9ydCAqLwoKI2lmZGVmIENPTkZJR19DUFVfUzNDMjQwMAoKc3RhdGljIGludCBzM2MyNDAwX3NlcmlhbF9nZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKCQkJCSAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQp7CgljbGstPmRpdmlzb3IgPSAxOwoJY2xrLT5uYW1lID0gInBjbGsiOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHMzYzI0MDBfc2VyaWFsX3NldHNvdXJjZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjICpjbGspCnsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHMzYzI0MDBfc2VyaWFsX3Jlc2V0cG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJICAgIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZykKewoJZGJnKCJzM2MyNDAwX3NlcmlhbF9yZXNldHBvcnQ6IHBvcnQ9JXAgKCUwOGx4KSwgY2ZnPSVwXG4iLAoJICAgIHBvcnQsIHBvcnQtPm1hcGJhc2UsIGNmZyk7CgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sICBjZmctPnVjb24pOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VMQ09OLCBjZmctPnVsY29uKTsKCgkvKiByZXNldCBib3RoIGZpZm9zICovCgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uIHwgUzNDMjQxMF9VRkNPTl9SRVNFVEJPVEgpOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyBzM2MyNDAwX3VhcnRfaW5mID0gewoJLm5hbWUJCT0gIlNhbXN1bmcgUzNDMjQwMCBVQVJUIiwKCS50eXBlCQk9IFBPUlRfUzNDMjQwMCwKCS5maWZvc2l6ZQk9IDE2LAoJLnJ4X2ZpZm9tYXNrCT0gUzNDMjQxMF9VRlNUQVRfUlhNQVNLLAoJLnJ4X2ZpZm9zaGlmdAk9IFMzQzI0MTBfVUZTVEFUX1JYU0hJRlQsCgkucnhfZmlmb2Z1bGwJPSBTM0MyNDEwX1VGU1RBVF9SWEZVTEwsCgkudHhfZmlmb2Z1bGwJPSBTM0MyNDEwX1VGU1RBVF9UWEZVTEwsCgkudHhfZmlmb21hc2sJPSBTM0MyNDEwX1VGU1RBVF9UWE1BU0ssCgkudHhfZmlmb3NoaWZ0CT0gUzNDMjQxMF9VRlNUQVRfVFhTSElGVCwKCS5nZXRfY2xrc3JjCT0gczNjMjQwMF9zZXJpYWxfZ2V0c291cmNlLAoJLnNldF9jbGtzcmMJPSBzM2MyNDAwX3NlcmlhbF9zZXRzb3VyY2UsCgkucmVzZXRfcG9ydAk9IHMzYzI0MDBfc2VyaWFsX3Jlc2V0cG9ydCwKfTsKCnN0YXRpYyBpbnQgczNjMjQwMF9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7CglyZXR1cm4gczNjMjR4eF9zZXJpYWxfcHJvYmUoZGV2LCAmczNjMjQwMF91YXJ0X2luZik7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0MDBfc2VyaWFsX2RydiA9IHsKCS5wcm9iZQkJPSBzM2MyNDAwX3NlcmlhbF9wcm9iZSwKCS5yZW1vdmUJCT0gczNjMjR4eF9zZXJpYWxfcmVtb3ZlLAoJLnN1c3BlbmQJPSBzM2MyNHh4X3NlcmlhbF9zdXNwZW5kLAoJLnJlc3VtZQkJPSBzM2MyNHh4X3NlcmlhbF9yZXN1bWUsCgkuZHJpdmVyCQk9IHsKCQkubmFtZQk9ICJzM2MyNDAwLXVhcnQiLAoJCS5vd25lcgk9IFRISVNfTU9EVUxFLAoJfSwKfTsKCnN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MDBfc2VyaWFsX2luaXQodm9pZCkKewoJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnMzYzI0MDBfc2VyaWFsX2RydiwgJnMzYzI0MDBfdWFydF9pbmYpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQwMF9zZXJpYWxfZXhpdCh2b2lkKQp7CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjMjQwMF9zZXJpYWxfZHJ2KTsKfQoKI2RlZmluZSBzM2MyNDAwX3VhcnRfaW5mX2F0ICZzM2MyNDAwX3VhcnRfaW5mCiNlbHNlCgpzdGF0aWMgaW5saW5lIGludCBzM2MyNDAwX3NlcmlhbF9pbml0KHZvaWQpCnsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQwMF9zZXJpYWxfZXhpdCh2b2lkKQp7Cn0KCiNkZWZpbmUgczNjMjQwMF91YXJ0X2luZl9hdCBOVUxMCgojZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDAwICovCgovKiBTM0MyNDEwIHN1cHBvcnQgKi8KCiNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTAKCnN0YXRpYyBpbnQgczNjMjQxMF9zZXJpYWxfc2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCgkJCQkgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKewoJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoKCWlmIChzdHJjbXAoY2xrLT5uYW1lLCAidWNsayIpID09IDApCgkJdWNvbiB8PSBTM0MyNDEwX1VDT05fVUNMSzsKCWVsc2UKCQl1Y29uICY9IH5TM0MyNDEwX1VDT05fVUNMSzsKCgl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiwgdWNvbik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzM2MyNDEwX3NlcmlhbF9nZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKCQkJCSAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQp7Cgl1bnNpZ25lZCBsb25nIHVjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTik7CgoJY2xrLT5kaXZpc29yID0gMTsKCWNsay0+bmFtZSA9ICh1Y29uICYgUzNDMjQxMF9VQ09OX1VDTEspID8gInVjbGsiIDogInBjbGsiOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHMzYzI0MTBfc2VyaWFsX3Jlc2V0cG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJICAgIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZykKewoJZGJnKCJzM2MyNDEwX3NlcmlhbF9yZXNldHBvcnQ6IHBvcnQ9JXAgKCUwOGx4KSwgY2ZnPSVwXG4iLAoJICAgIHBvcnQsIHBvcnQtPm1hcGJhc2UsIGNmZyk7CgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sICBjZmctPnVjb24pOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VMQ09OLCBjZmctPnVsY29uKTsKCgkvKiByZXNldCBib3RoIGZpZm9zICovCgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uIHwgUzNDMjQxMF9VRkNPTl9SRVNFVEJPVEgpOwoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyBzM2MyNDEwX3VhcnRfaW5mID0gewoJLm5hbWUJCT0gIlNhbXN1bmcgUzNDMjQxMCBVQVJUIiwKCS50eXBlCQk9IFBPUlRfUzNDMjQxMCwKCS5maWZvc2l6ZQk9IDE2LAoJLnJ4X2ZpZm9tYXNrCT0gUzNDMjQxMF9VRlNUQVRfUlhNQVNLLAoJLnJ4X2ZpZm9zaGlmdAk9IFMzQzI0MTBfVUZTVEFUX1JYU0hJRlQsCgkucnhfZmlmb2Z1bGwJPSBTM0MyNDEwX1VGU1RBVF9SWEZVTEwsCgkudHhfZmlmb2Z1bGwJPSBTM0MyNDEwX1VGU1RBVF9UWEZVTEwsCgkudHhfZmlmb21hc2sJPSBTM0MyNDEwX1VGU1RBVF9UWE1BU0ssCgkudHhfZmlmb3NoaWZ0CT0gUzNDMjQxMF9VRlNUQVRfVFhTSElGVCwKCS5nZXRfY2xrc3JjCT0gczNjMjQxMF9zZXJpYWxfZ2V0c291cmNlLAoJLnNldF9jbGtzcmMJPSBzM2MyNDEwX3NlcmlhbF9zZXRzb3VyY2UsCgkucmVzZXRfcG9ydAk9IHMzYzI0MTBfc2VyaWFsX3Jlc2V0cG9ydCwKfTsKCi8qIGRldmljZSBtYW5hZ2VtZW50ICovCgpzdGF0aWMgaW50IHMzYzI0MTBfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKewoJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX3Byb2JlKGRldiwgJnMzYzI0MTBfdWFydF9pbmYpOwp9CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNDEwX3NlcmlhbF9kcnYgPSB7CgkucHJvYmUJCT0gczNjMjQxMF9zZXJpYWxfcHJvYmUsCgkucmVtb3ZlCQk9IHMzYzI0eHhfc2VyaWFsX3JlbW92ZSwKCS5zdXNwZW5kCT0gczNjMjR4eF9zZXJpYWxfc3VzcGVuZCwKCS5yZXN1bWUJCT0gczNjMjR4eF9zZXJpYWxfcmVzdW1lLAoJLmRyaXZlcgkJPSB7CgkJLm5hbWUJPSAiczNjMjQxMC11YXJ0IiwKCQkub3duZXIJPSBUSElTX01PRFVMRSwKCX0sCn07CgpzdGF0aWMgaW5saW5lIGludCBzM2MyNDEwX3NlcmlhbF9pbml0KHZvaWQpCnsKCXJldHVybiBzM2MyNHh4X3NlcmlhbF9pbml0KCZzM2MyNDEwX3NlcmlhbF9kcnYsICZzM2MyNDEwX3VhcnRfaW5mKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfc2VyaWFsX2V4aXQodm9pZCkKewoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfc2VyaWFsX2Rydik7Cn0KCiNkZWZpbmUgczNjMjQxMF91YXJ0X2luZl9hdCAmczNjMjQxMF91YXJ0X2luZgojZWxzZQoKc3RhdGljIGlubGluZSBpbnQgczNjMjQxMF9zZXJpYWxfaW5pdCh2b2lkKQp7CglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfc2VyaWFsX2V4aXQodm9pZCkKewp9CgojZGVmaW5lIHMzYzI0MTBfdWFydF9pbmZfYXQgTlVMTAoKI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQxMCAqLwoKI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAoKc3RhdGljIGludCBzM2MyNDQwX3NlcmlhbF9zZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKCQkJCSAgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKewoJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoKCS8vIHRvZG8gLSBwcm9wZXIgZmNsazw+bm9uZmNsayBzd2l0Y2ggLy8KCgl1Y29uICY9IH5TM0MyNDQwX1VDT05fQ0xLTUFTSzsKCglpZiAoc3RyY21wKGNsay0+bmFtZSwgInVjbGsiKSA9PSAwKQoJCXVjb24gfD0gUzNDMjQ0MF9VQ09OX1VDTEs7CgllbHNlIGlmIChzdHJjbXAoY2xrLT5uYW1lLCAicGNsayIpID09IDApCgkJdWNvbiB8PSBTM0MyNDQwX1VDT05fUENMSzsKCWVsc2UgaWYgKHN0cmNtcChjbGstPm5hbWUsICJmY2xrIikgPT0gMCkKCQl1Y29uIHw9IFMzQzI0NDBfVUNPTl9GQ0xLOwoJZWxzZSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ1bmtub3duIGNsb2NrIHNvdXJjZSAlc1xuIiwgY2xrLT5uYW1lKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiwgdWNvbik7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgczNjMjQ0MF9zZXJpYWxfZ2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCgkJCQkgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKewoJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoJdW5zaWduZWQgbG9uZyB1Y29uMCwgdWNvbjEsIHVjb24yOwoKCXN3aXRjaCAodWNvbiAmIFMzQzI0NDBfVUNPTl9DTEtNQVNLKSB7CgljYXNlIFMzQzI0NDBfVUNPTl9VQ0xLOgoJCWNsay0+ZGl2aXNvciA9IDE7CgkJY2xrLT5uYW1lID0gInVjbGsiOwoJCWJyZWFrOwoKCWNhc2UgUzNDMjQ0MF9VQ09OX1BDTEs6CgljYXNlIFMzQzI0NDBfVUNPTl9QQ0xLMjoKCQljbGstPmRpdmlzb3IgPSAxOwoJCWNsay0+bmFtZSA9ICJwY2xrIjsKCQlicmVhazsKCgljYXNlIFMzQzI0NDBfVUNPTl9GQ0xLOgoJCS8qIHRoZSBmdW4gb2YgY2FsY3VsYXRpbmcgdGhlIHVhcnQgZGl2aXNvcnMgb24KCQkgKiB0aGUgczNjMjQ0MCAqLwoKCQl1Y29uMCA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfVkFfVUFSVDAgKyBTM0MyNDEwX1VDT04pOwoJCXVjb24xID0gX19yYXdfcmVhZGwoUzNDMjRYWF9WQV9VQVJUMSArIFMzQzI0MTBfVUNPTik7CgkJdWNvbjIgPSBfX3Jhd19yZWFkbChTM0MyNFhYX1ZBX1VBUlQyICsgUzNDMjQxMF9VQ09OKTsKCgkJcHJpbnRrKCJ1Y29uczogJTA4bHgsICUwOGx4LCAlMDhseFxuIiwgdWNvbjAsIHVjb24xLCB1Y29uMik7CgoJCXVjb24wICY9IFMzQzI0NDBfVUNPTjBfRElWTUFTSzsKCQl1Y29uMSAmPSBTM0MyNDQwX1VDT04xX0RJVk1BU0s7CgkJdWNvbjIgJj0gUzNDMjQ0MF9VQ09OMl9ESVZNQVNLOwoKCQlpZiAodWNvbjAgIT0gMCkgewoJCQljbGstPmRpdmlzb3IgPSB1Y29uMCA+PiBTM0MyNDQwX1VDT05fRElWU0hJRlQ7CgkJCWNsay0+ZGl2aXNvciArPSA2OwoJCX0gZWxzZSBpZiAodWNvbjEgIT0gMCkgewoJCQljbGstPmRpdmlzb3IgPSB1Y29uMSA+PiBTM0MyNDQwX1VDT05fRElWU0hJRlQ7CgkJCWNsay0+ZGl2aXNvciArPSAyMTsKCQl9IGVsc2UgaWYgKHVjb24yICE9IDApIHsKCQkJY2xrLT5kaXZpc29yID0gdWNvbjIgPj4gUzNDMjQ0MF9VQ09OX0RJVlNISUZUOwoJCQljbGstPmRpdmlzb3IgKz0gMzY7CgkJfSBlbHNlIHsKCQkJLyogbWFudWFsIGNhbGltcyA0NCwgc2VlbXMgdG8gYmUgOSAqLwoJCQljbGstPmRpdmlzb3IgPSA5OwoJCX0KCgkJY2xrLT5uYW1lID0gImZjbGsiOwoJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHMzYzI0NDBfc2VyaWFsX3Jlc2V0cG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAoJCQkJICAgIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZykKewoJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoKCWRiZygiczNjMjQ0MF9zZXJpYWxfcmVzZXRwb3J0OiBwb3J0PSVwICglMDhseCksIGNmZz0lcFxuIiwKCSAgICBwb3J0LCBwb3J0LT5tYXBiYXNlLCBjZmcpOwoKCS8qIGVuc3VyZSB3ZSBkb24ndCBjaGFuZ2UgdGhlIGNsb2NrIHNldHRpbmdzLi4uICovCgoJdWNvbiAmPSAoUzNDMjQ0MF9VQ09OMF9ESVZNQVNLIHwgKDM8PDEwKSk7CgoJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sICB1Y29uIHwgY2ZnLT51Y29uKTsKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VTENPTiwgY2ZnLT51bGNvbik7CgoJLyogcmVzZXQgYm90aCBmaWZvcyAqLwoKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbiB8IFMzQzI0MTBfVUZDT05fUkVTRVRCT1RIKTsKCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gczNjMjQ0MF91YXJ0X2luZiA9IHsKCS5uYW1lCQk9ICJTYW1zdW5nIFMzQzI0NDAgVUFSVCIsCgkudHlwZQkJPSBQT1JUX1MzQzI0NDAsCgkuZmlmb3NpemUJPSA2NCwKCS5yeF9maWZvbWFzawk9IFMzQzI0NDBfVUZTVEFUX1JYTUFTSywKCS5yeF9maWZvc2hpZnQJPSBTM0MyNDQwX1VGU1RBVF9SWFNISUZULAoJLnJ4X2ZpZm9mdWxsCT0gUzNDMjQ0MF9VRlNUQVRfUlhGVUxMLAoJLnR4X2ZpZm9mdWxsCT0gUzNDMjQ0MF9VRlNUQVRfVFhGVUxMLAoJLnR4X2ZpZm9tYXNrCT0gUzNDMjQ0MF9VRlNUQVRfVFhNQVNLLAoJLnR4X2ZpZm9zaGlmdAk9IFMzQzI0NDBfVUZTVEFUX1RYU0hJRlQsCgkuZ2V0X2Nsa3NyYwk9IHMzYzI0NDBfc2VyaWFsX2dldHNvdXJjZSwKCS5zZXRfY2xrc3JjCT0gczNjMjQ0MF9zZXJpYWxfc2V0c291cmNlLAoJLnJlc2V0X3BvcnQJPSBzM2MyNDQwX3NlcmlhbF9yZXNldHBvcnQsCn07CgovKiBkZXZpY2UgbWFuYWdlbWVudCAqLwoKc3RhdGljIGludCBzM2MyNDQwX3NlcmlhbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCnsKCWRiZygiczNjMjQ0MF9zZXJpYWxfcHJvYmU6IGRldj0lcFxuIiwgZGV2KTsKCXJldHVybiBzM2MyNHh4X3NlcmlhbF9wcm9iZShkZXYsICZzM2MyNDQwX3VhcnRfaW5mKTsKfQoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjQ0MF9zZXJpYWxfZHJ2ID0gewoJLnByb2JlCQk9IHMzYzI0NDBfc2VyaWFsX3Byb2JlLAoJLnJlbW92ZQkJPSBzM2MyNHh4X3NlcmlhbF9yZW1vdmUsCgkuc3VzcGVuZAk9IHMzYzI0eHhfc2VyaWFsX3N1c3BlbmQsCgkucmVzdW1lCQk9IHMzYzI0eHhfc2VyaWFsX3Jlc3VtZSwKCS5kcml2ZXIJCT0gewoJCS5uYW1lCT0gInMzYzI0NDAtdWFydCIsCgkJLm93bmVyCT0gVEhJU19NT0RVTEUsCgl9LAp9OwoKCnN0YXRpYyBpbmxpbmUgaW50IHMzYzI0NDBfc2VyaWFsX2luaXQodm9pZCkKewoJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnMzYzI0NDBfc2VyaWFsX2RydiwgJnMzYzI0NDBfdWFydF9pbmYpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQ0MF9zZXJpYWxfZXhpdCh2b2lkKQp7CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjMjQ0MF9zZXJpYWxfZHJ2KTsKfQoKI2RlZmluZSBzM2MyNDQwX3VhcnRfaW5mX2F0ICZzM2MyNDQwX3VhcnRfaW5mCiNlbHNlCgpzdGF0aWMgaW5saW5lIGludCBzM2MyNDQwX3NlcmlhbF9pbml0KHZvaWQpCnsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQ0MF9zZXJpYWxfZXhpdCh2b2lkKQp7Cn0KCiNkZWZpbmUgczNjMjQ0MF91YXJ0X2luZl9hdCBOVUxMCiNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0NDAgKi8KCi8qIG1vZHVsZSBpbml0aWFsaXNhdGlvbiBjb2RlICovCgpzdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NlcmlhbF9tb2Rpbml0KHZvaWQpCnsKCWludCByZXQ7CgoJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOwoJaWYgKHJldCA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBVQVJUIGRyaXZlclxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXMzYzI0MDBfc2VyaWFsX2luaXQoKTsKCXMzYzI0MTBfc2VyaWFsX2luaXQoKTsKCXMzYzI0NDBfc2VyaWFsX2luaXQoKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19leGl0IHMzYzI0eHhfc2VyaWFsX21vZGV4aXQodm9pZCkKewoJczNjMjQwMF9zZXJpYWxfZXhpdCgpOwoJczNjMjQxMF9zZXJpYWxfZXhpdCgpOwoJczNjMjQ0MF9zZXJpYWxfZXhpdCgpOwoKCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOwp9CgoKbW9kdWxlX2luaXQoczNjMjR4eF9zZXJpYWxfbW9kaW5pdCk7Cm1vZHVsZV9leGl0KHMzYzI0eHhfc2VyaWFsX21vZGV4aXQpOwoKLyogQ29uc29sZSBjb2RlICovCgojaWZkZWYgQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEUKCnN0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0ICpjb25zX3VhcnQ7CgpzdGF0aWMgaW50CnMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfdHhyZHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHVmY29uKQp7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gKmluZm8gPSBzM2MyNHh4X3BvcnRfdG9faW5mbyhwb3J0KTsKCXVuc2lnbmVkIGxvbmcgdWZzdGF0LCB1dHJzdGF0OwoKCWlmICh1ZmNvbiAmIFMzQzI0MTBfVUZDT05fRklGT01PREUpIHsKCQkvKiBmaWZvIG1vZGUgLSBjaGVjayBhbW1vdW50IG9mIGRhdGEgaW4gZmlmbyByZWdpc3RlcnMuLi4gKi8KCgkJdWZzdGF0ID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VGU1RBVCk7CgkJcmV0dXJuICh1ZnN0YXQgJiBpbmZvLT50eF9maWZvZnVsbCkgPyAwIDogMTsKCX0KCgkvKiBpbiBub24tZmlmbyBtb2RlLCB3ZSBnbyBhbmQgdXNlIHRoZSB0eCBidWZmZXIgZW1wdHkgKi8KCgl1dHJzdGF0ID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VUUlNUQVQpOwoJcmV0dXJuICh1dHJzdGF0ICYgUzNDMjQxMF9VVFJTVEFUX1RYRSkgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQKczNjMjR4eF9zZXJpYWxfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKewoJdW5zaWduZWQgaW50IHVmY29uID0gcmRfcmVnbChjb25zX3VhcnQsIFMzQzI0MTBfVUZDT04pOwoJd2hpbGUgKCFzM2MyNHh4X3NlcmlhbF9jb25zb2xlX3R4cmR5KHBvcnQsIHVmY29uKSkKCQliYXJyaWVyKCk7Cgl3cl9yZWdiKGNvbnNfdWFydCwgUzNDMjQxMF9VVFhILCBjaCk7Cn0KCnN0YXRpYyB2b2lkCnMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLAoJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKewoJdWFydF9jb25zb2xlX3dyaXRlKGNvbnNfdWFydCwgcywgY291bnQsIHMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7Cn0KCnN0YXRpYyB2b2lkIF9faW5pdApzM2MyNHh4X3NlcmlhbF9nZXRfb3B0aW9ucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgKmJhdWQsCgkJCSAgIGludCAqcGFyaXR5LCBpbnQgKmJpdHMpCnsKCXN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjIGNsa3NyYzsKCXN0cnVjdCBjbGsgKmNsazsKCXVuc2lnbmVkIGludCB1bGNvbjsKCXVuc2lnbmVkIGludCB1Y29uOwoJdW5zaWduZWQgaW50IHVicmRpdjsKCXVuc2lnbmVkIGxvbmcgcmF0ZTsKCgl1bGNvbiAgPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUxDT04pOwoJdWNvbiAgID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwoJdWJyZGl2ID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VCUkRJVik7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9nZXRfb3B0aW9uczogcG9ydD0lcFxuIgoJICAgICJyZWdpc3RlcnM6IHVsY29uPSUwOHgsIHVjb249JTA4eCwgdWJkcml2PSUwOHhcbiIsCgkgICAgcG9ydCwgdWxjb24sIHVjb24sIHVicmRpdik7CgoJaWYgKCh1Y29uICYgMHhmKSAhPSAwKSB7CgkJLyogY29uc2lkZXIgdGhlIHNlcmlhbCBwb3J0IGNvbmZpZ3VyZWQgaWYgdGhlIHR4L3J4IG1vZGUgc2V0ICovCgoJCXN3aXRjaCAodWxjb24gJiBTM0MyNDEwX0xDT05fQ1NNQVNLKSB7CgkJY2FzZSBTM0MyNDEwX0xDT05fQ1M1OgoJCQkqYml0cyA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgUzNDMjQxMF9MQ09OX0NTNjoKCQkJKmJpdHMgPSA2OwoJCQlicmVhazsKCQljYXNlIFMzQzI0MTBfTENPTl9DUzc6CgkJCSpiaXRzID0gNzsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQljYXNlIFMzQzI0MTBfTENPTl9DUzg6CgkJCSpiaXRzID0gODsKCQkJYnJlYWs7CgkJfQoKCQlzd2l0Y2ggKHVsY29uICYgUzNDMjQxMF9MQ09OX1BNQVNLKSB7CgkJY2FzZSBTM0MyNDEwX0xDT05fUEVWRU46CgkJCSpwYXJpdHkgPSAnZSc7CgkJCWJyZWFrOwoKCQljYXNlIFMzQzI0MTBfTENPTl9QT0REOgoJCQkqcGFyaXR5ID0gJ28nOwoJCQlicmVhazsKCgkJY2FzZSBTM0MyNDEwX0xDT05fUE5PTkU6CgkJZGVmYXVsdDoKCQkJKnBhcml0eSA9ICduJzsKCQl9CgoJCS8qIG5vdyBjYWxjdWxhdGUgdGhlIGJhdWQgcmF0ZSAqLwoKCQlzM2MyNHh4X3NlcmlhbF9nZXRzb3VyY2UocG9ydCwgJmNsa3NyYyk7CgoJCWNsayA9IGNsa19nZXQocG9ydC0+ZGV2LCBjbGtzcmMubmFtZSk7CgkJaWYgKCFJU19FUlIoY2xrKSAmJiBjbGsgIT0gTlVMTCkKCQkJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspIC8gY2xrc3JjLmRpdmlzb3I7CgkJZWxzZQoJCQlyYXRlID0gMTsKCgoJCSpiYXVkID0gcmF0ZSAvICggMTYgKiAodWJyZGl2ICsgMSkpOwoJCWRiZygiY2FsY3VsYXRlZCBiYXVkICVkXG4iLCAqYmF1ZCk7Cgl9Cgp9CgovKiBzM2MyNHh4X3NlcmlhbF9pbml0X3BvcnRzCiAqCiAqIGluaXRpYWxpc2UgdGhlIHNlcmlhbCBwb3J0cyBmcm9tIHRoZSBtYWNoaW5lIHByb3ZpZGVkIGluaXRpYWxpc2F0aW9uCiAqIGRhdGEuCiovCgpzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX2luaXRfcG9ydHMoc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvICppbmZvKQp7CglzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKnB0ciA9IHMzYzI0eHhfc2VyaWFsX3BvcnRzOwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKnBsYXRkZXZfcHRyOwoJaW50IGk7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9pbml0X3BvcnRzOiBpbml0aWFsaXNpbmcgcG9ydHMuLi5cbiIpOwoKCXBsYXRkZXZfcHRyID0gczNjMjR4eF91YXJ0X2RldnM7CgoJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyssIHB0cisrLCBwbGF0ZGV2X3B0cisrKSB7CgkJczNjMjR4eF9zZXJpYWxfaW5pdF9wb3J0KHB0ciwgaW5mbywgKnBsYXRkZXZfcHRyKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2luaXQKczNjMjR4eF9zZXJpYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCnsKCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CglpbnQgYmF1ZCA9IDk2MDA7CglpbnQgYml0cyA9IDg7CglpbnQgcGFyaXR5ID0gJ24nOwoJaW50IGZsb3cgPSAnbic7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9jb25zb2xlX3NldHVwOiBjbz0lcCAoJWQpLCAlc1xuIiwKCSAgICBjbywgY28tPmluZGV4LCBvcHRpb25zKTsKCgkvKiBpcyB0aGlzIGEgdmFsaWQgcG9ydCAqLwoKCWlmIChjby0+aW5kZXggPT0gLTEgfHwgY28tPmluZGV4ID49IE5SX1BPUlRTKQoJCWNvLT5pbmRleCA9IDA7CgoJcG9ydCA9ICZzM2MyNHh4X3NlcmlhbF9wb3J0c1tjby0+aW5kZXhdLnBvcnQ7CgoJLyogaXMgdGhlIHBvcnQgY29uZmlndXJlZD8gKi8KCglpZiAocG9ydC0+bWFwYmFzZSA9PSAweDApIHsKCQljby0+aW5kZXggPSAwOwoJCXBvcnQgPSAmczNjMjR4eF9zZXJpYWxfcG9ydHNbY28tPmluZGV4XS5wb3J0OwoJfQoKCWNvbnNfdWFydCA9IHBvcnQ7CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9jb25zb2xlX3NldHVwOiBwb3J0PSVwICglZClcbiIsIHBvcnQsIGNvLT5pbmRleCk7CgoJLyoKCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAoJICogaWYgc28sIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwb3J0IHRoYXQgZG9lcyBoYXZlCgkgKiBjb25zb2xlIHN1cHBvcnQuCgkgKi8KCWlmIChvcHRpb25zKQoJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKCWVsc2UKCQlzM2MyNHh4X3NlcmlhbF9nZXRfb3B0aW9ucyhwb3J0LCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMpOwoKCWRiZygiczNjMjR4eF9zZXJpYWxfY29uc29sZV9zZXR1cDogYmF1ZCAlZFxuIiwgYmF1ZCk7CgoJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Cn0KCi8qIHMzYzI0eHhfc2VyaWFsX2luaXRjb25zb2xlCiAqCiAqIGluaXRpYWxpc2UgdGhlIGNvbnNvbGUgZnJvbSBvbmUgb2YgdGhlIHVhcnQgZHJpdmVycwoqLwoKc3RhdGljIHN0cnVjdCBjb25zb2xlIHMzYzI0eHhfc2VyaWFsX2NvbnNvbGUgPQp7CgkubmFtZQkJPSBTM0MyNFhYX1NFUklBTF9OQU1FLAoJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAoJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKCS5pbmRleAkJPSAtMSwKCS53cml0ZQkJPSBzM2MyNHh4X3NlcmlhbF9jb25zb2xlX3dyaXRlLAoJLnNldHVwCQk9IHMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfc2V0dXAKfTsKCnN0YXRpYyBpbnQgczNjMjR4eF9zZXJpYWxfaW5pdGNvbnNvbGUodm9pZCkKewoJc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvICppbmZvOwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gczNjMjR4eF91YXJ0X2RldnNbMF07CgoJZGJnKCJzM2MyNHh4X3NlcmlhbF9pbml0Y29uc29sZVxuIik7CgoJLyogc2VsZWN0IGRyaXZlciBiYXNlZCBvbiB0aGUgY3B1ICovCgoJaWYgKGRldiA9PSBOVUxMKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzM2MyNHh4OiBubyBkZXZpY2VzIGZvciBjb25zb2xlIGluaXRcbiIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChzdHJjbXAoZGV2LT5uYW1lLCAiczNjMjQwMC11YXJ0IikgPT0gMCkgewoJCWluZm8gPSBzM2MyNDAwX3VhcnRfaW5mX2F0OwoJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAiczNjMjQxMC11YXJ0IikgPT0gMCkgewoJCWluZm8gPSBzM2MyNDEwX3VhcnRfaW5mX2F0OwoJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAiczNjMjQ0MC11YXJ0IikgPT0gMCkgewoJCWluZm8gPSBzM2MyNDQwX3VhcnRfaW5mX2F0OwoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9FUlIgInMzYzI0eHg6IG5vIGRyaXZlciBmb3IgJXNcbiIsIGRldi0+bmFtZSk7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGluZm8gPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX0VSUiAiczNjMjR4eDogbm8gZHJpdmVyIGZvciBjb25zb2xlXG4iKTsKCQlyZXR1cm4gMDsKCX0KCglzM2MyNHh4X3NlcmlhbF9jb25zb2xlLmRhdGEgPSAmczNjMjR4eF91YXJ0X2RydjsKCXMzYzI0eHhfc2VyaWFsX2luaXRfcG9ydHMoaW5mbyk7CgoJcmVnaXN0ZXJfY29uc29sZSgmczNjMjR4eF9zZXJpYWxfY29uc29sZSk7CglyZXR1cm4gMDsKfQoKY29uc29sZV9pbml0Y2FsbChzM2MyNHh4X3NlcmlhbF9pbml0Y29uc29sZSk7CgojZW5kaWYgLyogQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEUgKi8KCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgUzNDMjQxMC9TM0MyNDQwIFNlcmlhbCBwb3J0IGRyaXZlciIpOwo=