LyoKICogRGVidWdnZXIgeDg2XzY0IHNwZWNpZmljIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgMjAwNCBWaW5jZW50IELpcm9uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJkZWJ1Z2dlci5oIgoKI2lmIGRlZmluZWQoX194ODZfNjRfXykKCnN0YXRpYyB1bnNpZ25lZCBiZV94ODZfNjRfZ2V0X2FkZHIoSEFORExFIGhUaHJlYWQsIGNvbnN0IENPTlRFWFQqIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYmVfY3B1X2FkZHIgYmNhLCBBRERSRVNTNjQqIGFkZHIpCnsKICAgIGFkZHItPk1vZGUgPSBBZGRyTW9kZUZsYXQ7CiAgICBzd2l0Y2ggKGJjYSkKICAgIHsKICAgIGNhc2UgYmVfY3B1X2FkZHJfcGM6CiAgICAgICAgYWRkci0+U2VnbWVudCA9IGN0eC0+U2VnQ3M7CiAgICAgICAgYWRkci0+T2Zmc2V0ID0gY3R4LT5SaXA7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICBjYXNlIGJlX2NwdV9hZGRyX3N0YWNrOgogICAgICAgIGFkZHItPlNlZ21lbnQgPSBjdHgtPlNlZ1NzOwogICAgICAgIGFkZHItPk9mZnNldCA9IGN0eC0+UnNwOwogICAgICAgIHJldHVybiBUUlVFOwogICAgY2FzZSBiZV9jcHVfYWRkcl9mcmFtZToKICAgICAgICBhZGRyLT5TZWdtZW50ID0gY3R4LT5TZWdTczsKICAgICAgICBhZGRyLT5PZmZzZXQgPSBjdHgtPlJicDsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIGRlZmF1bHQ6CiAgICAgICAgYWRkci0+TW9kZSA9IC0xOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KfQoKc3RhdGljIHVuc2lnbmVkIGJlX3g4Nl82NF9nZXRfcmVnaXN0ZXJfaW5mbyhpbnQgcmVnbm8sIGVudW0gYmVfY3B1X2FkZHIqIGtpbmQpCnsKICAgIC8qIHRoaXMgaXMgdHJ1ZSB3aGVuIHJ1bm5pbmcgaW4gMzJiaXQgbW9kZS4uLiBhbmQgd3JvbmcgaW4gNjQgOi0vICovCiAgICBzd2l0Y2ggKHJlZ25vKQogICAgewogICAgY2FzZSBDVl9BTUQ2NF9SSVA6ICpraW5kID0gYmVfY3B1X2FkZHJfcGM7IHJldHVybiBUUlVFOwogICAgY2FzZSBDVl9BTUQ2NF9FQlA6ICpraW5kID0gYmVfY3B1X2FkZHJfZnJhbWU7IHJldHVybiBUUlVFOwogICAgY2FzZSBDVl9BTUQ2NF9FU1A6ICpraW5kID0gYmVfY3B1X2FkZHJfc3RhY2s7IHJldHVybiBUUlVFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgdm9pZCBiZV94ODZfNjRfc2luZ2xlX3N0ZXAoQ09OVEVYVCogY3R4LCB1bnNpZ25lZCBlbmFibGUpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIHNpbmdsZV9zdGVwXG4iKTsKfQoKc3RhdGljIHZvaWQgYmVfeDg2XzY0X3ByaW50X2NvbnRleHQoSEFORExFIGhUaHJlYWQsIGNvbnN0IENPTlRFWFQqIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbF9yZWdzKQp7CiAgICBkYmdfcHJpbnRmKCJDb250ZXh0IHByaW50aW5nIGZvciB4ODZfNjQgbm90IGRvbmUgeWV0XG4iKTsKfQoKc3RhdGljIHZvaWQgYmVfeDg2XzY0X3ByaW50X3NlZ21lbnRfaW5mbyhIQU5ETEUgaFRocmVhZCwgY29uc3QgQ09OVEVYVCogY3R4KQp7Cn0KCnN0YXRpYyBzdHJ1Y3QgZGJnX2ludGVybmFsX3ZhciBiZV94ODZfNjRfY3R4W10gPQp7CiAgICB7Q1ZfQU1ENjRfQUwsICAgICAgICJBTCIsICAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSYXgpLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2NoYXJfaW50fSwKICAgIHtDVl9BTUQ2NF9CTCwgICAgICAgIkJMIiwgICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFJieCksICAgICBkYmdfaXR5cGVfdW5zaWduZWRfY2hhcl9pbnR9LAogICAge0NWX0FNRDY0X0NMLCAgICAgICAiQ0wiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmN4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9jaGFyX2ludH0sCiAgICB7Q1ZfQU1ENjRfREwsICAgICAgICJETCIsICAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSZHgpLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2NoYXJfaW50fSwKICAgIHtDVl9BTUQ2NF9BSCwgICAgICAgIkFIIiwgICAgICAgICAgIChEV09SRCopKEZJRUxEX09GRlNFVChDT05URVhULCBSYXgpKzEpLCBkYmdfaXR5cGVfdW5zaWduZWRfY2hhcl9pbnR9LAogICAge0NWX0FNRDY0X0JILCAgICAgICAiQkgiLCAgICAgICAgICAgKERXT1JEKikoRklFTERfT0ZGU0VUKENPTlRFWFQsIFJieCkrMSksIGRiZ19pdHlwZV91bnNpZ25lZF9jaGFyX2ludH0sCiAgICB7Q1ZfQU1ENjRfQ0gsICAgICAgICJDSCIsICAgICAgICAgICAoRFdPUkQqKShGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmN4KSsxKSwgZGJnX2l0eXBlX3Vuc2lnbmVkX2NoYXJfaW50fSwKICAgIHtDVl9BTUQ2NF9ESCwgICAgICAgIkRIIiwgICAgICAgICAgIChEV09SRCopKEZJRUxEX09GRlNFVChDT05URVhULCBSZHgpKzEpLCBkYmdfaXR5cGVfdW5zaWduZWRfY2hhcl9pbnR9LAogICAge0NWX0FNRDY0X0FYLCAgICAgICAiQVgiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmF4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0JYLCAgICAgICAiQlgiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmJ4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0NYLCAgICAgICAiQ1giLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmN4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0RYLCAgICAgICAiRFgiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmR4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X1NQLCAgICAgICAiU1AiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUnNwKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0JQLCAgICAgICAiQlAiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmJwKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X1NJLCAgICAgICAiU0kiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUnNpKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0RJLCAgICAgICAiREkiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmRpKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0VBWCwgICAgICAiRUFYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmF4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VCWCwgICAgICAiRUJYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmJ4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VDWCwgICAgICAiRUNYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmN4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VEWCwgICAgICAiRURYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmR4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VTUCwgICAgICAiRVNQIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUnNwKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VCUCwgICAgICAiRUJQIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmJwKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VTSSwgICAgICAiRVNJIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUnNpKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VESSwgICAgICAiRURJIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmRpKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X0VTLCAgICAgICAiRVMiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnRXMpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0NTLCAgICAgICAiQ1MiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnQ3MpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X1NTLCAgICAgICAiU1MiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnU3MpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0RTLCAgICAgICAiRFMiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnRHMpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0ZTLCAgICAgICAiRlMiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnRnMpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0dTLCAgICAgICAiR1MiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgU2VnR3MpLCAgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0ZMQUdTLCAgICAiRkxBR1MiLCAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgRUZsYWdzKSwgIGRiZ19pdHlwZV91bnNpZ25lZF9zaG9ydF9pbnR9LAogICAge0NWX0FNRDY0X0VGTEFHUywgICAiRUZMQUdTIiwgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgRUZsYWdzKSwgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X1JJUCwgICAgICAiUklQIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmlwKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9pbnR9LAogICAge0NWX0FNRDY0X1JBWCwgICAgICAiUkFYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmF4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7Q1ZfQU1ENjRfUkJYLCAgICAgICJSQlgiLCAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSYngpLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2xvbmdfaW50fSwKICAgIHtDVl9BTUQ2NF9SQ1gsICAgICAgIlJDWCIsICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFJjeCksICAgICBkYmdfaXR5cGVfdW5zaWduZWRfbG9uZ19pbnR9LAogICAge0NWX0FNRDY0X1JEWCwgICAgICAiUkRYIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUmR4KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7Q1ZfQU1ENjRfUlNQLCAgICAgICJSU1AiLCAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSc3ApLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2xvbmdfaW50fSwKICAgIHtDVl9BTUQ2NF9SQlAsICAgICAgIlJCUCIsICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFJicCksICAgICBkYmdfaXR5cGVfdW5zaWduZWRfbG9uZ19pbnR9LAogICAge0NWX0FNRDY0X1JTSSwgICAgICAiUlNJIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUnNpKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7Q1ZfQU1ENjRfUkRJLCAgICAgICJSREkiLCAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSZGkpLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2xvbmdfaW50fSwKICAgIHtDVl9BTUQ2NF9SOCwgICAgICAgIlI4IiwgICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFI4KSwgICAgICBkYmdfaXR5cGVfdW5zaWduZWRfbG9uZ19pbnR9LAogICAge0NWX0FNRDY0X1I5LCAgICAgICAiUjkiLCAgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUjkpLCAgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7Q1ZfQU1ENjRfUjEwLCAgICAgICJSMTAiLCAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSMTApLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2xvbmdfaW50fSwKICAgIHtDVl9BTUQ2NF9SMTEsICAgICAgIlIxMSIsICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFIxMSksICAgICBkYmdfaXR5cGVfdW5zaWduZWRfbG9uZ19pbnR9LAogICAge0NWX0FNRDY0X1IxMiwgICAgICAiUjEyIiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUjEyKSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7Q1ZfQU1ENjRfUjEzLCAgICAgICJSMTMiLCAgICAgICAgICAoRFdPUkQqKUZJRUxEX09GRlNFVChDT05URVhULCBSMTMpLCAgICAgZGJnX2l0eXBlX3Vuc2lnbmVkX2xvbmdfaW50fSwKICAgIHtDVl9BTUQ2NF9SMTQsICAgICAgIlIxNCIsICAgICAgICAgIChEV09SRCopRklFTERfT0ZGU0VUKENPTlRFWFQsIFIxNCksICAgICBkYmdfaXR5cGVfdW5zaWduZWRfbG9uZ19pbnR9LAogICAge0NWX0FNRDY0X1IxNSwgICAgICAiUjE1IiwgICAgICAgICAgKERXT1JEKilGSUVMRF9PRkZTRVQoQ09OVEVYVCwgUjE1KSwgICAgIGRiZ19pdHlwZV91bnNpZ25lZF9sb25nX2ludH0sCiAgICB7MCwgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnX2l0eXBlX25vbmV9Cn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGRiZ19pbnRlcm5hbF92YXIqIGJlX3g4Nl82NF9pbml0X3JlZ2lzdGVycyhDT05URVhUKiBjdHgpCnsKICAgIHN0cnVjdCBkYmdfaW50ZXJuYWxfdmFyKiAgICBkaXY7CgogICAgZm9yIChkaXYgPSBiZV94ODZfNjRfY3R4OyBkaXYtPm5hbWU7IGRpdisrKQogICAgICAgIGRpdi0+cHZhbCA9IChEV09SRCopKChjaGFyKiljdHggKyAoRFdPUkRfUFRSKWRpdi0+cHZhbCk7CiAgICByZXR1cm4gYmVfeDg2XzY0X2N0eDsKfQoKc3RhdGljIHVuc2lnbmVkIGJlX3g4Nl82NF9pc19zdGVwX292ZXJfaW5zbihjb25zdCB2b2lkKiBpbnNuKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZSBzdGVwX292ZXJfaW5zblxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV94ODZfNjRfaXNfZnVuY3Rpb25fcmV0dXJuKGNvbnN0IHZvaWQqIGluc24pCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIGlzX2Z1bmN0aW9uX3JldHVyblxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV94ODZfNjRfaXNfYnJlYWtfaW5zbihjb25zdCB2b2lkKiBpbnNuKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZSBpc19icmVha19pbnNuXG4iKTsKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIHVuc2lnbmVkIGJlX3g4Nl82NF9pc19mdW5jX2NhbGwoY29uc3Qgdm9pZCogaW5zbiwgQUREUkVTUzY0KiBjYWxsZWUpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIGlzX2Z1bmNfY2FsbFxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB2b2lkIGJlX3g4Nl82NF9kaXNhc21fb25lX2luc24oQUREUkVTUzY0KiBhZGRyLCBpbnQgZGlzcGxheSkKewogICAgZGJnX3ByaW50ZigiRGlzYXNtIE5JWVxuIik7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV94ODZfNjRfaW5zZXJ0X1hwb2ludChIQU5ETEUgaFByb2Nlc3MsIGNvbnN0IHN0cnVjdCBiZV9wcm9jZXNzX2lvKiBwaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQqIGN0eCwgZW51bSBiZV94cG9pbnRfdHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhZGRyLCB1bnNpZ25lZCBsb25nKiB2YWwsIHVuc2lnbmVkIHNpemUpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIGluc2VydF9YcG9pbnRcbiIpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV94ODZfNjRfcmVtb3ZlX1hwb2ludChIQU5ETEUgaFByb2Nlc3MsIGNvbnN0IHN0cnVjdCBiZV9wcm9jZXNzX2lvKiBwaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQqIGN0eCwgZW51bSBiZV94cG9pbnRfdHlwZSB0eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIHNpemUpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIHJlbW92ZV9YcG9pbnRcbiIpOwogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgdW5zaWduZWQgYmVfeDg2XzY0X2lzX3dhdGNocG9pbnRfc2V0KGNvbnN0IENPTlRFWFQqIGN0eCwgdW5zaWduZWQgaWR4KQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZSBpc193YXRjaHBvaW50X3NldFxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB2b2lkIGJlX3g4Nl82NF9jbGVhcl93YXRjaHBvaW50KENPTlRFWFQqIGN0eCwgdW5zaWduZWQgaWR4KQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZSBjbGVhcl93YXRjaHBvaW50XG4iKTsKfQoKc3RhdGljIGludCBiZV94ODZfNjRfYWRqdXN0X3BjX2Zvcl9icmVhayhDT05URVhUKiBjdHgsIEJPT0wgd2F5KQp7CiAgICBpZiAod2F5KQogICAgewogICAgICAgIGN0eC0+UmlwLS07CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY3R4LT5SaXArKzsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50IGJlX3g4Nl82NF9mZXRjaF9pbnRlZ2VyKGNvbnN0IHN0cnVjdCBkYmdfbHZhbHVlKiBsdmFsdWUsIHVuc2lnbmVkIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBleHRfc2lnbiwgTE9OR0xPTkcqIHJldCkKewogICAgZGJnX3ByaW50Zigibm90IGRvbmUgZmV0Y2hfaW50ZWdlclxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBpbnQgYmVfeDg2XzY0X2ZldGNoX2Zsb2F0KGNvbnN0IHN0cnVjdCBkYmdfbHZhbHVlKiBsdmFsdWUsIHVuc2lnbmVkIHNpemUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlKiByZXQpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lIGZldGNoX2Zsb2F0XG4iKTsKICAgIHJldHVybiBGQUxTRTsKfQoKc3RydWN0IGJhY2tlbmRfY3B1IGJlX3g4Nl82NCA9CnsKICAgIGJlX2NwdV9saW5lYXJpemUsCiAgICBiZV9jcHVfYnVpbGRfYWRkciwKICAgIGJlX3g4Nl82NF9nZXRfYWRkciwKICAgIGJlX3g4Nl82NF9nZXRfcmVnaXN0ZXJfaW5mbywKICAgIGJlX3g4Nl82NF9zaW5nbGVfc3RlcCwKICAgIGJlX3g4Nl82NF9wcmludF9jb250ZXh0LAogICAgYmVfeDg2XzY0X3ByaW50X3NlZ21lbnRfaW5mbywKICAgIGJlX3g4Nl82NF9pbml0X3JlZ2lzdGVycywKICAgIGJlX3g4Nl82NF9pc19zdGVwX292ZXJfaW5zbiwKICAgIGJlX3g4Nl82NF9pc19mdW5jdGlvbl9yZXR1cm4sCiAgICBiZV94ODZfNjRfaXNfYnJlYWtfaW5zbiwKICAgIGJlX3g4Nl82NF9pc19mdW5jX2NhbGwsCiAgICBiZV94ODZfNjRfZGlzYXNtX29uZV9pbnNuLAogICAgYmVfeDg2XzY0X2luc2VydF9YcG9pbnQsCiAgICBiZV94ODZfNjRfcmVtb3ZlX1hwb2ludCwKICAgIGJlX3g4Nl82NF9pc193YXRjaHBvaW50X3NldCwKICAgIGJlX3g4Nl82NF9jbGVhcl93YXRjaHBvaW50LAogICAgYmVfeDg2XzY0X2FkanVzdF9wY19mb3JfYnJlYWssCiAgICBiZV94ODZfNjRfZmV0Y2hfaW50ZWdlciwKICAgIGJlX3g4Nl82NF9mZXRjaF9mbG9hdCwKfTsKI2VuZGlmCg==