JyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCicgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQonIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCicgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCicgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCicgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCicNCicgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KJw0KJyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQonIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQonIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KJyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQonIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KDQpTZXQgb2JqU2hlbGwgPSBDcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKQ0KDQpXU2NyaXB0LkVjaG8gKFdTY3JpcHQuU2NyaXB0TmFtZSAmICIgYmVnaW5uaW5nIHRvIHJ1bjogIiAmIERhdGUgJiAiICIgJiBUaW1lKQ0KDQpzdHJTeXN0ZW0zMj0iJVN5c3RlbVJvb3QlXHN5c3RlbTMyIg0KDQonIEdldCB0aGUgV2luZG93cyB2ZXJzaW9uDQonIFRoaXMgYWxsb3dzIHRoZSBzYW1lIHNjcmlwdCB0byBiZSB1c2VkIGZvciBkaWZmZXJlbnQgdmVyc2lvbnMNCicgU29tZSBjb21tYW5kcyBzdWNoIGFzIHNldHRpbmcgdGhlIGZpcmV3YWxsIGRpZmZlciBiZXR3ZWVuIHZlcnNpb25zDQpTZXQgb2JqV01JU2VydmljZSA9IEdldE9iamVjdCgid2lubWdtdHM6XFwuXHJvb3RcQ0lNVjIiKQ0KU2V0IGNvbEl0ZW1zID0gb2JqV01JU2VydmljZS5FeGVjUXVlcnkoIlNFTEVDVCBWZXJzaW9uIEZST00gV2luMzJfT3BlcmF0aW5nU3lzdGVtIikNCkZvciBFYWNoIG9iakl0ZW0gSW4gY29sSXRlbXMNCglzdHJXaW5kb3dzVmVyc2lvbiA9IG9iakl0ZW0uVmVyc2lvbg0KTmV4dA0KV1NjcmlwdC5FY2hvICJXaW5kb3dzIFZlcnNpb246ICIgJiBzdHJXaW5kb3dzVmVyc2lvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcmludCB0aGUgcm91dGluZyB0YWJsZSBiZWZvcmUgbWFraW5nIGFueSBjaGFuZ2VzDQonIFRoaXMgaXMgZG9uZSBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzDQpDTURfUk9VVEVfUFJJTlQ9c3RyU3lzdGVtMzIgJiAiXHJvdXRlLmV4ZSBwcmludCINClJ1bkNvbW1hbmQgQ01EX1JPVVRFX1BSSU5ULCAiUHJpbnRpbmcgcm91dGluZyB0YWJsZSINCg0KJyBSZW5ldyB0aGUgREhDUCBsZWFzZSB0byBtYWtlIHN1cmUgbm90IHRvIHJldHJpZXZlIG9sZCBpbmZvcm1hdGlvbg0KQ01EX0lQQ09ORklHX0FMTD1zdHJTeXN0ZW0zMiAmICJcaXBjb25maWcuZXhlIC9hbGwiDQpDTURfSVBDT05GSUdfUkVMRUFTRT1zdHJTeXN0ZW0zMiAmICJcaXBjb25maWcuZXhlIC9yZWxlYXNlIg0KQ01EX0lQQ09ORklHX1JFTkVXPXN0clN5c3RlbTMyICYgIlxpcGNvbmZpZy5leGUgL3JlbmV3Ig0KDQonUnVuQ29tbWFuZCBDTURfSVBDT05GSUdfUkVMRUFTRSwgIlJlbGVhc2luZyBESENQIGxlYXNlIg0KJ1J1bkNvbW1hbmQgQ01EX0lQQ09ORklHX1JFTkVXLCAiUmVuZXdpbmcgREhDUCBsZWFzZSINClJ1bkNvbW1hbmQgQ01EX0lQQ09ORklHX0FMTCwgIlJ1bm5pbmcgaXBjb25maWcgL2FsbCINCg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBHZXQgdGhlIG5ldHdvcmtpbmcgY29uZmlndXJhdGlvbg0KRGltIFBSSVZBVEVfTkFNRSwgUFJJVkFURV9JUCwgUFJJVkFURV9TVUJORVRfTUFTSywgUFJJVkFURV9HQVRFV0FZDQpEaW0gUFVCTElDX05BTUUsIFBVQkxJQ19JUCwgUFVCTElDX1NVQk5FVF9NQVNLLCBQVUJMSUNfR0FURVdBWQ0KZ2V0X25ldHdvcmtfY29uZmlndXJhdGlvbg0KDQpwcmludF9ocg0KDQpXU2NyaXB0LkVjaG8gIlBSSVZBVEVfTkFNRSAgICAgICAgICA9ICIgJiBQUklWQVRFX05BTUUNCldTY3JpcHQuRWNobyAiUFJJVkFURV9JUCAgICAgICAgICAgID0gIiAmIFBSSVZBVEVfSVANCldTY3JpcHQuRWNobyAiUFJJVkFURV9TVUJORVRfTUFTSyAgID0gIiAmIFBSSVZBVEVfU1VCTkVUX01BU0sNCldTY3JpcHQuRWNobyAiUFJJVkFURV9HQVRFV0FZICAgICAgID0gIiAmIFBSSVZBVEVfR0FURVdBWQ0KV1NjcmlwdC5FY2hvDQpXU2NyaXB0LkVjaG8gIlBVQkxJQ19OQU1FICAgICAgICAgICA9ICIgJiBQVUJMSUNfTkFNRQ0KV1NjcmlwdC5FY2hvICJQVUJMSUNfSVAgICAgICAgICAgICAgPSAiICYgUFVCTElDX0lQDQpXU2NyaXB0LkVjaG8gIlBVQkxJQ19TVUJORVRfTUFTSyAgICA9ICIgJiBQVUJMSUNfU1VCTkVUX01BU0sNCldTY3JpcHQuRWNobyAiUFVCTElDX0dBVEVXQVkgICAgICAgID0gIiAmIFBVQkxJQ19HQVRFV0FZDQpXU2NyaXB0LkVjaG8NCg0KJyBDaGVjayBpZiBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIHdhcyBmb3VuZA0KSWYgKExlbihQUklWQVRFX05BTUUpID4gMCkgQW5kIChMZW4oUFJJVkFURV9JUCkgPiAwKSBfDQogICBBbmQgKExlbihQVUJMSUNfTkFNRSkgPiAwKSBBbmQgKExlbihQVUJMSUNfSVApID4gMCkgQW5kIChMZW4oUFVCTElDX0dBVEVXQVkpID4gMCkgXw0KVGhlbg0KCVdTY3JpcHQuRWNobyAiU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBwcml2YXRlIGFuZCBwdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uIg0KRWxzZQ0KCVdTY3JpcHQuRWNobyAiRmFpbGVkIHRvIHJldHJpZXZlIHByaXZhdGUgYW5kIHB1YmxpYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24sIHJldHVybmluZyBleGl0IHN0YXR1cyAxIg0KCVdTY3JpcHQuUXVpdCAxDQpFbmQgSWYNCg0KJycgU2V0IHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMNCidTZXQgb2JqU2hlbGwgPSBDcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKQ0KJ1NldCBzeXN2YXJzID0gb2JqU2hlbGwuRW52aXJvbm1lbnQoIlNZU1RFTSIpDQonc3lzdmFycygiVkNMX1BSSVZBVEVfTkFNRSIpICAgID0gUFJJVkFURV9OQU1FDQonc3lzdmFycygiVkNMX1BSSVZBVEVfSVAiKSAgICAgID0gUFJJVkFURV9JUA0KJ3N5c3ZhcnMoIlZDTF9QUklWQVRFX01BU0siKSAgICA9IFBSSVZBVEVfU1VCTkVUX01BU0sNCidzeXN2YXJzKCJWQ0xfUFJJVkFURV9HQVRFV0FZIikgPSBQUklWQVRFX0dBVEVXQVkNCidzeXN2YXJzKCJWQ0xfUFVCTElDX05BTUUiKSAgICAgPSBQVUJMSUNfTkFNRQ0KJ3N5c3ZhcnMoIlZDTF9QVUJMSUNfSVAiKSAgICAgICA9IFBVQkxJQ19JUA0KJ3N5c3ZhcnMoIlZDTF9QVUJMSUNfTUFTSyIpICAgICAgID0gUFVCTElDX1NVQk5FVF9NQVNLDQonc3lzdmFycygiVkNMX1BVQkxJQ19HQVRFV0FZIikgID0gUFVCTElDX0dBVEVXQVkNCicNCidXU2NyaXB0LkVjaG8NCicNCidXU2NyaXB0LkVjaG8gIlNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ig0KJ1NldCBzeXN2YXJzID0gb2JqU2hlbGwuRW52aXJvbm1lbnQoIlNZU1RFTSIpDQonV1NjcmlwdC5FY2hvICJWQ0xfUFJJVkFURV9OQU1FOiAiICYgc3lzdmFycygiVkNMX1BSSVZBVEVfTkFNRSIpDQonV1NjcmlwdC5FY2hvICJWQ0xfUFJJVkFURV9JUDogIiAmIHN5c3ZhcnMoIlZDTF9QUklWQVRFX0lQIikNCidXU2NyaXB0LkVjaG8gIlZDTF9QUklWQVRFX01BU0s6ICIgJiBzeXN2YXJzKCJWQ0xfUFJJVkFURV9NQVNLIikNCidXU2NyaXB0LkVjaG8gIlZDTF9QUklWQVRFX0dBVEVXQVk6ICIgJiBzeXN2YXJzKCJWQ0xfUFJJVkFURV9HQVRFV0FZIikNCidXU2NyaXB0LkVjaG8NCidXU2NyaXB0LkVjaG8gIlZDTF9QVUJMSUNfTkFNRTogIiAmIHN5c3ZhcnMoIlZDTF9QVUJMSUNfTkFNRSIpDQonV1NjcmlwdC5FY2hvICJWQ0xfUFVCTElDX0lQOiAiICYgc3lzdmFycygiVkNMX1BVQkxJQ19JUCIpDQonV1NjcmlwdC5FY2hvICJWQ0xfUFVCTElDX01BU0s6ICIgJiBzeXN2YXJzKCJWQ0xfUFVCTElDX01BU0siKQ0KJ1dTY3JpcHQuRWNobyAiVkNMX1BVQkxJQ19HQVRFV0FZOiAiICYgc3lzdmFycygiVkNMX1BVQkxJQ19HQVRFV0FZIikNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgQXNzZW1ibGUgdGhlIGV4dGVybmFsIGNvbW1hbmRzDQoNCkNNRF9ST1VURV9BRERfUFVCTElDX0dBVEVXQVk9c3RyU3lzdGVtMzIgJiAiXHJvdXRlLmV4ZSAtcCBBREQgMC4wLjAuMCBNQVNLIDAuMC4wLjAgIiAmIFBVQkxJQ19HQVRFV0FZICYgIiBNRVRSSUMgMSINCkNNRF9ST1VURV9BRERfUFJJVkFURV9HQVRFV0FZPXN0clN5c3RlbTMyICYgIlxyb3V0ZS5leGUgLXAgQUREIDAuMC4wLjAgTUFTSyAwLjAuMC4wICIgJiBQUklWQVRFX0dBVEVXQVkgJiAiIE1FVFJJQyAyIg0KQ01EX1JPVVRFX0RFTEVURV9HQVRFV0FZUz1zdHJTeXN0ZW0zMiAmICJccm91dGUuZXhlIERFTEVURSAwLjAuMC4wIE1BU0sgMC4wLjAuMCAiDQpDTURfUk9VVEVfRkxVU0g9c3RyU3lzdGVtMzIgJiAiXHJvdXRlLmV4ZSAtZiINCg0KQ01EX1NFVF9OVFNZU0xPR19HQVRFV0FZPXN0clN5c3RlbTMyICYgIlxyZWcuZXhlIEFERCBIS0xNXFNPRlRXQVJFXFNhYmVyTmV0IC92IHN5c2xvZyAvZCAiICYgUFJJVkFURV9HQVRFV0FZICYgIiAvZiINCkNNRF9TVEFSVF9OVFNZU0xPR19TRVJWSUNFPXN0clN5c3RlbTMyICYgIlxuZXQuZXhlIHN0YXJ0IG50c3lzbG9nIg0KQ01EX1NUT1BfTlRTWVNMT0dfU0VSVklDRT1zdHJTeXN0ZW0zMiAmICJcbmV0LmV4ZSBzdG9wIG50c3lzbG9nIg0KDQpDTURfU0VUX1BSSVZBVEVfU1RBVElDPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgaW50ZXJmYWNlIGlwIHNldCBhZGRyZXNzIG5hbWU9IiIiICYgUFJJVkFURV9OQU1FICYgIiIiIHNvdXJjZT1zdGF0aWMgYWRkcj0iICYgUFJJVkFURV9JUCAmICIgbWFzaz0iICYgUFJJVkFURV9TVUJORVRfTUFTSyAmICIgZ2F0ZXdheT1ub25lIg0KDQpDTURfU0VUX1BVQkxJQ19ETlM9c3RyU3lzdGVtMzIgJiAiXG5ldHNoLmV4ZSBpbnRlcmZhY2UgaXAgc2V0IGRucyBuYW1lPSIiIiAmIFBVQkxJQ19OQU1FICYgIiIiIHNvdXJjZT1kaGNwIHJlZ2lzdGVyPW5vbmUiDQpDTURfU0VUX1BSSVZBVEVfRE5TPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgaW50ZXJmYWNlIGlwIHNldCBkbnMgbmFtZT0iIiIgJiBQUklWQVRFX05BTUUgJiAiIiIgc291cmNlPWRoY3AgcmVnaXN0ZXI9bm9uZSINCg0KQ01EX1NFVF9QVUJMSUNfTkFNRT1zdHJTeXN0ZW0zMiAmICJcbmV0c2guZXhlIGludGVyZmFjZSBzZXQgaW50ZXJmYWNlIG5hbWU9IiIiICYgUFVCTElDX05BTUUgJiAiIiIgbmV3bmFtZT0iIlB1YmxpYyBJbnRlcmZhY2UiIiINCkNNRF9TRVRfUFJJVkFURV9OQU1FPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgaW50ZXJmYWNlIHNldCBpbnRlcmZhY2UgbmFtZT0iIiIgJiBQUklWQVRFX05BTUUgJiAiIiIgbmV3bmFtZT0iIlByaXZhdGUgSW50ZXJmYWNlIiIiDQoNCkNNRF9GSVJFV0FMTF9BTExPV19QUklWQVRFX1BJTkc9c3RyU3lzdGVtMzIgJiAiXG5ldHNoLmV4ZSBmaXJld2FsbCBzZXQgaWNtcHNldHRpbmciICYgXw0KIiB0eXBlID0gOCIgJiBfDQoiIG1vZGUgPSBFTkFCTEUiICYgXw0KIiBpbnRlcmZhY2UgPSAiIiIgJiBQUklWQVRFX05BTUUgJiAiIiIiDQoNCkNNRF9GSVJFV0FMTF9BTExPV19QUklWQVRFX1NTSD1zdHJTeXN0ZW0zMiAmICJcbmV0c2guZXhlIGZpcmV3YWxsIHNldCBwb3J0b3BlbmluZyIgJiBfDQoiIHByb3RvY29sID0gVENQIiAmIF8NCiIgcG9ydCA9IDIyIiAmIF8NCiIgbW9kZSA9IEVOQUJMRSIgJiBfDQoiIG5hbWUgPSAiIlNTSEQiIiIgJiBfDQoiIGludGVyZmFjZSA9ICIiIiAmIFBSSVZBVEVfTkFNRSAmICIiIiINCg0KQ01EX0ZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfUkRQPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgZmlyZXdhbGwgc2V0IHBvcnRvcGVuaW5nIiAmIF8NCiIgcHJvdG9jb2wgPSBUQ1AiICYgXw0KIiBwb3J0ID0gMzM4OSIgJiBfDQoiIG1vZGUgPSBFTkFCTEUiICYgXw0KIiBuYW1lID0gIiJSZW1vdGUgRGVza3RvcCIiIiAmIF8NCiIgaW50ZXJmYWNlID0gIiIiICYgUFJJVkFURV9OQU1FICYgIiIiIg0KDQpDTURfQURWRklSRVdBTExfQUxMT1dfUFJJVkFURV9QSU5HPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2V0IHJ1bGUiICYgXw0KIiBuYW1lPSIiVkNMOiBhbGxvdyBwaW5nIGZyb20gcHJpdmF0ZSBuZXR3b3JrIiIiICYgXw0KIiBuZXciICYgXw0KIiBhY3Rpb249YWxsb3ciICYgXw0KIiBkZXNjcmlwdGlvbj0iIkFsbG93cyBpbmNvbWluZyBwaW5nIChJQ01QIHR5cGUgOCkgbWVzc2FnZXMgZnJvbSAxMC54LngueCBhZGRyZXNzZXMiIiIgJiBfDQoiIGRpcj1pbiIgJiBfDQoiIGVuYWJsZT15ZXMiICYgXw0KIiBsb2NhbGlwPTEwLjAuMC4wLzgiICYgXw0KIiBwcm90b2NvbD1pY21wdjQ6OCxhbnkiICYgXw0KIiByZW1vdGVpcD0xMC4wLjAuMC84Ig0KDQpDTURfQURWRklSRVdBTExfQUxMT1dfUFJJVkFURV9TU0g9c3RyU3lzdGVtMzIgJiAiXG5ldHNoLmV4ZSBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSIgJiBfDQoiIG5hbWU9IiJWQ0w6IGFsbG93IFNTSCBwb3J0IDIyIGZyb20gcHJpdmF0ZSBuZXR3b3JrIiIiICYgXw0KIiBuZXciICYgXw0KIiBhY3Rpb249YWxsb3ciICYgXw0KIiBkZXNjcmlwdGlvbj0iIkFsbG93cyBpbmNvbWluZyBUQ1AgcG9ydCAyMiB0cmFmZmljIGZyb20gMTAueC54LnggYWRkcmVzc2VzIiIiICYgXw0KIiBkaXI9aW4iICYgXw0KIiBlbmFibGU9eWVzIiAmIF8NCiIgbG9jYWxpcD0xMC4wLjAuMC84IiAmIF8NCiIgbG9jYWxwb3J0PTIyIiAmIF8NCiIgcHJvdG9jb2w9VENQIiAmIF8NCiIgcmVtb3RlaXA9MTAuMC4wLjAvOCINCg0KQ01EX0FEVkZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfUkRQPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2V0IHJ1bGUiICYgXw0KIiBuYW1lPSIiVkNMOiBhbGxvdyBSRFAgcG9ydCAzMzg5IGZyb20gcHJpdmF0ZSBuZXR3b3JrIiIiICYgXw0KIiBuZXciICYgXw0KIiBhY3Rpb249YWxsb3ciICYgXw0KIiBkZXNjcmlwdGlvbj0iIkFsbG93cyBpbmNvbWluZyBUQ1AgcG9ydCAzMzg5IHRyYWZmaWMgZnJvbSAxMC54LngueCBhZGRyZXNzZXMiIiIgJiBfDQoiIGRpcj1pbiIgJiBfDQoiIGVuYWJsZT15ZXMiICYgXw0KIiBsb2NhbGlwPTEwLjAuMC4wLzgiICYgXw0KIiBsb2NhbHBvcnQ9MzM4OSIgJiBfDQoiIHByb3RvY29sPVRDUCIgJiBfDQoiIHJlbW90ZWlwPTEwLjAuMC4wLzgiDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFJ1biBjb21tYW5kcyB0byBjb25maWd1cmUgbmV0d29ya2luZw0KJyBLZWVwIGEgdG90YWwgb2YgdGhlIGV4aXQgY29kZXMNCmludEV4aXRTdGF0dXNUb3RhbCA9IDANCg0KJyBTZXQgdGhlIGFkYXB0ZXJzIHRvIG5vdCByZWdpc3RlciBETlMgcmVjb3Jkcw0KaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfU0VUX1BVQkxJQ19ETlMsICJTZXR0aW5nIHRoZSBwdWJsaWMgYWRhcHRlciB0byBub3QgcmVnaXN0ZXIgRE5TIHJlY29yZHMiKQ0KaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfU0VUX1BSSVZBVEVfRE5TLCAiU2V0dGluZyB0aGUgcHJpdmF0ZSBhZGFwdGVyIHRvIG5vdCByZWdpc3RlciBETlMgcmVjb3JkcyIpDQoNCicnIFNldCB0aGUgcHJpdmF0ZSBhZGFwdGVyIHRvIHN0YXRpYyBhbmQgcmVtb3ZlIHRoZSBkZWZhdWx0IGdhdGV3YXkNCidpbnRFeGl0U3RhdHVzVG90YWwgPSBpbnRFeGl0U3RhdHVzVG90YWwgKyBSdW5Db21tYW5kKENNRF9TRVRfUFJJVkFURV9TVEFUSUMsICJTZXR0aW5nIHRoZSBwcml2YXRlIGFkYXB0ZXIgdG8gc3RhdGljIikNCg0KJyBDb25maWd1cmUgdGhlIHJvdXRpbmcgdGFibGUgZGVmYXVsdCBnYXRld2F5cw0KaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfUk9VVEVfREVMRVRFX0dBVEVXQVlTLCAiRGVsZXRpbmcgcm91dGVzIHRvIGRlZmF1bHQgZ2F0ZXdheXMiKQ0KaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfUk9VVEVfQUREX1BVQkxJQ19HQVRFV0FZLCAiQWRkaW5nIHJvdXRlIHRvIHB1YmxpYyBkZWZhdWx0IGdhdGV3YXkiKQ0KJ2ludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX1JPVVRFX0FERF9QUklWQVRFX0dBVEVXQVksICJBZGRpbmcgcm91dGUgdG8gcHJpdmF0ZSBkZWZhdWx0IGdhdGV3YXkiKQ0KDQonJyBDb25maWd1cmUgdGhlIG50c3lzbG9nIHNlcnZpY2UgdG8gdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcml2YXRlIGRlZmF1bHQgZ2F0ZXdheSAobWFuYWdlbWVudCBub2RlKQ0KJ1J1bkNvbW1hbmQgQ01EX1NUT1BfTlRTWVNMT0dfU0VSVklDRSwgIlN0b3BwaW5nIHRoZSBudHN5c2xvZyBzZXJ2aWNlIg0KJ2ludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX1NFVF9OVFNZU0xPR19HQVRFV0FZLCAiQ29uZmlndXJpbmcgbnRzeXNsb2cgdG8gdXNlIHByaXZhdGUgZGVmYXVsdCBnYXRld2F5IikNCidpbnRFeGl0U3RhdHVzVG90YWwgPSBpbnRFeGl0U3RhdHVzVG90YWwgKyBSdW5Db21tYW5kKENNRF9TVEFSVF9OVFNZU0xPR19TRVJWSUNFLCAiU1RBUlRJTkcgdGhlIG50c3lzbG9nIHNlcnZpY2UiKQ0KDQonIENvbmZpZ3VyZSB0aGUgZmlyZXdhbGwgdG8gYWxsb3cgcGluZywgUkRQIGFuZCBTU0ggb24gdGhlIHByaXZhdGUgbmV0d29yaw0KJ3ByaW50X2hyDQoNCidJZiAoTGVmdChzdHJXaW5kb3dzVmVyc2lvbiwgMSkgPCA2KSBUaGVuDQonCVdTY3JpcHQuRWNobyAiV2luZG93cyB2ZXJzaW9uIGlzICIgJiBzdHJXaW5kb3dzVmVyc2lvbiAmICIsIGNvbmZpZ3VyaW5nIGZpcmV3YWxsIHdpdGggbmV0c2ggZmlyZXdhbGwiDQonCWludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX0ZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfUElORywgIkFsbG93aW5nIHBpbmcgb24gdGhlIHByaXZhdGUgaW50ZXJmYWNlIikNCicJaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfRklSRVdBTExfQUxMT1dfUFJJVkFURV9TU0gsICJBbGxvd2luZyBTU0ggb24gdGhlIHByaXZhdGUgaW50ZXJmYWNlIikNCicJJ2ludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX0ZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfUkRQLCAiQWxsb3dpbmcgUkRQIG9uIHRoZSBwcml2YXRlIGludGVyZmFjZSIpDQonRWxzZQ0KJyAgIFdTY3JpcHQuRWNobyAiV2luZG93cyB2ZXJzaW9uIGlzICIgJiBzdHJXaW5kb3dzVmVyc2lvbiAmICIsIGNvbmZpZ3VyaW5nIGZpcmV3YWxsIHdpdGggbmV0c2ggYWR2ZmlyZXdhbGwiDQonCWludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX0FEVkZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfUElORywgIkFsbG93aW5nIHBpbmcgZnJvbSBwcml2YXRlIGFkZHJlc3NlcyIpDQonCWludEV4aXRTdGF0dXNUb3RhbCA9IGludEV4aXRTdGF0dXNUb3RhbCArIFJ1bkNvbW1hbmQoQ01EX0FEVkZJUkVXQUxMX0FMTE9XX1BSSVZBVEVfU1NILCAiQWxsb3dpbmcgU1NIIGZyb20gcHJpdmF0ZSBhZGRyZXNzZXMiKQ0KJwknaW50RXhpdFN0YXR1c1RvdGFsID0gaW50RXhpdFN0YXR1c1RvdGFsICsgUnVuQ29tbWFuZChDTURfQURWRklSRVdBTExfQUxMT1dfUFJJVkFURV9SRFAsICJBbGxvd2luZyBSRFAgZnJvbSBwcml2YXRlIGFkZHJlc3NlcyIpDQonRW5kIElmDQoNCicnIFNldCB0aGUgbmFtZXMgb2YgdGhlIGFkYXB0ZXJzIHRvIFB1YmxpYyBhbmQgUHJpdmF0ZQ0KJ1J1bkNvbW1hbmQgQ01EX1NFVF9QUklWQVRFX05BTUUsICJTZXR0aW5nIHRoZSBwcml2YXRlIGFkYXB0ZXIgbmFtZSB0byBQcml2YXRlIg0KJ1J1bkNvbW1hbmQgQ01EX1NFVF9QVUJMSUNfTkFNRSwgIlNldHRpbmcgdGhlIHB1YmxpYyBhZGFwdGVyIG5hbWUgdG8gUHVibGljIg0KDQonIFByaW50IHRoZSByb3V0aW5nIHRhYmxlDQpSdW5Db21tYW5kIENNRF9ST1VURV9QUklOVCwgIlByaW50aW5nIHJvdXRpbmcgdGFibGUiDQoNCicgUnVuIGlwY29uZmlnIC9hbGwNClJ1bkNvbW1hbmQgQ01EX0lQQ09ORklHX0FMTCwgIlJ1bm5pbmcgaXBjb25maWcgL2FsbCINCg0KcHJpbnRfaHINCg0KV1NjcmlwdC5FY2hvIChXU2NyaXB0LlNjcmlwdE5hbWUgJiAiIGZpbmlzaGVkOiAiICYgRGF0ZSAmICIgIiAmIFRpbWUpDQpXU2NyaXB0LkVjaG8gIkV4aXQgc3RhdHVzIHRvdGFsOiAiICYgaW50RXhpdFN0YXR1c1RvdGFsDQpXU2NyaXB0LlF1aXQgaW50RXhpdFN0YXR1c1RvdGFsDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gZ2V0X25ldHdvcmtfY29uZmlndXJhdGlvbg0KCScgQ29ubmVjdCB0byBsb2NhbCBjb21wdXRlciB2aWEgV01JDQoJU2V0IHdtaSA9IEdldE9iamVjdCgid2lubWdtdHM6e2ltcGVyc29uYXRpb25MZXZlbD1pbXBlcnNvbmF0ZX0hXFwuXHJvb3RcY2ltdjIiKQ0KDQoJJyBHZXQgYSBsaXN0IG9mIG5ldHdvcmsgYWRhcHRlcnMNCgknIE5ldENvbm5lY3Rpb25TdGF0dXM6IDAgPSBEaXNjb25uZWN0ZWQsIDEgPSBDb25uZWN0aW5nLCAyID0gQ29ubmVjdGVkDQoJU2V0IHdtaV9OQXMgPSB3bWkuRXhlY1F1ZXJ5KCJTRUxFQ1QgKiBGUk9NIFdpbjMyX05ldHdvcmtBZGFwdGVyIFdIRVJFICIgJiBfDQoJCQkJCQkJCQkJCSJOZXRDb25uZWN0aW9uU3RhdHVzID0gMiAiICYgXw0KCQkJCQkJCQkJCQkiQU5EIE5PVCBTZXJ2aWNlTmFtZSBMSUtFICclbG9vcCUnIikNCg0KCScgTG9vcCB0aHJvdWdoIG5ldGVvcmsgYWRhcHRlcnMNCglJZiAod21pX05Bcy5jb3VudCA9IDApIFRoZW4NCgkJV1NjcmlwdC5FY2hvICJObyBuZXR3b3JrIGFkYXB0ZXJzIHdlcmUgZm91bmQiDQoJCVdTY3JpcHQuUXVpdCAxDQoJRW5kIElmDQoJDQoJJyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWdub3JlIGNlcnRhaW4gbmV0d29yayBjb25uZWN0aW9uIG5hbWVzDQoJc3RyUGF0dGVybklnbm9yZWRBZGFwdGVyTmFtZXMgPSAiKGxvb3BiYWNrfHZtbmV0fGFmcykiDQoJDQoJJyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWdub3JlIGNlcnRhaW4gbmV0d29yayBjb25uZWN0aW9uIGRlc2NyaXB0aW9ucw0KCXN0clBhdHRlcm5JZ25vcmVkQWRhcHRlckRlc2NyaXB0aW9ucyA9ICIobG9vcGJhY2t8dmlydHVhbHxhZnMpIg0KCQ0KCScgUmVndWxhciBleHByZXNzaW9uIHRvIG1ha2Ugc3VyZSB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgY29ycmVjdCBmb3JtYXQNCglzdHJQYXR0ZXJuSVBBZGRyZXNzID0gIigoXGR7MSwzfVwuPyl7NH0pIg0KDQoJJyBVc2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gY2hlY2sgaWYgdGhlIElQIGFkZHJlc3MgaXMgcHJpdmF0ZQ0KCXN0clBhdHRlcm5Qcml2YXRlID0gIl4oMTApXC4iDQoNCgknIFVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiB0aGUgSVAgYWRkcmVzcyBpcyBub3QgcHVibGljDQoJJyAxMC4wLjAuMCCWIDEwLjI1NS4yNTUuMjU1DQoJJyAxMjcuMC4wLjAgLSAxMjcuMjU1LjI1NS4yNTUNCgknIDE3Mi4xNi4wLjAgliAxNzIuMzEuMjU1LjI1NQ0KCScgMTkyLjE2OC4wLjAgliAxOTIuMTY4LjI1NS4yNTUNCglzdHJQYXR0ZXJuTm90UHVibGljID0gIl4oMTB8MTI3fDE5MlwuMTY4fDE3MlwuKDFbNi05XXwyWzAtOV18M1swLTFdKSlcLiINCgkNCgknaW50Q2hlY2tBZGFwdGVycyA9IDENCgknaW50TG9vcENvdW50ID0gMA0KCSdEbyBXaGlsZSAoaW50Q2hlY2tBZGFwdGVycyA8PiAwIEFuZCBpbnRMb29wQ291bnQgPCAzKQ0KCScJaW50TG9vcENvdW50ID0gaW50TG9vcENvdW50ICsgMQ0KCScJaW50Q2hlY2tBZGFwdGVycyA9IDANCgkJDQoJCScgUmVuZXcgdGhlIERIQ1AgbGVhc2UgaWYgbm90IHRoZSBmaXJzdCBpdGVyYXRpb24NCgkJJyBUaGlzIG1lYW5zIERIQ1Agd2FzIGVuYWJsZWQgb24gYW4gYWRhcHRlcg0KCQlJZiAoaW50TG9vcENvdW50ID4gMSkgVGhlbg0KCQkJUnVuQ29tbWFuZCBDTURfSVBDT05GSUdfUkVORVcsICJSZW5ld2luZyBESENQIGxlYXNlIg0KCQlFbmQgSWYNCgkJDQoJCScgTG9vcCB0aHJvdWdoIG5ldHdvcmsgYWRhcHRlcnMNCgkJRm9yIEVhY2ggTkEgaW4gd21pX05Bcw0KCQkJV1NjcmlwdC5FY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIg0KCQkJV1NjcmlwdC5FY2hvICIqKiogIiAmIE5BLkRlc2NyaXB0aW9uICYgIiAoSW5kZXg6ICIgJiBOQS5JbmRleCAmICIpICoqKiINCgkJCSdXU2NyaXB0LkVjaG8NCgkNCgkJCScnIFByaW50IGFsbCBvZiB0aGUgdGhlIFdpbjMyX05ldHdvcmtBZGFwdGVyIHByb3BlcnRpZXMNCgkJCSdGb3IgRWFjaCBOQV9wcm9wZXJ0eSBpbiBOQS5Qcm9wZXJ0aWVzXw0KCQkJJwlJZiBOb3QgSXNOdWxsKE5BX3Byb3BlcnR5LlZhbHVlKSBUaGVuDQoJCQknCQlwcmludF92YXJpYWJsZSBOQV9wcm9wZXJ0eS5WYWx1ZSwgIk5BOiIgJiBOQV9wcm9wZXJ0eS5OYW1lDQoJCQknCUVuZCBJZg0KCQkJJ05leHQNCgkNCgkJCScgR2V0IGEgbGlzdCBvZiBuZXR3b3JrIGFkYXB0ZXIgY29uZmlndXJhdGlvbnMgbWF0Y2hpbmcgdGhlIGluZGV4IG9mIHRoZSBuZXR3b3JrIGFkYXB0ZXINCgkJCVNldCB3bWlfTkFDcyA9IHdtaS5FeGVjUXVlcnkoIlNFTEVDVCAqIEZST00gV2luMzJfTmV0d29ya0FkYXB0ZXJDb25maWd1cmF0aW9uIFdIRVJFIEluZGV4ID0gJyIgJiBOQS5JbmRleCAmICInIikNCgkJCUZvciBFYWNoIE5BQyBpbiB3bWlfTkFDcw0KCQkJCVdTY3JpcHQuRWNobw0KCQ0KCQkJCScnIFByaW50IGFsbCBvZiB0aGUgdGhlIFdpbjMyX05ldHdvcmtBZGFwdGVyQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzDQoJCQkJJ0ZvciBFYWNoIE5BQ19wcm9wZXJ0eSBpbiBOQUMuUHJvcGVydGllc18NCgkJCQknCUlmIE5vdCBJc051bGwoTkFDX3Byb3BlcnR5LlZhbHVlKSBUaGVuDQoJCQkJJwkJcHJpbnRfdmFyaWFibGUgTkFDX3Byb3BlcnR5LlZhbHVlLCAiTkFDOiIgJiBOQUNfcHJvcGVydHkuTmFtZQ0KCQkJCScJRW5kIElmDQoJCQkJJ05leHQNCgkNCgkJCQknIEV2YWx1YXRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zDQoJCQkJc3RySWdub3JlZEFkYXB0ZXJOYW1lID0gUmVnRXhwVmFsKHN0clBhdHRlcm5JZ25vcmVkQWRhcHRlck5hbWVzLCBOQS5OYW1lLCAwKQ0KCQkJCXN0cklnbm9yZWRBZGFwdGVyRGVzY3JpcHRpb24gPSBSZWdFeHBWYWwoc3RyUGF0dGVybklnbm9yZWRBZGFwdGVyRGVzY3JpcHRpb25zLCBOQS5EZXNjcmlwdGlvbiwgMCkNCgkJCQlzdHJJUEFkZHJlc3MgPSBSZWdFeHBWYWwoc3RyUGF0dGVybklQQWRkcmVzcywgSm9pbihOQUMuSVBBZGRyZXNzKSwgMCkNCgkJCQlzdHJJUEFkZHJlc3NNYXRjaFByaXZhdGUgPSBSZWdFeHBWYWwoc3RyUGF0dGVyblByaXZhdGUsIHN0cklQQWRkcmVzcywgMCkNCgkJCQlzdHJJUEFkZHJlc3NNYXRjaE5vdFB1YmxpYyA9IFJlZ0V4cFZhbChzdHJQYXR0ZXJuTm90UHVibGljLCBzdHJJUEFkZHJlc3MsIDApDQoJDQoJCQkJV1NjcmlwdC5FY2hvICJBZHBhdGVyIG5hbWU6ICIgJiBOQS5OYW1lDQoJCQkJV1NjcmlwdC5FY2hvICJJZ25vcmVkIGFkcGF0ZXIgbmFtZSBzZWN0aW9uOiAiICYgc3RySWdub3JlZEFkYXB0ZXJOYW1lDQoJCQkJV1NjcmlwdC5FY2hvICJJZ25vcmVkIGFkcGF0ZXIgZGVzY3JpcHRpb24gc2VjdGlvbjogIiAmIHN0cklnbm9yZWRBZGFwdGVyRGVzY3JpcHRpb24NCgkJCQlXU2NyaXB0LkVjaG8gIklQIGFkZHJlc3M6ICIgJiBzdHJJUEFkZHJlc3MNCgkJCQlXU2NyaXB0LkVjaG8gIk1hdGNoaW5nIFZDTCBwcml2YXRlIGFkZHJlc3Mgc2VjdGlvbjogIiAmIHN0cklQQWRkcmVzc01hdGNoUHJpdmF0ZQ0KCQkJCVdTY3JpcHQuRWNobyAiTWF0Y2hpbmcgbm9uLXB1YmxpYyBhZGRyZXNzIHNlY3Rpb246ICIgJiBzdHJJUEFkZHJlc3NNYXRjaE5vdFB1YmxpYw0KCQ0KCQkJCScgQ2hlY2sgaWYgYWRhcHRlciBzaG91bGQgYmUgaWdub3JlZA0KCQkJCUlmIExlbihzdHJJZ25vcmVkQWRhcHRlck5hbWUpID4gMCBUaGVuDQoJCQkJCVdTY3JpcHQuRWNobyAiTmV0d29yayBhZGFwdGVyICIgJiBOQS5OYW1lICYgIiBpcyBiZWluZyBpZ25vcmVkIGJlY2F1c2UgdGhlIG5hbWUgY29udGFpbnM6ICIgJiBzdHJJZ25vcmVkQWRhcHRlck5hbWUNCgkJCQkNCgkJCQknIENoZWNrIGlmIGFkYXB0ZXIgc2hvdWxkIGJlIGlnbm9yZWQNCgkJCQlFbHNlaWYgTGVuKHN0cklnbm9yZWRBZGFwdGVyRGVzY3JpcHRpb24pID4gMCBUaGVuDQoJCQkJCVdTY3JpcHQuRWNobyAiTmV0d29yayBhZGFwdGVyICIgJiBOQS5OYW1lICYgIiBpcyBiZWluZyBpZ25vcmVkIGJlY2F1c2UgdGhlIGRlc2NyaXB0aW9uIGNvbnRhaW5zOiAiICYgc3RySWdub3JlZEFkYXB0ZXJEZXNjcmlwdGlvbg0KCQkJCQ0KCQkJCScgQ2hlY2sgdG8gbWFrZSBzdXJlIGEgdmFsaWQgSVAgYWRkcmVzcyB3YXMgZm91bmQNCgkJCQlFbHNlaWYgTGVuKHN0cklQQWRkcmVzcykgPSAwIFRoZW4NCgkJCQkJV1NjcmlwdC5FY2hvICJJUCBhZGRyZXNzIGlzIGVpdGhlciBibGFuayBvciBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0OiAiICYgTkFDLklQQWRkcmVzcw0KCQkJCQ0KCQkJCScgQ2hlY2sgaWYgYWRkcmVzcyBpcyBhIHZhbGlkIFZDTCBwcml2YXRlIGFkZHJlc3MgKDEwLiopDQoJCQkJRWxzZWlmIExlbihzdHJJUEFkZHJlc3NNYXRjaFByaXZhdGUpID4gMCBUaGVuDQoJCQkJCVBSSVZBVEVfTkFNRSA9IE5BLk5ldENvbm5lY3Rpb25JRA0KCQkJCQlXU2NyaXB0LkVjaG8gIiogUFJJVkFURV9OQU1FICAgICAgICAgID0gIiAmIFBSSVZBVEVfTkFNRQ0KCQkJCQlXU2NyaXB0LkVjaG8gIiogREhDUCBlbmFibGVkICAgICAgICAgID0gIiAmIE5BQy5ESENQRW5hYmxlZA0KCQkJCQknSWYgKE5BQy5ESENQRW5hYmxlZCA9ICJGYWxzZSIpIFRoZW4NCgkJCQkJJwlDTURfUFJJVkFURV9FTkFCTEVfREhDUD1zdHJTeXN0ZW0zMiAmICJcbmV0c2guZXhlIGludGVyZmFjZSBpcCBzZXQgYWRkcmVzcyBuYW1lPSIiIiAmIFBSSVZBVEVfTkFNRSAmICIiIiBzb3VyY2U9ZGhjcCINCgkJCQkJJwlSdW5Db21tYW5kIENNRF9QUklWQVRFX0VOQUJMRV9ESENQLCAiRW5hYmxpbmcgREhDUCBvbiB0aGUgcHJpdmF0ZSBhZGFwdGVyIg0KCQkJCQknCWludENoZWNrQWRhcHRlcnMgPSAxDQoJCQkJCSdFbHNlDQoJCQkJCQlQUklWQVRFX0lQID0gc3RySVBBZGRyZXNzDQoJCQkJCQlQUklWQVRFX1NVQk5FVF9NQVNLID0gSm9pbihOQUMuSVBTdWJuZXQpDQoJCQkJCQlQUklWQVRFX0RFU0NSSVBUSU9OID0gTkEuRGVzY3JpcHRpb24NCgkJCQkJCUlmIE5vdCBJc051bGwoTkFDLkRlZmF1bHRJUEdhdGV3YXkpIFRoZW4NCgkJCQkJCSAgIFBSSVZBVEVfR0FURVdBWSA9IEpvaW4oTkFDLkRlZmF1bHRJUEdhdGV3YXkpDQoJCQkJCQlFbmQgSWYNCgkJCQkJCVdTY3JpcHQuRWNobyAiKiBQUklWQVRFX0lQICAgICAgICAgICAgPSAiICYgUFJJVkFURV9JUA0KCQkJCQkJV1NjcmlwdC5FY2hvICIqIFBSSVZBVEVfU1VCTkVUX01BU0sgICA9ICIgJiBQUklWQVRFX1NVQk5FVF9NQVNLDQoJCQkJCQlXU2NyaXB0LkVjaG8gIiogUFJJVkFURV9HQVRFV0FZICAgICAgID0gIiAmIFBSSVZBVEVfR0FURVdBWQ0KCQkJCQkJV1NjcmlwdC5FY2hvICIqIFBSSVZBVEVfREVTQ1JJUFRJT04gICA9ICIgJiBQUklWQVRFX0RFU0NSSVBUSU9ODQoJCQkJCSdFbmQgSWYNCgkJCQknIEFkZHJlc3MgaXMgbm90IGEgdmFsaWQgVkNMIHByaXZhdGUgYWRkcmVzcyAoMTAuKikgYnV0IG1heSBzdGlsbCBiZSBwcml2YXRlICgxOTIuMTY4LiogLi4uKQ0KCQkJCScgQ2hlY2sgaWYgYWRkcmVzcyBpcyBwcml2YXRlDQoJCQkJRWxzZWlmIExlbihzdHJJUEFkZHJlc3NNYXRjaE5vdFB1YmxpYykgPiAwIFRoZW4NCgkJCQkJV1NjcmlwdC5FY2hvICJJUCBhZGRyZXNzIGlzIG5vdCBhIHB1YmxpYyBub3IgdmFsaWQgVkNMIHByaXZhdGUgYWRkcmVzczogIiAmIHN0cklQQWRkcmVzcw0KCQkJCQ0KCQkJCScgQWRkcmVzcyBpcyBub3QgcHJpdmF0ZSwgaXQncyBhIHZhbGlkIHB1YmxpYyBhZGRyZXNzDQoJCQkJRWxzZQ0KCQkJCQlQVUJMSUNfTkFNRSA9IE5BLk5ldENvbm5lY3Rpb25JRA0KCQkJCQlXU2NyaXB0LkVjaG8gIiogUFVCTElDX05BTUUgICAgICAgICAgPSAiICYgUFVCTElDX05BTUUNCgkJCQkJV1NjcmlwdC5FY2hvICIqIERIQ1AgZW5hYmxlZCAgICAgICAgID0gIiAmIE5BQy5ESENQRW5hYmxlZA0KCQkJCQknSWYgKE5BQy5ESENQRW5hYmxlZCA9ICJGYWxzZSIpIFRoZW4NCgkJCQkJJwlDTURfUFVCTElDX0VOQUJMRV9ESENQPXN0clN5c3RlbTMyICYgIlxuZXRzaC5leGUgaW50ZXJmYWNlIGlwIHNldCBhZGRyZXNzIG5hbWU9IiIiICYgUFVCTElDX05BTUUgJiAiIiIgc291cmNlPWRoY3AiDQoJCQkJCScJUnVuQ29tbWFuZCBDTURfUFVCTElDX0VOQUJMRV9ESENQLCAiRW5hYmxpbmcgREhDUCBvbiB0aGUgcHVibGljIGFkYXB0ZXIiDQoJCQkJCScJaW50Q2hlY2tBZGFwdGVycyA9IDENCgkJCQkJJ0Vsc2UNCgkJCQkJCVBVQkxJQ19JUCA9IHN0cklQQWRkcmVzcw0KCQkJCQkJUFVCTElDX1NVQk5FVF9NQVNLID0gSm9pbihOQUMuSVBTdWJuZXQpDQoJCQkJCQlQVUJMSUNfREVTQ1JJUFRJT04gPSBOQS5EZXNjcmlwdGlvbg0KCQkJCQkJSWYgTm90IElzTnVsbChOQUMuRGVmYXVsdElQR2F0ZXdheSkgVGhlbg0KCQkJCQkJICAgUFVCTElDX0dBVEVXQVkgPSBKb2luKE5BQy5EZWZhdWx0SVBHYXRld2F5KQ0KCQkJCQkJRW5kIElmDQoJCQkJCQlXU2NyaXB0LkVjaG8gIiogUFVCTElDX0lQICAgICAgICAgICAgPSAiICYgUFVCTElDX0lQDQoJCQkJCQlXU2NyaXB0LkVjaG8gIiogUFVCTElDX1NVQk5FVF9NQVNLICAgPSAiICYgUFVCTElDX1NVQk5FVF9NQVNLDQoJCQkJCQlXU2NyaXB0LkVjaG8gIiogUFVCTElDX0dBVEVXQVkgICAgICAgPSAiICYgUFVCTElDX0dBVEVXQVkNCgkJCQkJCVdTY3JpcHQuRWNobyAiKiBQVUJMSUNfREVTQ1JJUFRJT04gICA9ICIgJiBQVUJMSUNfREVTQ1JJUFRJT04NCgkJCQkJJ0VuZCBJZg0KCQkJCUVuZCBJZg0KCQkJTmV4dA0KCQlOZXh0DQoJCQ0KCSdMb29wDQpFbmQgZnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBwcmludF92YXJpYWJsZShhcnIsIHN0clRpdGxlKQ0KCUlmIE5vdCBJc051bGwoYXJyKSBUaGVuDQoJCUlmIElzQXJyYXkoYXJyKSBUaGVuDQoJCQlGb3IgRWFjaCBlbGVtZW50IEluIGFycg0KCQkJCVdTY3JpcHQuRWNobyBzdHJUaXRsZSAmICIgPSAiICYgZWxlbWVudA0KCQkJTmV4dA0KCQlFbHNlDQoJCQlXU2NyaXB0LkVjaG8gc3RyVGl0bGUgJiAiID0gIiAmIGFycg0KCQlFbmQgSWYNCglFbHNlDQoJCVdTY3JpcHQuRWNobyBzdHJUaXRsZSAmICIgPSBOVUxMIg0KCUVuZCBJZg0KRW5kIGZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRnVuY3Rpb24gUmVnRXhwVmFsKHN0clBhdHRlcm4sIHN0clN0cmluZywgaWR4KQ0KCU9uIEVycm9yIFJlc3VtZSBOZXh0DQoJRGltIHJlZ0V4LCBNYXRjaCwgTWF0Y2hlcywgUmV0U3RyDQoJU2V0IHJlZ0V4ICAgICAgICA9IE5ldyBSZWdFeHANCglyZWdFeC5QYXR0ZXJuICAgID0gc3RyUGF0dGVybg0KCXJlZ0V4Lklnbm9yZUNhc2UgPSBUcnVlDQoJcmVnRXguR2xvYmFsICAgICA9IFRydWUNCglTZXQgTWF0Y2hlcyAgICAgID0gcmVnRXguRXhlY3V0ZSggc3RyU3RyaW5nICkNCglSZWdFeHBWYWwgICAgICAgID0gTWF0Y2hlcyggMCApLlN1Yk1hdGNoZXMoIGlkeCApDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGdW5jdGlvbiBSdW5Db21tYW5kIChzdHJDb21tYW5kLCBzdHJEZXNjcmlwdGlvbikNCglwcmludF9ocg0KCXN0ckNvbW1hbmQgPSAiY21kLmV4ZSAvYyAiICYgc3RyQ29tbWFuZA0KCVdTY3JpcHQuRWNobyBzdHJEZXNjcmlwdGlvbiAmICIsIGNvbW1hbmQ6ICIgJiBzdHJDb21tYW5kDQoJU2V0IG9iakV4ZWNSZXN1bHQgPSBvYmpTaGVsbC5FeGVjKHN0ckNvbW1hbmQgJiAiIDI+JjEiKQ0KDQoJSWYgb2JqRXhlY1Jlc3VsdC5Qcm9jZXNzSUQgPSAwIEFuZCBvYmpFeGVjUmVzdWx0LlN0YXR1cyA9IDEgVGhlbg0KCQlXU2NyaXB0LkVjaG8gc3RyRGVzY3JpcHRpb24gJiAiIGZhaWxlZDogIiAmIGVyci5EZXNjcmlwdGlvbg0KCQlXU2NyaXB0LlF1aXQgMQ0KCUVuZCBJZg0KDQoJRG8NCgkJaW50U3RhdHVzID0gb2JqRXhlY1Jlc3VsdC5TdGF0dXMNCgkJV1NjcmlwdC5TdGRPdXQuV3JpdGUgb2JqRXhlY1Jlc3VsdC5TdGRPdXQuUmVhZEFsbCgpDQoJCVdTY3JpcHQuU3RkRXJyLldyaXRlIG9iakV4ZWNSZXN1bHQuU3RkRXJyLlJlYWRBbGwoKQ0KCQlJZiBpbnRTdGF0dXMgPD4gMCBUaGVuIEV4aXQgRG8NCgkJJ1dTY3JpcHQuU2xlZXAgMTANCglMb29wDQoNCglJZiBvYmpFeGVjUmVzdWx0LkV4aXRDb2RlID4gMCBUaGVuDQoJCVdTY3JpcHQuRWNobyBzdHJEZXNjcmlwdGlvbiAmICIgZmFpbGVkLCBleGl0IGNvZGU6ICIgJiBvYmpFeGVjUmVzdWx0LkV4aXRDb2RlDQoJRWxzZQ0KCQlXU2NyaXB0LkVjaG8gc3RyRGVzY3JpcHRpb24gJiAiIHN1Y2Nlc3NmdWwsIGV4aXQgY29kZTogIiAmIG9iakV4ZWNSZXN1bHQuRXhpdENvZGUNCglFbmQgSWYNCg0KCVJ1bkNvbW1hbmQgPSBvYmpFeGVjUmVzdWx0LkV4aXRDb2RlDQoJV1NjcmlwdC5FY2hvIChUaW1lKQ0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRnVuY3Rpb24gcHJpbnRfaHINCglXU2NyaXB0LkVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSINCglXU2NyaXB0LkVjaG8gKFRpbWUpDQoJV1NjcmlwdC5FY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iDQpFbmQgRnVuY3Rpb24=