LyogTWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5CiAqIENvcHlyaWdodCCpIDE5OTUtMjAwMiBNZXRyb3dlcmtzIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogJERhdGUkCiAqICRSZXZpc2lvbiQKICovCgojaW5jbHVkZSA8YW5zaV9wYXJtcy5oPgojaW5jbHVkZSA8c2l6ZV90Lmg+CiNpbmNsdWRlIDxjb25zb2xlLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpZiBfX01BQ0hfXwogIHNob3J0IEluc3RhbGxDb25zb2xlKHNob3J0IGZkKQogIHsKICAjcHJhZ21hIHVudXNlZCAoZmQpCgogICAgcmV0dXJuIDA7CiAgfQojZWxzZQogICNpbmNsdWRlIDxDYXJib24uaD4KCiAgdHlwZWRlZiBpbnQgKCpSZWFkUHRyKShpbnQsIHZvaWQgKiwgX19zdGQoc2l6ZV90KSk7CiAgdHlwZWRlZiBpbnQgKCpXcml0ZVB0cikoaW50LCBjb25zdCB2b2lkICosIF9fc3RkKHNpemVfdCkpOwoKICBzdGF0aWMgc3RydWN0CiAgewogICAgQm9vbGVhbiBpc0xvYWRlZDsKICAgIENGQnVuZGxlUmVmIHRoZUJ1bmRsZTsKICAgIFJlYWRQdHIgdGhlUmVhZDsKICAgIFdyaXRlUHRyIHRoZVdyaXRlOwogIH0gX19tc2xfb3NfeDsKCiAgc3RhdGljIE9TRXJyIF9fbXNsX0NyZWF0ZUZyYW1ld29ya0J1bmRsZUZyb21OYW1lKENGU3RyaW5nUmVmIHRoZUZyYW1ld29ya05hbWUsCiAgICBDRkJ1bmRsZVJlZiAqdGhlQnVuZGxlKQogIHsKICAgIE9TRXJyIHRoZUVycjsKICAgIEZTUmVmIHRoZVJlZjsKICAgIENGVVJMUmVmIHRoZUZyYW1ld29ya1VSTDsKICAgIENGVVJMUmVmIHRoZUJ1bmRsZVVSTDsKCiAgICAvKiBGaW5kIHRoZSBmb2xkZXIgY29udGFpbmluZyBhbGwgdGhlIGZyYW1ld29ya3MgKi8KICAgIHRoZUVyciA9IEZTRmluZEZvbGRlcihrT25BcHByb3ByaWF0ZURpc2ssIGtGcmFtZXdvcmtzRm9sZGVyVHlwZSwgZmFsc2UsICZ0aGVSZWYpOwoKICAgIGlmICh0aGVFcnIgPT0gbm9FcnIpCiAgICB7CiAgICAgIC8qIFR1cm4gdGhlIGZyYW1ld29yayBmb2xkZXIgRlNSZWYgaW50byBhIENGVVJMICovCiAgICAgIHRoZUZyYW1ld29ya1VSTCA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsICZ0aGVSZWYpOwoKICAgICAgaWYgKHRoZUZyYW1ld29ya1VSTCAhPSBOVUxMKQogICAgICB7CiAgICAgICAgLyogQ3JlYXRlIGEgQ0ZVUkwgcG9pbnRpbmcgdG8gdGhlIGRlc2lyZWQgZnJhbWV3b3JrICovCiAgICAgICAgdGhlQnVuZGxlVVJMID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudChrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LAogICAgICAgICAgdGhlRnJhbWV3b3JrVVJMLCB0aGVGcmFtZXdvcmtOYW1lLCBmYWxzZSk7CgogICAgICAgIENGUmVsZWFzZSh0aGVGcmFtZXdvcmtVUkwpOwoKICAgICAgICBpZiAodGhlQnVuZGxlVVJMICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgLyogVHVybiB0aGUgQ0ZVUkwgaW50byBhIGJ1bmRsZSByZWZlcmVuY2UgKi8KICAgICAgICAgICp0aGVCdW5kbGUgPSBDRkJ1bmRsZUNyZWF0ZShrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCB0aGVCdW5kbGVVUkwpOwoKICAgICAgICAgIENGUmVsZWFzZSh0aGVCdW5kbGVVUkwpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiB0aGVFcnI7CiAgfQoKICBzaG9ydCBJbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKICB7CiAgI3ByYWdtYSB1bnVzZWQgKGZkKQogICAgT1NFcnIgdGhlRXJyOwogICAgc2hvcnQgdGhlUmVzdWx0OwoKICAgIHRoZVJlc3VsdCA9IC0xOwoKICAgIC8qIFN0YXJ0IHdpdGggbm8gYnVuZGxlICovCiAgICBfX21zbF9vc194LmlzTG9hZGVkID0gZmFsc2U7CiAgICBfX21zbF9vc194LnRoZUJ1bmRsZSA9IE5VTEw7CiAgICBfX21zbF9vc194LnRoZVJlYWQgPSBOVUxMOwogICAgX19tc2xfb3NfeC50aGVXcml0ZSA9IE5VTEw7CgogICAgLyogQ3JlYXRlIGEgYnVuZGxlIHJlZmVyZW5jZSBiYXNlZCBvbiBpdHMgbmFtZSAqLwogICAgdGhlRXJyID0gX19tc2xfQ3JlYXRlRnJhbWV3b3JrQnVuZGxlRnJvbU5hbWUoQ0ZTVFIoIlN5c3RlbS5mcmFtZXdvcmsiKSwKICAgICAgJl9fbXNsX29zX3gudGhlQnVuZGxlKTsKCiAgICBpZiAoKHRoZUVyciA9PSBub0VycikgJiYgKF9fbXNsX29zX3gudGhlQnVuZGxlICE9IE5VTEwpKQogICAgewogICAgICB0aGVSZXN1bHQgPSAwOwoKICAgICAgX19tc2xfb3NfeC5pc0xvYWRlZCA9IENGQnVuZGxlTG9hZEV4ZWN1dGFibGUoX19tc2xfb3NfeC50aGVCdW5kbGUpOwoKICAgICAgaWYgKF9fbXNsX29zX3guaXNMb2FkZWQpCiAgICAgIHsKICAgICAgICAvKiBMb29rdXAgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgYnVuZGxlIGJ5IG5hbWUgKi8KICAgICAgICBfX21zbF9vc194LnRoZVJlYWQgPSAoUmVhZFB0cikKICAgICAgICAgIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZShfX21zbF9vc194LnRoZUJ1bmRsZSwgQ0ZTVFIoInJlYWQiKSk7CiAgICAgICAgX19tc2xfb3NfeC50aGVXcml0ZSA9IChXcml0ZVB0cikKICAgICAgICAgIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZShfX21zbF9vc194LnRoZUJ1bmRsZSwgQ0ZTVFIoIndyaXRlIikpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRoZVJlc3VsdDsKICB9CiNlbmRpZgoKdm9pZCBSZW1vdmVDb25zb2xlKHZvaWQpCnsKI2lmICFfX01BQ0hfXwogIGlmIChfX21zbF9vc194LnRoZUJ1bmRsZSAhPSBOVUxMKQogIHsKICAgIGlmIChfX21zbF9vc194LmlzTG9hZGVkKQogICAgewogICAgICBfX21zbF9vc194LnRoZVJlYWQgPSBOVUxMOwogICAgICBfX21zbF9vc194LnRoZVdyaXRlID0gTlVMTDsKCiAgICAgIENGQnVuZGxlVW5sb2FkRXhlY3V0YWJsZShfX21zbF9vc194LnRoZUJ1bmRsZSk7CiAgICAgIF9fbXNsX29zX3guaXNMb2FkZWQgPSBmYWxzZTsKICAgIH0KCiAgICBDRlJlbGVhc2UoX19tc2xfb3NfeC50aGVCdW5kbGUpOwogICAgX19tc2xfb3NfeC50aGVCdW5kbGUgPSBOVUxMOwogIH0KI2VuZGlmCn0KCmxvbmcgV3JpdGVDaGFyc1RvQ29uc29sZShjaGFyICpidWZmZXIsIGxvbmcgbikKewojaWYgX19NQUNIX18KICByZXR1cm4gd3JpdGUoMSwgYnVmZmVyLCBuKTsKI2Vsc2UKICAvKiBDYWxsIHRoZSBmdW5jdGlvbiBpZiBpdCB3YXMgZm91bmQgKi8KICBpZiAoX19tc2xfb3NfeC50aGVXcml0ZSA9PSBOVUxMKQogICAgcmV0dXJuIC0xOwogIGVsc2UKICAgIHJldHVybiBfX21zbF9vc194LnRoZVdyaXRlKDEsIGJ1ZmZlciwgbik7CiNlbmRpZgp9CgojaWYgX19NQUNIX18KbG9uZyBXcml0ZUNoYXJzVG9FcnJvckNvbnNvbGUoY2hhciAqYnVmZmVyLCBsb25nIG4pCnsKICByZXR1cm4gd3JpdGUoMiwgYnVmZmVyLCBuKTsKfQojZW5kaWYKCmxvbmcgUmVhZENoYXJzRnJvbUNvbnNvbGUoY2hhciAqYnVmZmVyLCBsb25nIG4pCnsKI2lmIF9fTUFDSF9fCiAgcmV0dXJuIHJlYWQoMCwgYnVmZmVyLCBuKTsKI2Vsc2UKICAvKiBDYWxsIHRoZSBmdW5jdGlvbiBpZiBpdCB3YXMgZm91bmQgKi8KICBpZiAoX19tc2xfb3NfeC50aGVSZWFkID09IE5VTEwpCiAgICByZXR1cm4gLTE7CiAgZWxzZQogICAgcmV0dXJuIF9fbXNsX29zX3gudGhlUmVhZCgwLCBidWZmZXIsIG4pOwojZW5kaWYKfQoKLyogSldXIC0gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLCBidXQgaXQncyBuZWVkZWQgZm9yIGxpbmsgcHVycG9zZXMgKi8KY2hhciAqX190dHluYW1lKGxvbmcgZmlsZGVzKQp7CiNwcmFnbWEgdW51c2VkIChmaWxkZXMpCiAgLyogYWxsIHN0cmVhbXMgaGF2ZSB0aGUgc2FtZSBuYW1lICovCiAgc3RhdGljIGNoYXIgKl9fZGV2aWNlbmFtZSA9ICJUZXJtaW5hbCI7CgogIGlmIChmaWxkZXMgPj0gMCAmJiBmaWxkZXMgPD0gMikKICAgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKCiAgcmV0dXJuICgwTCk7Cn0KCmludCBrYmhpdCh2b2lkKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBnZXRjaCh2b2lkKQp7CiAgcmV0dXJuIDA7Cn0KCnZvaWQgY2xyc2NyKCkKewogIHJldHVybjsKfQoKLyogQ2hhbmdlIHJlY29yZDoKICogSldXIDAxMDkxOSBDcmVhdGVkIE1hY2gtTyBjb25zb2xlIHN0dWJzIGZpbGUKICogSldXIDAyMDQxOCBVc2UgX19zdGQoKSBmb3IgYWxsIHNpemVfdCwgYW5kICNpbmNsdWRlIDxzaXplX3QuaD4gdG8gZ2V0IHByb3BlciBDKysgZGVmaW5pdGlvbnMKICov