LyoKICAgIGdsNTIwc20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgICBtb25pdG9yaW5nCiAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICAgQ29weXJpZ2h0IChjKSAyMDA1ICAgICAgICBNYWFydGVuIERlcHJleiA8bWFhcnRlbmRlcHJlekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgoqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9od21vbi5oPgojaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KCi8qIFR5cGUgb2YgdGhlIGV4dHJhIHNlbnNvciAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgZXh0cmFfc2Vuc29yX3R5cGU7Cm1vZHVsZV9wYXJhbShleHRyYV9zZW5zb3JfdHlwZSwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhleHRyYV9zZW5zb3JfdHlwZSwgIlR5cGUgb2YgZXh0cmEgc2Vuc29yICgwPWF1dG9kZXRlY3QsIDE9dGVtcGVyYXR1cmUsIDI9dm9sdGFnZSkiKTsKCi8qIEFkZHJlc3NlcyB0byBzY2FuICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIEkyQ19DTElFTlRfRU5EIH07CgovKiBJbnNtb2QgcGFyYW1ldGVycyAqLwpJMkNfQ0xJRU5UX0lOU01PRF8xKGdsNTIwc20pOwoKLyogTWFueSBHTDUyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93IApPbmUgb2YgdGhlIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCBhcyBlaXRoZXIgdGVtcCBvciB2b2x0YWdlLgpUaGF0J3Mgd2h5IF9URU1QMiBhbmQgX0lONCBhY2Nlc3MgdGhlIHNhbWUgcmVnaXN0ZXIgCiovCgovKiBUaGUgR0w1MjAgcmVnaXN0ZXJzICovCiNkZWZpbmUgR0w1MjBfUkVHX0NISVBfSUQJCTB4MDAKI2RlZmluZSBHTDUyMF9SRUdfUkVWSVNJT04JCTB4MDEKI2RlZmluZSBHTDUyMF9SRUdfQ09ORgkJCTB4MDMKI2RlZmluZSBHTDUyMF9SRUdfTUFTSwkJCTB4MTEKCiNkZWZpbmUgR0w1MjBfUkVHX1ZJRF9JTlBVVAkJMHgwMgoKI2RlZmluZSBHTDUyMF9SRUdfSU4wX0lOUFVUCQkweDE1CiNkZWZpbmUgR0w1MjBfUkVHX0lOMF9MSU1JVAkJMHgwYwojZGVmaW5lIEdMNTIwX1JFR19JTjBfTUlOCQlHTDUyMF9SRUdfSU4wX0xJTUlUCiNkZWZpbmUgR0w1MjBfUkVHX0lOMF9NQVgJCUdMNTIwX1JFR19JTjBfTElNSVQKCiNkZWZpbmUgR0w1MjBfUkVHX0lOMV9JTlBVVAkJMHgxNAojZGVmaW5lIEdMNTIwX1JFR19JTjFfTElNSVQJCTB4MDkKI2RlZmluZSBHTDUyMF9SRUdfSU4xX01JTgkJR0w1MjBfUkVHX0lOMV9MSU1JVAojZGVmaW5lIEdMNTIwX1JFR19JTjFfTUFYCQlHTDUyMF9SRUdfSU4xX0xJTUlUCgojZGVmaW5lIEdMNTIwX1JFR19JTjJfSU5QVVQJCTB4MTMKI2RlZmluZSBHTDUyMF9SRUdfSU4yX0xJTUlUCQkweDBhCiNkZWZpbmUgR0w1MjBfUkVHX0lOMl9NSU4JCUdMNTIwX1JFR19JTjJfTElNSVQKI2RlZmluZSBHTDUyMF9SRUdfSU4yX01BWAkJR0w1MjBfUkVHX0lOMl9MSU1JVAoKI2RlZmluZSBHTDUyMF9SRUdfSU4zX0lOUFVUCQkweDBkCiNkZWZpbmUgR0w1MjBfUkVHX0lOM19MSU1JVAkJMHgwYgojZGVmaW5lIEdMNTIwX1JFR19JTjNfTUlOCQlHTDUyMF9SRUdfSU4zX0xJTUlUCiNkZWZpbmUgR0w1MjBfUkVHX0lOM19NQVgJCUdMNTIwX1JFR19JTjNfTElNSVQKCiNkZWZpbmUgR0w1MjBfUkVHX0lONF9JTlBVVAkJMHgwZQojZGVmaW5lIEdMNTIwX1JFR19JTjRfTUFYCQkweDE3CiNkZWZpbmUgR0w1MjBfUkVHX0lONF9NSU4JCTB4MTgKCiNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX0lOUFVUCQkweDA0CiNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX01BWAkJMHgwNQojZGVmaW5lIEdMNTIwX1JFR19URU1QMV9NQVhfSFlTVAkweDA2CgojZGVmaW5lIEdMNTIwX1JFR19URU1QMl9JTlBVVAkJMHgwZQojZGVmaW5lIEdMNTIwX1JFR19URU1QMl9NQVgJCTB4MTcKI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfTUFYX0hZU1QJMHgxOAoKI2RlZmluZSBHTDUyMF9SRUdfRkFOX0lOUFVUCQkweDA3CiNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9NSU4JCTB4MDgKI2RlZmluZSBHTDUyMF9SRUdfRkFOX0RJVgkJMHgwZgojZGVmaW5lIEdMNTIwX1JFR19GQU5fT0ZGCQlHTDUyMF9SRUdfRkFOX0RJVgoKI2RlZmluZSBHTDUyMF9SRUdfQUxBUk1TCQkweDEyCiNkZWZpbmUgR0w1MjBfUkVHX0JFRVBfTUFTSwkJMHgxMAojZGVmaW5lIEdMNTIwX1JFR19CRUVQX0VOQUJMRQkJR0w1MjBfUkVHX0NPTkYKCi8qCiAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucwogKi8KCnN0YXRpYyBpbnQgZ2w1MjBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOwpzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKc3RhdGljIGludCBnbDUyMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwpzdGF0aWMgaW50IGdsNTIwX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKc3RhdGljIGludCBnbDUyMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CnN0YXRpYyBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZ2w1MjBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwoKLyogRHJpdmVyIGRhdGEgKi8Kc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGdsNTIwX2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm5hbWUJPSAiZ2w1MjBzbSIsCgl9LAoJLmlkCQk9IEkyQ19EUklWRVJJRF9HTDUyMCwKCS5hdHRhY2hfYWRhcHRlcgk9IGdsNTIwX2F0dGFjaF9hZGFwdGVyLAoJLmRldGFjaF9jbGllbnQJPSBnbDUyMF9kZXRhY2hfY2xpZW50LAp9OwoKLyogQ2xpZW50IGRhdGEgKi8Kc3RydWN0IGdsNTIwX2RhdGEgewoJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OwoJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwoJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwoJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KCgl1OCB2aWQ7Cgl1OCB2cm07Cgl1OCBpbl9pbnB1dFs1XTsJCS8qIFswXSA9IFZWRCAqLwoJdTggaW5fbWluWzVdOwkJLyogWzBdID0gVkREICovCgl1OCBpbl9tYXhbNV07CQkvKiBbMF0gPSBWREQgKi8KCXU4IGZhbl9pbnB1dFsyXTsKCXU4IGZhbl9taW5bMl07Cgl1OCBmYW5fZGl2WzJdOwoJdTggZmFuX29mZjsKCXU4IHRlbXBfaW5wdXRbMl07Cgl1OCB0ZW1wX21heFsyXTsKCXU4IHRlbXBfbWF4X2h5c3RbMl07Cgl1OCBhbGFybXM7Cgl1OCBiZWVwX2VuYWJsZTsKCXU4IGJlZXBfbWFzazsKCXU4IGFsYXJtX21hc2s7Cgl1OCB0d29fdGVtcHM7Cn07CgovKgogKiBTeXNmcyBzdHVmZgogKi8KCiNkZWZpbmUgc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjaXRlbSAoc3RydWN0IGdsNTIwX2RhdGEgKiwgY2hhciAqLCBpbnQpOyBcCnN0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKik7IFwKc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCnsgXAoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7IFwKCXJldHVybiBnZXRfIyN0eXBlIyNpdGVtKGRhdGEsIGJ1ZiwgKG4pKTsgXAp9CgojZGVmaW5lIHN5c2ZzX3codHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI2l0ZW0gKHN0cnVjdCBpMmNfY2xpZW50ICosIHN0cnVjdCBnbDUyMF9kYXRhICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQsIGludCk7IFwKc3RhdGljIHNzaXplX3Qgc2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCnsgXAoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAoJcmV0dXJuIHNldF8jI3R5cGUjI2l0ZW0oY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCAobiksIHJlZyk7IFwKfQoKI2RlZmluZSBzeXNmc19yd19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjbiMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjI24jI2l0ZW0sIHNldF8jI3R5cGUjI24jI2l0ZW0pOwoKI2RlZmluZSBzeXNmc19yb19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjbiMjaXRlbSwgU19JUlVHTywgZ2V0XyMjdHlwZSMjbiMjaXRlbSwgTlVMTCk7CgojZGVmaW5lIHN5c2ZzX3J3KHR5cGUsIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIDAsIGl0ZW0sIHJlZykgXApzeXNmc193KHR5cGUsIDAsIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjIzAjI2l0ZW0sIHNldF8jI3R5cGUjIzAjI2l0ZW0pOwoKI2RlZmluZSBzeXNmc19ybyh0eXBlLCBpdGVtLCByZWcpIFwKc3lzZnNfcih0eXBlLCAwLCBpdGVtLCByZWcpIFwKc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI2l0ZW0sIFNfSVJVR08sIGdldF8jI3R5cGUjIzAjI2l0ZW0sIE5VTEwpOwoKCiNkZWZpbmUgc3lzZnNfdmlkKG4pIFwKc3lzZnNfcm9fbihjcHUsIG4sIF92aWQsIEdMNTIwX1JFR19WSURfSU5QVVQpCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92aWQoY2xpZW50LCBuKSBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUjI24jI192aWQpCgojZGVmaW5lIHN5c2ZzX2luKG4pIFwKc3lzZnNfcm9fbihpbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfSU4jI24jI0lOUFVUKSBcCnN5c2ZzX3J3X24oaW4sIG4sIF9taW4sIEdMNTIwX1JFR19JTiMjbiMjX01JTikgXApzeXNmc19yd19uKGluLCBuLCBfbWF4LCBHTDUyMF9SRUdfSU4jI24jI19NQVgpIFwKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX2lucHV0KTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI24jI19taW4pOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX21heCk7fSkKCiNkZWZpbmUgc3lzZnNfZmFuKG4pIFwKc3lzZnNfcm9fbihmYW4sIG4sIF9pbnB1dCwgR0w1MjBfUkVHX0ZBTl9JTlBVVCkgXApzeXNmc19yd19uKGZhbiwgbiwgX21pbiwgR0w1MjBfUkVHX0ZBTl9NSU4pIFwKc3lzZnNfcndfbihmYW4sIG4sIF9kaXYsIEdMNTIwX1JFR19GQU5fRElWKQoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19pbnB1dCk7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX21pbik7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX2Rpdik7fSkKCiNkZWZpbmUgc3lzZnNfZmFuX29mZihuKSBcCnN5c2ZzX3J3X24oZmFuLCBuLCBfb2ZmLCBHTDUyMF9SRUdfRkFOX09GRikgXAoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX29mZihjbGllbnQsIG4pIFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX29mZikKCiNkZWZpbmUgc3lzZnNfdGVtcChuKSBcCnN5c2ZzX3JvX24odGVtcCwgbiwgX2lucHV0LCBHTDUyMF9SRUdfVEVNUCMjbiMjX0lOUFVUKSBcCnN5c2ZzX3J3X24odGVtcCwgbiwgX21heCwgR0w1MjBfUkVHX1RFTVAjI24jI19NQVgpIFwKc3lzZnNfcndfbih0ZW1wLCBuLCBfbWF4X2h5c3QsIEdMNTIwX1JFR19URU1QIyNuIyNfTUFYX0hZU1QpCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV90ZW1wKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfaW5wdXQpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfbWF4KTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbiMjX21heF9oeXN0KTt9KQoKI2RlZmluZSBzeXNmc19hbGFybXMoKSBcCnN5c2ZzX3JvKGFsYXJtcywgLCBHTDUyMF9SRUdfQUxBUk1TKSBcCnN5c2ZzX3J3KGJlZXBfZW5hYmxlLCAsIEdMNTIwX1JFR19CRUVQX0VOQUJMRSkgXApzeXNmc19ydyhiZWVwX21hc2ssICwgR0w1MjBfUkVHX0JFRVBfTUFTSykKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhjbGllbnQpIFwKKHtkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9lbmFibGUpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX21hc2spO30pCgoKc3lzZnNfdmlkKDApCgpzeXNmc19pbigwKQpzeXNmc19pbigxKQpzeXNmc19pbigyKQpzeXNmc19pbigzKQpzeXNmc19pbig0KQoKc3lzZnNfZmFuKDEpCnN5c2ZzX2ZhbigyKQpzeXNmc19mYW5fb2ZmKDEpCgpzeXNmc190ZW1wKDEpCnN5c2ZzX3RlbXAoMikKCnN5c2ZzX2FsYXJtcygpCgoKc3RhdGljIHNzaXplX3QgZ2V0X2NwdV92aWQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKfQoKI2RlZmluZSBWRERfRlJPTV9SRUcodmFsKSAoKCh2YWwpKjk1KzIpLzQpCiNkZWZpbmUgVkREX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkqNCs0NykvOTUpLDAsMjU1KSkKCiNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkqMTkpCiNkZWZpbmUgSU5fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgodmFsKSs5KS8xOSksMCwyNTUpKQoKc3RhdGljIHNzaXplX3QgZ2V0X2luX2lucHV0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7Cgl1OCByID0gZGF0YS0+aW5faW5wdXRbbl07CgoJaWYgKG4gPT0gMCkKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVkREX0ZST01fUkVHKHIpKTsKCWVsc2UKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcocikpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfaW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7Cgl1OCByID0gZGF0YS0+aW5fbWluW25dOwoKCWlmIChuID09IDApCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFZERF9GUk9NX1JFRyhyKSk7CgllbHNlCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2luX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJdTggciA9IGRhdGEtPmluX21heFtuXTsKCglpZiAobiA9PSAwKQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWRERfRlJPTV9SRUcocikpOwoJZWxzZQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhyKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWlmIChuID09IDApCgkJciA9IFZERF9UT19SRUcodik7CgllbHNlCgkJciA9IElOX1RPX1JFRyh2KTsKCglkYXRhLT5pbl9taW5bbl0gPSByOwoKCWlmIChuIDwgNCkKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYpIHwgcik7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOwoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJaWYgKG4gPT0gMCkKCQlyID0gVkREX1RPX1JFRyh2KTsKCWVsc2UKCQlyID0gSU5fVE9fUkVHKHYpOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglkYXRhLT5pbl9tYXhbbl0gPSByOwoKCWlmIChuIDwgNCkKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOwoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCiNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCiNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpICgodmFsKT09MCA/IDAgOiAoNDgwMDAwLygodmFsKSA8PCAoZGl2KSkpKQojZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikgKCh2YWwpPD0wPzA6U0VOU09SU19MSU1JVCgoNDgwMDAwICsgKCh2YWwpIDw8ICgoZGl2KS0xKSkpIC8gKCh2YWwpIDw8IChkaXYpKSwgMSwgMjU1KSk7CgpzdGF0aWMgc3NpemVfdCBnZXRfZmFuX2lucHV0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9pbnB1dFtuIC0gMV0sIGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbiAtIDFdLCBkYXRhLT5mYW5fZGl2W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfZmFuX2RpdihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfZmFuX29mZihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmZhbl9vZmYpOwp9CgpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJciA9IEZBTl9UT19SRUcodiwgZGF0YS0+ZmFuX2RpdltuIC0gMV0pOwoJZGF0YS0+ZmFuX21pbltuIC0gMV0gPSByOwoKCWlmIChuID09IDEpCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGZmMDApIHwgKHIgPDwgOCkpOwoJZWxzZQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZikgfCByKTsKCglkYXRhLT5iZWVwX21hc2sgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSyk7CglpZiAoZGF0YS0+ZmFuX21pbltuIC0gMV0gPT0gMCkKCQlkYXRhLT5hbGFybV9tYXNrICY9IChuID09IDEpID8gfjB4MjAgOiB+MHg0MDsKCWVsc2UKCQlkYXRhLT5hbGFybV9tYXNrIHw9IChuID09IDEpID8gMHgyMCA6IDB4NDA7CglkYXRhLT5iZWVwX21hc2sgJj0gZGF0YS0+YWxhcm1fbWFzazsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSywgZGF0YS0+YmVlcF9tYXNrKTsKCgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJc3dpdGNoICh2KSB7CgljYXNlIDE6IHIgPSAwOyBicmVhazsKCWNhc2UgMjogciA9IDE7IGJyZWFrOwoJY2FzZSA0OiByID0gMjsgYnJlYWs7CgljYXNlIDg6IHIgPSAzOyBicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYW5fZGl2IHZhbHVlICVsZCBub3Qgc3VwcG9ydGVkLiBDaG9vc2Ugb25lIG9mIDEsIDIsIDQgb3IgOCFcbiIsIHYpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9kaXZbbiAtIDFdID0gcjsKCglpZiAobiA9PSAxKQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhjMCkgfCAociA8PCA2KSk7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDMwKSB8IChyIDw8IDQpKTsKCgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX29mZihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1OCByID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk/MTowOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9vZmYgPSByOwoJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDBjKSB8IChyIDw8IDIpKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCiNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICgoKHZhbCkgLSAxMzApICogMTAwMCkKI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKCh2YWwpPDA/KHZhbCktNTAwOih2YWwpKzUwMCkgLyAxMDAwKSsxMzApLDAsMjU1KSkKCnN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX2lucHV0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2lucHV0W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9tYXgoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0pKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9tYXhbbiAtIDFdID0gVEVNUF9UT19SRUcodik7OwoJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnRlbXBfbWF4W24gLSAxXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cglsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfbWF4X2h5c3RbbiAtIDFdID0gVEVNUF9UT19SRUcodik7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2FsYXJtcyhzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9iZWVwX2VuYWJsZShzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmJlZXBfZW5hYmxlKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfbWFzayhzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmJlZXBfbWFzayk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9iZWVwX2VuYWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1OCByID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk/MDoxOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmJlZXBfZW5hYmxlID0gIXI7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MDQpIHwgKHIgPDwgMikpOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2JlZXBfbWFzayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1OCByID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgkKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXIgJj0gZGF0YS0+YWxhcm1fbWFzazsKCWRhdGEtPmJlZXBfbWFzayA9IHI7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgcik7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgoKLyoKICogUmVhbCBjb2RlCiAqLwoKc3RhdGljIGludCBnbDUyMF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKCQlyZXR1cm4gMDsKCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZ2w1MjBfZGV0ZWN0KTsKfQoKc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGE7CglpbnQgZXJyID0gMDsKCglpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CgkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCgkJZ290byBleGl0OwoKCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCgkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGdsNTIwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KCglpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdsNTIwX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdDsKCX0KCgluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CgluZXdfY2xpZW50LT5kcml2ZXIgPSAmZ2w1MjBfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwoJaWYgKGtpbmQgPCAwKSB7CgkJaWYgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19DSElQX0lEKSAhPSAweDIwKSB8fAoJCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8CgkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfQ09ORikgJiAweDgwKSAhPSAweDAwKSkgewoJCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJVbmtub3duIGNoaXAgdHlwZSwgc2tpcHBpbmdcbiIpOwoJCQlnb3RvIGV4aXRfZnJlZTsKCQl9Cgl9CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImdsNTIwc20iLCBJMkNfTkFNRV9TSVpFKTsKCWRhdGEtPnZhbGlkID0gMDsKCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCgkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCglpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKCQlnb3RvIGV4aXRfZnJlZTsKCgkvKiBJbml0aWFsaXplIHRoZSBHTDUyMFNNIGNoaXAgKi8KCWdsNTIwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwoKCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCglkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CglpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CgkJZ290byBleGl0X2RldGFjaDsKCX0KCglkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKG5ld19jbGllbnQsIDApOwoKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKCWlmICghZGF0YS0+dHdvX3RlbXBzKQoJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDEpOwoJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fb2ZmKG5ld19jbGllbnQsIDEpOwoKCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOwoJaWYgKGRhdGEtPnR3b190ZW1wcykKCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAyKTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOwoKCXJldHVybiAwOwoKZXhpdF9kZXRhY2g6CglpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKZXhpdF9mcmVlOgoJa2ZyZWUoZGF0YSk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgoKLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBHTDUyMFNNLiAqLwpzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdTggb2xkY29uZiwgY29uZjsKCgljb25mID0gb2xkY29uZiA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CgoJZGF0YS0+YWxhcm1fbWFzayA9IDB4ZmY7CglkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CgoJaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDEpCgkJY29uZiAmPSB+MHgxMDsKCWVsc2UgaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDIpCgkJY29uZiB8PSAweDEwOwoJZGF0YS0+dHdvX3RlbXBzID0gIShjb25mICYgMHgxMCk7CgoJLyogSWYgSVJRIyBpcyBkaXNhYmxlZCwgd2UgY2FuIHNhZmVseSBmb3JjZSBjb21wYXJhdG9yIG1vZGUgKi8KCWlmICghKGNvbmYgJiAweDIwKSkKCQljb25mICY9IDB4Zjc7CgoJLyogRW5hYmxlIG1vbml0b3JpbmcgaWYgbmVlZGVkICovCgljb25mIHw9IDB4NDA7CgoJaWYgKGNvbmYgIT0gb2xkY29uZikKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GLCBjb25mKTsKCglnbDUyMF91cGRhdGVfZGV2aWNlKCYoY2xpZW50LT5kZXYpKTsKCglpZiAoZGF0YS0+ZmFuX21pblswXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4MjA7CglpZiAoZGF0YS0+ZmFuX21pblsxXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4NDA7CgoJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19CRUVQX01BU0ssIGRhdGEtPmJlZXBfbWFzayk7Cn0KCnN0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IGVycjsKCglod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwoKCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCgkJcmV0dXJuIGVycjsKCglrZnJlZShkYXRhKTsKCXJldHVybiAwOwp9CgoKLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAogICBHTDUyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24gKi8Kc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKewoJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOwoJZWxzZQoJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwp9CgpzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQp7CglpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQoJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKCWVsc2UKCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwp9CgoKc3RhdGljIHN0cnVjdCBnbDUyMF9kYXRhICpnbDUyMF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyAyICogSFopIHx8ICFkYXRhLT52YWxpZCkgewoKCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGdsNTIwc20gdXBkYXRlXG4iKTsKCgkJZGF0YS0+YWxhcm1zID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19BTEFSTVMpOwoJCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKCQlkYXRhLT52aWQgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkgJiAweDFmOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMF9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzBdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMV9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzFdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMl9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzJdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOM19MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzNdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19GQU5fSU5QVVQpOwoJCWRhdGEtPmZhbl9pbnB1dFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9pbnB1dFsxXSA9IHZhbCAmIDB4ZmY7CgoJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTik7CgkJZGF0YS0+ZmFuX21pblswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOwoKCQlkYXRhLT50ZW1wX2lucHV0WzBdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMV9JTlBVVCk7CgkJZGF0YS0+dGVtcF9tYXhbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWCk7CgkJZGF0YS0+dGVtcF9tYXhfaHlzdFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QpOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9ESVYpOwoJCWRhdGEtPmZhbl9kaXZbMF0gPSAodmFsID4+IDYpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gKHZhbCA+PiA0KSAmIDB4MDM7CgkJZGF0YS0+ZmFuX29mZiA9ICh2YWwgPj4gMikgJiAweDAxOwoKCQlkYXRhLT5hbGFybXMgJj0gZGF0YS0+YWxhcm1fbWFzazsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKCQlkYXRhLT5iZWVwX2VuYWJsZSA9ICEoKHZhbCA+PiAyKSAmIDEpOwoKCQlkYXRhLT5pbl9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4wX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4xX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsyXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFszXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4zX0lOUFVUKTsKCgkJLyogVGVtcDEgYW5kIFZpbjQgYXJlIHRoZSBzYW1lIGlucHV0ICovCgkJaWYgKGRhdGEtPnR3b190ZW1wcykgewoJCQlkYXRhLT50ZW1wX2lucHV0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9JTlBVVCk7CgkJCWRhdGEtPnRlbXBfbWF4WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVgpOwoJCQlkYXRhLT50ZW1wX21heF9oeXN0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVhfSFlTVCk7CgkJfSBlbHNlIHsKCQkJZGF0YS0+aW5faW5wdXRbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9JTlBVVCk7CgkJCWRhdGEtPmluX21pbls0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01JTik7CgkJCWRhdGEtPmluX21heFs0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01BWCk7CgkJfQoKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoKCXJldHVybiBkYXRhOwp9CgoKc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19nbDUyMHNtX2luaXQodm9pZCkKewoJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZnbDUyMF9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19nbDUyMHNtX2V4aXQodm9pZCkKewoJaTJjX2RlbF9kcml2ZXIoJmdsNTIwX2RyaXZlcik7Cn0KCgpNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCgkiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCgkiTWFhcnRlbiBEZXByZXogPG1hYXJ0ZW5kZXByZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkdMNTIwU00gZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KHNlbnNvcnNfZ2w1MjBzbV9pbml0KTsKbW9kdWxlX2V4aXQoc2Vuc29yc19nbDUyMHNtX2V4aXQpOwo=