LyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAibW9kdWxlLmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCgppbnQgcHlzcWxpdGVfc3RlcChzcWxpdGUzX3N0bXQqIHN0YXRlbWVudCwgcHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbikKewogICAgaW50IHJjOwoKICAgIGlmIChzdGF0ZW1lbnQgPT0gTlVMTCkgewogICAgICAgIC8qIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBTUUxpdGUgMy41IGFuZCBsYXRlci4gaXQgbm93IGFwcGFyZW50bHkKICAgICAgICAgKiByZXR1cm5zIE5VTEwgZm9yICJuby1vcGVyYXRpb24iIHN0YXRlbWVudHMgKi8KICAgICAgICByYyA9IFNRTElURV9PSzsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCi8qKgogKiBDaGVja3MgdGhlIFNRTGl0ZSBlcnJvciBjb2RlIGFuZCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBEQi1BUEkgZXhjZXB0aW9uLgogKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4KICovCmludCBfcHlzcWxpdGVfc2V0ZXJyb3Ioc3FsaXRlMyogZGIsIHNxbGl0ZTNfc3RtdCogc3QpCnsKICAgIGludCBlcnJvcmNvZGU7CgogICAgLyogU1FMaXRlIG9mdGVuIGRvZXNuJ3QgcmVwb3J0IGFueXRoaW5nIHVzZWZ1bCwgdW5sZXNzIHlvdSByZXNldCB0aGUgc3RhdGVtZW50IGZpcnN0ICovCiAgICBpZiAoc3QgIT0gTlVMTCkgewogICAgICAgICh2b2lkKXNxbGl0ZTNfcmVzZXQoc3QpOwogICAgfQoKICAgIGVycm9yY29kZSA9IHNxbGl0ZTNfZXJyY29kZShkYik7CgogICAgc3dpdGNoIChlcnJvcmNvZGUpCiAgICB7CiAgICAgICAgY2FzZSBTUUxJVEVfT0s6CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSTkFMOgogICAgICAgIGNhc2UgU1FMSVRFX05PVEZPVU5EOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfSW50ZXJuYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTUUxJVEVfTk9NRU06CiAgICAgICAgICAgICh2b2lkKVB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX0VSUk9SOgogICAgICAgIGNhc2UgU1FMSVRFX1BFUk06CiAgICAgICAgY2FzZSBTUUxJVEVfQUJPUlQ6CiAgICAgICAgY2FzZSBTUUxJVEVfQlVTWToKICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CiAgICAgICAgY2FzZSBTUUxJVEVfUkVBRE9OTFk6CiAgICAgICAgY2FzZSBTUUxJVEVfSU5URVJSVVBUOgogICAgICAgIGNhc2UgU1FMSVRFX0lPRVJSOgogICAgICAgIGNhc2UgU1FMSVRFX0ZVTEw6CiAgICAgICAgY2FzZSBTUUxJVEVfQ0FOVE9QRU46CiAgICAgICAgY2FzZSBTUUxJVEVfUFJPVE9DT0w6CiAgICAgICAgY2FzZSBTUUxJVEVfRU1QVFk6CiAgICAgICAgY2FzZSBTUUxJVEVfU0NIRU1BOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTUUxJVEVfQ09SUlVQVDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX0RhdGFFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX0ludGVncml0eUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNRTElURV9NSVNVU0U6CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIGVycm9yY29kZTsKfQoKI2lmZGVmIFdPUkRTX0JJR0VORElBTgojIGRlZmluZSBJU19MSVRUTEVfRU5ESUFOIDAKI2Vsc2UKIyBkZWZpbmUgSVNfTElUVExFX0VORElBTiAxCiNlbmRpZgoKUHlPYmplY3QgKgpfcHlzcWxpdGVfbG9uZ19mcm9tX2ludDY0KHNxbGl0ZTNfaW50NjQgdmFsdWUpCnsKI2lmZGVmIEhBVkVfTE9OR19MT05HCiMgaWYgU0laRU9GX0xPTkdfTE9ORyA8IDgKICAgIGlmICh2YWx1ZSA+IFBZX0xMT05HX01BWCB8fCB2YWx1ZSA8IFBZX0xMT05HX01JTikgewogICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoJnZhbHVlLCBzaXplb2YodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfTElUVExFX0VORElBTiwgMSAvKiBzaWduZWQgKi8pOwogICAgfQojIGVuZGlmCiMgaWYgU0laRU9GX0xPTkcgPCBTSVpFT0ZfTE9OR19MT05HCiAgICBpZiAodmFsdWUgPiBMT05HX01BWCB8fCB2YWx1ZSA8IExPTkdfTUlOKQogICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKIyBlbmRpZgojZWxzZQojIGlmIFNJWkVPRl9MT05HIDwgOAogICAgaWYgKHZhbHVlID4gTE9OR19NQVggfHwgdmFsdWUgPCBMT05HX01JTikgewogICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoJnZhbHVlLCBzaXplb2YodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfTElUVExFX0VORElBTiwgMSAvKiBzaWduZWQgKi8pOwogICAgfQojIGVuZGlmCiNlbmRpZgogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKfQoKc3FsaXRlM19pbnQ2NApfcHlzcWxpdGVfbG9uZ19hc19pbnQ2NChQeU9iamVjdCAqIHB5X3ZhbCkKewogICAgaW50IG92ZXJmbG93OwojaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgIFBZX0xPTkdfTE9ORyB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cocHlfdmFsLCAmb3ZlcmZsb3cpOwojZWxzZQogICAgbG9uZyB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhweV92YWwsICZvdmVyZmxvdyk7CiNlbmRpZgogICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgcmV0dXJuIC0xOwogICAgaWYgKCFvdmVyZmxvdykgewojaWZkZWYgSEFWRV9MT05HX0xPTkcKIyBpZiBTSVpFT0ZfTE9OR19MT05HID4gOAogICAgICAgIGlmICgtMHg4MDAwMDAwMDAwMDAwMDAwTEwgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiMgZW5kaWYKI2Vsc2UKIyBpZiBTSVpFT0ZfTE9ORyA+IDgKICAgICAgICBpZiAoLTB4ODAwMDAwMDAwMDAwMDAwMEwgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHg3RkZGRkZGRkZGRkZGRkZGTCkKIyBlbmRpZgojZW5kaWYKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZWxzZSBpZiAoc2l6ZW9mKHZhbHVlKSA8IHNpemVvZihzcWxpdGUzX2ludDY0KSkgewogICAgICAgIHNxbGl0ZTNfaW50NjQgaW50NjR2YWw7CiAgICAgICAgaWYgKF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXB5X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZpbnQ2NHZhbCwgc2l6ZW9mKGludDY0dmFsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19MSVRUTEVfRU5ESUFOLCAxIC8qIHNpZ25lZCAqLykgPj0gMCkgewogICAgICAgICAgICByZXR1cm4gaW50NjR2YWw7CiAgICAgICAgfQogICAgfQogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gU1FMaXRlIElOVEVHRVIiKTsKICAgIHJldHVybiAtMTsKfQo=