IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KIwojIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCiMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjdXJsL2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCnNldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlOyR7Q01BS0VfTU9EVUxFX1BBVEh9IikKaW5jbHVkZShVdGlsaXRpZXMpCmluY2x1ZGUoTWFjcm9zKQppbmNsdWRlKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKcHJvamVjdCggQ1VSTCBDICkKCm1lc3NhZ2UoV0FSTklORyAidGhlIGN1cmwgY21ha2UgYnVpbGQgc3lzdGVtIGlzIHBvb3JseSBtYWludGFpbmVkLiBCZSBhd2FyZSIpCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICIjZGVmaW5lIExJQkNVUkxfVkVSU0lPTiBcIlteXCJdKiIKICBDVVJMX1ZFUlNJT04gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW15cIl0rXCIiICIiIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTn0pCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFswLTlhLWZBLUZdKyIKICBDVVJMX1ZFUlNJT05fTlVNICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIlteMF0rMHgiICIiIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fTlVNfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjdXJsIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKENVUkxfU1RBVElDTElCICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBsaW5raW5nLiIgT0ZGKQpvcHRpb24oRU5BQkxFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIKICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdG8gT04gdG8gZW5hYmxlIHRocmVhZGVkIEROUyBsb29rdXAiCiAgICAgICAgICAgICAgICAgICAgICAgICBPTiAiTk9UIEVOQUJMRV9BUkVTIgogICAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQplbHNlKCkKICBvcHRpb24oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiIE9GRikKZW5kaWYoKQpvcHRpb24oRU5BQkxFX0RFQlVHICJTZXQgdG8gT04gdG8gZW5hYmxlIGN1cmwgZGVidWcgZmVhdHVyZXMiIE9GRikKb3B0aW9uKEVOQUJMRV9DVVJMREVCVUcgIlNldCB0byBPTiB0byBidWlsZCB3aXRoIFRyYWNrTWVtb3J5IGZlYXR1cmUgZW5hYmxlZCIgT0ZGKQoKaWYgKEVOQUJMRV9ERUJVRykKICAjIERFQlVHQlVJTEQgd2lsbCBiZSBkZWZpbmVkIG9ubHkgZm9yIERlYnVnIGJ1aWxkcwogIGlmKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TICQ8JDxDT05GSUc6RGVidWc+OkRFQlVHQlVJTEQ+KQogIGVsc2UoKQogICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OU19ERUJVRyBERUJVR0JVSUxEKQogIGVuZGlmKCkKICBzZXQoRU5BQkxFX0NVUkxERUJVRyBPTikKZW5kaWYoKQoKaWYgKEVOQUJMRV9DVVJMREVCVUcpCiAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBDVVJMREVCVUcpCmVuZGlmKCkKCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBBTkQgRU5BQkxFX0FSRVMpCiAgbWVzc2FnZShGQVRBTF9FUlJPUiAiT3B0aW9ucyBFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgYW5kIEVOQUJMRV9BUkVTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKQplbmRpZigpCgppZihFTkFCTEVfQVJFUykKICBzZXQoVVNFX0FSRVMgMSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKaW5jbHVkZShDdXJsU3ltYm9sSGlkaW5nKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX1JUU1AgInRvIGRpc2FibGUgUlRTUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9SVFNQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BST1hZICJ0byBkaXNhYmxlIHByb3h5IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BST1hZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BPUDMgInRvIGRpc2FibGUgUE9QMyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QT1AzKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0lNQVAgInRvIGRpc2FibGUgSU1BUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9JTUFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1NNVFAgInRvIGRpc2FibGUgU01UUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9TTVRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0dPUEhFUiAidG8gZGlzYWJsZSBHb3BoZXIiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfR09QSEVSKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUlRTUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1BPUDMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9JTUFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfU01UUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0dPUEhFUiBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X2FkZHIgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfc2NvcGVfaWQgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKQogIGlmKE5PVCBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgICBtZXNzYWdlKFdBUk5JTkcgInN0cnVjdCBzb2NrYWRkcl9pbjYgbm90IGF2YWlsYWJsZSwgZGlzYWJsaW5nIElQdjYgc3VwcG9ydCIpCiAgICAjIEZvcmNlIHRoZSBmZWF0dXJlIG9mZiBhcyB0aGlzIG5hbWUgaXMgdXNlZCBhcyBndWFyZCBtYWNyby4uLgogICAgc2V0KEVOQUJMRV9JUFY2IE9GRgogICAgICAgIENBQ0hFIEJPT0wgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfTUFOVUFMICJ0byBwcm92aWRlIHRoZSBidWlsdC1pbiBtYW51YWwiIE9OKQp1bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/CmlmKEVOQUJMRV9NQU5VQUwpCiAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKICBpZihOUk9GRikKICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCiAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCiAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQogICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAogICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCiAgICAgICAgRVJST1JfUVVJRVQpCiAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAogICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQogICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQogICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQogICAgICAgIGJyZWFrKCkKICAgICAgZW5kaWYoKQogICAgZW5kZm9yZWFjaCgpCiAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQogICAgaWYoTk9UIFVTRV9NQU5VQUwpCiAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKICAgIGVuZGlmKCkKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKaW5jbHVkZSAoQ2hlY2tDU291cmNlQ29tcGlsZXMpCmluY2x1ZGUgKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKIyBPbiB3aW5kb3dzIHByZWxvYWQgc2V0dGluZ3MKaWYoV0lOMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRF9XSU5TT0NLQVBJXyIpCiAgaW5jbHVkZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvUGxhdGZvcm1zL1dpbmRvd3NDYWNoZS5jbWFrZSkKZW5kaWYoV0lOMzIpCgppZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIpCiAgaWYoV0lOMzIpCiAgICBzZXQoVVNFX1RIUkVBRFNfV0lOMzIgT04pCiAgZWxzZSgpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwdGhyZWFkLmgiIEhBVkVfUFRIUkVBRF9IKQogICAgaWYoSEFWRV9QVEhSRUFEX0gpCiAgICAgIHNldChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgMSkKICAgICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCiAgICAgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQogICAgICAgIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCiAgICAgICAgc2V0KFVTRV9USFJFQURTX1BPU0lYIDEpCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdG5hbWUgSEFWRV9HRVRIT1NUTkFNRSkKCnNldChPUEVOU1NMX0RFRkFVTFQgT04pCmlmKFdJTjMyKQogIHNldChPUEVOU1NMX0RFRkFVTFQgT0ZGKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid3MyXzMyIiBnZXRjaCAgICAgICAgSEFWRV9MSUJXUzJfMzIpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQplbmRpZigpCgpvcHRpb24oQ01BS0VfVVNFX09QRU5TU0wgIlVzZSBPcGVuU1NMIGNvZGUuIEV4cGVyaW1lbnRhbCIgJHtPUEVOU1NMX0RFRkFVTFR9KQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQoKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihDVVJMX1dJTkRPV1NfU1NQSSAiVXNlIHdpbmRvd3MgbGlicmFyaWVzIHRvIGFsbG93IE5UTE0gYXV0aGVudGljYXRpb24gd2l0aG91dCBvcGVuc3NsIiBPTgogICAgIk5PVCBDTUFLRV9VU0VfT1BFTlNTTCIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9XSU5ET1dTX1NTUEkpCmVuZGlmKCkKCnNldChVU0VfT1BFTlNTTCBPRkYpCnNldChIQVZFX0xJQkNSWVBUTyBPRkYpCnNldChIQVZFX0xJQlNTTCBPRkYpCgppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICBpZihPUEVOU1NMX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgc2V0KFVTRV9PUEVOU1NMIE9OKQogICAgc2V0KEhBVkVfTElCQ1JZUFRPIE9OKQogICAgc2V0KEhBVkVfTElCU1NMIE9OKQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvY3J5cHRvLmgiIEhBVkVfT1BFTlNTTF9DUllQVE9fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9lbmdpbmUuaCIgSEFWRV9PUEVOU1NMX0VOR0lORV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2Vyci5oIiAgICBIQVZFX09QRU5TU0xfRVJSX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcGVtLmgiICAgIEhBVkVfT1BFTlNTTF9QRU1fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9wa2NzMTIuaCIgSEFWRV9PUEVOU1NMX1BLQ1MxMl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3JzYS5oIiAgICBIQVZFX09QRU5TU0xfUlNBX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvc3NsLmgiICAgIEhBVkVfT1BFTlNTTF9TU0xfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC94NTA5LmgiICAgSEFWRV9PUEVOU1NMX1g1MDlfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9yYW5kLmgiICAgSEFWRV9PUEVOU1NMX1JBTkRfSCkKICBlbHNlaWYoV0lOMzIpCiAgICBzZXQoQ1VSTF9XSU5ET1dTX1NTUEkgT04pCiAgZW5kaWYoKQplbmRpZigpCgpvcHRpb24oVVNFX05HSFRUUDIgIlVzZSBOZ2h0dHAyIGxpYnJhcnkiIE9GRikKaWYoVVNFX05HSFRUUDIpCiAgZmluZF9wYWNrYWdlKE5HSFRUUDIgUkVRVUlSRUQpCiAgaW5jbHVkZV9kaXJlY3Rvcmllcygke05HSFRUUDJfSU5DTFVERV9ESVJTfSkKICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtOR0hUVFAyX0xJQlJBUklFU30pCmVuZGlmKCkKCmlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUCkKICBpZihXSU4zMikKICAgIG9wdGlvbihVU0VfV0lOMzJfTERBUCAiVXNlIFdpbmRvd3MgTERBUCBpbXBsZW1lbnRhdGlvbiIgT04pCiAgICBpZihVU0VfV0lOMzJfTERBUCkKICAgICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3bGRhcDMyIiBjbGRhcF9vcGVuIEhBVkVfV0xEQVAzMikKICAgICAgaWYoTk9UIEhBVkVfV0xEQVAzMikKICAgICAgICBzZXQoVVNFX1dJTjMyX0xEQVAgT0ZGKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKICBvcHRpb24oQ01BS0VfVVNFX09QRU5MREFQICJVc2UgT3BlbkxEQVAgY29kZS4iIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOTERBUCkKICBzZXQoQ01BS0VfTERBUF9MSUIgImxkYXAiIENBQ0hFIFNUUklORyAiTmFtZSBvciBmdWxsIHBhdGggdG8gbGRhcCBsaWJyYXJ5IikKICBzZXQoQ01BS0VfTEJFUl9MSUIgImxiZXIiIENBQ0hFIFNUUklORyAiTmFtZSBvciBmdWxsIHBhdGggdG8gbGJlciBsaWJyYXJ5IikKCiAgaWYoQ01BS0VfVVNFX09QRU5MREFQIEFORCBVU0VfV0lOMzJfTERBUCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCB1c2UgVVNFX1dJTjMyX0xEQVAgYW5kIENNQUtFX1VTRV9PUEVOTERBUCBhdCB0aGUgc2FtZSB0aW1lIikKICBlbmRpZigpCgogICMgTm93IHRoYXQgd2Uga25vdywgd2UncmUgbm90IHVzaW5nIHdpbmRvd3MgTERBUC4uLgogIGlmKFVTRV9XSU4zMl9MREFQKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2lubGRhcC5oIiBIQVZFX1dJTkxEQVBfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmJlci5oIiAgSEFWRV9XSU5CRVJfSCkKICBlbHNlKCkKICAgICMgQ2hlY2sgZm9yIExEQVAKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MREFQX0xJQn0gbGRhcF9pbml0IEhBVkVfTElCTERBUCkKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgke0NNQUtFX0xCRVJfTElCfSBiZXJfaW5pdCBIQVZFX0xJQkxCRVIpCgogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBSyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTfSkKICAgIHNldChDTUFLRV9MREFQX0lOQ0xVREVfRElSICIiIENBQ0hFIFNUUklORyAiUGF0aCB0byBMREFQIGluY2x1ZGUgZGlyZWN0b3J5IikKICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgICBlbmRpZigpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwLmgiICAgICAgICAgICBIQVZFX0xEQVBfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxiZXIuaCIgICAgICAgICAgIEhBVkVfTEJFUl9IKQoKICAgIGlmKE5PVCBIQVZFX0xEQVBfSCkKICAgICAgbWVzc2FnZShTVEFUVVMgIkxEQVBfSCBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICAgICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBS30pICNMREFQIGluY2x1ZGVzIHdvbid0IGJlIHVzZWQKICAgIGVsc2VpZihOT1QgSEFWRV9MSUJMREFQKQogICAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBsaWJyYXJ5ICcke0NNQUtFX0xEQVBfTElCfScgbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUt9KSAjTERBUCBpbmNsdWRlcyB3b24ndCBiZSB1c2VkCiAgICBlbHNlKCkKICAgICAgaWYoQ01BS0VfVVNFX09QRU5MREFQKQogICAgICAgIHNldChVU0VfT1BFTkxEQVAgT04pCiAgICAgIGVuZGlmKCkKICAgICAgaWYoQ01BS0VfTERBUF9JTkNMVURFX0RJUikKICAgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgICAgIGVuZGlmKCkKICAgICAgc2V0KE5FRURfTEJFUl9IIE9OKQogICAgICBzZXQoX0hFQURFUl9MSVNUKQogICAgICBpZihIQVZFX1dJTkRPV1NfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgIndpbmRvd3MuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9TWVNfVFlQRVNfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgInN5cy90eXBlcy5oIikKICAgICAgZW5kaWYoKQogICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgImxkYXAuaCIpCgogICAgICBzZXQoX1NSQ19TVFJJTkcgIiIpCiAgICAgIGZvcmVhY2goX0hFQURFUiAke19IRUFERVJfTElTVH0pCiAgICAgICAgc2V0KF9JTkNMVURFX1NUUklORyAiJHtfSU5DTFVERV9TVFJJTkd9I2luY2x1ZGUgPCR7X0hFQURFUn0+XG4iKQogICAgICBlbmRmb3JlYWNoKCkKCiAgICAgIHNldChfU1JDX1NUUklORwogICAgICAgICIKICAgICAgICAke19JTkNMVURFX1NUUklOR30KICAgICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQogICAgICAgIHsKICAgICAgICAgIEJlclZhbHVlICpidnAgPSBOVUxMOwogICAgICAgICAgQmVyRWxlbWVudCAqYmVwID0gYmVyX2luaXQoYnZwKTsKICAgICAgICAgIGJlcl9mcmVlKGJlcCwgMSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IgogICAgICApCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURMREFQX0RFUFJFQ0FURUQ9MSIpCiAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xEQVBfTElCfSkKICAgICAgaWYoSEFWRV9MSUJMQkVSKQogICAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xCRVJfTElCfSkKICAgICAgZW5kaWYoKQogICAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiJHtfU1JDX1NUUklOR30iIE5PVF9ORUVEX0xCRVJfSCkKCiAgICAgIGlmKE5PVF9ORUVEX0xCRVJfSCkKICAgICAgICBzZXQoTkVFRF9MQkVSX0ggT0ZGKQogICAgICBlbHNlKCkKICAgICAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1ETkVFRF9MQkVSX0giKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKZW5kaWYoKQoKIyBObyBsZGFwLCBubyBsZGFwcy4KaWYoQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQIG5lZWRzIHRvIGJlIGVuYWJsZWQgdG8gc3VwcG9ydCBMREFQUyIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXBfc3NsLmgiIEhBVkVfTERBUF9TU0xfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwc3NsLmgiICBIQVZFX0xEQVBTU0xfSCkKZW5kaWYoKQoKIyBDaGVjayBmb3IgaWRuCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiaWRuMiIgaWRuMl9sb29rdXBfdWwgSEFWRV9MSUJJRE4yKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgpvcHRpb24oQ1VSTF9aTElCICJTZXQgdG8gT04gdG8gZW5hYmxlIGJ1aWxkaW5nIGN1cmwgd2l0aCB6bGliIHN1cHBvcnQuIiBPTikKc2V0KEhBVkVfTElCWiBPRkYpCnNldChIQVZFX1pMSUJfSCBPRkYpCnNldChIQVZFX1pMSUIgT0ZGKQppZihDVVJMX1pMSUIpCiAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCiAgaWYoWkxJQl9GT1VORCkKICAgIHNldChIQVZFX1pMSUJfSCBPTikKICAgIHNldChIQVZFX1pMSUIgT04pCiAgICBzZXQoSEFWRV9MSUJaIE9OKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7WkxJQl9MSUJSQVJJRVN9KQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJTfSkKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7WkxJQl9JTkNMVURFX0RJUlN9KQogIGVuZGlmKCkKZW5kaWYoKQoKI2xpYlNTSDIKb3B0aW9uKENNQUtFX1VTRV9MSUJTU0gyICJVc2UgbGliU1NIMiIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX0xJQlNTSDIpCnNldChVU0VfTElCU1NIMiBPRkYpCnNldChIQVZFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyX0ggT0ZGKQoKaWYoQ01BS0VfVVNFX0xJQlNTSDIpCiAgZmluZF9wYWNrYWdlKExpYlNTSDIpCiAgaWYoTElCU1NIMl9GT1VORCkKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7TElCU1NIMl9MSUJSQVJZfSkKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7TElCU1NIMl9JTkNMVURFX0RJUn0iKQogICAgc2V0KEhBVkVfTElCU1NIMiBPTikKICAgIHNldChVU0VfTElCU1NIMiBPTikKCiAgICAjIGZpbmRfcGFja2FnZSBoYXMgYWxyZWFkeSBmb3VuZCB0aGUgaGVhZGVycwogICAgc2V0KEhBVkVfTElCU1NIMl9IIE9OKQogICAgc2V0KENVUkxfSU5DTFVERVMgJHtDVVJMX0lOQ0xVREVTfSAiJHtMSUJTU0gyX0lOQ0xVREVfRElSfS9saWJzc2gyLmgiKQogICAgc2V0KENVUkxfVEVTVF9ERUZJTkVTICIke0NVUkxfVEVTVF9ERUZJTkVTfSAtREhBVkVfTElCU1NIMl9IIikKCiAgICAjIG5vdyBjaGVjayBmb3Igc3BlY2lmaWMgbGlic3NoMiBzeW1ib2xzIGFzIHRoZXkgd2VyZSBhZGRlZCBpbiBkaWZmZXJlbnQgdmVyc2lvbnMKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJsaWJzc2gyLmgiKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfdmVyc2lvbiAgICAgICAgICAgSEFWRV9MSUJTU0gyX1ZFUlNJT04pCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9pbml0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfSU5JVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX2V4aXQgICAgICAgICAgICAgIEhBVkVfTElCU1NIMl9FWElUKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2NwX3NlbmQ2NCAgICAgICAgSEFWRV9MSUJTU0gyX1NDUF9TRU5ENjQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9zZXNzaW9uX2hhbmRzaGFrZSBIQVZFX0xJQlNTSDJfU0VTU0lPTl9IQU5EU0hBS0UpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiIikKCiAgZW5kaWYoTElCU1NIMl9GT1VORCkKZW5kaWYoQ01BS0VfVVNFX0xJQlNTSDIpCgpvcHRpb24oQ01BS0VfVVNFX0dTU0FQSSAiVXNlIEdTU0FQSSBpbXBsZW1lbnRhdGlvbiAocmlnaHQgbm93IG9ubHkgSGVpbWRhbCBpcyBzdXBwb3J0ZWQgd2l0aCBDTWFrZSBidWlsZCkiIE9GRikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfR1NTQVBJKQoKaWYoQ01BS0VfVVNFX0dTU0FQSSkKICBmaW5kX3BhY2thZ2UoR1NTKQoKICBzZXQoSEFWRV9HU1NBUEkgJHtHU1NfRk9VTkR9KQogIGlmKEdTU19GT1VORCkKCiAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgJHtHU1NfRkxBVk9VUn0gR1NTQVBJIHZlcnNpb246IFwiJHtHU1NfVkVSU0lPTn1cIiIpCgogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtHU1NfSU5DTFVERV9ESVJFQ1RPUklFU30pCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpLmgiICBIQVZFX0dTU0FQSV9HU1NBUElfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIiBIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCgogICAgaWYoR1NTX0ZMQVZPVVIgU1RSRVFVQUwgIkhlaW1kYWwiKQogICAgICBzZXQoSEFWRV9HU1NIRUlNREFMIE9OKQogICAgZWxzZSgpICMgTUlUCiAgICAgIHNldChIQVZFX0dTU01JVCBPTikKICAgICAgc2V0KF9JTkNMVURFX0xJU1QgIiIpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGkuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIpCiAgICAgIGVuZGlmKCkKCiAgICAgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgX0NPTVBJTEVSX0ZMQUdTX1NUUiAiJHtHU1NfQ09NUElMRVJfRkxBR1N9IikKICAgICAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBfTElOS0VSX0ZMQUdTX1NUUiAiJHtHU1NfTElOS0VSX0ZMQUdTfSIpCgogICAgICBmb3JlYWNoKF9kaXIgJHtHU1NfTElOS19ESVJFQ1RPUklFU30pCiAgICAgICAgc2V0KF9MSU5LRVJfRkxBR1NfU1RSICIke19MSU5LRVJfRkxBR1NfU1RSfSAtTFwiJHtfZGlyfVwiIikKICAgICAgZW5kZm9yZWFjaCgpCgogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7X0NPTVBJTEVSX0ZMQUdTX1NUUn0gJHtfTElOS0VSX0ZMQUdTX1NUUn0iKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7R1NTX0xJQlJBUklFU30pCiAgICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoIkdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIiAke19JTkNMVURFX0xJU1R9IEhBVkVfR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UpCiAgICAgIGlmKE5PVCBIQVZFX0dTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFKQogICAgICAgIHNldChIQVZFX09MRF9HU1NNSVQgT04pCiAgICAgIGVuZGlmKCkKCiAgICBlbmRpZigpCgogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0dTU19JTkNMVURFX0RJUkVDVE9SSUVTfSkKICAgIGxpbmtfZGlyZWN0b3JpZXMoJHtHU1NfTElOS19ESVJFQ1RPUklFU30pCiAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke0dTU19DT01QSUxFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAke0dTU19MSU5LRVJfRkxBR1N9IikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0dTU19MSUJSQVJJRVN9KQoKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiR1NTQVBJIHN1cHBvcnQgaGFzIGJlZW4gcmVxdWVzdGVkIGJ1dCBubyBzdXBwb3J0aW5nIGxpYnJhcmllcyBmb3VuZC4gU2tpcHBpbmcuIikKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfVU5JWF9TT0NLRVRTICJEZWZpbmUgaWYgeW91IHdhbnQgVW5peCBkb21haW4gc29ja2V0cyBzdXBwb3J0IiBPTikKaWYoRU5BQkxFX1VOSVhfU09DS0VUUykKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfdW4iIHN1bl9wYXRoICJzeXMvdW4uaCIgVVNFX1VOSVhfU09DS0VUUykKZWxzZSgpCiAgdW5zZXQoVVNFX1VOSVhfU09DS0VUUyBDQUNIRSkKZW5kaWYoKQoKCiMgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwppZihOT1QgVU5JWCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5kb3dzLmgiICAgICAgSEFWRV9XSU5ET1dTX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jay5oIiAgICAgIEhBVkVfV0lOU09DS19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndzMnRjcGlwLmgiICAgICBIQVZFX1dTMlRDUElQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jazIuaCIgICAgIEhBVkVfV0lOU09DSzJfSCkKICBpZihDVVJMX1dJTkRPV1NfU1NQSSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURTRUNVUklUWV9XSU4zMiIpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc3BpLmgiICAgICAgIEhBVkVfU1NQSV9IKQogICAgaWYoSEFWRV9TU1BJX0gpCiAgICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNjaGFubmVsLmgiIEhBVkVfU0NIQU5ORUxfSCkKICAgICAgc2V0KFVTRV9XSU5ET1dTX1NTUEkgT04pCiAgICAgIGlmKEhBVkVfU0NIQU5ORUxfSCkKICAgICAgICBzZXQoVVNFX1NDSEFOTkVMIE9OKQogICAgICAgIHNldChTU0xfRU5BQkxFRCBPTikKICAgICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAiY3J5cHQzMiIpCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKE5PVCBVTklYKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuMi5oIiAgICAgICAgICAgSEFWRV9JRE4yX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlmYWRkcnMuaCIgICAgICAgIEhBVkVfSUZBRERSU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpby5oIiAgICAgICAgICAgICBIQVZFX0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImtyYi5oIiAgICAgICAgICAgIEhBVkVfS1JCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxpYmdlbi5oIiAgICAgICAgIEhBVkVfTElCR0VOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxpbWl0cy5oIiAgICAgICAgIEhBVkVfTElNSVRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxvY2FsZS5oIiAgICAgICAgIEhBVkVfTE9DQUxFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldC9pZi5oIiAgICAgICAgIEhBVkVfTkVUX0lGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGRiLmgiICAgICAgICAgIEhBVkVfTkVUREJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC9pbi5oIiAgICAgSEFWRV9ORVRJTkVUX0lOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvdGNwLmgiICAgIEhBVkVfTkVUSU5FVF9UQ1BfSCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBlbS5oIiAgICAgICAgICAgIEhBVkVfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBvbGwuaCIgICAgICAgICAgIEhBVkVfUE9MTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwd2QuaCIgICAgICAgICAgICBIQVZFX1BXRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJyc2EuaCIgICAgICAgICAgICBIQVZFX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZXRqbXAuaCIgICAgICAgICBIQVZFX1NFVEpNUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZ3R0eS5oIiAgICAgICAgICBIQVZFX1NHVFRZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNpZ25hbC5oIiAgICAgICAgIEhBVkVfU0lHTkFMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNzbC5oIiAgICAgICAgICAgIEhBVkVfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGJvb2wuaCIgICAgICAgIEhBVkVfU1REQk9PTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgICBIQVZFX1NURElOVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RETElCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZy5oIiAgICAgICAgIEhBVkVfU1RSSU5HX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZ3MuaCIgICAgICAgIEhBVkVfU1RSSU5HU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJvcHRzLmgiICAgICAgICBIQVZFX1NUUk9QVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvLmgiICAgICAgICAgSEFWRV9URVJNSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvcy5oIiAgICAgICAgSEFWRV9URVJNSU9TX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRpbWUuaCIgICAgICAgICAgIEhBVkVfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1bmlzdGQuaCIgICAgICAgICBIQVZFX1VOSVNURF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1dGltZS5oIiAgICAgICAgICBIQVZFX1VUSU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIng1MDkuaCIgICAgICAgICAgIEhBVkVfWDUwOV9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHJvY2Vzcy5oIiAgICAgICAgSEFWRV9QUk9DRVNTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGRlZi5oIiAgICAgICAgIEhBVkVfU1REREVGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImRsZmNuLmgiICAgICAgICAgIEhBVkVfRExGQ05fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWFsbG9jLmgiICAgICAgICAgSEFWRV9NQUxMT0NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWVtb3J5LmgiICAgICAgICAgSEFWRV9NRU1PUllfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC9pZl9ldGhlci5oIiBIQVZFX05FVElORVRfSUZfRVRIRVJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW50LmgiICAgICAgICBIQVZFX1NURElOVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzb2NraW8uaCIgICAgICAgIEhBVkVfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91dHNuYW1lLmgiICAgSEFWRV9TWVNfVVRTTkFNRV9IKQoKY2hlY2tfdHlwZV9zaXplKHNpemVfdCAgU0laRU9GX1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKHNzaXplX3QgIFNJWkVPRl9TU0laRV9UKQpjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgIFNJWkVPRl9MT05HX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyIgIFNJWkVPRl9MT05HKQpjaGVja190eXBlX3NpemUoInNob3J0IiAgU0laRU9GX1NIT1JUKQpjaGVja190eXBlX3NpemUoImludCIgIFNJWkVPRl9JTlQpCmNoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgIFNJWkVPRl9fX0lOVDY0KQpjaGVja190eXBlX3NpemUoImxvbmcgZG91YmxlIiAgU0laRU9GX0xPTkdfRE9VQkxFKQpjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCmlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQogIGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBsb25nKQogIGVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBfX2ludDY0KQogIGVuZGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQplbmRpZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKIyBvZmZfdCBpcyBzaXplZCBsYXRlciwgYWZ0ZXIgdGhlIEhBVkVfRklMRV9PRkZTRVRfQklUUyB0ZXN0CgojIERpZmZlcmVudCBzaXplb2ZzLCBldGMuCgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9MT05HICAgICAgICA0CiMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgIGxvbmcgbG9uZwojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAibGxkIgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAgICAgICAiJWxsZCIKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAgOAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICBMTAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKCnNldChDVVJMX1NJWkVPRl9MT05HICR7U0laRU9GX0xPTkd9KQoKaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwpCmVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCgppZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgImxvbmcgbG9uZyIpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMKQplbmRpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCgppZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAke3NzaXplX3R9KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UICR7U0laRU9GX1NTSVpFX1R9KQogICMgVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQoKaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogIHNldChIQVZFX0xPTkdMT05HIDEpCiAgc2V0KEhBVkVfTEwgMSkKZW5kaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQoKZmluZF9maWxlKFJBTkRPTV9GSUxFIHVyYW5kb20gL2RldikKbWFya19hc19hZHZhbmNlZChSQU5ET01fRklMRSkKCiMgQ2hlY2sgZm9yIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQKaWYoSEFWRV9MSUJXUzJfMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyB3czJfMzIpCmVsc2VpZihIQVZFX0xJQlNPQ0tFVCkKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHNvY2tldCkKZW5kaWYoKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhiYXNlbmFtZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0JBU0VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHNvY2tldCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0YWRkcmluZm8gICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCiMgc2lnYWN0aW9uIGFuZCBzaWdzZXRqbXAgYXJlIHNwZWNpYWwuIFVzZSBzcGVjaWFsIG1lY2hhbmlzbSBmb3IKIyBkZXRlY3RpbmcgdGhvc2UsIGJ1dCBvbmx5IGlmIHByZXZpb3VzIGF0dGVtcHQgZmFpbGVkLgppZihIQVZFX1NJR05BTF9IKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnYWN0aW9uICJzaWduYWwuaCIgSEFWRV9TSUdBQ1RJT04pCmVuZGlmKEhBVkVfU0lHTkFMX0gpCgppZihOT1QgSEFWRV9TSUdTRVRKTVApCiAgaWYoSEFWRV9TRVRKTVBfSCkKICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICJzZXRqbXAuaCIgSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICBpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgICAgc2V0KEhBVkVfU0lHU0VUSk1QIDEpCiAgICBlbmRpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICBlbmRpZihIQVZFX1NFVEpNUF9IKQplbmRpZihOT1QgSEFWRV9TSUdTRVRKTVApCgojIElmIHRoZXJlIGlzIG5vIHN0cmljbXAoKSwgZG8gbm90IGFsbG93IExEQVAgdG8gcGFyc2UgVVJMcwppZihOT1QgSEFWRV9TVFJJQ01QKQogIHNldChIQVZFX0xEQVBfVVJMX1BBUlNFIDEpCmVuZGlmKE5PVCBIQVZFX1NUUklDTVApCgojIERvIGN1cmwgc3BlY2lmaWMgdGVzdHMKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfRkNOVExfT19OT05CTE9DSwogICAgSEFWRV9JT0NUTFNPQ0tFVAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMU09DS0VUX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfRklPTkJJTwogICAgSEFWRV9JT0NUTF9TSU9DR0lGQUREUgogICAgSEFWRV9TRVRTT0NLT1BUX1NPX05PTkJMT0NLCiAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECiAgICBUSU1FX1dJVEhfU1lTX1RJTUUKICAgIEhBVkVfT19OT05CTE9DSwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzdfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82X1JFRU5UUkFOVAogICAgSEFWRV9TT0NLTEVOX1QKICAgIEhBVkVfSU5fQUREUl9UCiAgICBIQVZFX0JPT0xfVAogICAgU1REQ19IRUFERVJTCiAgICBSRVRTSUdUWVBFX1RFU1QKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVAogICAgSEFWRV9HRVRBRERSSU5GTwogICAgSEFWRV9GSUxFX09GRlNFVF9CSVRTCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0KCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgppZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCiAgc2V0KF9GSUxFX09GRlNFVF9CSVRTIDY0KQogIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCmVuZGlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKY2hlY2tfdHlwZV9zaXplKCJvZmZfdCIgIFNJWkVPRl9PRkZfVCkKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQoKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0xJQkNfU1RSRVJST1JfUgogICAgSEFWRV9QT1NJWF9TVFJFUlJPUl9SCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0X3J1bigke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKIyBDaGVjayBmb3IgcmVlbnRyYW50CmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIGlmKE5PVCAke0NVUkxfVEVTVH0pCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kaWYoTk9UICR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgppZihORUVEX1JFRU5UUkFOVCkKICBmb3JlYWNoKENVUkxfVEVTVAogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNikKICAgIHNldCgke0NVUkxfVEVTVH0gMCkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kZm9yZWFjaChDVVJMX1RFU1QpCmVuZGlmKE5FRURfUkVFTlRSQU5UKQoKaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBzZXQoSEFWRV9JTkVUX05UT0FfUl9ERUNMIDEpCiAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCmVuZGlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCgojIFNvbWUgb3RoZXIgbWlub3IgdGVzdHMKCmlmKE5PVCBIQVZFX0lOX0FERFJfVCkKICBzZXQoaW5fYWRkcl90ICJ1bnNpZ25lZCBsb25nIikKZW5kaWYoTk9UIEhBVkVfSU5fQUREUl9UKQoKIyBGaXggbGlieiAvIHpsaWIuaAoKaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQogIGlmKE5PVCBIQVZFX0xJQlopCiAgICBzZXQoSEFWRV9aTElCX0ggMCkKICBlbmRpZihOT1QgSEFWRV9MSUJaKQoKICBpZihOT1QgSEFWRV9aTElCX0gpCiAgICBzZXQoSEFWRV9MSUJaIDApCiAgZW5kaWYoTk9UIEhBVkVfWkxJQl9IKQplbmRpZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgojIENoZWNrIGZvciBub25ibG9ja2luZwpzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORyAxKQppZihIQVZFX0ZJT05CSU8gT1IKICAgIEhBVkVfSU9DVExTT0NLRVQgT1IKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogICAgSEFWRV9PX05PTkJMT0NLKQogIHNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HKQplbmRpZihIQVZFX0ZJT05CSU8gT1IKICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgSEFWRV9PX05PTkJMT0NLKQoKaWYoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIHZvaWQpCmVsc2UoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIGludCkKZW5kaWYoUkVUU0lHVFlQRV9URVNUKQoKaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQogIGluY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQogIGNoZWNrX2NfY29tcGlsZXJfZmxhZygtV25vLWxvbmctZG91YmxlIEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICBpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgICAjIFRoZSBNYWMgdmVyc2lvbiBvZiBHQ0Mgd2FybnMgYWJvdXQgdXNlIG9mIGxvbmcgZG91YmxlLiAgRGlzYWJsZSBpdC4KICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eShNUFJJTlRGX0NPTVBJTEVfRkxBR1MgbXByaW50Zi5jIENPTVBJTEVfRkxBR1MpCiAgICBpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIiR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSAtV25vLWxvbmctZG91YmxlIikKICAgIGVsc2UoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICItV25vLWxvbmctZG91YmxlIikKICAgIGVuZGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhtcHJpbnRmLmMgUFJPUEVSVElFUwogICAgICBDT01QSUxFX0ZMQUdTICR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSkKICBlbmRpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCmVuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKCmlmKEhBVkVfU09DS0xFTl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCAic29ja2xlbl90IikKICBpZihXSU4zMikKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJ3aW5zb2NrMi5oO3dzMnRjcGlwLmgiKQogIGVsc2VpZihIQVZFX1NZU19TT0NLRVRfSCkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQogIGVuZGlmKCkKICBjaGVja190eXBlX3NpemUoInNvY2tsZW5fdCIgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCiAgaWYoTk9UIEhBVkVfQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCiAgICAgIkNoZWNrIGZvciBzaXplb2Ygc29ja2xlbl90IGZhaWxlZCwgc2VlIENNYWtlRmlsZXMvQ01ha2Vycm9yLmxvZyIpCiAgZW5kaWYoKQplbHNlKCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCAke1NJWkVPRl9JTlR9KQplbmRpZigpCgojIFRPRE8gdGVzdCB3aGljaCBvZiB0aGVzZSBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgdGhlIHR5cGVkZWZzIHVzZWQgaW4gY3VybGJ1aWxkLmgKaWYoV0lOMzIpCiAgc2V0KENVUkxfUFVMTF9XUzJUQ1BJUF9IICR7SEFWRV9XUzJUQ1BJUF9IfSkKZWxzZSgpCiAgc2V0KENVUkxfUFVMTF9TWVNfVFlQRVNfSCAke0hBVkVfU1lTX1RZUEVTX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1NPQ0tFVF9IICR7SEFWRV9TWVNfU09DS0VUX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1BPTExfSCAke0hBVkVfU1lTX1BPTExfSH0pCmVuZGlmKCkKc2V0KENVUkxfUFVMTF9TVERJTlRfSCAke0hBVkVfU1RESU5UX0h9KQpzZXQoQ1VSTF9QVUxMX0lOVFRZUEVTX0ggJHtIQVZFX0lOVFRZUEVTX0h9KQoKaW5jbHVkZShDTWFrZS9PdGhlclRlc3RzLmNtYWtlKQoKYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKCiMgRm9yIHdpbmRvd3MsIGRvIG5vdCBhbGxvdyB0aGUgY29tcGlsZXIgdG8gdXNlIGRlZmF1bHQgdGFyZ2V0IChWaXN0YSkuCmlmKFdJTjMyKQogIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCmVuZGlmKFdJTjMyKQoKIyBGb3Igd2luZG93cywgYWxsIGNvbXBpbGVycyB1c2VkIGJ5IGNtYWtlIHNob3VsZCBzdXBwb3J0IGxhcmdlIGZpbGVzCmlmKFdJTjMyKQogIHNldChVU0VfV0lOMzJfTEFSR0VfRklMRVMgT04pCmVuZGlmKFdJTjMyKQoKaWYoTVNWQykKICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQplbmRpZihNU1ZDKQoKIyBVZ2x5IChidXQgZnVuY3Rpb25hbCkgd2F5IHRvIGluY2x1ZGUgIk1ha2VmaWxlLmluYyIgYnkgdHJhbnNmb3JtaW5nIGl0ICg9IHJlZ2VuZXJhdGUgaXQpLgpmdW5jdGlvbihUUkFOU0ZPUk1fTUFLRUZJTEVfSU5DIElOUFVUX0ZJTEUgT1VUUFVUX0ZJTEUpCiAgZmlsZShSRUFEICR7SU5QVVRfRklMRX0gTUFLRUZJTEVfSU5DX1RFWFQpCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX3NyY2RpcikiICAgIlwke0NVUkxfU09VUkNFX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9idWlsZGRpcikiICJcJHtDVVJMX0JJTkFSWV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcXFxcbiIgIqchpyIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbYS16QS1aX11bYS16QS1aMC05X10qKVtcdCBdKj1bXHQgXSooW15cbl0qKSIgIlNFVChcXDEgXFwyKSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIqchpyIgIlxuIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcJFxcKChbYS16QS1aX11bYS16QS1aMC05X10qKVxcKSIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgJCgpIHdpdGggJHt9CiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkAoW2EtekEtWl9dW2EtekEtWjAtOV9dKilAIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSBAQCB3aXRoICR7fSwgZXZlbiBpZiB0aGF0IG1heSBub3QgYmUgcmVhZCBieSBDTWFrZSBzY3JpcHRzLgogIGZpbGUoV1JJVEUgJHtPVVRQVVRfRklMRX0gJHtNQUtFRklMRV9JTkNfVEVYVH0pCgplbmRmdW5jdGlvbigpCgphZGRfc3ViZGlyZWN0b3J5KGxpYikKaWYoQlVJTERfQ1VSTF9FWEUpCiAgYWRkX3N1YmRpcmVjdG9yeShzcmMpCmVuZGlmKCkKCmluY2x1ZGUoQ1Rlc3QpCmlmKEJVSUxEX1RFU1RJTkcpCiAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0cykKZW5kaWYoKQoKIyBUT0RPIHN1cHBvcnQgR05VVExTLCBOU1MsIFBPTEFSU1NMLCBBWFRMUywgQ1lBU1NMLCBXSU5TU0wsIERBUldJTlNTTAppZihVU0VfT1BFTlNTTCkKICBzZXQoU1NMX0VOQUJMRUQgMSkKZW5kaWYoKQoKIyBIZWxwZXIgdG8gcG9wdWxhdGUgYSBsaXN0IChfaXRlbXMpIHdpdGggYSBsYWJlbCB3aGVuIGNvbmRpdGlvbnMgKHRoZSByZW1haW5pbmcKIyBhcmdzKSBhcmUgc2F0aXNmaWVkCmZ1bmN0aW9uKF9hZGRfaWYgbGFiZWwpCiAgIyBUT0RPIG5lZWQgdG8gZGlzYWJsZSBwb2xpY3kgQ01QMDA1NCAoQ01ha2UgMy4xKSB0byBhbGxvdyB0aGlzIGluZGlyZWN0aW9uCiAgaWYoJHtBUkdOfSkKICAgIHNldChfaXRlbXMgJHtfaXRlbXN9ICIke2xhYmVsfSIgUEFSRU5UX1NDT1BFKQogIGVuZGlmKCkKZW5kZnVuY3Rpb24oKQoKIyBDbGVhciBsaXN0IGFuZCB0cnkgdG8gZGV0ZWN0IGF2YWlsYWJsZSBmZWF0dXJlcwpzZXQoX2l0ZW1zKQpfYWRkX2lmKCJXaW5TU0wiICAgICAgICBTU0xfRU5BQkxFRCBBTkQgVVNFX1dJTkRPV1NfU1NQSSkKX2FkZF9pZigiT3BlblNTTCIgICAgICAgU1NMX0VOQUJMRUQgQU5EIFVTRV9PUEVOU1NMKQpfYWRkX2lmKCJJUHY2IiAgICAgICAgICBFTkFCTEVfSVBWNikKX2FkZF9pZigidW5peC1zb2NrZXRzIiAgVVNFX1VOSVhfU09DS0VUUykKX2FkZF9pZigibGlieiIgICAgICAgICAgSEFWRV9MSUJaKQpfYWRkX2lmKCJBc3luY2hETlMiICAgICBVU0VfQVJFUyBPUiBVU0VfVEhSRUFEU19QT1NJWCBPUiBVU0VfVEhSRUFEU19XSU4zMikKX2FkZF9pZigiSUROIiAgICAgICAgICAgSEFWRV9MSUJJRE4yKQpfYWRkX2lmKCJMYXJnZWZpbGUiICAgICAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBHUkVBVEVSIDQpIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkVPRl9PRkZfVCBHUkVBVEVSIDQpIE9SIFVTRV9XSU4zMl9MQVJHRV9GSUxFUykpCiMgVE9ETyBTU1AxIChXaW5TU0wpIGNoZWNrIGlzIG1pc3NpbmcKX2FkZF9pZigiU1NQSSIgICAgICAgICAgVVNFX1dJTkRPV1NfU1NQSSkKX2FkZF9pZigiR1NTLUFQSSIgICAgICAgSEFWRV9HU1NBUEkpCiMgVE9ETyBTU1AxIG1pc3NpbmcgZm9yIFNQTkVHTwpfYWRkX2lmKCJTUE5FR08iICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoSEFWRV9HU1NBUEkgT1IgVVNFX1dJTkRPV1NfU1NQSSkpCl9hZGRfaWYoIktlcmJlcm9zIiAgICAgIE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5ECiAgICAgICAgICAgICAgICAgICAgICAgIChIQVZFX0dTU0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKIyBOVExNIHN1cHBvcnQgcmVxdWlyZXMgY3J5cHRvIGZ1bmN0aW9uIGFkYXB0aW9ucyBmcm9tIHZhcmlvdXMgU1NMIGxpYnMKIyBUT0RPIGFsdGVybmF0aXZlIFNTTCBsaWJzIHRlc3RzIGZvciBTU1AxLCBHTlVUTFMsIE5TUywgREFSV0lOU1NMCmlmKE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5EIChVU0VfT1BFTlNTTCBPUgogICBVU0VfV0lORE9XU19TU1BJIE9SIEdOVVRMU19FTkFCTEVEIE9SIE5TU19FTkFCTEVEIE9SIERBUldJTlNTTF9FTkFCTEVEKSkKICBfYWRkX2lmKCJOVExNIiAgICAgICAgMSkKICAjIFRPRE8gbWlzc2luZyBvcHRpb24gKGF1dG9jb25mOiAtLWVuYWJsZS1udGxtLXdiKQogIF9hZGRfaWYoIk5UTE1fV0IiICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIE5UTE1fV0JfRU5BQkxFRCkKZW5kaWYoKQojIFRPRE8gbWlzc2luZyBvcHRpb24gKC0tZW5hYmxlLXRscy1zcnApLCBkZXBlbmRzIG9uIEdOVVRMU19TUlAvT1BFTlNTTF9TUlAKX2FkZF9pZigiVExTLVNSUCIgICAgICAgVVNFX1RMU19TUlApCiMgVE9ETyBvcHRpb24gLS13aXRoLW5naHR0cDIgdGVzdHMgZm9yIG5naHR0cDIgbGliIGFuZCBuZ2h0dHAyL25naHR0cDIuaCBoZWFkZXIKX2FkZF9pZigiSFRUUDIiICAgICAgICAgVVNFX05HSFRUUDIpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9GRUFUVVJFUyAiJHtfaXRlbXN9IikKbWVzc2FnZShTVEFUVVMgIkVuYWJsZWQgZmVhdHVyZXM6ICR7U1VQUE9SVF9GRUFUVVJFU30iKQoKIyBDbGVhciBsaXN0IGFuZCB0cnkgdG8gZGV0ZWN0IGF2YWlsYWJsZSBwcm90b2NvbHMKc2V0KF9pdGVtcykKX2FkZF9pZigiSFRUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQKQpfYWRkX2lmKCJIVFRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGVFAiICAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCkKX2FkZF9pZigiRlRQUyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGSUxFIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZJTEUpCl9hZGRfaWYoIlRFTE5FVCIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfVEVMTkVUKQpfYWRkX2lmKCJMREFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiMgQ1VSTF9ESVNBQkxFX0xEQVAgaW1wbGllcyBDVVJMX0RJU0FCTEVfTERBUFMKIyBUT0RPIGNoZWNrIEhBVkVfTERBUF9TU0wgKGluIGF1dG9jb25mIHRoaXMgaXMgZW5hYmxlZCB3aXRoIC0tZW5hYmxlLWxkYXBzKQpfYWRkX2lmKCJMREFQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFVTRV9PUEVOTERBUCBBTkQgU1NMX0VOQUJMRUQpIE9SCiAgICAgICAgICAgICAgICAgICAgICAgIChOT1QgVVNFX09QRU5MREFQIEFORCBIQVZFX0xEQVBfU1NMKSkpCl9hZGRfaWYoIkRJQ1QiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRElDVCkKX2FkZF9pZigiVEZUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URlRQKQpfYWRkX2lmKCJHT1BIRVIiICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0dPUEhFUikKX2FkZF9pZigiUE9QMyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9QT1AzKQpfYWRkX2lmKCJQT1AzUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJTUFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0lNQVApCl9hZGRfaWYoIklNQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIlNNVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfU01UUCkKX2FkZF9pZigiU01UUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU0NQIiAgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlNGVFAiICAgICAgICAgIFVTRV9MSUJTU0gyKQpfYWRkX2lmKCJSVFNQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1JUU1ApCl9hZGRfaWYoIlJUTVAiICAgICAgICAgIFVTRV9MSUJSVE1QKQpsaXN0KFNPUlQgX2l0ZW1zKQpzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIFNVUFBPUlRfUFJPVE9DT0xTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBwcm90b2NvbHM6ICR7U1VQUE9SVF9QUk9UT0NPTFN9IikKCiMgY3VybC1jb25maWcgbmVlZHMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGJlIHNldC4Kc2V0KENDICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NfQ09NUElMRVJ9IikKIyBUT0RPIHByb2JhYmx5IHB1dCBhIC1ELi4uIG9wdGlvbnMgaGVyZT8Kc2V0KENPTkZJR1VSRV9PUFRJT05TICAgICAgICIiKQojIFRPRE8gd2hlbiB0byBzZXQgIi1EQ1VSTF9TVEFUSUNMSUIiIGZvciBDUFBGTEFHX0NVUkxfU1RBVElDTElCPwpzZXQoQ1BQRkxBR19DVVJMX1NUQVRJQ0xJQiAgIiIpCiMgVE9ETyBuZWVkIHRvIHNldCB0aGlzIChzZWUgQ1VSTF9DSEVDS19DQV9CVU5ETEUgaW4gYWNpbmNsdWRlLm00KQpzZXQoQ1VSTF9DQV9CVU5ETEUgICAgICAgICAgIiIpCnNldChDVVJMVkVSU0lPTiAgICAgICAgICAgICAiJHtDVVJMX1ZFUlNJT059IikKc2V0KEVOQUJMRV9TSEFSRUQgICAgICAgICAgICJ5ZXMiKQppZihDVVJMX1NUQVRJQ0xJQikKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJ5ZXMiKQplbHNlKCkKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJubyIpCmVuZGlmKCkKc2V0KGV4ZWNfcHJlZml4ICAgICAgICAgICAgICJcJHtwcmVmaXh9IikKc2V0KGluY2x1ZGVkaXIgICAgICAgICAgICAgICJcJHtwcmVmaXh9L2luY2x1ZGUiKQpzZXQoTERGTEFHUyAgICAgICAgICAgICAgICAgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30iKQpzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICAgIiIpCnNldChsaWJkaXIgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKZm9yZWFjaChfbGliICR7Q01BS0VfQ19JTVBMSUNJVF9MSU5LX0xJQlJBUklFU30gJHtDVVJMX0xJQlN9KQogIGlmKF9saWIgTUFUQ0hFUyAiLiovLioiKQogICAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9ICR7X2xpYn0iKQogIGVsc2UoKQogICAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9IC1sJHtfbGlifSIpCiAgZW5kaWYoKQplbmRmb3JlYWNoKCkKIyAiYSIgKExpbnV4KSBvciAibGliIiAoV2luZG93cykKc3RyaW5nKFJFUExBQ0UgIi4iICIiIGxpYmV4dCAiJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9IikKc2V0KHByZWZpeCAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCiMgU2V0IHRoaXMgdG8gInllcyIgdG8gYXBwZW5kIGFsbCBsaWJyYXJpZXMgb24gd2hpY2ggLWxjdXJsIGlzIGRlcGVuZGVudApzZXQoUkVRVUlSRV9MSUJfREVQUyAgICAgICAgIm5vIikKIyBTVVBQT1JUX0ZFQVRVUkVTCiMgU1VQUE9SVF9QUk9UT0NPTFMKc2V0KFZFUlNJT05OVU0gICAgICAgICAgICAgICIke0NVUkxfVkVSU0lPTl9OVU19IikKCiMgRmluYWxseSBnZW5lcmF0ZSBhICJjdXJsLWNvbmZpZyIgbWF0Y2hpbmcgdGhpcyBjb25maWcKY29uZmlndXJlX2ZpbGUoIiR7Q1VSTF9TT1VSQ0VfRElSfS9jdXJsLWNvbmZpZy5pbiIKICAgICAgICAgICAgICAgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIKICAgICAgICBERVNUSU5BVElPTiBiaW4KICAgICAgICBQRVJNSVNTSU9OUwogICAgICAgICAgT1dORVJfUkVBRCBPV05FUl9XUklURSBPV05FUl9FWEVDVVRFCiAgICAgICAgICBHUk9VUF9SRUFEIEdST1VQX0VYRUNVVEUKICAgICAgICAgIFdPUkxEX1JFQUQgV09STERfRVhFQ1VURSkKCiMgRmluYWxseSBnZW5lcmF0ZSBhIHBrZy1jb25maWcgZmlsZSBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2xpYmN1cmwucGMuaW4iCiAgICAgICAgICAgICAgICIke0NVUkxfQklOQVJZX0RJUn0vbGliY3VybC5wYyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9saWJjdXJsLnBjIgogICAgICAgIERFU1RJTkFUSU9OIGxpYi9wa2djb25maWcpCgojIFRoaXMgbmVlZHMgdG8gYmUgcnVuIHZlcnkgbGFzdCBzbyBvdGhlciBwYXJ0cyBvZiB0aGUgc2NyaXB0cyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KaWYoTk9UIENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUpCiAgc2V0KENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUgMSBDQUNIRSBJTlRFUk5BTCAiRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgcnVubmluZyBDTWFrZSBvciBpZiBDTWFrZSBoYXMgYmVlbiBjb25maWd1cmVkIGJlZm9yZSIpCmVuZGlmKCkKCiMgSW5zdGFsbGF0aW9uLgojIEZpcnN0LCBpbnN0YWxsIGdlbmVyYXRlZCBjdXJsYnVpbGQuaAppbnN0YWxsKEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIgogICAgREVTVElOQVRJT04gaW5jbHVkZS9jdXJsICkKIyBOZXh0LCBpbnN0YWxsIG90aGVyIGhlYWRlcnMgZXhjbHVkaW5nIGN1cmxidWlsZC5oCmluc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsIgogICAgREVTVElOQVRJT04gaW5jbHVkZQogICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIgogICAgUEFUVEVSTiAiY3VybGJ1aWxkLmgiIEVYQ0xVREUpCgoKIyBXb3JrYXJvdW5kIGZvciBNU1ZTMTAgdG8gYXZvaWQgdGhlIERpYWxvZyBIZWxsCiMgRklYTUU6IFRoaXMgY291bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSB2ZXJzaW9uIG9mIENNYWtlLgppZihNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCkKICBzZXQoQ1VSTF9TTE5fRklMRU5BTUUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9DVVJMLnNsbiIpCiAgaWYoRVhJU1RTICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIpCiAgICBmaWxlKEFQUEVORCAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iICJcbiMgVGhpcyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQhXG4iKQogIGVuZGlmKCkKZW5kaWYoKQo=