IyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMiBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKCnByb2plY3QoIENVUkwgQyApCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICJMSUJDVVJMX1ZFUlNJT05fTUFKT1JbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fTUogJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9NSiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnN0cmluZyAoUkVHRVggTUFUQ0gKICAiTElCQ1VSTF9WRVJTSU9OX01JTk9SWyBcdF0rKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX01JICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIE1BVENIICIoWzAtOV0rKSIgTElCQ1VSTF9WRVJTSU9OX01JICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc3RyaW5nIChSRUdFWCBNQVRDSAogICJMSUJDVVJMX1ZFUlNJT05fUEFUQ0hbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fUFQgJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIiBMSUJDVVJMX1ZFUlNJT05fUFQgJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQpzZXQgKENVUkxfTUFKT1JfVkVSU0lPTiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnNldCAoQ1VSTF9NSU5PUl9WRVJTSU9OICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc2V0IChDVVJMX1BBVENIX1ZFUlNJT04gJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQoKaW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb24oIl4uKiQiKSAgICAjIFN1a2VuZGVyOiBJcyBpdCBuZWNlc3Nhcnk/CgojIFNldHVwIHBhY2thZ2UgbWV0YS1kYXRhCiMgU0VUKFBBQ0tBR0UgImN1cmwiKQpzZXQoQ1VSTF9WRVJTSU9OICR7Q1VSTF9NQUpPUl9WRVJTSU9OfS4ke0NVUkxfTUlOT1JfVkVSU0lPTn0uJHtDVVJMX1BBVENIX1ZFUlNJT059KQptZXNzYWdlKFNUQVRVUyAiY3VybCB2ZXJzaW9uPVske0NVUkxfVkVSU0lPTn1dIikKIyBTRVQoUEFDS0FHRV9UQVJOQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9OQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9WRVJTSU9OICItIikKIyBTRVQoUEFDS0FHRV9TVFJJTkcgImN1cmwtIikKIyBTRVQoUEFDS0FHRV9CVUdSRVBPUlQgImEgc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsLyIpCnNldChPUEVSQVRJTkdfU1lTVEVNICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCnNldChPUyAiXCIke0NNQUtFX1NZU1RFTV9OQU1FfVwiIikKCmluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQoKaWYoV0lOMzIpCiAgc2V0KE5BVElWRV9XSU5ET1dTIE9OKQplbmRpZigpCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKEJVSUxEX0NVUkxfVEVTVFMgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIHRlc3RzLiIgT04pCm9wdGlvbihDVVJMX1NUQVRJQ0xJQiAiU2V0IHRvIE9OIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBzdGF0aWMgbGlua2luZy4iIE9GRikKb3B0aW9uKENVUkxfVVNFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKIyBpbml0aWFsaXplIENVUkxfTElCUwpzZXQoQ1VSTF9MSUJTICIiKQoKaWYoQ1VSTF9VU0VfQVJFUykKICBzZXQoVVNFX0FSRVMgJHtDVVJMX1VTRV9BUkVTfSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCm9wdGlvbihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUyAiU2V0IHRvIE9OIHRvIGFjdGl2YXRlIHJlcG9ydGluZyBvZiBjVVJMIGJ1aWxkcyBoZXJlIGh0dHA6Ly93d3cuY2Rhc2gub3JnL0NEYXNoUHVibGljL2luZGV4LnBocD9wcm9qZWN0PUNVUkwiIE9GRikKaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCiAgI0lOQ0xVREUoRGFydCkKICBpbmNsdWRlKENUZXN0KQplbmRpZihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUykKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKb3B0aW9uKENVUkxfSElEREVOX1NZTUJPTFMgIlNldCB0byBPTiB0byBoaWRlIGxpYmN1cmwgaW50ZXJuYWwgc3ltYm9scyAoPWhpZGUgYWxsIHN5bWJvbHMgdGhhdCBhcmVuJ3Qgb2ZmaWNpYWxseSBleHRlcm5hbCkuIiBPTikKbWFya19hc19hZHZhbmNlZChDVVJMX0hJRERFTl9TWU1CT0xTKQoKIyBJRihXSU4zMikKIyBPUFRJT04oQ1VSTF9XSU5ET1dTX1NTUEkgIlVzZSB3aW5kb3dzIGxpYnJhcmllcyB0byBhbGxvdyBOVExNIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgb3BlbnNzbCIgT04pCiMgTUFSS19BU19BRFZBTkNFRChDVVJMX1dJTkRPV1NfU1NQSSkKIyBFTkRJRigpCgpvcHRpb24oSFRUUF9PTkxZICJkaXNhYmxlcyBhbGwgcHJvdG9jb2xzIGV4Y2VwdCBIVFRQIChUaGlzIG92ZXJyaWRlcyBhbGwgQ1VSTF9ESVNBQkxFXyogb3B0aW9ucykiIE9GRikKbWFya19hc19hZHZhbmNlZChIVFRQX09OTFkpCm9wdGlvbihDVVJMX0RJU0FCTEVfRlRQICJkaXNhYmxlcyBGVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0xEQVAgImRpc2FibGVzIExEQVAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUCkKb3B0aW9uKENVUkxfRElTQUJMRV9URUxORVQgImRpc2FibGVzIFRlbG5ldCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URUxORVQpCm9wdGlvbihDVVJMX0RJU0FCTEVfRElDVCAiZGlzYWJsZXMgRElDVCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9ESUNUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZJTEUgImRpc2FibGVzIEZJTEUiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRklMRSkKb3B0aW9uKENVUkxfRElTQUJMRV9URlRQICJkaXNhYmxlcyBURlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1RGVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfSFRUUCAiZGlzYWJsZXMgSFRUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9IVFRQKQoKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQUyAidG8gZGlzYWJsZSBMREFQUyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9MREFQUykKaWYoV0lOMzIpCiAgc2V0KENVUkxfREVGQVVMVF9ESVNBQkxFX0xEQVAgT0ZGKQogICMgc29tZSB3aW5kb3dzIGNvbXBpbGVycyBkbyBub3QgaGF2ZSB3bGRhcDMyCiAgaWYoIE5PVCBIQVZFX1dMREFQMzIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgIG1lc3NhZ2UoU1RBVFVTICJ3bGRhcDMyIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgb3B0aW9uKENVUkxfTERBUF9XSU4gIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9GRikKICBlbHNlKCkKICAgIG9wdGlvbihDVVJMX0xEQVBfV0lOICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPTikKICBlbmRpZigpCiAgbWFya19hc19hZHZhbmNlZChDVVJMX0xEQVBfV0lOKQplbmRpZigpCgppZihIVFRQX09OTFkpCiAgc2V0KENVUkxfRElTQUJMRV9GVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQplbmRpZigpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NPT0tJRVMgInRvIGRpc2FibGUgY29va2llcyBzdXBwb3J0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIICJ0byBkaXNhYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24iIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgpCm9wdGlvbihDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTICJ0byBkaXNhYmxlIHZlcmJvc2Ugc3RyaW5ncyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MpCm9wdGlvbihESVNBQkxFRF9USFJFQURTQUZFICJTZXQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKERJU0FCTEVEX1RIUkVBRFNBRkUpCm9wdGlvbihFTkFCTEVfSVBWNiAiRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKCmlmKFdJTjMyKQogIGZpbmRfbGlicmFyeShXU09DSzMyX0xJQlJBUlkgd3NvY2szMikKICBmaW5kX2xpYnJhcnkoV1MyXzMyX0xJQlJBUlkgd3MyXzMyKQogIGxpc3Rfc3BhY2VzX2FwcGVuZF9vbmNlKENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTICR7V1NPQ0szMl9MSUJSQVJZfSAke1dTMl8zMl9MSUJSQVJZfSkgICMgYnVmZmVyb3ZlcmZsb3d1LmxpYgogIGlmKENVUkxfRElTQUJMRV9MREFQKQogICAgIyBSZW1vdmUgd2xkYXAzMi5saWIgZnJvbSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAogICAgc3RyaW5nKFJFUExBQ0UgIiAiICI7IiBfTElTVCAke0NNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTfSkKICAgIGxpc3QoUkVNT1ZFX0lURU0gX0xJU1QgIndsZGFwMzIubGliIikKICAgIHRvX2xpc3Rfc3BhY2VzKF9MSVNUIENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTKQogIGVsc2UoKQogICAgIyBBcHBlbmQgd2xkYXAzMi5saWIKICAgIGxpc3Rfc3BhY2VzX2FwcGVuZF9vbmNlKENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTIHdsZGFwMzIubGliKQogIGVuZGlmKCkKICBzZXQoQ01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVMgIiR7Q01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVN9IiAgIENBQ0hFIFNUUklORyAiIiBGT1JDRSkKZW5kaWYoKQoKCiMgV2UgbmVlZCBhbnNpIGMtZmxhZ3MsIGVzcGVjaWFsbHkgb24gSFAKc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQU5TSV9DRkxBR1N9ICR7Q01BS0VfQ19GTEFHU30iKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9BTlNJX0NGTEFHU30pCgojIERpc2FibGUgd2FybmluZ3Mgb24gQm9ybGFuZCB0byBhdm9pZCBjaGFuZ2luZyAzcmQgcGFydHkgY29kZS4KaWYoQk9STEFORCkKICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtdy0iKQplbmRpZihCT1JMQU5EKQoKIyBJZiB3ZSBhcmUgb24gQUlYLCBkbyB0aGUgX0FMTF9TT1VSQ0UgbWFnaWMKaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCiAgc2V0KF9BTExfU09VUkNFIDEpCmVuZGlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQoKIyBJbmNsdWRlIGFsbCB0aGUgbmVjZXNzYXJ5IGZpbGVzIGZvciBtYWNyb3MKaW5jbHVkZSAoQ2hlY2tGdW5jdGlvbkV4aXN0cykKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZSkKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZXMpCmluY2x1ZGUgKENoZWNrTGlicmFyeUV4aXN0cykKaW5jbHVkZSAoQ2hlY2tTeW1ib2xFeGlzdHMpCmluY2x1ZGUgKENoZWNrVHlwZVNpemUpCgojIE9uIHdpbmRvd3MgcHJlbG9hZCBzZXR0aW5ncwppZihXSU4zMikKICBpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9QbGF0Zm9ybXMvV2luZG93c0NhY2hlLmNtYWtlKQplbmRpZihXSU4zMikKCiMgVGhpcyBtYWNybyBjaGVja3MgaWYgdGhlIHN5bWJvbCBleGlzdHMgaW4gdGhlIGxpYnJhcnkgYW5kIGlmIGl0CiMgZG9lcywgaXQgcHJlcGVuZHMgbGlicmFyeSB0byB0aGUgbGlzdC4KbWFjcm8oQ0hFQ0tfTElCUkFSWV9FWElTVFNfQ09OQ0FUIExJQlJBUlkgU1lNQk9MIFZBUklBQkxFKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0xJQlJBUll9OyR7Q1VSTF9MSUJTfSIgJHtTWU1CT0x9ICIke0NNQUtFX0xJQlJBUllfUEFUSH0iCiAgICAke1ZBUklBQkxFfSkKICBpZigke1ZBUklBQkxFfSkKICAgIHNldChDVVJMX0xJQlMgJHtMSUJSQVJZfSAke0NVUkxfTElCU30pCiAgZW5kaWYoJHtWQVJJQUJMRX0pCmVuZG1hY3JvKENIRUNLX0xJQlJBUllfRVhJU1RTX0NPTkNBVCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndzMl8zMiIgZ2V0Y2ggICAgICAgIEhBVkVfTElCV1MyXzMyKQpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndpbm1tIiAgZ2V0Y2ggICAgICAgIEhBVkVfTElCV0lOTU0pCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJ3bGRhcDMyIiBjbGRhcF9vcGVuICIiIEhBVkVfV0xEQVAzMikKCiMgSUYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQojICBDSEVDS19MSUJSQVJZX0VYSVNUU19DT05DQVQoInoiICAgICAgaW5mbGF0ZUVuZCAgIEhBVkVfTElCWikKIyBFTkRJRihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgojIENoZWNrIGZvciBpZG4KY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJpZG4iIGlkbmFfdG9fYXNjaWlfbHogSEFWRV9MSUJJRE4pCgojIENoZWNrIGZvciBMREFQCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgibGRhcCIgbGRhcF9pbml0IEhBVkVfTElCTERBUCkKIyBpZihOT1QgSEFWRV9MSUJMREFQKQojIFNFVChDVVJMX0RJU0FCTEVfTERBUCBPTikKIyBlbmRpZihOT1QgSEFWRV9MSUJMREFQKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgojIEZvciBvdGhlciB0ZXN0cyB0byB1c2UgdGhlIHNhbWUgbGlicmFyaWVzCnNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDVVJMX0xJQlN9KQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjVVJMIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKSAgIyBBTkQgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihDTUFLRV9VU0VfT1BFTlNTTCAiVXNlIE9wZW5TU0wgY29kZS4gRXhwZXJpbWVudGFsIiBPTikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTlNTTCkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgaWYoV0lOMzIpCiAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICAgIGlmKE9QRU5TU0xfRk9VTkQpCiAgICAgIHNldChVU0VfU1NMRUFZIFRSVUUpCiAgICAgIHNldChVU0VfT1BFTlNTTCBUUlVFKQogICAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtPUEVOU1NMX0xJQlJBUklFU30gKQogICAgZWxzZSgpCiAgICAgIHNldChDTUFLRV9VU0VfT1BFTlNTTCBGQUxTRSkKICAgICAgbWVzc2FnZShTVEFUVVMgIk9wZW5TU0wgTk9UIEZvdW5kLCBkaXNhYmxpbmcgQ01BS0VfVVNFX09QRU5TU0wiKQogICAgZW5kaWYoKQogIGVsc2UoV0lOMzIpCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImNyeXB0byIgQ1JZUFRPX2xvY2sgIEhBVkVfTElCQ1JZUFRPKQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzc2wiICAgIFNTTF9jb25uZWN0ICBIQVZFX0xJQlNTTCkKICBlbmRpZihXSU4zMikKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCgojIElmIHdlIGhhdmUgZmVhdHVyZXMuaCwgdGhlbiBkbyB0aGUgX0JTRF9TT1VSQ0UgbWFnaWMKY2hlY2tfaW5jbHVkZV9maWxlKCJmZWF0dXJlcy5oIiAgICAgICBIQVZFX0ZFQVRVUkVTX0gpCgojIENoZWNrIGlmIGhlYWRlciBmaWxlIGV4aXN0cyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgptYWNybyhDSEVDS19JTkNMVURFX0ZJTEVfQ09OQ0FUIEZJTEUgVkFSSUFCTEUpCiAgY2hlY2tfaW5jbHVkZV9maWxlcygiJHtDVVJMX0lOQ0xVREVTfTske0ZJTEV9IiAke1ZBUklBQkxFfSkKICBpZigke1ZBUklBQkxFfSkKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gJHtGSUxFfSkKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLUQke1ZBUklBQkxFfSIpCiAgZW5kaWYoJHtWQVJJQUJMRX0pCmVuZG1hY3JvKENIRUNLX0lOQ0xVREVfRklMRV9DT05DQVQpCgoKIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndzMnRjcGlwLmgiICAgICBIQVZFX1dTMlRDUElQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jazIuaCIgICAgIEhBVkVfV0lOU09DSzJfSCkKZW5kaWYoTk9UIFVOSVgpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKZW5kaWYoTk9UIFVOSVgpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIiBIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuLWZyZWUuaCIgICAgICAgSEFWRV9JRE5fRlJFRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZmFkZHJzLmgiICAgICAgICBIQVZFX0lGQUREUlNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW8uaCIgICAgICAgICAgICAgSEFWRV9JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJrcmIuaCIgICAgICAgICAgICBIQVZFX0tSQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJnZW4uaCIgICAgICAgICBIQVZFX0xJQkdFTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJzc2gyLmgiICAgICAgICBIQVZFX0xJQlNTSDJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL2NyeXB0by5oIiBIQVZFX09QRU5TU0xfQ1JZUFRPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvZW5naW5lLmgiIEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9lcnIuaCIgICAgSEFWRV9PUEVOU1NMX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3BlbS5oIiAgICBIQVZFX09QRU5TU0xfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcGtjczEyLmgiIEhBVkVfT1BFTlNTTF9QS0NTMTJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9yc2EuaCIgICAgSEFWRV9PUEVOU1NMX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3NzbC5oIiAgICBIQVZFX09QRU5TU0xfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wveDUwOS5oIiAgIEhBVkVfT1BFTlNTTF9YNTA5X0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBlbS5oIiAgICAgICAgICAgIEhBVkVfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBvbGwuaCIgICAgICAgICAgIEhBVkVfUE9MTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwd2QuaCIgICAgICAgICAgICBIQVZFX1BXRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJyc2EuaCIgICAgICAgICAgICBIQVZFX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZXRqbXAuaCIgICAgICAgICBIQVZFX1NFVEpNUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZ3R0eS5oIiAgICAgICAgICBIQVZFX1NHVFRZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNpZ25hbC5oIiAgICAgICAgIEhBVkVfU0lHTkFMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNzbC5oIiAgICAgICAgICAgIEhBVkVfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGJvb2wuaCIgICAgICAgIEhBVkVfU1REQk9PTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgICBIQVZFX1NURElOVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RETElCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZy5oIiAgICAgICAgIEhBVkVfU1RSSU5HX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZ3MuaCIgICAgICAgIEhBVkVfU1RSSU5HU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJvcHRzLmgiICAgICAgICBIQVZFX1NUUk9QVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvLmgiICAgICAgICAgSEFWRV9URVJNSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvcy5oIiAgICAgICAgSEFWRV9URVJNSU9TX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRpbWUuaCIgICAgICAgICAgIEhBVkVfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0bGQuaCIgICAgICAgICAgICBIQVZFX1RMRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1bmlzdGQuaCIgICAgICAgICBIQVZFX1VOSVNURF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1dGltZS5oIiAgICAgICAgICBIQVZFX1VUSU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIng1MDkuaCIgICAgICAgICAgIEhBVkVfWDUwOV9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHJvY2Vzcy5oIiAgICAgICAgSEFWRV9QUk9DRVNTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGRlZi5oIiAgICAgICAgIEhBVkVfU1REREVGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImRsZmNuLmgiICAgICAgICAgIEhBVkVfRExGQ05fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWFsbG9jLmgiICAgICAgICAgSEFWRV9NQUxMT0NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWVtb3J5LmgiICAgICAgICAgSEFWRV9NRU1PUllfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcmFuZC5oIiAgIEhBVkVfT1BFTlNTTF9SQU5EX0gpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQoKaWYoTk9UIEhBVkVfTERBUF9IKSAKICBtZXNzYWdlKFNUQVRVUyAiTERBUF9IIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQplbmRpZigpCgoKY2hlY2tfdHlwZV9zaXplKHNpemVfdCAgU0laRU9GX1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKHNzaXplX3QgIFNJWkVPRl9TU0laRV9UKQpjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgIFNJWkVPRl9MT05HX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyIgIFNJWkVPRl9MT05HKQpjaGVja190eXBlX3NpemUoInNob3J0IiAgU0laRU9GX1NIT1JUKQpjaGVja190eXBlX3NpemUoImludCIgIFNJWkVPRl9JTlQpCmNoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgIFNJWkVPRl9fX0lOVDY0KQpjaGVja190eXBlX3NpemUoImxvbmcgZG91YmxlIiAgU0laRU9GX0xPTkdfRE9VQkxFKQpjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCmlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQogIGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBsb25nKQogIGVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBfX2ludDY0KQogIGVuZGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQplbmRpZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKCiMgRGlmZmVyZW50IHNpemVvZnMsIGV0Yy4KCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0xPTkcgICAgICAgIDQKIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgbG9uZyBsb25nCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICJsbGQiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICAgICAgICIlbGxkIgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UICA4CiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgIExMCiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAoKc2V0KENVUkxfU0laRU9GX0xPTkcgJHtTSVpFT0ZfTE9OR30pCgppZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKCmlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAibG9uZyBsb25nIikKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMTFUpCmVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKCmlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICR7c3NpemVfdH0pCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgJHtTSVpFT0ZfU1NJWkVfVH0pCiAgIyBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4KICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCgppZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgc2V0KEhBVkVfTE9OR0xPTkcgMSkKICBzZXQoSEFWRV9MTCAxKQplbmRpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCgpmaW5kX2ZpbGUoUkFORE9NX0ZJTEUgdXJhbmRvbSAvZGV2KQptYXJrX2FzX2FkdmFuY2VkKFJBTkRPTV9GSUxFKQoKIyBDaGVjayBmb3Igc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZApjaGVja19zeW1ib2xfZXhpc3RzKGJhc2VuYW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQkFTRU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMocG9sbCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNlbGVjdCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VMRUNUKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmR1cCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRFVQKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnN0ciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSU1RSKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRva19yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9LX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZnRpbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJGVElNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNhc2VjbXAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ0FTRUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJpY21wICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUklDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY21waSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cm5jbXBpICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoYWxhcm0gICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9BTEFSTSkKaWYoTk9UIEhBVkVfU1RSTkNNUEkpCiAgc2V0KEhBVkVfU1RSQ01QSSkKZW5kaWYoTk9UIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHJfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0dGltZW9mZGF5ICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRUSU1FT0ZEQVkpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9hZGRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX0FERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0EpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0FfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y3NldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDU0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y2dldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDR0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhjbG9zZXNvY2tldCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0NMT1NFU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHZidWYgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUVkJVRikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR1NFVEpNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwYXNzX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBBU1NfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJsY2F0ICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkxDQVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHd1aWQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQV1VJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRldWlkICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEVVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHModXRpbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VVElNRSkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3N0YXR1cyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU1RBVFVTKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zY3JlZW4gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NDUkVFTikKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfZWdkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9FR0QpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSAiJHtDVVJMX0lOQ0xVREVTfSIKICAgIEhBVkVfQ1JZUFRPX0NMRUFOVVBfQUxMX0VYX0RBVEEpCiAgaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQogICAgc2V0KFVTRV9PUEVOU1NMIDEpCiAgICBzZXQoVVNFX1NTTEVBWSAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5fZnJlZSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5fRlJFRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5hX3N0cmVycm9yICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5BX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRsZF9zdHJlcnJvciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RMRF9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCiMgc2lnYWN0aW9uIGFuZCBzaWdzZXRqbXAgYXJlIHNwZWNpYWwuIFVzZSBzcGVjaWFsIG1lY2hhbmlzbSBmb3IKIyBkZXRlY3RpbmcgdGhvc2UsIGJ1dCBvbmx5IGlmIHByZXZpb3VzIGF0dGVtcHQgZmFpbGVkLgppZihIQVZFX1NJR05BTF9IKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnYWN0aW9uICJzaWduYWwuaCIgSEFWRV9TSUdBQ1RJT04pCmVuZGlmKEhBVkVfU0lHTkFMX0gpCgppZihOT1QgSEFWRV9TSUdTRVRKTVApCiAgaWYoSEFWRV9TRVRKTVBfSCkKICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICJzZXRqbXAuaCIgSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICBpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgICAgc2V0KEhBVkVfU0lHU0VUSk1QIDEpCiAgICBlbmRpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICBlbmRpZihIQVZFX1NFVEpNUF9IKQplbmRpZihOT1QgSEFWRV9TSUdTRVRKTVApCgojIElmIHRoZXJlIGlzIG5vIHN0cmljbXAoKSwgZG8gbm90IGFsbG93IExEQVAgdG8gcGFyc2UgVVJMcwppZihOT1QgSEFWRV9TVFJJQ01QKQogIHNldChIQVZFX0xEQVBfVVJMX1BBUlNFIDEpCmVuZGlmKE5PVCBIQVZFX1NUUklDTVApCgojIEZvciBvdGhlciBjdXJsIHNwZWNpZmljIHRlc3RzLCB1c2UgdGhpcyBtYWNyby4KbWFjcm8oQ1VSTF9JTlRFUk5BTF9URVNUIENVUkxfVEVTVCkKICBpZigiJHtDVVJMX1RFU1R9IiBNQVRDSEVTICJeJHtDVVJMX1RFU1R9JCIpCiAgICBzZXQoTUFDUk9fQ0hFQ0tfRlVOQ1RJT05fREVGSU5JVElPTlMKICAgICAgIi1EJHtDVVJMX1RFU1R9ICR7Q1VSTF9URVNUX0RFRklORVN9ICR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IikKICAgIGlmKENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKICAgICAgc2V0KENVUkxfVEVTVF9BRERfTElCUkFSSUVTCiAgICAgICAgIi1ETElOS19MSUJSQVJJRVM6U1RSSU5HPSR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCiAgICBlbmRpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCgogICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSIpCiAgICB0cnlfY29tcGlsZSgke0NVUkxfVEVTVH0KICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQogICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvQ3VybFRlc3RzLmMKICAgICAgQ01BS0VfRkxBR1MgLURDT01QSUxFX0RFRklOSVRJT05TOlNUUklORz0ke01BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TfQogICAgICAiJHtDVVJMX1RFU1RfQUREX0xJQlJBUklFU30iCiAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCiAgICBpZigke0NVUkxfVEVTVH0pCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSBDQUNIRSBJTlRFUk5BTCAiQ3VybCB0ZXN0ICR7RlVOQ1RJT059IikKICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSAtIFN1Y2Nlc3MiKQogICAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlT3V0cHV0LmxvZwogICAgICAgICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gcGFzc2VkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCiAgICAgICAgIiR7T1VUUFVUfVxuIikKICAgIGVsc2UoJHtDVVJMX1RFU1R9KQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gRmFpbGVkIikKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAiIiBDQUNIRSBJTlRFUk5BTCAiQ3VybCB0ZXN0ICR7RlVOQ1RJT059IikKICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZwogICAgICAgICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCiAgICAgICAgIiR7T1VUUFVUfVxuIikKICAgIGVuZGlmKCR7Q1VSTF9URVNUfSkKICBlbmRpZigiJHtDVVJMX1RFU1R9IiBNQVRDSEVTICJeJHtDVVJMX1RFU1R9JCIpCmVuZG1hY3JvKENVUkxfSU5URVJOQUxfVEVTVCkKCm1hY3JvKENVUkxfSU5URVJOQUxfVEVTVF9SVU4gQ1VSTF9URVNUKQogIGlmKCIke0NVUkxfVEVTVH1fQ09NUElMRSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfV9DT01QSUxFJCIpCiAgICBzZXQoTUFDUk9fQ0hFQ0tfRlVOQ1RJT05fREVGSU5JVElPTlMKICAgICAgIi1EJHtDVVJMX1RFU1R9ICR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IikKICAgIGlmKENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKICAgICAgc2V0KENVUkxfVEVTVF9BRERfTElCUkFSSUVTCiAgICAgICAgIi1ETElOS19MSUJSQVJJRVM6U1RSSU5HPSR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCiAgICBlbmRpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCgogICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSIpCiAgICB0cnlfcnVuKCR7Q1VSTF9URVNUfSAke0NVUkxfVEVTVH1fQ09NUElMRQogICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CiAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9DdXJsVGVzdHMuYwogICAgICBDTUFLRV9GTEFHUyAtRENPTVBJTEVfREVGSU5JVElPTlM6U1RSSU5HPSR7TUFDUk9fQ0hFQ0tfRlVOQ1RJT05fREVGSU5JVElPTlN9CiAgICAgICIke0NVUkxfVEVTVF9BRERfTElCUkFSSUVTfSIKICAgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVCkKICAgIGlmKCR7Q1VSTF9URVNUfV9DT01QSUxFIEFORCBOT1QgJHtDVVJMX1RFU1R9KQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gLSBTdWNjZXNzIikKICAgIGVsc2UoJHtDVVJMX1RFU1R9X0NPTVBJTEUgQU5EIE5PVCAke0NVUkxfVEVTVH0pCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gLSBGYWlsZWQiKQogICAgICBzZXQoJHtDVVJMX1RFU1R9ICIiIENBQ0hFIElOVEVSTkFMICJDdXJsIHRlc3QgJHtGVU5DVElPTn0iKQogICAgICBmaWxlKEFQUEVORCAiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZyIKICAgICAgICAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgogICAgICAgICIke09VVFBVVH0iKQogICAgICBpZigke0NVUkxfVEVTVH1fQ09NUElMRSkKICAgICAgICBmaWxlKEFQUEVORAogICAgICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2ciCiAgICAgICAgICAiVGhlcmUgd2FzIGEgcHJvYmxlbSBydW5uaW5nIHRoaXMgdGVzdFxuIikKICAgICAgZW5kaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUpCiAgICAgIGZpbGUoQVBQRU5EICIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nIgogICAgICAgICJcblxuIikKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9DT01QSUxFIEFORCBOT1QgJHtDVVJMX1RFU1R9KQogIGVuZGlmKCIke0NVUkxfVEVTVH1fQ09NUElMRSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfV9DT01QSUxFJCIpCmVuZG1hY3JvKENVUkxfSU5URVJOQUxfVEVTVF9SVU4pCgojIERvIGN1cmwgc3BlY2lmaWMgdGVzdHMKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfRkNOVExfT19OT05CTE9DSwogICAgSEFWRV9JT0NUTFNPQ0tFVAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMU09DS0VUX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfRklPTkJJTwogICAgSEFWRV9JT0NUTF9TSU9DR0lGQUREUgogICAgSEFWRV9TRVRTT0NLT1BUX1NPX05PTkJMT0NLCiAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECiAgICBUSU1FX1dJVEhfU1lTX1RJTUUKICAgIEhBVkVfT19OT05CTE9DSwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzdfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82X1JFRU5UUkFOVAogICAgSEFWRV9TT0NLTEVOX1QKICAgIEhBVkVfSU5fQUREUl9UCiAgICBIQVZFX0JPT0xfVAogICAgU1REQ19IRUFERVJTCiAgICBSRVRTSUdUWVBFX1RFU1QKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVAogICAgSEFWRV9HRVRBRERSSU5GTwogICAgSEFWRV9GSUxFX09GRlNFVF9CSVRTCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0KCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCmlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0xJQkNfU1RSRVJST1JfUgogICAgSEFWRV9QT1NJWF9TVFJFUlJPUl9SCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0X3J1bigke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKIyBDaGVjayBmb3IgcmVlbnRyYW50CmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIGlmKE5PVCAke0NVUkxfVEVTVH0pCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kaWYoTk9UICR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgppZihORUVEX1JFRU5UUkFOVCkKICBmb3JlYWNoKENVUkxfVEVTVAogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNikKICAgIHNldCgke0NVUkxfVEVTVH0gMCkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kZm9yZWFjaChDVVJMX1RFU1QpCmVuZGlmKE5FRURfUkVFTlRSQU5UKQoKaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBzZXQoSEFWRV9JTkVUX05UT0FfUl9ERUNMIDEpCiAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCmVuZGlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCgojIFNvbWUgb3RoZXIgbWlub3IgdGVzdHMKCmlmKE5PVCBIQVZFX0lOX0FERFJfVCkKICBzZXQoaW5fYWRkcl90ICJ1bnNpZ25lZCBsb25nIikKZW5kaWYoTk9UIEhBVkVfSU5fQUREUl9UKQoKIyBGaXggbGlieiAvIHpsaWIuaAoKaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQogIGlmKE5PVCBIQVZFX0xJQlopCiAgICBzZXQoSEFWRV9aTElCX0ggMCkKICBlbmRpZihOT1QgSEFWRV9MSUJaKQoKICBpZihOT1QgSEFWRV9aTElCX0gpCiAgICBzZXQoSEFWRV9MSUJaIDApCiAgZW5kaWYoTk9UIEhBVkVfWkxJQl9IKQplbmRpZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgppZihfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKF9GSUxFX09GRlNFVF9CSVRTKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2N1cmwvY3VybC5oIikKY2hlY2tfdHlwZV9zaXplKCJjdXJsX29mZl90IiBTSVpFT0ZfQ1VSTF9PRkZfVCkKc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKCgojIENoZWNrIGZvciBub25ibG9ja2luZwpzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORyAxKQppZihIQVZFX0ZJT05CSU8gT1IKICAgIEhBVkVfSU9DVExTT0NLRVQgT1IKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogICAgSEFWRV9PX05PTkJMT0NLKQogIHNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HKQplbmRpZihIQVZFX0ZJT05CSU8gT1IKICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgSEFWRV9PX05PTkJMT0NLKQoKaWYoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIHZvaWQpCmVsc2UoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIGludCkKZW5kaWYoUkVUU0lHVFlQRV9URVNUKQoKaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQogIGluY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQogIGNoZWNrX2NfY29tcGlsZXJfZmxhZygtV25vLWxvbmctZG91YmxlIEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICBpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgICAjIFRoZSBNYWMgdmVyc2lvbiBvZiBHQ0Mgd2FybnMgYWJvdXQgdXNlIG9mIGxvbmcgZG91YmxlLiAgRGlzYWJsZSBpdC4KICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eShNUFJJTlRGX0NPTVBJTEVfRkxBR1MgbXByaW50Zi5jIENPTVBJTEVfRkxBR1MpCiAgICBpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIiR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSAtV25vLWxvbmctZG91YmxlIikKICAgIGVsc2UoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICItV25vLWxvbmctZG91YmxlIikKICAgIGVuZGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhtcHJpbnRmLmMgUFJPUEVSVElFUwogICAgICBDT01QSUxFX0ZMQUdTICR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSkKICBlbmRpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCmVuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKCmlmKEhBVkVfU09DS0xFTl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCAic29ja2xlbl90IikKICBpZihXSU4zMikKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJ3aW5zb2NrMi5oO3dzMnRjcGlwLmgiKQogIGVsc2VpZihIQVZFX1NZU19TT0NLRVRfSCkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQogIGVuZGlmKCkKICBjaGVja190eXBlX3NpemUoInNvY2tsZW5fdCIgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCiAgaWYoTk9UIEhBVkVfQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SIAogICAgICJDaGVjayBmb3Igc2l6ZW9mIHNvY2tsZW5fdCBmYWlsZWQsIHNlZSBDTWFrZUZpbGVzL0NNYWtlcnJvci5sb2ciKQogIGVuZGlmKCkKZWxzZSgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludCkKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgJHtTSVpFT0ZfSU5UfSkKZW5kaWYoKQoKaW5jbHVkZShDTWFrZS9PdGhlclRlc3RzLmNtYWtlKQoKYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKCiMgRm9yIHdpbmRvd3MsIGRvIG5vdCBhbGxvdyB0aGUgY29tcGlsZXIgdG8gdXNlIGRlZmF1bHQgdGFyZ2V0IChWaXN0YSkuCmlmKFdJTjMyKQogIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCmVuZGlmKFdJTjMyKQoKaWYoTVNWQykKICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQplbmRpZihNU1ZDKQoKIyBTZXRzIHVwIHRoZSBkZXBlbmRlbmNpZXMgKHpsaWIsIE9wZW5TU0wsIGV0Yy4pIG9mIGEgY1VSTCBzdWJwcm9qZWN0IGFjY29yZGluZyB0byBvcHRpb25zLgojIFRPRE8gVGhpcyBpcyBmYXIgdG8gYmUgY29tcGxldGUhCmZ1bmN0aW9uKFNFVFVQX0NVUkxfREVQRU5ERU5DSUVTIFRBUkdFVF9OQU1FKQogIGlmKENVUkxfWkxJQiBBTkQgWkxJQl9GT1VORCkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSfSkKICBlbmRpZigpCiAgaWYoQ1VSTF9aTElCIEFORCBaTElCX0ZPVU5EKQogICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7VEFSR0VUX05BTUV9ICR7WkxJQl9MSUJSQVJJRVN9KQogICAgI0FERF9ERUZJTklUSU9OUyggLURIQVZFX1pMSUJfSCAtREhBVkVfWkxJQiAtREhBVkVfTElCWiApCiAgZW5kaWYoKQoKICBpZihDTUFLRV9VU0VfT1BFTlNTTCBBTkQgT1BFTlNTTF9GT1VORCkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICBlbmRpZigpCiAgaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUpCiAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtUQVJHRVRfTkFNRX0gJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICAjQUREX0RFRklOSVRJT05TKCAtRFVTRV9TU0xFQVkgKQogIGVuZGlmKCkKZW5kZnVuY3Rpb24oKQoKIyBVZ2x5IChidXQgZnVuY3Rpb25hbCkgd2F5IHRvIGluY2x1ZGUgIk1ha2VmaWxlLmluYyIgYnkgdHJhbnNmb3JtaW5nIGl0ICg9IHJlZ2VuZXJhdGUgaXQpLgpmdW5jdGlvbihUUkFOU0ZPUk1fTUFLRUZJTEVfSU5DIElOUFVUX0ZJTEUgT1VUUFVUX0ZJTEUpCiAgZmlsZShSRUFEICR7SU5QVVRfRklMRX0gTUFLRUZJTEVfSU5DX1RFWFQpCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX3NyY2RpcikiICAgIlwke0NVUkxfU09VUkNFX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9idWlsZGRpcikiICJcJHtDVVJMX0JJTkFSWV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcXFxcbiIgIqchpyIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbYS16QS1aX11bYS16QS1aMC05X10qKVtcdCBdKj1bXHQgXSooW15cbl0qKSIgIlNFVChcXDEgXFwyKSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIqchpyIgIlxuIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcJFxcKChbYS16QS1aX11bYS16QS1aMC05X10qKVxcKSIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgJCgpIHdpdGggJHt9CiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkAoW2EtekEtWl9dW2EtekEtWjAtOV9dKilAIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSBAQCB3aXRoICR7fSwgZXZlbiBpZiB0aGF0IG1heSBub3QgYmUgcmVhZCBieSBDTWFrZSBzY3JpcHRzLgogIGZpbGUoV1JJVEUgJHtPVVRQVVRfRklMRX0gJHtNQUtFRklMRV9JTkNfVEVYVH0pCgplbmRmdW5jdGlvbigpCgphZGRfc3ViZGlyZWN0b3J5KGxpYikKaWYoQlVJTERfQ1VSTF9FWEUpCiAgYWRkX3N1YmRpcmVjdG9yeShzcmMpCmVuZGlmKCkKaWYoQlVJTERfQ1VSTF9URVNUUykKICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RzKQplbmRpZigpCgojIFRoaXMgbmVlZHMgdG8gYmUgcnVuIHZlcnkgbGFzdCBzbyBvdGhlciBwYXJ0cyBvZiB0aGUgc2NyaXB0cyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KaWYoTk9UIENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUpCiAgc2V0KENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUgMSBDQUNIRSBJTlRFUk5BTCAiRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgcnVubmluZyBDTWFrZSBvciBpZiBDTWFrZSBoYXMgYmVlbiBjb25maWd1cmVkIGJlZm9yZSIpCmVuZGlmKCkKCiMgSW5zdGFsbGF0aW9uLgojIEZpcnN0LCBpbnN0YWxsIGdlbmVyYXRlZCBjdXJsYnVpbGQuaAppbnN0YWxsKEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIgogICAgREVTVElOQVRJT04gaW5jbHVkZS9jdXJsICkKIyBOZXh0LCBpbnN0YWxsIG90aGVyIGhlYWRlcnMgZXhjbHVkaW5nIGN1cmxidWlsZC5oCmluc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsIgogICAgREVTVElOQVRJT04gaW5jbHVkZQogICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIgogICAgUEFUVEVSTiAiY3VybGJ1aWxkLmgiIEVYQ0xVREUpCg==