ImportExport
1.1.2
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.1.2.
Build for OTRS::ITSM 1.1.1.
Build for OTRS::ITSM 1.1.0 rc1.
Build for OTRS::ITSM 1.1.0 beta4.
Build for OTRS::ITSM 1.1.0 beta3.
Build for OTRS::ITSM 1.1.0 beta2.
Build for OTRS::ITSM 1.1.0 beta1.
Testbuild for OTRS::ITSM 1.1.0 beta1.
The ImportExport package.
Das ImportExport Paket.
2.2.7
2.2.x CVS
<br>
WELCOME<br>
<br>
You are about to install the OTRS module ImportExport.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ImportExport zu installieren.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WELCOME<br>
<br>
You are about to upgrade the OTRS module ImportExport.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ImportExport zu aktualisieren.<br>
<br>
<br>
((enjoy))<br>
<br>
2008-06-04 10:10:50
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBJbXBvcnRFeHBvcnQucGwgLSBpbXBvcnQvZXhwb3J0IHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBsLHYgMS44IDIwMDgvMDQvMTcgMTE6Mjk6NDIgbWggRXhwICQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgRmluZEJpbiBxdygkUmVhbEJpbik7CnVzZSBsaWIgZGlybmFtZSAkUmVhbEJpbjsKCnVzZSBHZXRvcHQ6OlN0ZDsKdXNlIEtlcm5lbDo6Q29uZmlnOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47Cgp1c2UgdmFycyBxdygkVkVSU0lPTiAkUmVhbEJpbik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKIyBnZXQgb3B0aW9ucwpteSAlT3B0czsKZ2V0b3B0KCAnaG5haW8nLCBcJU9wdHMgKTsKCmlmICggJE9wdHN7aH0gKSB7CgogICAgcHJpbnQgU1RET1VUICJJbXBvcnRFeHBvcnQucGwgPFJldmlzaW9uICRWRVJTSU9OPiAtIGEgaW1wb3J0L2V4cG9ydCB0b29sXG4iOwogICAgcHJpbnQgU1RET1VUICJDb3B5cmlnaHQgKGMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvXG4iOwogICAgcHJpbnQgU1RET1VUICJ1c2FnZTpJbXBvcnRFeHBvcnQucGwgLW4gPFRlbXBsYXRlTnVtYmVyPiAtYSBpbXBvcnR8ZXhwb3J0ICI7CiAgICBwcmludCBTVERPVVQgIlstaSA8U291cmNlRmlsZT5dIFstbyA8RGVzdGluYXRpb25GaWxlPl1cbiI7CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgZXhhbXBsZXM6XG4iOwogICAgcHJpbnQgU1RET1VUICIgICAgICAgSW1wb3J0RXhwb3J0LnBsIC1uIDAwMDA0IC1hIGltcG9ydCAtaSAvdG1wL2ltcG9ydC5jc3ZcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBJbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgZXhwb3J0IC1vIC90bXAvZXhwb3J0LmNzdlxuIjsKCiAgICBleGl0IDE7Cn0KCiMgY2hlY2sgdGVtcGFsdGUgbnVtYmVyCmlmICggISRPcHRze259ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTmVlZCAtbiBUZW1wbGF0ZU51bWJlclxuIjsKICAgIGV4aXQgMTsKfQppZiAoICRPcHRze259ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBUZW1wbGF0ZU51bWJlclxuIjsKICAgIGV4aXQgMTsKfQpteSAkVGVtcGxhdGVJRCA9IGludCAkT3B0c3tufTsKCiMgY2hlY2sgYWN0aW9uIG1vZGUKaWYgKCAhJE9wdHN7YX0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1hIGltcG9ydHxleHBvcnRcbiI7CiAgICBleGl0IDE7Cn0KaWYgKCBsYyAkT3B0c3thfSBuZSAnaW1wb3J0JyAmJiBsYyAkT3B0c3thfSBuZSAnZXhwb3J0JyApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IEludmFsaWQgYWN0aW9uXG4iOwogICAgZXhpdCAxOwp9CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAlQ29tbW9uT2JqZWN0OwokQ29tbW9uT2JqZWN0e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiRDb21tb25PYmplY3R7TG9nT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgIExvZ1ByZWZpeCA9PiAnT1RSUy1JbXBvcnRFeHBvcnQnLAogICAgJUNvbW1vbk9iamVjdCwKKTsKJENvbW1vbk9iamVjdHtFbmNvZGVPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e01haW5PYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0RCT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCVDb21tb25PYmplY3QpOwoKIyBnZXQgdGVtcGxhdGUgZGF0YQpteSAkVGVtcGxhdGVEYXRhID0gJENvbW1vbk9iamVjdHtJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgppZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBUZW1wbGF0ZSAkT3B0c3tufSBub3QgZm91bmQhXG4iOwogICAgcHJpbnQgU1RERVJSICJFeHBvcnQgYWJvcnRlZC5cbiI7CiAgICBleGl0IDE7Cn0KCiMgdGltZSB0byBzdGFydAppZiAoIGxjICRPcHRze2F9IGVxICdpbXBvcnQnICkgewoKICAgIG15ICRTb3VyY2VDb250ZW50ID0gXGRvIHsnJ307CiAgICBpZiAoICRPcHRze2l9ICkgewoKICAgICAgICBwcmludCBTVERPVVQgIlJlYWQgRmlsZSAkT3B0c3tpfS5cbiI7CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgICRTb3VyY2VDb250ZW50ID0gJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze2l9LAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3QgcmVhZCBmaWxlICRPcHRze2l9LlxuSW1wb3J0IGFib3J0ZWQuXG4iIGlmICEkU291cmNlQ29udGVudDsKICAgIH0KCiAgICBwcmludCBTVERPVVQgIkltcG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgaW1wb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFNvdXJjZUNvbnRlbnQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCiAgICBkaWUgIlxuRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLlxuIiBpZiAhZGVmaW5lZCAkUmVzdWx0OwoKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICJTdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc31cbiI7CiAgICBwcmludCBTVERPVVQgIkZhaWxlZCA6ICRSZXN1bHQtPntGYWlsZWR9XG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgIkltcG9ydCBjb21wbGV0ZS5cbiI7Cn0KZWxzaWYgKCBsYyAkT3B0c3thfSBlcSAnZXhwb3J0JyApIHsKCiAgICBwcmludCBTVERPVVQgIkV4cG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgZXhwb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgZGllICJcbkVycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy5cbiIgaWYgIWRlZmluZWQgJFJlc3VsdDsKCiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiU3VjY2VzczogJFJlc3VsdC0+e1N1Y2Nlc3N9XG4iOwogICAgcHJpbnQgU1RET1VUICJGYWlsZWQgOiAkUmVzdWx0LT57RmFpbGVkfVxuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwoKICAgIGlmICggJE9wdHN7b30gKSB7CgogICAgICAgIG15ICRGaWxlQ29udGVudCA9IGpvaW4gIlxuIiwgQHsgJFJlc3VsdC0+e0Rlc3RpbmF0aW9uQ29udGVudH0gfTsKCiAgICAgICAgIyBzYXZlIGRlc3RpbmF0aW9uIGNvbnRlbnQgdG8gZmlsZQogICAgICAgIG15ICRTdWNjZXNzID0gJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fS0+RmlsZVdyaXRlKAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkT3B0c3tvfSwKICAgICAgICAgICAgQ29udGVudCAgPT4gXCRGaWxlQ29udGVudCwKICAgICAgICApOwoKICAgICAgICBkaWUgIkNhbid0IHdyaXRlIGZpbGUgJE9wdHN7b30uXG5FeHBvcnQgYWJvcnRlZC5cbiIgaWYgISRTdWNjZXNzOwoKICAgICAgICBwcmludCBTVERPVVQgIkZpbGUgJE9wdHN7b30gc2F2ZWQuXG4iOwogICAgfQoKICAgIHByaW50IFNURE9VVCAiRXhwb3J0IGNvbXBsZXRlLlxuIjsKfQoKZXhpdCAwOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAwOC8wNC8xNyAxMToyOTo0MiAkCgo9Y3V0Cg==
cGFja2FnZSBUZXh0OjpDU1Y7CgoKdXNlIHN0cmljdDsKdXNlIENhcnAgKCk7CgpCRUdJTiB7CiAgICAkVGV4dDo6Q1NWOjpWRVJTSU9OID0gJzEuMDQnOwogICAgJFRleHQ6OkNTVjo6REVCVUcgICA9IDA7Cn0KCiMgaWYgdXNlIENTVl9YUywgcmVxdWlyZXMgdmVyc2lvbgpteSAkTW9kdWxlX1hTICA9ICdUZXh0OjpDU1ZfWFMnOwpteSAkTW9kdWxlX1BQICA9ICdUZXh0OjpDU1ZfUFAnOwpteSAkWFNfVmVyc2lvbiA9ICcwLjQzJzsKCm15ICRJc19EeW5hbWljID0gMDsKCiMgdXNlZCBpbiBfbG9hZF94cyBhbmQgX2xvYWRfcHAKbXkgJEluc3RhbGxfRG9udF9EaWUgPSAxOyAjIFdoZW4gX2xvYWRfeHMgZmFpbHMgdG8gbG9hZCBYUywgZG9uJ3QgZGllLgpteSAkSW5zdGFsbF9Pbmx5ICAgICA9IDI7ICMgRG9uJ3QgY2FsbCBfc2V0X21ldGhvZHMoKQoKCm15IEBQdWJsaWNNZXRob2RzID0gcXcvCiAgICB2ZXJzaW9uIHR5cGVzIHF1b3RlX2NoYXIgZXNjYXBlX2NoYXIgc2VwX2NoYXIgZW9sIGFsd2F5c19xdW90ZSBiaW5hcnkgYWxsb3dfd2hpdGVzcGFjZQogICAga2VlcF9tZXRhX2luZm8gYWxsb3dfbG9vc2VfcXVvdGVzIGFsbG93X2xvb3NlX2VzY2FwZXMgdmVyYmF0aW0gbWV0YV9pbmZvIGlzX3F1b3RlZCBpc19iaW5hcnkgZW9mCiAgICBnZXRsaW5lIHByaW50IHBhcnNlIGNvbWJpbmUgZmllbGRzIHN0cmluZyBlcnJvcl9kaWFnIGVycm9yX2lucHV0IHN0YXR1cyBibGFua19pc191bmRlZgogICAgZ2V0bGluZV9ociBjb2x1bW5fbmFtZXMgYmluZF9jb2x1bW5zCiAgICBQViBJViBOVgovOwojCm15IEBVbmRvY3VtZW50ZWRYU01ldGhvZHMgPSBxdy9Db21iaW5lIFBhcnNlIFNldERpYWcvOwoKbXkgQFVuZG9jdW1lbnRlZFBQTWV0aG9kcyA9IHF3Ly87ICMgQ3VycmVudGx5IGVtcHR5CgoKIyBDaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGVjaWRlIHdvcmtlciBtb2R1bGUuIAoKdW5sZXNzICgkVGV4dDo6Q1NWOjpXb3JrZXIpIHsKICAgICRUZXh0OjpDU1Y6OkRFQlVHIGFuZCAgQ2FycDo6Y2FycCgiQ2hlY2sgdXNlZCB3b3JrZXIgbW9kdWxlLi4uIik7CgogICAgaWYgKCBleGlzdHMgJEVOVntQRVJMX1RFWFRfQ1NWfSApIHsKICAgICAgICBpZiAoJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnMCcgb3IgJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnVGV4dDo6Q1NWX1BQJykgewogICAgICAgICAgICBfbG9hZF9wcCgpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnMScgb3IgJEVOVntQRVJMX1RFWFRfQ1NWfSA9fiAvVGV4dDo6Q1NWX1hTXHMqLFxzKlRleHQ6OkNTVl9QUC8pIHsKICAgICAgICAgICAgX2xvYWRfeHMoJEluc3RhbGxfRG9udF9EaWUpIG9yIF9sb2FkX3BwKCk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICcyJyBvciAkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICdUZXh0OjpDU1ZfWFMnKSB7CiAgICAgICAgICAgIF9sb2FkX3hzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBDYXJwOjpjcm9hayAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50YWwgdmFyaWFibGUgJ1BFUkxfVEVYVF9DU1YnIGlzIGludmFsaWQuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBfbG9hZF94cygkSW5zdGFsbF9Eb250X0RpZSkgb3IgX2xvYWRfcHAoKTsKICAgIH0KCn0KCgpteSAkY29tcGlsZV9keW5hbWljX21vZGUgPSBzdWIgewogICAgbXkgKCRjbGFzcywgJHdvcmtlcikgPSBAXzsKCiAgICBsb2NhbCAkXlc7CiAgICBubyBzdHJpY3QgcXcocmVmcyk7CgogICAgZm9yIG15ICRtZXRob2QgKEBQdWJsaWNNZXRob2RzKSB7CiAgICAgICAgZXZhbCBxcXwKICAgICAgICAgICAgKnsiJGNsYXNzXDo6JG1ldGhvZCJ9ID0gc3ViIHsKICAgICAgICAgICAgICAgIG15IFwkc2VsZiA9IHNoaWZ0OwogICAgICAgICAgICAgICAgXCRzZWxmLT57X01PRFVMRX0gLT4gJG1ldGhvZChcQF8pOwogICAgICAgICAgICB9OwogICAgICAgIHw7CiAgICB9CgogICAgKlRleHQ6OkNTVjo6bmV3ID0gXCZfbmV3X2R5bmFtaWM7Cn07CgoKc3ViIGltcG9ydCB7CiAgICBteSAoJGNsYXNzLCAkb3B0aW9uKSA9IEBfOwogICAgaWYgKCRvcHRpb24gYW5kICRvcHRpb24gZXEgJy1keW5hbWljJykgewogICAgICAgICRjb21waWxlX2R5bmFtaWNfbW9kZS0+KCRjbGFzcyA9PiAkVGV4dDo6Q1NWOjpXb3JrZXIpOwogICAgICAgICRJc19EeW5hbWljID0gMTsKICAgICAgICAkVGV4dDo6Q1NWOjpERUJVRyBhbmQgIENhcnA6OmNhcnAoIkR5bmFtaWMgd29ya2VyIG1vZHVsZSBtb2RlLiIpLCAiXG4iOwogICAgfQp9CgoKc3ViIF9uZXdfZHluYW1pYyB7CiAgICBteSAkcHJvdG8gID0gc2hpZnQ7CiAgICBteSAkY2xhc3MgID0gcmVmKCRwcm90bykgfHwgJHByb3RvIG9yIHJldHVybjsKICAgIG15ICRtb2R1bGUgPSAkVGV4dDo6Q1NWOjpXb3JrZXI7CgogICAgaWYgKHJlZiAkX1swXSBhbmQgJF9bMF0tPnttb2R1bGV9KSB7CiAgICAgICAgJG1vZHVsZSA9IGRlbGV0ZSAkX1swXS0+e21vZHVsZX07ICMgQ2F1dGlvbiEgZGVsZXRlZCBmcm9tIG9yaWdpbmFsIGhhc2hyZWYgdG9vLgoKICAgICAgICBteSAkaW5zdGFsbGVkID0gJG1vZHVsZSAuICcucG0nOwogICAgICAgICRpbnN0YWxsZWQgPX4gc3s6On17L307CgogICAgICAgIHVubGVzcyAoJElOQ3sgJGluc3RhbGxlZCB9KSB7ICMgTm90IHlldCBpbnN0YWxsZWQKICAgICAgICAgICAgaWYgKCRtb2R1bGUgZXEgJE1vZHVsZV9YUykgewogICAgICAgICAgICAgICAgX2xvYWRfeHMoJEluc3RhbGxfT25seSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRtb2R1bGUgZXEgJE1vZHVsZV9QUCkgewogICAgICAgICAgICAgICAgX2xvYWRfcHAoJEluc3RhbGxfT25seSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIGlmICggbXkgJG9iaiA9ICRtb2R1bGUtPm5ldyhAXykgKSB7CiAgICAgICAgbXkgJHNlbGYgPSBibGVzcyB7fSwgJGNsYXNzOwogICAgICAgICRzZWxmLT57X01PRFVMRX0gPSAkb2JqOwogICAgICAgIHJldHVybiAkc2VsZjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KCn0KCgpzdWIgbmV3IHsgIyBub3JtYWwgbW9kZQogICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICBteSAkY2xhc3MgPSByZWYoJHByb3RvKSB8fCAkcHJvdG87CgogICAgdW5sZXNzICggJHByb3RvICkgeyAjIGZvciBUZXh0OjpDU1ZfWFMvUFA6Om5ldygwKTsKICAgICAgICByZXR1cm4gZXZhbCBxcXwgJFRleHQ6OkNTVjo6V29ya2VyXDo6bmV3KCBcJHByb3RvICkgfDsKICAgIH0KCiMgICAgcmV0dXJuICRUZXh0OjpDU1Y6Oldvcmtlci0+bmV3KEBfKTsKCiAgICBpZiAocmVmICRfWzBdIGFuZCAkX1swXS0+e21vZHVsZX0pIHsKICAgICAgICBDYXJwOjpjcm9haygiQ2FuJ3Qgc2V0ICdtb2R1bGUnIGluIG5vbiBkeW5hbWljIG1vZGUuIik7CiAgICB9CgogICAgaWYgKCBteSAkb2JqID0gJFRleHQ6OkNTVjo6V29ya2VyLT5uZXcoQF8pICkgewogICAgICAgICRvYmotPntfTU9EVUxFfSA9ICRUZXh0OjpDU1Y6OldvcmtlcjsKICAgICAgICBibGVzcyAkb2JqLCAkY2xhc3M7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9CgoKfQoKCnN1YiByZXF1aXJlX3hzX3ZlcnNpb24geyAkWFNfVmVyc2lvbjsgfQoKCnN1YiBtb2R1bGUgewogICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICByZXR1cm4gICAhcmVmKCRwcm90bykgICAgICAgICAgICA/ICRUZXh0OjpDU1Y6OldvcmtlcgogICAgICAgICAgIDogIHJlZigkcHJvdG8tPntfTU9EVUxFfSkgPyByZWYoJHByb3RvLT57X01PRFVMRX0pIDogJHByb3RvLT57X01PRFVMRX07Cn0KCipiYWNrZW5kID0gKm1vZHVsZTsKCgpzdWIgaXNfeHMgewogICAgcmV0dXJuICRfWzBdLT5tb2R1bGUgZXEgJE1vZHVsZV9YUzsKfQoKCnN1YiBpc19wcCB7CiAgICByZXR1cm4gJF9bMF0tPm1vZHVsZSBlcSAkTW9kdWxlX1BQOwp9CgoKc3ViIGlzX2R5bmFtaWMgeyAkSXNfRHluYW1pYzsgfQoKCnN1YiBBVVRPTE9BRCB7CiAgICBteSAkc2VsZiA9ICRfWzBdOwogICAgbXkgJGF0dHIgPSAkVGV4dDo6Q1NWOjpBVVRPTE9BRDsKICAgICRhdHRyID1+IHMvLio6Oi8vOwogICAgcmV0dXJuIHVubGVzcyAkYXR0ciA9fiAvXl8vOwoKICAgIG15ICRwa2cgPSAkVGV4dDo6Q1NWOjpXb3JrZXI7CgogICAgbXkgJG1ldGhvZCA9ICIkcGtnXDo6JGF0dHIiOwoKICAgICRUZXh0OjpDU1Y6OkRFQlVHIGFuZCBDYXJwOjpjYXJwKCInJGF0dHInIGlzIHByaXZhdGUgbWV0aG9kLCBzbyB0cnkgdG8gYXV0b2xvYWQuLi4iKTsKCiAgICBsb2NhbCAkXlc7CiAgICBubyBzdHJpY3QgcXcocmVmcyk7CgogICAgKnsiVGV4dDo6Q1NWOjokYXR0ciJ9ID0gKnsiJHBrZ1w6OiRhdHRyIn07CgogICAgZ290byAmJGF0dHI7Cn0KCgoKc3ViIF9sb2FkX3hzIHsKICAgIG15ICRvcHQgPSBzaGlmdDsKCiAgICAkVGV4dDo6Q1NWOjpERUJVRyBhbmQgQ2FycDo6Y2FycCAiTG9hZCAkTW9kdWxlX1hTLiI7CgogICAgZXZhbCBxcXwgdXNlICRNb2R1bGVfWFMgJFhTX1ZlcnNpb24gfDsKCiAgICBpZiAoJEApIHsKICAgICAgICBpZiAoZGVmaW5lZCAkb3B0IGFuZCAkb3B0ICYgJEluc3RhbGxfRG9udF9EaWUpIHsKICAgICAgICAgICAgJFRleHQ6OkNTVjo6REVCVUcgYW5kIENhcnA6OmNhcnAgIkNhbid0IGxvYWQgJE1vZHVsZV9YUy4uLigkQCkiOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgQ2FycDo6Y3JvYWsgJEA7CiAgICB9CgogICAgcHVzaCBAVGV4dDo6Q1NWOjpJU0EsICdUZXh0OjpDU1ZfWFMnOwoKICAgIHVubGVzcyAoZGVmaW5lZCAkb3B0IGFuZCAkb3B0ICYgJEluc3RhbGxfT25seSkgewogICAgICAgIF9zZXRfbWV0aG9kcyggJFRleHQ6OkNTVjo6V29ya2VyID0gJE1vZHVsZV9YUyApOwogICAgfQoKICAgIHJldHVybiAxOwp9OwoKCnN1YiBfbG9hZF9wcCB7CiAgICBteSAkb3B0ID0gc2hpZnQ7CgogICAgJFRleHQ6OkNTVjo6REVCVUcgYW5kIENhcnA6OmNhcnAgIkxvYWQgJE1vZHVsZV9QUC4iOwoKICAgIGV2YWwgcXF8IHJlcXVpcmUgJE1vZHVsZV9QUCB8OwogICAgaWYgKCRAKSB7CiAgICAgICAgQ2FycDo6Y3JvYWsgJEA7CiAgICB9CgogICAgcHVzaCBAVGV4dDo6Q1NWOjpJU0EsICdUZXh0OjpDU1ZfUFAnOwoKICAgIHVubGVzcyAoZGVmaW5lZCAkb3B0IGFuZCAkb3B0ICYgJEluc3RhbGxfT25seSkgewogICAgICAgIF9zZXRfbWV0aG9kcyggJFRleHQ6OkNTVjo6V29ya2VyID0gJE1vZHVsZV9QUCApOwogICAgfQp9OwoKCgoKc3ViIF9zZXRfbWV0aG9kcyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKCiAgICAjcmV0dXJuOwoKICAgIGxvY2FsICReVzsKICAgIG5vIHN0cmljdCBxdyhyZWZzKTsKCiAgICBmb3IgbXkgJG1ldGhvZCAoQFB1YmxpY01ldGhvZHMpIHsKICAgICAgICAqeyJUZXh0OjpDU1Y6OiRtZXRob2QifSA9IFwmeyIkY2xhc3NcOjokbWV0aG9kIn07CiAgICB9CgogICAgaWYgKCRUZXh0OjpDU1Y6OldvcmtlciBlcSAkTW9kdWxlX1hTKSB7CiAgICAgICAgZm9yIG15ICRtZXRob2QgKEBVbmRvY3VtZW50ZWRYU01ldGhvZHMpIHsKICAgICAgICAgICAgKnsiVGV4dDo6Q1NWOjokbWV0aG9kIn0gPSBcJnsiJE1vZHVsZV9YU1w6OiRtZXRob2QifTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRUZXh0OjpDU1Y6OldvcmtlciBlcSAkTW9kdWxlX1BQKSB7CiAgICAgICAgZm9yIG15ICRtZXRob2QgKEBVbmRvY3VtZW50ZWRQUE1ldGhvZHMpIHsKICAgICAgICAgICAgKnsiVGV4dDo6Q1NWOjokbWV0aG9kIn0gPSBcJnsiJE1vZHVsZV9QUFw6OiRtZXRob2QifTsKICAgICAgICB9CiAgICB9Cgp9CgoKCjE7Cl9fRU5EX18KCj1wb2QKCj1oZWFkMSBOQU1FCgpUZXh0OjpDU1YgLSBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIG1hbmlwdWxhdG9yICh1c2luZyBYUyBvciBQdXJlUGVybCkKCgo9aGVhZDEgU1lOT1BTSVMKCiB1c2UgVGV4dDo6Q1NWOwogCiAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcoKTsgICAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IG9iamVjdAogCiAjIElmIHlvdSB3YW50IHRvIGhhbmRsZSBub24tYXNjaWkgY2hhci4KICRjc3YgPSBUZXh0OjpDU1YtPm5ldyh7YmluYXJ5ID0+IDF9KTsKIAogJHN0YXR1cyA9ICRjc3YtPmNvbWJpbmUoQGNvbHVtbnMpOyAgICAjIGNvbWJpbmUgY29sdW1ucyBpbnRvIGEgc3RyaW5nCiAkbGluZSAgID0gJGNzdi0+c3RyaW5nKCk7ICAgICAgICAgICAgICMgZ2V0IHRoZSBjb21iaW5lZCBzdHJpbmcKIAogJHN0YXR1cyAgPSAkY3N2LT5wYXJzZSgkbGluZSk7ICAgICAgICAjIHBhcnNlIGEgQ1NWIHN0cmluZyBpbnRvIGZpZWxkcwogQGNvbHVtbnMgPSAkY3N2LT5maWVsZHMoKTsgICAgICAgICAgICAjIGdldCB0aGUgcGFyc2VkIGZpZWxkcwogCiAkc3RhdHVzICAgICAgID0gJGNzdi0+c3RhdHVzICgpOyAgICAgICMgZ2V0IHRoZSBtb3N0IHJlY2VudCBzdGF0dXMKICRiYWRfYXJndW1lbnQgPSAkY3N2LT5lcnJvcl9pbnB1dCAoKTsgIyBnZXQgdGhlIG1vc3QgcmVjZW50IGJhZCBhcmd1bWVudAogJGRpYWcgICAgICAgICA9ICRjc3YtPmVycm9yX2RpYWcgKCk7ICAjIGlmIGFuIGVycm9yIG9jY3VyZWQsIGV4cGxhaW5zIFdIWQogCiAkc3RhdHVzID0gJGNzdi0+cHJpbnQgKCRpbywgJGNvbHJlZik7ICMgV3JpdGUgYW4gYXJyYXkgb2YgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgdG8gYSBmaWxlICRpbwogJGNvbHJlZiA9ICRjc3YtPmdldGxpbmUgKCRpbyk7ICAgICAgICAjIFJlYWQgYSBsaW5lIGZyb20gZmlsZSAkaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFyc2UgaXQgYW5kIHJldHVybiBhbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlZiBvZiBmaWVsZHMKICRjc3YtPmNvbHVtbl9uYW1lcyAoQG5hbWVzKTsgICAgICAgICAgIyBTZXQgY29sdW1uIG5hbWVzIGZvciBnZXRsaW5lX2hyICgpCiAkcmVmID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsgICAgICAgICMgZ2V0bGluZSAoKSwgYnV0IHJldHVybnMgYSBoYXNocmVmCiAkZW9mID0gJGNzdi0+ZW9mICgpOyAgICAgICAgICAgICAgICAgICMgSW5kaWNhdGUgaWYgbGFzdCBwYXJzZSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldGxpbmUgKCkgaGl0IEVuZCBPZiBGaWxlCiAKICRjc3YtPnR5cGVzKFxAdF9hcnJheSk7ICAgICAgICAgICAgICAgIyBTZXQgY29sdW1uIHR5cGVzCgoKPWhlYWQxIERFU0NSSVBUSU9OCgpUZXh0OjpDU1YgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgdGhlIGNvbXBvc2l0aW9uIGFuZCBkZWNvbXBvc2l0aW9uIG9mCmNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgdXNpbmcgTDxUZXh0OjpDU1ZfWFM+IG9yIGl0cyBwdXJlIFBlcmwgdmVyc2lvbi4KCkFuIGluc3RhbmNlIG9mIHRoZSBUZXh0OjpDU1YgY2xhc3MgY2FuIGNvbWJpbmUgZmllbGRzIGludG8gYSBDU1Ygc3RyaW5nCmFuZCBwYXJzZSBhIENTViBzdHJpbmcgaW50byBmaWVsZHMuCgpUaGUgbW9kdWxlIGFjY2VwdHMgZWl0aGVyIHN0cmluZ3Mgb3IgZmlsZXMgYXMgaW5wdXQgYW5kIGNhbiB1dGlsaXplIGFueQp1c2VyLXNwZWNpZmllZCBjaGFyYWN0ZXJzIGFzIGRlbGltaXRlcnMsIHNlcGFyYXRvcnMsIGFuZCBlc2NhcGVzIHNvIGl0IGlzCnBlcmhhcHMgYmV0dGVyIGNhbGxlZCBBU1YgKGFueXRoaW5nIHNlcGFyYXRlZCB2YWx1ZXMpIHJhdGhlciB0aGFuIGp1c3QgQ1NWLgoKPWhlYWQyIEJJTkFSWSBNT0RFCgpUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBvbmx5IGFjY2VwdCBhc2NpaSBjaGFyYWN0ZXJzLgpJbiBtYW55IGNhc2VzLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIFRleHQ6OkNTViBvYmplY3Qgd2l0aApiaW5hcnkgbW9kZS4KCiBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcoe2JpbmFyeSA9PiAxfSk7CgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvRW1iZWRkZWQgbmV3bGluZXM+LgoKPWhlYWQxIFNQRUNJRklDQVRJT04KClNlZSB0byBMPFRleHQ6OkNTVl9YUy9TUEVDSUZJQ0FUSU9OPi4KCj1oZWFkMSBWRVJTSU9OCgogICAgMS4wNAoKVGhpcyBtb2R1bGUgaXMgY29tcGF0aWJsZSB3aXRoIFRleHQ6OkNTVl9YUyBCPDAuNDM+LgoKPWhlYWQxIEZVTkNUSU9OUwoKVGhlc2UgbWV0aG9kcyBhcmUgY29tbW9uIGJldHdlZW4gWFMgYW5kIHB1ZXIgUGVybCB2ZXJzaW9uLgpNb3N0IG9mIHRoZSBkb2N1bWVudCB3YXMgc2hhbWVsZXNzbHkgY29waWVkIGFuZCByZXBsYWNlZCBmcm9tIFRleHQ6OkNTVl9YUy4KCj1oZWFkMiB2ZXJzaW9uICgpCgooQ2xhc3MgbWV0aG9kKSBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbW9kdWxlIHZlcnNpb24uCklmIHlvdSB3YW50IHRoZSBtb2R1bGUgdmVyc2lvbiwgeW91IGNhbiB1c2UgdGhlIEM8VkVSU0lPTj4gbWV0aG9kLAoKIHByaW50IFRleHQ6OkNTVi0+VkVSU0lPTjsgICAgICAjIFRoaXMgbW9kdWxlIHZlcnNpb24KIHByaW50IFRleHQ6OkNTVi0+dmVyc2lvbjsgICAgICAjIFRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JrZXIgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1lIGFzIFRleHQ6OkNTVi0+YmFja2VuZC0+dmVyc2lvbgoKPWhlYWQyIG5ldyAoXCVhdHRyKQoKKENsYXNzIG1ldGhvZCkgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBUZXh0OjpDU1ZfWFMuIFRoZSBvYmplY3RzCmF0dHJpYnV0ZXMgYXJlIGRlc2NyaWJlZCBieSB0aGUgKG9wdGlvbmFsKSBoYXNoIHJlZiBDPFwlYXR0cj4uCkN1cnJlbnRseSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZToKCj1vdmVyIDQKCj1pdGVtIGVvbAoKQW4gZW5kLW9mLWxpbmUgc3RyaW5nIHRvIGFkZCB0byByb3dzLCB1c3VhbGx5IEM8dW5kZWY+IChub3RoaW5nLApkZWZhdWx0KSwgQzwiXDAxMiI+IChMaW5lIEZlZWQpIG9yIEM8IlwwMTVcMDEyIj4gKENhcnJpYWdlIFJldHVybiwKTGluZSBGZWVkKS4gQ2Fubm90IGJlIGxvbmdlciB0aGFuIDcgKEFTQ0lJKSBjaGFyYWN0ZXJzLgoKSWYgYm90aCBDPCQvPiBhbmQgQzxlb2w+IGVxdWFsIEM8IlwwMTUiPiwgcGFyc2luZyBsaW5lcyB0aGF0IGVuZCBvbgpvbmx5IGEgQ2FycmlhZ2UgUmV0dXJuIHdpdGhvdXQgTGluZSBGZWVkLCB3aWxsIGJlIEM8cGFyc2U+ZCBjb3JyZWN0LgpMaW5lIGVuZGluZ3MsIHdoZXRoZXIgaW4gQzwkLz4gb3IgQzxlb2w+LCBvdGhlciB0aGFuIEM8dW5kZWY+LApDPCJcbiI+LCBDPCJcclxuIj4sIG9yIEM8IlxyIj4gYXJlIG5vdCAoeWV0KSBzdXBwb3J0ZWQgZm9yIHBhcnNpbmcuCgo9aXRlbSBzZXBfY2hhcgoKVGhlIGNoYXIgdXNlZCBmb3Igc2VwYXJhdGluZyBmaWVsZHMsIGJ5IGRlZmF1bHQgYSBjb21tYS4gKEM8LD4pLgpMaW1pdGVkIHRvIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZSByYW5nZSBmcm9tIDB4MjAKKHNwYWNlKSB0byAweDdlICh0aWxkZSkuCgpUaGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgcXVvdGUgY2hhcmFjdGVyLgpUaGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgZXNjYXBlIGNoYXJhY3Rlci4KCj1pdGVtIGFsbG93X3doaXRlc3BhY2UKCldoZW4gdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHdoaXRlc3BhY2UgKFRBQidzIGFuZCBTUEFDRSdzKQpzdXJyb3VuZGluZyB0aGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgaXMgcmVtb3ZlZCB3aGVuIHBhcnNpbmcuIFNvCmxpbmVzIGxpa2U6CgogIDEgLCAiZm9vIiAsIGJhciAsIDMgLCB6YXBwCgphcmUgbm93IGNvcnJlY3RseSBwYXJzZWQsIGV2ZW4gdGhvdWdoIGl0IHZpb2xhdGVzIHRoZSBDU1Ygc3BlY3MuCk5vdGUgdGhhdCBCPGFsbD4gd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIHN0YXJ0IGFuZCBlbmQgb2YgZWFjaApmaWVsZC4gVGhhdCB3b3VsZCBtYWtlIGlzIG1vcmUgYSBJPGZlYXR1cmU+IHRoYW4gYSB3YXkgdG8gYmUgYWJsZQp0byBwYXJzZSBiYWQgQ1NWIGxpbmVzLCBhcwoKIDEsICAgMi4wLCAgMywgICBhcGUgICwgbW9ua2V5Cgp3aWxsIG5vdyBiZSBwYXJzZWQgYXMKCiAoIjEiLCAiMi4wIiwgIjMiLCAiYXBlIiwgIm1vbmtleSIpCgpldmVuIGlmIHRoZSBvcmlnaW5hbCBsaW5lIHdhcyBwZXJmZWN0bHkgc2FuZSBDU1YuCgo9aXRlbSBibGFua19pc191bmRlZgoKVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIENTViBkYXRhIG1ha2VzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4KcXVvdGVkLSBhbmQgdW5xdW90ZWQgZW1wdHkgZmllbGRzLiBUaGV5IGJvdGggZW5kIHVwIGluIGFuIGVtcHR5CnN0cmluZyBmaWVsZCBvbmNlIHJlYWQsIHNvCgogMSwiIiwsIiAiLDIKCmlzIHJlYWQgYXMKCiAoIjEiLCAiIiwgIiIsICIgIiwgIjIiKQoKV2hlbiBJPHdyaXRpbmc+IENTViBmaWxlcyB3aXRoIEM8YWx3YXlzX3F1b3RlPiBzZXQsIHRoZSB1bnF1b3RlZCBlbXB0eQpmaWVsZCBpcyB0aGUgcmVzdWx0IG9mIGFuIHVuZGVmaW5lZCB2YWx1ZS4gVG8gbWFrZSBpdCBwb3NzaWJsZSB0byBhbHNvCm1ha2UgdGhpcyBkaXN0aW5jdGlvbiB3aGVuIHJlYWRpbmcgQ1NWIGRhdGEsIHRoZSBDPGJsYW5rX2lzX3VuZGVmPiBvcHRpb24Kd2lsbCBjYXVzZSB1bnF1b3RlZCBlbXB0eSBmaWVsZHMgdG8gYmUgc2V0IHRvIHVuZGVmLCBjYXVzaW5nIHRoZSBhYm92ZSB0bwpiZSBwYXJzZWQgYXMKCiAoIjEiLCAiIiwgdW5kZWYsICIgIiwgIjIiKQoKPWl0ZW0gcXVvdGVfY2hhcgoKVGhlIGNoYXIgdXNlZCBmb3IgcXVvdGluZyBmaWVsZHMgY29udGFpbmluZyBibGFua3MsIGJ5IGRlZmF1bHQgdGhlCmRvdWJsZSBxdW90ZSBjaGFyYWN0ZXIgKEM8Ij4pLiBBIHZhbHVlIG9mIHVuZGVmIHN1cHByZXNzZXMKcXVvdGUgY2hhcnMuIChGb3Igc2ltcGxlIGNhc2VzIG9ubHkpLgpMaW1pdGVkIHRvIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZSByYW5nZSBmcm9tIDB4MjAKKHNwYWNlKSB0byAweDdlICh0aWxkZSkuCgpUaGUgcXVvdGUgY2hhcmFjdGVyIGNhbiBub3QgYmUgZXF1YWwgdG8gdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyLgoKPWl0ZW0gYWxsb3dfbG9vc2VfcXVvdGVzCgpCeSBkZWZhdWx0LCBwYXJzaW5nIGZpZWxkcyB0aGF0IGhhdmUgQzxxdW90ZV9jaGFyPiBjaGFyYWN0ZXJzIGluc2lkZQphbiB1bnF1b3RlZCBmaWVsZCwgbGlrZQoKIDEsZm9vICJiYXIiIGJheiw0MgoKd291bGQgcmVzdWx0IGluIGEgcGFyc2UgZXJyb3IuIFRob3VnaCBpdCBpcyBzdGlsbCBiYWQgcHJhY3RpY2UgdG8KYWxsb3cgdGhpcyBmb3JtYXQsIHdlIGNhbm5vdCBoZWxwIHRoZXJlIGFyZSBzb21lIHZlbmRvcnMgdGhhdCBtYWtlCnRoZWlyIGFwcGxpY2F0aW9ucyBzcGl0IG91dCBsaW5lcyBzdHlsZWQgbGlrZSB0aGlzLgoKSW4gY2FzZSB0aGVyZSBpcyBCPHJlYWxseT4gYmFkIENTViBkYXRhLCBsaWtlCgogMSwiZm9vICJiYXIiIGJheiIsNDIKCm9yCgogMSwiImZvbyBiYXIgYmF6IiIsNDIKCnRoZXJlIGlzIGEgd2F5IHRvIGdldCB0aGF0IHBhcnNlZCwgYW5kIGxlYXZlIHRoZSBxdW90ZXMgaW5zaWRlIHRoZSBxdW90ZWQKZmllbGQgYXMtaXMuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHNldHRpbmcgQzxhbGxvd19sb29zZV9xdW90ZXM+IEI8QU5EPgptYWtpbmcgc3VyZSB0aGF0IHRoZSBDPGVzY2FwZV9jaGFyPiBpcyBJPG5vdD4gZXF1YWwgdG8gQzxxdW90ZV9jaGFyPi4KCj1pdGVtIGVzY2FwZV9jaGFyCgpUaGUgY2hhcmFjdGVyIHVzZWQgZm9yIGVzY2FwaW5nIGNlcnRhaW4gY2hhcmFjdGVycyBpbnNpZGUgcXVvdGVkIGZpZWxkcy4KTGltaXRlZCB0byBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlciwgdXN1YWxseSBpbiB0aGUgcmFuZ2UgZnJvbSAweDIwCihzcGFjZSkgdG8gMHg3ZSAodGlsZGUpLgoKVGhlIEM8ZXNjYXBlX2NoYXI+IGRlZmF1bHRzIHRvIGJlaW5nIHRoZSBsaXRlcmFsIGRvdWJsZS1xdW90ZSBtYXJrIChDPCI+KQppbiBvdGhlciB3b3JkcywgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQgQzxxdW90ZV9jaGFyPi4gVGhpcyBtZWFucyB0aGF0CmRvdWJsaW5nIHRoZSBxdW90ZSBtYXJrIGluIGEgZmllbGQgZXNjYXBlcyBpdDoKCiAgImZvbyIsImJhciIsIkVzY2FwZSAiInF1b3RlIG1hcmsiIiB3aXRoIHR3byAiInF1b3RlIG1hcmtzIiIiLCJiYXoiCgpJZiB5b3UgY2hhbmdlIHRoZSBkZWZhdWx0IHF1b3RlX2NoYXIgd2l0aG91dCBjaGFuZ2luZyB0aGUgZGVmYXVsdAplc2NhcGVfY2hhciwgdGhlIGVzY2FwZV9jaGFyIHdpbGwgc3RpbGwgYmUgdGhlIHF1b3RlIG1hcmsuICBJZiBpbnN0ZWFkIAp5b3Ugd2FudCB0byBlc2NhcGUgdGhlIHF1b3RlX2NoYXIgYnkgZG91YmxpbmcgaXQsIHlvdSB3aWxsIG5lZWQgdG8gY2hhbmdlCnRoZSBlc2NhcGVfY2hhciB0byBiZSB0aGUgc2FtZSBhcyB3aGF0IHlvdSBjaGFuZ2VkIHRoZSBxdW90ZV9jaGFyIHRvLgoKVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIuCgo9aXRlbSBhbGxvd19sb29zZV9lc2NhcGVzCgpCeSBkZWZhdWx0LCBwYXJzaW5nIGZpZWxkcyB0aGF0IGhhdmUgQzxlc2NhcGVfY2hhcj4gY2hhcmFjdGVycyB0aGF0CmVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90IG5lZWQgdG8gYmUgZXNjYXBlZCwgbGlrZToKCiBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgZXNjYXBlX2NoYXIgPT4gIlxcIiB9KTsKICRjc3YtPnBhcnNlIChxcXsxLCJteSBiYXJcJ3MiLGJheiw0Mn0pOwoKd291bGQgcmVzdWx0IGluIGEgcGFyc2UgZXJyb3IuIFRob3VnaCBpdCBpcyBzdGlsbCBiYWQgcHJhY3RpY2UgdG8KYWxsb3cgdGhpcyBmb3JtYXQsIHRoaXMgb3B0aW9uIGVuYWJsZXMgeW91IHRvIHRyZWF0IGFsbCBlc2NhcGUgY2hhcmFjdGVyCnNlcXVlbmNlcyBlcXVhbC4KCj1pdGVtIGJpbmFyeQoKSWYgdGhpcyBhdHRyaWJ1dGUgaXMgVFJVRSwgeW91IG1heSB1c2UgYmluYXJ5IGNoYXJhY3RlcnMgaW4gcXVvdGVkIGZpZWxkcywKaW5jbHVkaW5nIGxpbmUgZmVlZHMsIGNhcnJpYWdlIHJldHVybnMgYW5kIE5VTEwgYnl0ZXMuIChUaGUgbGF0dGVyIG11c3QKYmUgZXNjYXBlZCBhcyBDPCIwPi4pIEJ5IGRlZmF1bHQgdGhpcyBmZWF0dXJlIGlzIG9mZi4KCj1pdGVtIHR5cGVzCgpBIHNldCBvZiBjb2x1bW4gdHlwZXM7IHRoaXMgYXR0cmlidXRlIGlzIGltbWVkaWF0ZWx5IHBhc3NlZCB0byB0aGUKSTx0eXBlcz4gbWV0aG9kIGJlbG93LiBZb3UgbXVzdCBub3Qgc2V0IHRoaXMgYXR0cmlidXRlIG90aGVyd2lzZSwKZXhjZXB0IGZvciB1c2luZyB0aGUgSTx0eXBlcz4gbWV0aG9kLiBGb3IgZGV0YWlscyBzZWUgdGhlIGRlc2NyaXB0aW9uCm9mIHRoZSBJPHR5cGVzPiBtZXRob2QgYmVsb3cuCgo9aXRlbSBhbHdheXNfcXVvdGUKCkJ5IGRlZmF1bHQgdGhlIGdlbmVyYXRlZCBmaWVsZHMgYXJlIHF1b3RlZCBvbmx5LCBpZiB0aGV5IG5lZWQgdG8sIGZvcgpleGFtcGxlLCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNlcGFyYXRvci4gSWYgeW91IHNldCB0aGlzIGF0dHJpYnV0ZSB0bwphIFRSVUUgdmFsdWUsIHRoZW4gYWxsIGZpZWxkcyB3aWxsIGJlIHF1b3RlZC4gVGhpcyBpcyB0eXBpY2FsbHkgZWFzaWVyCnRvIGhhbmRsZSBpbiBleHRlcm5hbCBhcHBsaWNhdGlvbnMuCgo9aXRlbSBrZWVwX21ldGFfaW5mbwoKQnkgZGVmYXVsdCwgdGhlIHBhcnNpbmcgb2YgaW5wdXQgbGluZXMgaXMgYXMgc2ltcGxlIGFuZCBmYXN0IGFzCnBvc3NpYmxlLiBIb3dldmVyLCBzb21lIHBhcnNpbmcgaW5mb3JtYXRpb24gLSBsaWtlIHF1b3RhdGlvbiBvZgp0aGUgb3JpZ2luYWwgZmllbGQgLSBpcyBsb3N0IGluIHRoYXQgcHJvY2Vzcy4gU2V0IHRoaXMgZmxhZyB0bwp0cnVlIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgdGhhdCBpbmZvcm1hdGlvbiBhZnRlciBwYXJzaW5nIHdpdGgKdGhlIG1ldGhvZHMgQzxtZXRhX2luZm8gKCk+LCBDPGlzX3F1b3RlZCAoKT4sIGFuZCBDPGlzX2JpbmFyeSAoKT4KZGVzY3JpYmVkIGJlbG93LiAgRGVmYXVsdCBpcyBmYWxzZS4KCj1pdGVtIHZlcmJhdGltCgpUaGlzIGlzIGEgcXVpdGUgY29udHJvdmVyc2lhbCBhdHRyaWJ1dGUgdG8gc2V0LCBidXQgaXQgbWFrZXMgaGFyZAp0aGluZ3MgcG9zc2libGUuCgpUaGUgYmFzaWMgdGhvdWdodCBiZWhpbmQgdGhpcyBpcyB0byB0ZWxsIHRoZSBwYXJzZXIgdGhhdCB0aGUgbm9ybWFsbHkKc3BlY2lhbCBjaGFyYWN0ZXJzIG5ld2xpbmUgKE5MKSBhbmQgQ2FycmlhZ2UgUmV0dXJuIChDUikgd2lsbCBub3QgYmUKc3BlY2lhbCB3aGVuIHRoaXMgZmxhZyBpcyBzZXQsIGFuZCBiZSBkZWFsdCB3aXRoIGFzIGJlaW5nIG9yZGluYXJ5CmJpbmFyeSBjaGFyYWN0ZXJzLiBUaGlzIHdpbGwgZWFzZSB3b3JraW5nIHdpdGggZGF0YSB3aXRoIGVtYmVkZGVkCm5ld2xpbmVzLgoKV2hlbiBDPHZlcmJhdGltPiBpcyB1c2VkIHdpdGggQzxnZXRsaW5lICgpPiwgZ2V0bGluZQphdXRvLWNob21wJ3MgZXZlcnkgbGluZS4KCkltYWdpbmUgYSBmaWxlIGZvcm1hdCBsaWtlCgogIE1eXkhhbnNeSmFuc3Nlbl5LbGFzIDJcbjJBXkphXjExLTA2LTIwMDcjXHJcbgoKd2hlcmUsIHRoZSBsaW5lIGVuZGluZyBpcyBhIHZlcnkgc3BlY2lmaWMgIiNcclxuIiwgYW5kIHRoZSBzZXBfY2hhcgppcyBhIF4gKGNhcmV0KS4gTm9uZSBvZiB0aGUgZmllbGRzIGlzIHF1b3RlZCwgYnV0IGVtYmVkZGVkIGJpbmFyeQpkYXRhIGlzIGxpa2VseSB0byBiZSBwcmVzZW50LiBXaXRoIHRoZSBzcGVjaWZpYyBsaW5lIGVuZGluZywgdGhhdApzaG91bGRuJ3QgYmUgdG9vIGhhcmQgdG8gZGV0ZWN0LgoKQnkgZGVmYXVsdCwgVGV4dDo6Q1NWJyBwYXJzZSBmdW5jdGlvbiBob3dldmVyIGlzIGluc3RydWN0ZWQgdG8gb25seQprbm93IGFib3V0ICJcbiIgYW5kICJcciIgdG8gYmUgbGVnYWwgbGluZSBlbmRpbmdzLCBhbmQgc28gaGFzIHRvIGRlYWwKd2l0aCB0aGUgZW1iZWRkZWQgbmV3bGluZSBhcyBhIHJlYWwgZW5kLW9mLWxpbmUsIHNvIGl0IGNhbiBzY2FuIHRoZSBuZXh0CmxpbmUgaWYgYmluYXJ5IGlzIHRydWUsIGFuZCB0aGUgbmV3bGluZSBpcyBpbnNpZGUgYSBxdW90ZWQgZmllbGQuCldpdGggdGhpcyBhdHRyaWJ1dGUgaG93ZXZlciwgd2UgY2FuIHRlbGwgcGFyc2UgKCkgdG8gcGFyc2UgdGhlIGxpbmUKYXMgaWYgXG4gaXMganVzdCBub3RoaW5nIG1vcmUgdGhhbiBhIGJpbmFyeSBjaGFyYWN0ZXIuCgpGb3IgcGFyc2UgKCkgdGhpcyBtZWFucyB0aGF0IHRoZSBwYXJzZXIgaGFzIG5vIGlkZWEgYWJvdXQgbGluZSBlbmRpbmcKYW55bW9yZSwgYW5kIGdldGxpbmUgKCkgY2hvbXBzIGxpbmUgZW5kaW5ncyBvbiByZWFkaW5nLgoKPWJhY2sKClRvIHN1bSBpdCB1cCwKCiAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKCk7CgppcyBlcXVpdmFsZW50IHRvCgogJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7CiAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgZXNjYXBlX2NoYXIgICAgICAgICA9PiAnIicsCiAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAnLCcsCiAgICAgZW9sICAgICAgICAgICAgICAgICA9PiAnJywKICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDAsCiAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAwLAogICAgIGtlZXBfbWV0YV9pbmZvICAgICAgPT4gMCwKICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMCwKICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgIH0pOwoKRm9yIGFsbCBvZiB0aGUgYWJvdmUgbWVudGlvbmVkIGZsYWdzLCB0aGVyZSBpcyBhbiBhY2Nlc3NvciBtZXRob2QKYXZhaWxhYmxlIHdoZXJlIHlvdSBjYW4gaW5xdWlyZSBmb3IgdGhlIGN1cnJlbnQgdmFsdWUsIG9yIGNoYW5nZQp0aGUgdmFsdWUKCiBteSAkcXVvdGUgPSAkY3N2LT5xdW90ZV9jaGFyOwogJGNzdi0+YmluYXJ5ICgxKTsKCkl0IGlzIHVud2lzZSB0byBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MgaGFsZndheSB0aHJvdWdoIHdyaXRpbmcgQ1NWCmRhdGEgdG8gYSBzdHJlYW0uIElmIGhvd2V2ZXIsIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBzdHJlYW0gdXNpbmcKdGhlIGF2YWlsYWJsZSBDU1Ygb2JqZWN0LCB0aGVyZSBpcyBubyBoYXJtIGluIGNoYW5naW5nIHRoZW0uCgpJZiB0aGUgQzxuZXcgKCk+IGNvbnN0cnVjdG9yIGNhbGwgZmFpbHMsIGl0IHJldHVybnMgQzx1bmRlZj4sIGFuZCBtYWtlcwp0aGUgZmFpbCByZWFzb24gYXZhaWxhYmxlIHRocm91Z2ggdGhlIEM8ZXJyb3JfZGlhZyAoKT4gbWV0aG9kLgoKICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBlY3NfY2hhciA9PiAxIH0pIG9yCiAgICAgZGllIFRleHQ6OkNTVi0+ZXJyb3JfZGlhZyAoKTsKCkM8ZXJyb3JfZGlhZyAoKT4gd2lsbCByZXR1cm4gYSBzdHJpbmcgbGlrZQoKICJVbmtub3duIGF0dHJpYnV0ZSAnZWNzX2NoYXInIgoKPWhlYWQyIGNvbWJpbmUKCiAkc3RhdHVzID0gJGNzdi0+Y29tYmluZSAoQGNvbHVtbnMpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gY29uc3RydWN0cyBhIENTViBzdHJpbmcgZnJvbSB0aGUgYXJndW1lbnRzLCByZXR1cm5pbmcKc3VjY2VzcyBvciBmYWlsdXJlLiAgRmFpbHVyZSBjYW4gcmVzdWx0IGZyb20gbGFjayBvZiBhcmd1bWVudHMgb3IgYW4gYXJndW1lbnQKY29udGFpbmluZyBhbiBpbnZhbGlkIGNoYXJhY3Rlci4gIFVwb24gc3VjY2VzcywgQzxzdHJpbmcgKCk+IGNhbiBiZSBjYWxsZWQgdG8KcmV0cmlldmUgdGhlIHJlc3VsdGFudCBDU1Ygc3RyaW5nLiAgVXBvbiBmYWlsdXJlLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKQzxzdHJpbmcgKCk+IGlzIHVuZGVmaW5lZCBhbmQgQzxlcnJvcl9pbnB1dCAoKT4gY2FuIGJlIGNhbGxlZCB0byByZXRyaWV2ZSBhbgppbnZhbGlkIGFyZ3VtZW50LgoKPWhlYWQyIHByaW50CgogJHN0YXR1cyA9ICRjc3YtPnByaW50ICgkaW8sICRjb2xyZWYpOwoKU2ltaWxhciB0byBjb21iaW5lLCBidXQgaXQgZXhwZWN0cyBhbiBhcnJheSByZWYgYXMgaW5wdXQgKG5vdCBhbiBhcnJheSEpCmFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBub3QgcmVhbGx5IGNyZWF0ZWQsIGJ1dCBpbW1lZGlhdGVseSB3cml0dGVuCnRvIHRoZSBJPCRpbz4gb2JqZWN0LCB0eXBpY2FsbHkgYW4gSU8gaGFuZGxlIG9yIGFueSBvdGhlciBvYmplY3QgdGhhdApvZmZlcnMgYSBJPHByaW50PiBtZXRob2QuIE5vdGUsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgd3Jvbmc6Cgogb3BlbiBGSUxFLCAiPiIsICJ3aGF0ZXZlciI7CiAkc3RhdHVzID0gJGNzdi0+cHJpbnQgKFwqRklMRSwgJGNvbHJlZik7CgpUaGUgZ2xvYiBDPFwqRklMRT4gaXMgbm90IGFuIG9iamVjdCwgdGh1cyBpdCBkb2Vzbid0IGhhdmUgYSBwcmludAptZXRob2QuIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgYW4gSU86OkZpbGUgb2JqZWN0IG9yIHRvIGhpZGUgdGhlCmdsb2IgYmVoaW5kIGFuIElPOjpXcmFwIG9iamVjdC4gU2VlIEw8SU86OkZpbGUoMyk+IGFuZCBMPElPOjpXcmFwKDMpPgpmb3IgZGV0YWlscy4KCkZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZSBwcmludCBtZXRob2QgZG9lc24ndCBjcmVhdGUgYSByZXN1bHQgc3RyaW5nLgpJbiBwYXJ0aWN1bGFyIHRoZSBJPCRjc3YtRTxndD5zdHJpbmcgKCk+LCBJPCRjc3YtRTxndD5zdGF0dXMgKCk+LApJPCRjc3YtPmZpZWxkcyAoKT4gYW5kIEk8JGNzdi1FPGd0PmVycm9yX2lucHV0ICgpPiBtZXRob2RzIGFyZSBtZWFuaW5nbGVzcwphZnRlciBleGVjdXRpbmcgdGhpcyBtZXRob2QuCgo9aGVhZDIgc3RyaW5nCgogJGxpbmUgPSAkY3N2LT5zdHJpbmcgKCk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbnB1dCB0byBDPHBhcnNlICgpPiBvciB0aGUgcmVzdWx0YW50IENTVgpzdHJpbmcgb2YgQzxjb21iaW5lICgpPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCj1oZWFkMiBwYXJzZQoKICRzdGF0dXMgPSAkY3N2LT5wYXJzZSAoJGxpbmUpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gZGVjb21wb3NlcyBhIENTViBzdHJpbmcgaW50byBmaWVsZHMsIHJldHVybmluZwpzdWNjZXNzIG9yIGZhaWx1cmUuICBGYWlsdXJlIGNhbiByZXN1bHQgZnJvbSBhIGxhY2sgb2YgYXJndW1lbnQgb3IgdGhlCmdpdmVuIENTViBzdHJpbmcgaXMgaW1wcm9wZXJseSBmb3JtYXR0ZWQuICBVcG9uIHN1Y2Nlc3MsIEM8ZmllbGRzICgpPiBjYW4KYmUgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkZWNvbXBvc2VkIGZpZWxkcyAuICBVcG9uIGZhaWx1cmUsIHRoZSB2YWx1ZQpyZXR1cm5lZCBieSBDPGZpZWxkcyAoKT4gaXMgdW5kZWZpbmVkIGFuZCBDPGVycm9yX2lucHV0ICgpPiBjYW4gYmUgY2FsbGVkCnRvIHJldHJpZXZlIHRoZSBpbnZhbGlkIGFyZ3VtZW50LgoKWW91IG1heSB1c2UgdGhlIEk8dHlwZXMgKCk+IG1ldGhvZCBmb3Igc2V0dGluZyBjb2x1bW4gdHlwZXMuIFNlZSB0aGUKZGVzY3JpcHRpb24gYmVsb3cuCgo9aGVhZDIgZ2V0bGluZQoKICRjb2xyZWYgPSAkY3N2LT5nZXRsaW5lICgkaW8pOwoKVGhpcyBpcyB0aGUgY291bnRlcnBhcnQgdG8gcHJpbnQsIGxpa2UgcGFyc2UgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvCmNvbWJpbmU6IEl0IHJlYWRzIGEgcm93IGZyb20gdGhlIElPIG9iamVjdCAkaW8gdXNpbmcgJGlvLT5nZXRsaW5lICgpCmFuZCBwYXJzZXMgdGhpcyByb3cgaW50byBhbiBhcnJheSByZWYuIFRoaXMgYXJyYXkgcmVmIGlzIHJldHVybmVkCmJ5IHRoZSBmdW5jdGlvbiBvciB1bmRlZiBmb3IgZmFpbHVyZS4KCldoZW4gZmllbGRzIGFyZSBib3VuZCB3aXRoIEM8YmluZF9jb2x1bW5zICgpPiwgdGhlIHJldHVybiB2YWx1ZSBpcyBhCnJlZmVyZW5jZSB0byBhbiBlbXB0eSBsaXN0LgoKVGhlIEk8JGNzdi1FPGd0PnN0cmluZyAoKT4sIEk8JGNzdi1FPGd0PmZpZWxkcyAoKT4gYW5kIEk8JGNzdi1FPGd0PnN0YXR1cyAoKT4KbWV0aG9kcyBhcmUgbWVhbmluZ2xlc3MsIGFnYWluLgoKPWhlYWQyIGdldGxpbmVfaHIKClRoZSBDPGdldGxpbmVfaHIgKCk+IGFuZCBDPGNvbHVtbl9uYW1lcyAoKT4gbWV0aG9kcyB3b3JrIHRvZ2V0aGVyIHRvIGFsbG93CnlvdSB0byBoYXZlIHJvd3MgcmV0dXJuZWQgYXMgaGFzaHJlZnMuIFlvdSBtdXN0IGNhbGwgQzxjb2x1bW5fbmFtZXMgKCk+CmZpcnN0IHRvIGRlY2xhcmUgeW91ciBjb2x1bW4gbmFtZXMuIAoKICRjc3YtPmNvbHVtbl9uYW1lcyAocXcoIGNvZGUgbmFtZSBwcmljZSBkZXNjcmlwdGlvbiApKTsKICRociA9ICRjc3YtPmdldGxpbmVfaHIgKCRpbyk7CiBwcmludCAiUHJpY2UgZm9yICRoci0+e25hbWV9IGlzICRoci0+e3ByaWNlfSBFVVJcbiI7CgpDPGdldGxpbmVfaHIgKCk+IHdpbGwgY3JvYWsgaWYgY2FsbGVkIGJlZm9yZSBDPGNvbHVtbl9uYW1lcyAoKT4uCgo9aGVhZDIgY29sdW1uX25hbWVzCgpTZXQgdGhlIGtleXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIEM8Z2V0bGluZV9ociAoKT4gY2FsbHMuIElmIG5vIGtleXMKKGNvbHVtbiBuYW1lcykgYXJlIHBhc3NlZCwgaXQnbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcuCgpDPGNvbHVtbl9uYW1lcyAoKT4gYWNjZXB0cyBhIGxpc3Qgb2Ygc2NhbGFycyAodGhlIGNvbHVtbiBuYW1lcykgb3IgYQpzaW5nbGUgYXJyYXlfcmVmLCBzbyB5b3UgY2FuIHBhc3MgQzxnZXRsaW5lICgpPgoKICAkY3N2LT5jb2x1bW5fbmFtZXMgKCRjc3YtPmdldGxpbmUgKCRpbykpOwoKQzxjb2x1bW5fbmFtZXMgKCk+IGNyb2FrcyBvbiBpbnZhbGlkIGFyZ3VtZW50cy4KCj1oZWFkMiBiaW5kX2NvbHVtbnMKClRha2VzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIHNjYWxhcnMgKG1heCAyNTUpIHRvIHN0b3JlIHRoZSBmaWVsZHMgZmV0Y2hlZApDPGdldGxpbmUgKCk+IGluLiBXaGVuIHlvdSBkb24ndCBwYXNzIGVub3VnaCByZWZlcmVuY2VzIHRvIHN0b3JlIHRoZQpmZXRjaGVkIGZpZWxkcyBpbiwgQzxnZXRsaW5lICgpPiB3aWxsIGZhaWwuIElmIHlvdSBwYXNzIG1vcmUgdGhhbiB0aGVyZSBhcmUKZmllbGRzIHRvIHJldHVybiwgdGhlIHJlbWFpbmluZyByZWZlcmVuY2VzIGFyZSBsZWZ0IHVudG91Y2hlZC4KCiAgJGNzdi0+YmluZF9jb2x1bW5zIChcJGNvZGUsIFwkbmFtZSwgXCRwcmljZSwgXCRkZXNjcmlwdGlvbik7CiAgd2hpbGUgKCRjc3YtPmdldGxpbmUgKCkpIHsKICAgICAgcHJpbnQgIlRoZSBwcmljZSBvZiBhICRuYW1lIGlzIFx4ezIwYWN9ICRwcmljZVxuIjsKICAgICAgfQoKPWhlYWQyIGVvZgoKICRlb2YgPSAkY3N2LT5lb2YgKCk7CgpJZiBDPHBhcnNlICgpPiBvciBDPGdldGxpbmUgKCk+IHdhcyB1c2VkIHdpdGggYW4gSU8gc3RyZWFtLCB0aGlzCm1ldGhvZCB3aWxsIHJldHVybiB0cnVlICgxKSBpZiB0aGUgbGFzdCBjYWxsIGhpdCBlbmQgb2YgZmlsZSwgb3RoZXJ3aXNlCml0IHdpbGwgcmV0dXJuIGZhbHNlICgnJykuIFRoaXMgaXMgdXNlZnVsIHRvIHNlZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCmEgZmFpbHVyZSBhbmQgZW5kIG9mIGZpbGUuCgo9aGVhZDIgdHlwZXMKCiAkY3N2LT50eXBlcyAoXEB0cmVmKTsKClRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZm9yY2UgdGhhdCBjb2x1bW5zIGFyZSBvZiBhIGdpdmVuIHR5cGUuIEZvcgpleGFtcGxlLCBpZiB5b3UgaGF2ZSBhbiBpbnRlZ2VyIGNvbHVtbiwgdHdvIGRvdWJsZSBjb2x1bW5zIGFuZCBhCnN0cmluZyBjb2x1bW4sIHRoZW4geW91IG1pZ2h0IGRvIGEKCiAkY3N2LT50eXBlcyAoW1RleHQ6OkNTVjo6SVYgKCksCiAgICAgICAgICAgICAgIFRleHQ6OkNTVjo6TlYgKCksCiAgICAgICAgICAgICAgIFRleHQ6OkNTVjo6TlYgKCksCiAgICAgICAgICAgICAgIFRleHQ6OkNTVjo6UFYgKCldKTsKCkNvbHVtbiB0eXBlcyBhcmUgdXNlZCBvbmx5IGZvciBkZWNvZGluZyBjb2x1bW5zLCBpbiBvdGhlciB3b3JkcwpieSB0aGUgSTxwYXJzZSAoKT4gYW5kIEk8Z2V0bGluZSAoKT4gbWV0aG9kcy4KCllvdSBjYW4gdW5zZXQgY29sdW1uIHR5cGVzIGJ5IGRvaW5nIGEKCiAkY3N2LT50eXBlcyAodW5kZWYpOwoKb3IgZmV0Y2ggdGhlIGN1cnJlbnQgdHlwZSBzZXR0aW5ncyB3aXRoCgogJHR5cGVzID0gJGNzdi0+dHlwZXMgKCk7Cgo9b3ZlciA0Cgo9aXRlbSBJVgoKU2V0IGZpZWxkIHR5cGUgdG8gaW50ZWdlci4KCj1pdGVtIE5WCgpTZXQgZmllbGQgdHlwZSB0byBudW1lcmljL2Zsb2F0LgoKPWl0ZW0gUFYKClNldCBmaWVsZCB0eXBlIHRvIHN0cmluZy4KCj1iYWNrCgo9aGVhZDIgZmllbGRzCgogQGNvbHVtbnMgPSAkY3N2LT5maWVsZHMgKCk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbnB1dCB0byBDPGNvbWJpbmUgKCk+IG9yIHRoZSByZXN1bHRhbnQKZGVjb21wb3NlZCBmaWVsZHMgb2YgQzxwYXJzZSAoKT4sIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCgo9aGVhZDIgbWV0YV9pbmZvCgogQGZsYWdzID0gJGNzdi0+bWV0YV9pbmZvICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmxhZ3Mgb2YgdGhlIGlucHV0IHRvIEM8Y29tYmluZSAoKT4gb3IKdGhlIGZsYWdzIG9mIHRoZSByZXN1bHRhbnQgZGVjb21wb3NlZCBmaWVsZHMgb2YgQzxwYXJzZSAoKT4sIHdoaWNoZXZlcgp3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCgpGb3IgZWFjaCBmaWVsZCwgYSBtZXRhX2luZm8gZmllbGQgd2lsbCBob2xkIGZsYWdzIHRoYXQgdGVsbCBzb21ldGhpbmcgYWJvdXQKdGhlIGZpZWxkIHJldHVybmVkIGJ5IHRoZSBDPGZpZWxkcyAoKT4gbWV0aG9kIG9yIHBhc3NlZCB0byB0aGUgQzxjb21iaW5lICgpPgptZXRob2QuIFRoZSBmbGFncyBhcmUgYml0d2lzZS1vcidkIGxpa2U6Cgo9b3ZlciA0Cgo9aXRlbSAweDAwMDEKClRoZSBmaWVsZCB3YXMgcXVvdGVkLgoKPWl0ZW0gMHgwMDAyCgpUaGUgZmllbGQgd2FzIGJpbmFyeS4KCj1iYWNrCgpTZWUgdGhlIEM8aXNfKioqICgpPiBtZXRob2RzIGJlbG93LgoKPWhlYWQyIGlzX3F1b3RlZAoKICBteSAkcXVvdGVkID0gJGNzdi0+aXNfcXVvdGVkICgkY29sdW1uX2lkeCk7CgpXaGVyZSBDPCRjb2x1bW5faWR4PiBpcyB0aGUgKHplcm8tYmFzZWQpIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlCmxhc3QgcmVzdWx0IG9mIEM8cGFyc2UgKCk+LgoKVGhpcyByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZGF0YSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiB3YXMKZW5jbG9zZWQgaW4gQzxxdW90ZV9jaGFyPiBxdW90ZXMuIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50IGZvciBkYXRhCndoZXJlIEM8LDIwMDcwMTA4LD4gaXMgdG8gYmUgdHJlYXRlZCBhcyBhIG51bWVyaWMgdmFsdWUsIGFuZCB3aGVyZQpDPCwiMjAwNzAxMDgiLD4gaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgY2hhcmFjdGVyIHN0cmluZyBkYXRhLgoKPWhlYWQyIGlzX2JpbmFyeQoKICBteSAkYmluYXJ5ID0gJGNzdi0+aXNfYmluYXJ5ICgkY29sdW1uX2lkeCk7CgpXaGVyZSBDPCRjb2x1bW5faWR4PiBpcyB0aGUgKHplcm8tYmFzZWQpIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlCmxhc3QgcmVzdWx0IG9mIEM8cGFyc2UgKCk+LgoKVGhpcyByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZGF0YSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbgpjb250YWluZWQgYW55IGJ5dGUgaW4gdGhlIHJhbmdlIFtceDAwLVx4MDgsXHgxMC1ceDFGLFx4N0YtXHhGRl0KCj1oZWFkMiBzdGF0dXMKCiAkc3RhdHVzID0gJGNzdi0+c3RhdHVzICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzIChvciBmYWlsdXJlKSBvZiBDPGNvbWJpbmUgKCk+IG9yCkM8cGFyc2UgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIGVycm9yX2lucHV0CgogJGJhZF9hcmd1bWVudCA9ICRjc3YtPmVycm9yX2lucHV0ICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXJyb25lb3VzIGFyZ3VtZW50IChpZiBpdCBleGlzdHMpIG9mCkM8Y29tYmluZSAoKT4gb3IgQzxwYXJzZSAoKT4sIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCgo9aGVhZDIgZXJyb3JfZGlhZwoKICRjc3YtPmVycm9yX2RpYWcgKCk7CiAkZXJyb3JfY29kZSAgID0gMCAgKyAkY3N2LT5lcnJvcl9kaWFnICgpOwogJGVycm9yX3N0ciAgICA9ICIiIC4gJGNzdi0+ZXJyb3JfZGlhZyAoKTsKICgkY2RlLCAkc3RyLCAkcG9zKSA9ICRjc3YtPmVycm9yX2RpYWcgKCk7CgpJZiAoYW5kIG9ubHkgaWYpIGFuIGVycm9yIG9jY3VyZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGlhZ25vc3RpY3MKb2YgdGhhdCBlcnJvci4KCklmIGNhbGxlZCBpbiB2b2lkIGNvbnRleHQsIGl0IHdpbGwgcHJpbnQgdGhlIGludGVybmFsIGVycm9yIGNvZGUgYW5kIHRoZQphc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UgdG8gU1RERVJSLgoKSWYgY2FsbGVkIGluIGxpc3QgY29udGV4dCwgaXQgd2lsbCByZXR1cm4gdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlcnJvcgptZXNzYWdlIGluIHRoYXQgb3JkZXIuIElmIHRoZSBsYXN0IGVycm9yIHdhcyBmcm9tIHBhcnNpbmcsIHRoZSB0aGlyZAp2YWx1ZSByZXR1cm5lZCBpcyB0aGUgYmVzdCBndWVzcyBhdCB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBsaW5lIHRoYXQgd2FzCmJlaW5nIHBhcnNlZC4gSXQncyB2YWx1ZSBpcyAxLWJhc2VkLgoKTm90ZTogQzwkcG9zPiByZXR1cm5lZCBieSB0aGUgYmFja2VuZCBUZXh0OjpDU1ZfUFAgZG9lcyBub3Qgc2hvdwp0aGUgZXJyb3IgcG9pbnQgaW4gbWFueSBjYXNlcyAoc2VlIHRvIHRoZSBiZWxvdyBsaW5lKS4KSXQgaXMgZm9yIGNvbnNjaWVuY2UncyBzYWtlIGluIHVzaW5nIFRleHQ6OkNTVl9QUC4KCklmIGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCwgaXQgd2lsbCByZXR1cm4gdGhlIGRpYWdub3N0aWNzIGluIGEgc2luZ2xlCnNjYWxhciwgYS1sYSAkIS4gSXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBjb2RlIGluIG51bWVyaWMgY29udGV4dCwgYW5kCnRoZSBkaWFnbm9zdGljcyBtZXNzYWdlIGluIHN0cmluZyBjb250ZXh0LgoKRGVwZW5kaW5nIG9uIHRoZSB1c2VkIHdvcmtlciBtb2R1bGUsIHJldHVybmVkIGRpYWdub3N0aWNzIGlzIGRpZmZmZXJlbnQuCgpUZXh0OjpDU1ZfWFMgcGFyc2VzIGNzdiBzdHJpbmdzIGJ5IGRpdmlkaW5nIG9uZSBjaGFyYWN0ZXIgd2hpbGUgVGV4dDo6Q1NWX1BQCmJ5IHVzaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zLiBUaGF0IGRpZmZlcmVuY2UgbWFrZXMgdGhlIGRpZmZlcmVudCBjYXVzZQpvZiB0aGUgZmFpbHVyZS4KCj1oZWFkMiBTZXREaWFnCgogJGNzdi0+U2V0RGlhZyAoMCk7CgpVc2UgdG8gcmVzZXQgdGhlIGRpYWdub3N0aWN0cyBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBlcnJvcnMuCgo9aGVhZDIgU29tZSBtZXRob2RzIGFyZSBUZXh0OjpDU1Ygb25seS4KCj1vdmVyCgo9aXRlbSBiYWNrZW5kCgpSZXR1cm5zIHRoZSBiYWNrZW5kIG1vZHVsZSBuYW1lIGNhbGxlZCBieSBUZXh0OjpDU1YuCkM8bW9kdWxlPiBpcyBhbiBhbGlhcy4KCgo9aXRlbSBpc194cwoKUmV0dXJucyB0cnVlIHZhbHVlIGlmIFRleHQ6OkNTViBvciB0aGUgb2JqZWN0IHVzZXMgWFMgbW9kdWxlIGFzIHdvcmtlci4KCj1pdGVtIGlzX3BwCgpSZXR1cm5zIHRydWUgdmFsdWUgaWYgVGV4dDo6Q1NWIG9yIHRoZSBvYmplY3QgdXNlcyBwdXJlLVBlcmwgbW9kdWxlIGFzIHdvcmtlci4KCgo9YmFjawoKCj1oZWFkMSBESUFHTk9TVElDUwoKSWYgYW4gZXJyb3Igb2NjdXJlZCwgJGNzdi0+ZXJyb3JfZGlhZyAoKSBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbgpvbiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuIE5vdGUgdGhhdCBmb3Igc3BlZWQgcmVhc29ucywgdGhlIGludGVybmFsIHZhbHVlCmlzIG5ldmVyIGNsZWFyZWQgb24gc3VjY2Vzcywgc28gdXNpbmcgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGVycm9yX2RpYWcgKCkgaW4Kbm9ybWFsIGNhc2VzIC0gd2hlbiBubyBlcnJvciBvY2N1cmVkIC0gbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KClRoaXMgZnVuY3Rpb24gY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIHVzZWQgbW9kdWxlIChYUyBvciBQdXJlUGVybCkuCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvRElBR05PU1RJQ1M+IGFuZCBMPFRleHQ6OkNTVl9QUC9ESUFHTk9TVElDUz4uCgoKCj1oZWFkMiBISVNUT1JZIEFORCBXT1JLRVIgTU9EVUxFUwoKVGhpcyBtb2R1bGUsIEw8VGV4dDo6Q1NWPiB3YXMgZmlyc3RseSB3cml0dGVuIGJ5IEFsYW4gQ2l0dGVybWFuIHdoaWNoIGNvdWxkIGRlYWwgd2l0aApCPG9ubHkgYXNjaWkgY2hhcmFjdGVycz4uIFRoZW4sIEpvY2hlbiBXaWVkbWFubiB3cm90ZSBMPFRleHQ6OkNTVl9YUz4gd2hpY2ggaGFzCnRoZSBCPGJpbmFyeSBtb2RlPi4gVGhpcyBYUyB2ZXJzaW9uIGlzIG1haW50YWluZWQgYnkgSC5NZXJpam4gQnJhbmQgYW5kIEw8VGV4dDo6Q1NWX1BQPgp3cml0dGVuIGJ5IE1ha2FtYWthIHdhcyBwdXJlLVBlcmwgdmVyc2lvbiBvZiBUZXh0OjpDU1ZfWFMuCgpOb3csIFRleHQ6OkNTViB3YXMgcmV3cml0dGVuIGJ5IE1ha2FtYWthIGFuZCBiZWNvbWUgYSB3cmFwcGVyIHRvIFRleHQ6OkNTVl9YUyBvciBUZXh0OjpDU1ZfUFAuClRleHQ6OkNTVl9QUCB3aWxsIGJlIGJ1bmRsZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCgpXaGVuIHlvdSB1c2UgVGV4dDo6Q1NWLCBpdCBjYWxscyBhIGJhY2tlbmQgd29ya2VyIG1vZHVsZSAtIEw8VGV4dDo6Q1NWX1hTPiBvciBMPFRleHQ6OkNTVl9QUD4uCkJ5IGRlZmF1bHQsIFRleHQ6OkNTViB0cmllcyB0byB1c2UgVGV4dDo6Q1NWX1hTIHdoaWNoIG11c3QgYmUgY29tcGxpZWQgYW5kIGluc3RhbGxlZCBwcm9wZXJseS4KSWYgdGhpcyBjYWxsIGlzIGZhaWwsIFRleHQ6OkNTViB1c2VzIEw8VGV4dDo6Q1NWX1BQPi4KClRoZSByZXF1aXJlZCBUZXh0OjpDU1ZfWFMgdmVyc2lvbiBpcyBJPDAuNDE+IGluIFRleHQ6OkNTViB2ZXJzaW9uIDEuMDMuCgpJZiB5b3Ugc2V0IGFuIGVudmlvcm5tZW50IHZhcmlhYmxlIEM8UEVSTF9URVhUX0NTVj4sIFRoZSBjYWxsaW5nIGFjdGlvbiB3aWxsIGJlIGNoYW5nZWQuCgo9b3ZlcgoKPWl0ZW0gUEVSTF9URVhUX0NTViA9IDAKCj1pdGVtIFBFUkxfVEVYVF9DU1YgPSAnVGV4dDo6Q1NWX1BQJwoKQWx3YXlzIHVzZSBUZXh0OjpDU1ZfUFAKCj1pdGVtIFBFUkxfVEVYVF9DU1YgPSAxCgo9aXRlbSBQRVJMX1RFWFRfQ1NWID0gJ1RleHQ6OkNTVl9YUyxUZXh0OjpDU1ZfUFAnCgooVGhlIGRlZmF1bHQpIFVzZSBjb21waWxlZCBUZXh0OjpDU1ZfWFMgaWYgaXQgaXMgcHJvcGVybHkgY29tcGlsZWQgJiBpbnN0YWxsZWQsCm90aGVyd2lzZSB1c2UgVGV4dDo6Q1NWX1BQCgo9aXRlbSBQRVJMX1RFWFRfQ1NWID0gMgoKPWl0ZW0gUEVSTF9URVhUX0NTViA9ICdUZXh0OjpDU1ZfWFMnCgpBbHdheXMgdXNlIGNvbXBpbGVkIFRleHQ6OkNTVl9YUywgZGllIGlmIGl0IGlzbid0IHByb3Blcmx5IGNvbXBpbGVkICYgaW5zdGFsbGVkLgoKPWJhY2sKClRoZXNlIGlkZWFzIGNvbWUgZnJvbSBMPERCSTo6UHVyZVBlcmw+IG1lY2hhbmlzbS4KCmV4YW1wbGU6CgogIEJFR0lOIHsgJEVOVntQRVJMX1RFWFRfQ1NWfSA9IDAgfQogIHVzZSBUZXh0OjpDU1Y7ICMgYWx3YXlzIHVzZXMgVGV4dDo6Q1NWX1BQCgoKSW4gZnV0dXJlLCBpdCBtYXkgYmUgYWJsZSB0byBzcGVjaWZ5IGFub3RoZXIgbW9kdWxlLgoKPWhlYWQxIFRPRE8KCj1vdmVyCgo9aXRlbSBXcmFwcGVyIG1lY2hhbmlzbQoKQ3VycmVudGx5IHRoZSB3cmFwcGVyIG1lY2hhbmlzbSBpcyB0byBjaGFuZ2Ugc3ltYm9saWMgdGFibGUgZm9yIHNwZWVkLgoKIGZvciBteSAkbWV0aG9kIChAUHVibGljTWV0aG9kcykgewogICAgICp7IlRleHQ6OkNTVjo6JG1ldGhvZCJ9ID0gXCZ7IiRjbGFzc1w6OiRtZXRob2QifTsKIH0KCkJ1dCBob3cgYWJvdXQgaXQgLSBjYWxsaW5nIHdvcmtlciBtb2R1bGUgb2JqZWN0PwoKIHN1YiBwYXJzZSB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAkc2VsZi0+e19XT1JLRVJfT0JKRUNUfS0+cGFyc2UoQF8pOyAjIFhTIG9yIFBQIENTViBvYmplY3QKIH0KCgoKPWl0ZW0gU2ltcGxlIG9wdGlvbgoKICRjc3YgPSBUZXh0OjpDU1YtPnNpbXBsZTsKCmlzIGVxdWl2YWxlbnQgdG8KCiAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsKICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICcsJywKICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDEsCiAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAxLAogICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMSwKICAgICBibGFua19pc191bmRlZiAgICAgID0+IDEsCiB9KTsKCklzIGl0IG5lZWRsZXNzPwoKCj1iYWNrCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvVE9ETz4gYW5kIEw8VGV4dDo6Q1NWX1BQL1RPRE8+LgoKCj1oZWFkMSBTRUUgQUxTTwoKTDxUZXh0OjpDU1ZfUFAoMyk+IGFuZCBMPFRleHQ6OkNTVl9YUygzKT4uCgoKPWhlYWQxIEFVVEhPUlMgYW5kIE1BSU5UQUlORVJTCgpBbGFuIENpdHRlcm1hbiBGPEU8bHQ+YWxhblthdF1tZmdydGwuY29tRTxndD4+IHdyb3RlIHRoZSBvcmlnaW5hbCBQZXJsCm1vZHVsZS4gUGxlYXNlIGRvbid0IHNlbmQgbWFpbCBjb25jZXJuaW5nIFRleHQ6OkNTViB0byBBbGFuLCBhcwpoZSdzIG5vdCBhIHByZXNlbnQgbWFpbnRhaW5lci4KCkpvY2hlbiBXaWVkbWFubiBGPEU8bHQ+am9lW2F0XWlzcHNvZnQuZGVFPGd0Pj4gcmV3cm90ZSB0aGUgZW5jb2RpbmcgYW5kCmRlY29kaW5nIGluIEMgYnkgaW1wbGVtZW50aW5nIGEgc2ltcGxlIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIGFuZCBhZGRlZAp0aGUgdmFyaWFibGUgcXVvdGUsIGVzY2FwZSBhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcnMsIHRoZSBiaW5hcnkgbW9kZQphbmQgdGhlIHByaW50IGFuZCBnZXRsaW5lIG1ldGhvZHMuIFNlZSBDaGFuZ2VMb2cgcmVsZWFzZXMgMC4xMCB0aHJvdWdoCjAuMjMuCgpILk1lcmlqbiBCcmFuZCBGPEU8bHQ+aC5tLmJyYW5kW2F0XXhzNGFsbC5ubEU8Z3Q+PiBjbGVhbmVkIHVwIHRoZSBjb2RlLAphZGRlZCB0aGUgZmllbGQgZmxhZ3MgbWV0aG9kcywgd3JvdGUgdGhlIG1ham9yIHBhcnQgb2YgdGhlIHRlc3Qgc3VpdGUsCmNvbXBsZXRlZCB0aGUgZG9jdW1lbnRhdGlvbiwgZml4ZWQgc29tZSBSVCBidWdzLiBTZWUgQ2hhbmdlTG9nIHJlbGVhc2VzCjAuMjUgYW5kIG9uLgoKTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PiB3cm90ZSBUZXh0OjpDU1ZfUFAKd2hpY2ggaXMgdGhlIHB1cmUtUGVybCB2ZXJzaW9uIG9mIFRleHQ6OkNTVl9YUy4KCk5ldyBUZXh0OjpDU1YgKHNpbmNlIDAuOTkpIGlzIG1haW50YWluZWQgYnkgTWFrYW1ha2EuCgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGV4dDo6Q1NWCgpDb3B5cmlnaHQgKEMpIDE5OTcgQWxhbiBDaXR0ZXJtYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1ha2FtYWthIEhhbm55YWhhcmFtaXR1LgoKClRleHQ6OkNTVl9QUDoKCkNvcHlyaWdodCAoQykgMjAwNS0yMDA4IE1ha2FtYWthIEhhbm55YWhhcmFtaXR1LgoKClRleHQ6Q1NWX1hTOgoKQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSC5NZXJpam4gQnJhbmQgZm9yIFBST0NVUkEgQi5WLgpDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBKb2NoZW4gV2llZG1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuClBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5NyBBbGFuIENpdHRlcm1hbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gCgo9Y3V0Cg==
cGFja2FnZSBUZXh0OjpDU1ZfUFA7CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgVGV4dDo6Q1NWX1BQIC0gVGV4dDo6Q1NWX1hTIGNvbXBhdGlibGUgcHVyZS1QZXJsIG1vZHVsZQojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnJlcXVpcmUgNS4wMDU7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxdygkVkVSU0lPTik7CnVzZSBDYXJwICgpOwoKJFZFUlNJT04gPSAnMS4xMic7CgpzdWIgUFYgIHsgMCB9CnN1YiBJViAgeyAxIH0Kc3ViIE5WICB7IDIgfQoKc3ViIElTX1FVT1RFRCAoKSB7IDB4MDAwMTsgfQpzdWIgSVNfQklOQVJZICgpIHsgMHgwMDAyOyB9CgoKbXkgJEVSUk9SUyA9IHsKICAgICAgICAjIFBQIGFuZCBYUwogICAgICAgIDEwMDAgPT4gIklOSSAtIGNvbnN0cnVjdG9yIGZhaWxlZCIsCiAgICAgICAgMTAwMSA9PiAic2VwX2NoYXIgaXMgZXF1YWwgdG8gcXVvdGVfY2hhciBvciBlc2NhcGVfY2hhciIsCgogICAgICAgIDIwMTAgPT4gIkVDUiAtIFFVTyBjaGFyIGluc2lkZSBxdW90ZXMgZm9sbG93ZWQgYnkgQ1Igbm90IHBhcnQgb2YgRU9MIiwKICAgICAgICAyMDExID0+ICJFQ1IgLSBDaGFyYWN0ZXJzIGFmdGVyIGVuZCBvZiBxdW90ZWQgZmllbGQiLAoKICAgICAgICAyMDIxID0+ICJFSVEgLSBOTCBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiLAogICAgICAgIDIwMjIgPT4gIkVJUSAtIENSIGNoYXIgaW5zaWRlIHF1b3RlcywgYmluYXJ5IG9mZiIsCiAgICAgICAgMjAyNSA9PiAiRUlRIC0gTG9vc2UgdW5lc2NhcGVkIGVzY2FwZSIsCiAgICAgICAgMjAyNiA9PiAiRUlRIC0gQmluYXJ5IGNoYXJhY3RlciBpbnNpZGUgcXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIiwKICAgICAgICAyMDI3ID0+ICJFSVEgLSBRdW90ZWQgZmllbGQgbm90IHRlcm1pbmF0ZWQiLAoKICAgICAgICAyMDMwID0+ICJFSUYgLSBOTCBjaGFyIGluc2lkZSB1bnF1b3RlZCB2ZXJiYXRpbSwgYmluYXJ5IG9mZiIsCiAgICAgICAgMjAzMSA9PiAiRUlGIC0gQ1IgY2hhciBpcyBmaXJzdCBjaGFyIG9mIGZpZWxkLCBub3QgcGFydCBvZiBFT0wiLAogICAgICAgIDIwMzIgPT4gIkVJRiAtIENSIGNoYXIgaW5zaWRlIHVucXVvdGVkLCBub3QgcGFydCBvZiBFT0wiLAogICAgICAgIDIwMzQgPT4gIkVJRiAtIExvb3NlIHVuZXNjYXBlZCBxdW90ZSIsCiAgICAgICAgMjAzNyA9PiAiRUlGIC0gQmluYXJ5IGNoYXJhY3RlciBpbiB1bnF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIsCgogICAgICAgIDIxMTAgPT4gIkVDQiAtIEJpbmFyeSBjaGFyYWN0ZXIgaW4gQ29tYmluZSwgYmluYXJ5IG9mZiIsCgogICAgICAgICMgUFAgT25seSBFcnJvcgogICAgICAgIDQwMDIgPT4gIkVJUSAtIFVuZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkIiwKICAgICAgICA0MDAzID0+ICJFSUYgLSBFU0MgQ1IiLAogICAgICAgIDQwMDQgPT4gIkVVRiAtICIsCgogICAgICAgICMgSGFzaC1SZWYgZXJyb3JzCiAgICAgICAgMzAwMSA9PiAiRUhSIC0gVW5zdXBwb3J0ZWQgc3ludGF4IGZvciBjb2x1bW5fbmFtZXMgKCkiLAogICAgICAgIDMwMDIgPT4gIkVIUiAtIGdldGxpbmVfaHIgKCkgY2FsbGVkIGJlZm9yZSBjb2x1bW5fbmFtZXMgKCkiLAogICAgICAgIDMwMDMgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBhbmQgY29sdW1uX25hbWVzICgpIGZpZWxkcyBjb3VudCBtaXNtYXRjaCIsCiAgICAgICAgMzAwNCA9PiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIG9ubHkgYWNjZXB0cyByZWZzIHRvIHNjYWxhcnMiLAogICAgICAgIDMwMDUgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyAoKSB0YWtlcyAyNTQgcmVmcyBtYXgiLAogICAgICAgIDMwMDYgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBkaWQgbm90IHBhc3MgZW5vdWdoIHJlZnMgZm9yIHBhcnNlZCBmaWVsZHMiLAogICAgICAgIDMwMDcgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyBuZWVkcyByZWZzIHRvIHdyaXRlYWJsZSBzY2FsYXJzIiwKICAgICAgICAzMDA4ID0+ICJFSFIgLSB1bmV4cGVjdGVkIGVycm9yIGluIGJvdW5kIGZpZWxkcyIsCgogICAgICAgIDAgICAgPT4gIiIsCn07CgoKbXkgJGxhc3RfbmV3X2Vycm9yID0gJyc7CgpteSAlZGVmX2F0dHIgPSAoCiAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAnLCcsCiAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAwLAogICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAwLAogICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgY2hvbXBfdmVyYmF0aW0gICAgICA9PiAwLAogICAgdHlwZXMgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKCiAgICBfRU9GICAgICAgICAgICAgICAgID0+IDAsCiAgICBfU1RBVFVTICAgICAgICAgICAgID0+IHVuZGVmLAogICAgX0ZJRUxEUyAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIF9GRkxBR1MgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBfU1RSSU5HICAgICAgICAgICAgID0+IHVuZGVmLAogICAgX0VSUk9SX0lOUFVUICAgICAgICA9PiB1bmRlZiwKICAgIF9FUlJPUl9ESUFHICAgICAgICAgPT4gdW5kZWYsCgogICAgX0NPTFVNTl9OQU1FUyAgICAgICA9PiB1bmRlZiwKICAgIF9CT1VORF9DT0xVTU5TICAgICAgPT4gdW5kZWYsCik7CgoKQkVHSU4gewogICAgZXZhbCBxfCByZXF1aXJlIFNjYWxhcjo6VXRpbCB8OwogICAgaWYgKCAkQCApIHsKICAgICAgICBldmFsIHF8IHJlcXVpcmUgQiB8OwogICAgICAgIGlmICggJEAgKSB7CiAgICAgICAgICAgIENhcnA6OmNyb2FrICRAOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKlNjYWxhcjo6VXRpbDo6cmVhZG9ubHkgPSBzdWIgKFwkKSB7CiAgICAgICAgICAgICAgICBteSAkYiA9IEI6OnN2cmVmXzJvYmplY3QoICRfWzBdICk7CiAgICAgICAgICAgICAgICAkYi0+RkxBR1MgJiAweDAwODAwMDAwOyAjIFNWZl9SRUFET05MWT8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyB2ZXJzaW9uCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiB2ZXJzaW9uIHsKICAgIHJldHVybiAkVkVSU0lPTjsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG5ldwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgbmV3IHsKICAgIG15ICRwcm90byA9IHNoaWZ0OwogICAgbXkgJGF0dHIgID0gc2hpZnQgfHwge307CgogICAgJGxhc3RfbmV3X2Vycm9yID0gJ3VzYWdlOiBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKFt7IG9wdGlvbiA9PiB2YWx1ZSwgLi4uIH1dKTsnOwoKICAgIG15ICRjbGFzcyA9IHJlZigkcHJvdG8pIHx8ICRwcm90byBvciByZXR1cm47CiAgICBteSAkc2VsZiAgPSB7ICVkZWZfYXR0ciB9OwoKICAgIGZvciBteSAkcHJvcCAoa2V5cyAlJGF0dHIpIHsgIyBpZiBpbnZhbGlkIGF0dHIsIHJldHVybiB1bmRlZgogICAgICAgIHVubGVzcyAoJHByb3AgPX4gL15bYS16XS8gJiYgZXhpc3RzICRkZWZfYXR0cnskcHJvcH0pIHsKICAgICAgICAgICAgJGxhc3RfbmV3X2Vycm9yID0gIlVua25vd24gYXR0cmlidXRlICckcHJvcCciOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRzZWxmLT57JHByb3B9ID0gJGF0dHItPnskcHJvcH07CiAgICB9CgogICAgJGxhc3RfbmV3X2Vycm9yID0gJyc7CgogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBpZihleGlzdHMoJHNlbGYtPnt0eXBlc30pKSB7CiAgICAgICAgJHNlbGYtPnR5cGVzKCRzZWxmLT57dHlwZXN9KTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzdGF0dXMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHN0YXR1cyB7CiAgICAkX1swXS0+e19TVEFUVVN9Owp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZXJyb3JfaW5wdXQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGVycm9yX2lucHV0IHsKICAgICRfWzBdLT57X0VSUk9SX0lOUFVUfTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGVycm9yX2RpYWcKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGVycm9yX2RpYWcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15IEBkaWFnID0gKDAsICRsYXN0X25ld19lcnJvciwgMCk7CgogICAgdW5sZXNzICgkc2VsZiBhbmQgcmVmICRzZWxmKSB7CSMgQ2xhc3MgbWV0aG9kIG9yIGRpcmVjdCBjYWxsCiAgICAgICAgJGxhc3RfbmV3X2Vycm9yIGFuZCAkZGlhZ1swXSA9IDEwMDA7CiAgICB9CiAgICBlbHNpZiAoICRzZWxmLT5pc2EgKF9fUEFDS0FHRV9fKSBhbmQgZGVmaW5lZCAkc2VsZi0+e19FUlJPUl9ESUFHfSApIHsKICAgICAgICBAZGlhZyA9ICggMCArICRzZWxmLT57X0VSUk9SX0RJQUd9LCAkRVJST1JTLT57ICRzZWxmLT57X0VSUk9SX0RJQUd9IH0gKTsKICAgICAgICBleGlzdHMgJHNlbGYtPntfRVJST1JfUE9TfSBhbmQgJGRpYWdbMl0gPSAxICsgJHNlbGYtPntfRVJST1JfUE9TfTsKICAgIH0KCiAgICBteSAkY29udGV4dCA9IHdhbnRhcnJheTsKCiAgICBteSAkZGlhZ29iaiA9IGJsZXNzIFxAZGlhZywgJ1RleHQ6OkNTVjo6RXJyb3JEaWFnJzsKCiAgICB1bmxlc3MgKGRlZmluZWQgJGNvbnRleHQpIHsJIyBWb2lkIGNvbnRleHQKICAgICAgICBwcmludCBTVERFUlIgIiMgQ1NWX1BQIEVSUk9SOiAiLCAkZGlhZ1swXSwgIiAtICRkaWFnWzFdXG4iIGlmICggJGRpYWdbMF0gKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRjb250ZXh0ID8gQGRpYWcgOiAkZGlhZ29iajsKIyAgICByZXR1cm4gJGNvbnRleHQgPyAoMCArICRkaWFnb2JqLCAiJGRpYWdvYmoiKSA6ICRkaWFnb2JqOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3RyaW5nCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBzdHJpbmcgewogICAgJF9bMF0tPntfU1RSSU5HfTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZpZWxkcwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgZmllbGRzIHsKICAgIHJlZigkX1swXS0+e19GSUVMRFN9KSA/ICBAeyRfWzBdLT57X0ZJRUxEU319IDogdW5kZWY7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjb21iaW5lCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBjb21iaW5lIHsKICAgIG15ICgkc2VsZiwgQHBhcnQpID0gQF87CgogICAgIyBhdCBsZWFzdCBvbmUgYXJndW1lbnQgd2FzIGdpdmVuIGZvciAiY29tYmluaW5nIi4uLgogICAgcmV0dXJuICRzZWxmLT57X1NUQVRVU30gPSAwIHVubGVzcyhAcGFydCk7CgogICAgJHNlbGYtPntfRklFTERTfSAgICAgID0gXEBwYXJ0OwogICAgJHNlbGYtPntfRVJST1JfSU5QVVR9ID0gdW5kZWY7CiAgICAkc2VsZi0+e19TVFJJTkd9ICAgICAgPSAnJzsKICAgICRzZWxmLT57X1NUQVRVU30gICAgICA9IDA7CgogICAgbXkgKCRhbHdheXNfcXVvdGUsICRiaW5hcnksICRxdW90LCAkc2VwLCAkZXNjKQogICAgICAgICAgICA9IEB7JHNlbGZ9e3F3L2Fsd2F5c19xdW90ZSBiaW5hcnkgcXVvdGVfY2hhciBzZXBfY2hhciBlc2NhcGVfY2hhci99OwoKICAgIGlmKCFkZWZpbmVkICRxdW90KXsgJHF1b3QgPSAnJzsgfQoKICAgIHJldHVybiAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDEwMDEpIGlmICgkc2VwIGVxICRlc2Mgb3IgJHNlcCBlcSAkcXVvdCk7CgogICAgbXkgJHJlX2VzYyA9ICRzZWxmLT57X3JlX2NvbWJfZXNjYXBlfS0+eyRxdW90fS0+eyRlc2N9IHx8PSBxci8oXFEkcXVvdFxFfFxRJGVzY1xFKS87CiAgICBteSAkcmVfc3AgID0gJHNlbGYtPntfcmVfY29tYl9zcH0tPnskc2VwfSAgICAgICAgICAgICAgfHw9IHFyL1tcc1xRJHNlcFxFXS87CgogICAgbXkgJG11c3RfYmVfcXVvdGVkOwogICAgZm9yIG15ICRjb2x1bW4gKEBwYXJ0KSB7CgogICAgICAgIHVubGVzcyAoZGVmaW5lZCAkY29sdW1uKSB7CiAgICAgICAgICAgICRjb2x1bW4gPSAnJzsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgIGlmICghJGJpbmFyeSBhbmQgJGNvbHVtbiA9fiAvW15ceDA5XHgyMC1ceDdFXS8pIHsKICAgICAgICAgICAgIyBhbiBhcmd1bWVudCBjb250YWluZWQgYW4gaW52YWxpZCBjaGFyYWN0ZXIuLi4KICAgICAgICAgICAgJHNlbGYtPntfRVJST1JfSU5QVVR9ID0gJGNvbHVtbjsKICAgICAgICAgICAgJHNlbGYtPl9zZXRfZXJyb3JfZGlhZygyMTEwKTsKICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57X1NUQVRVU307CiAgICAgICAgfQoKICAgICAgICAkbXVzdF9iZV9xdW90ZWQgPSAwOwoKICAgICAgICBpZigkcXVvdCBuZSAnJyBhbmQgJGNvbHVtbiA9fiBzLyRyZV9lc2MvJGVzYyQxL2cpewogICAgICAgICAgICAkbXVzdF9iZV9xdW90ZWQrKzsKICAgICAgICB9CiAgICAgICAgaWYoJGNvbHVtbiA9fiAvJHJlX3NwLyl7CiAgICAgICAgICAgICRtdXN0X2JlX3F1b3RlZCsrOwogICAgICAgIH0KCiAgICAgICAgaWYoJGJpbmFyeSl7CiAgICAgICAgICAgICRtdXN0X2JlX3F1b3RlZCsrIGlmICggJGNvbHVtbiA9fiBzL1wwLyR7ZXNjfTAvZyB8fCAkY29sdW1uID1+IC9bXHgwMC1ceDFmXHg3Zi1ceGEwXS8gKTsKICAgICAgICB9CgogICAgICAgIGlmKCRhbHdheXNfcXVvdGUgb3IgJG11c3RfYmVfcXVvdGVkKXsKICAgICAgICAgICAgJGNvbHVtbiA9ICRxdW90IC4gJGNvbHVtbiAuICRxdW90OwogICAgICAgIH0KICAgIH0KCiAgICAkc2VsZi0+e19TVFJJTkd9ID0gam9pbigkc2VwLCBAcGFydCkgLiAkc2VsZi0+e2VvbH07CiAgICAkc2VsZi0+e19TVEFUVVN9ID0gMTsKCiAgICByZXR1cm4gJHNlbGYtPntfU1RBVFVTfTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHBhcnNlCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCm15ICVhbGxvd19lb2wgPSAoIlxyIiA9PiAxLCAiXHJcbiIgPT4gMSwgIlxuIiA9PiAxLCAiIiA9PiAxKTsKCnN1YiBwYXJzZSB7CiAgICBteSAoJHNlbGYsICRsaW5lKSA9IEBfOwoKICAgIEB7JHNlbGZ9e3F3L19TVFJJTkcgX0ZJRUxEUyBfU1RBVFVTIF9FUlJPUl9JTlBVVC99ID0gKCRsaW5lLCB1bmRlZiwgMCwgJGxpbmUpOwoKICAgIHJldHVybiAwIGlmKCFkZWZpbmVkICRsaW5lKTsKCiAgICBteSAoJGJpbmFyeSwgJHF1b3QsICRzZXAsICRlc2MsICR0eXBlcywgJGtlZXBfbWV0YV9pbmZvLCAkYWxsb3dfd2hpdGVzcGFjZSwgJGVvbCwgJGJsYW5rX2lzX3VuZGVmKQogICAgICAgICA9IEB7JHNlbGZ9e3F3L2JpbmFyeSBxdW90ZV9jaGFyIHNlcF9jaGFyIGVzY2FwZV9jaGFyIHR5cGVzIGtlZXBfbWV0YV9pbmZvIGFsbG93X3doaXRlc3BhY2UgZW9sIGJsYW5rX2lzX3VuZGVmL307CiAgICAkc2VwICA9ICJcMCIgdW5sZXNzIChkZWZpbmVkICRzZXApOwogICAgJGVzYyAgPSAiXDAiIHVubGVzcyAoZGVmaW5lZCAkZXNjKTsKICAgICRxdW90ID0gJycgICB1bmxlc3MgKGRlZmluZWQgJHF1b3QpOwoKICAgIHJldHVybiAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDEwMDEpIGlmICgoJHNlcCBlcSAkZXNjIG9yICRzZXAgZXEgJHF1b3QpIGFuZCAkc2VwIG5lICJcMCIpOwoKICAgIG15ICRtZXRhX2ZsYWcgICAgICA9ICRrZWVwX21ldGFfaW5mbyA/IFtdIDogdW5kZWY7CiAgICBteSAkcmVfc3BsaXQgICAgICAgPSAkc2VsZi0+e19yZV9zcGxpdH0tPnskcXVvdH0tPnskZXNjfS0+eyRzZXB9IHx8PSBfbWFrZV9yZWdleHBfc3BsaXRfY29sdW1uKCRlc2MsICRxdW90LCAkc2VwKTsKICAgIG15ICRyZV9xdW90ZWQgICAgICAgPSAkc2VsZi0+e19yZV9xdW90ZWR9LT57JHF1b3R9ICAgICAgICAgICAgICAgfHw9IHFyL15cUSRxdW90XEUoLiopXFEkcXVvdFxFJC9zOwogICAgbXkgJHJlX2luX3F1b3RfZXNwMSA9ICRzZWxmLT57X3JlX2luX3F1b3RfZXNwMX0tPnskZXNjfSAgICAgICAgICB8fD0gcXIvXFEkZXNjXEUoLikvOwogICAgbXkgJHJlX2luX3F1b3RfZXNwMiA9ICRzZWxmLT57X3JlX2luX3F1b3RfZXNwMn0tPnskcXVvdH0tPnskZXNjfSB8fD0gcXIvW1xRJHF1b3QkZXNjXEUwXS87CiAgICBteSAkcmVfcXVvdF9jaGFyICAgID0gJHNlbGYtPntfcmVfcXVvdF9jaGFyfS0+eyRxdW90fSAgICAgICAgICAgIHx8PSBxci9cUSRxdW90XEUvOwogICAgbXkgJHJlX2VzYyAgICAgICAgICA9ICRzZWxmLT57X3JlX2VzY30tPnskcXVvdH0tPnskZXNjfSAgICAgICAgICB8fD0gcXIvXFEkZXNjXEUoXFEkcXVvdFxFfFxRJGVzY1xFfDApLzsKICAgIG15ICRyZV9pbnZhbGlkX3F1b3QgPSAkc2VsZi0+e19yZV9pbnZhbGlkX3F1b3R9LT57JHF1b3R9LT57JGVzY30gfHw9IHFyL14kcmVfcXVvdF9jaGFyfFteXFEkcmVfZXNjXEVdJHJlX3F1b3RfY2hhci87CiAgICBteSAkcmVfcnMgICAgICAgICAgID0gJHNlbGYtPntfcmVfcnN9LT57JC99IHx8PSBxcntcUSQvXEU/JH07ICMgJC8gLi4gaW5wdXQgcmVjb3JkIHNlcGFyYXRvcgoKICAgIGlmICgkYWxsb3dfd2hpdGVzcGFjZSkgewogICAgICAgICRyZV9zcGxpdCA9ICRzZWxmLT57X3JlX3NwbGl0X2FsbG93X3NwfS0+eyRxdW90fS0+eyRlc2N9LT57JHNlcH0KICAgICAgICAgICAgICAgICAgICAgfHw9IF9tYWtlX3JlZ2V4cF9zcGxpdF9jb2x1bW5fYWxsb3dfc3AoJGVzYywgJHF1b3QsICRzZXApOwogICAgfQoKICAgIG15ICRwYWxhdGFibGUgPSAxOwogICAgbXkgQHBhcnQgICAgICA9ICgpOwoKICAgIG15ICRpID0gMDsKICAgIG15ICRmbGFnOwoKICAgIGlmIChkZWZpbmVkICRlb2wgYW5kICRlb2wgZXEgIlxyIikgewogICAgICAgICRsaW5lID1+IHMvW1xyIF0qXHJbIF0qJC8vOwogICAgfQoKICAgIGlmICgkc2VsZi0+e3ZlcmJhdGltfSkgewogICAgICAgICRsaW5lIC49ICRzZXA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoZGVmaW5lZCAkZW9sIGFuZCAhJGFsbG93X2VvbHskZW9sfSkgewogICAgICAgICAgICAkbGluZSAuPSAkc2VwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJGxpbmUgPX4gcy8oPzpceDBEXHgwQXxceDBBKT8kfCg/Olx4MERceDBBfFx4MEEpWyBdKiQvJHNlcC87CiAgICAgICAgfQogICAgfQoKICAgIG15ICRwb3MgPSAwOwoKICAgIGZvciBteSAkY29sICgkbGluZSA9fiAvJHJlX3NwbGl0L2cpIHsKCiAgICAgICAgaWYgKCRrZWVwX21ldGFfaW5mbykgewogICAgICAgICAgICAkZmxhZyA9IDB4MDAwMDsKICAgICAgICAgICAgJGZsYWcgfD0gSVNfQklOQVJZIGlmICgkY29sID1+IC9bXlx4MDlceDIwLVx4N0VdLyk7CiAgICAgICAgfQoKICAgICAgICAkcG9zICs9IGxlbmd0aCAkY29sOwoKICAgICAgICBpZiAoISRiaW5hcnkgYW5kICRjb2wgPX4gL1teXHgwOVx4MjAtXHg3RV0vKSB7ICMgQmluYXJ5IGNoYXJhY3RlciwgYmluYXJ5IG9mZgogICAgICAgICAgICBpZiAoICRjb2wgPX4gJHJlX3F1b3RlZCApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoCiAgICAgICAgICAgICAgICAgICAgICAkY29sID1+IC9cbihbXlxuXSopLyA/ICgyMDIxLCAkcG9zIC0gMSAtIGxlbmd0aCAkMSkKICAgICAgICAgICAgICAgICAgICA6ICRjb2wgPX4gL1xyKFteXHJdKikvID8gKDIwMjIsICRwb3MgLSAxIC0gbGVuZ3RoICQxKQogICAgICAgICAgICAgICAgICAgIDogKDIwMjYsICRwb3MgLTIpICMgQmluYXJ5IGNoYXJhY3RlciBpbnNpZGUgcXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHNlbGYtPl9zZXRfZXJyb3JfZGlhZygKICAgICAgICAgICAgICAgICAgICAgICRjb2wgPX4gL1xRJHF1b3RcRSguKilcUSRxdW90XEVcciQvICAgPyAoMjAxMCwgJHBvcyAtIDIpCiAgICAgICAgICAgICAgICAgICAgOiAkY29sID1+IC9eXHIvICAgICAgICAgICAgICAgICAgICAgICAgID8gKDIwMzEsICRwb3MgLSBsZW5ndGggJGNvbCkKICAgICAgICAgICAgICAgICAgICA6ICRjb2wgPX4gL1xyKFteXHJdKikvICAgICAgICAgICAgICAgICAgPyAoMjAzMiwgJHBvcyAtIDEgLSBsZW5ndGggJDEpCiAgICAgICAgICAgICAgICAgICAgOiAoMjAzNywgJHBvcyAtIGxlbmd0aCAkY29sKSAjIEJpbmFyeSBjaGFyYWN0ZXIgaW4gdW5xdW90ZWQgZmllbGQsIGJpbmFyeSBvZmYKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbCA9fiAkcmVfcXVvdGVkKSB7CiAgICAgICAgICAgICRmbGFnIHw9IElTX1FVT1RFRCBpZiAoJGtlZXBfbWV0YV9pbmZvKTsKICAgICAgICAgICAgJGNvbCA9ICQxOwoKICAgICAgICAgICAgaWYgKCRjb2wgPX4gJHJlX2luX3F1b3RfZXNwMSkgewogICAgICAgICAgICAgICAgbXkgJHN0ciA9ICQxOwogICAgICAgICAgICAgICAgaWYgKCRzdHIgIX4gJHJlX2luX3F1b3RfZXNwMikgewogICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJHNlbGYtPnthbGxvd19sb29zZV9lc2NhcGVzfSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCAyMDI1LCAkcG9zIC0gMiApOyAjIE5lZWRsZXNzIEVTQyBpbiBxdW90ZWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkY29sID1+IHMvXFEkZXNjXEUoLikvJDEvZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoJGNvbCA9fiAvKD88IVxRJGVzY1xFKVxRJGVzY1xFLykgewogICAgICAgICAgICAgICAgICAgICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoIDQwMDIsICRwb3MgLSAxICk7ICMgTm8gZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvbCA9fiBzeyRyZV9lc2N9eyQxIGVxICcwJyA/ICJcMCIgOiAkMX1lZzsKCiAgICAgICAgICAgIGlmICgkdHlwZXMgYW5kICR0eXBlcy0+WyRpXSkgeyAjIElWIG9yIE5WCiAgICAgICAgICAgICAgICBfY2hlY2tfdHlwZShcJGNvbCwgJHR5cGVzLT5bJGldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBxdW90ZWQgYnV0IGludmFsaWQKCiAgICAgICAgZWxzaWYgKCRjb2wgPX4gJHJlX2ludmFsaWRfcXVvdCkgewoKICAgICAgICAgICAgdW5sZXNzICgkc2VsZi0+e2FsbG93X2xvb3NlX3F1b3Rlc30gYW5kICRjb2wgPX4gLyRyZV9xdW90X2NoYXIvKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKAogICAgICAgICAgICAgICAgICAgICAgJGNvbCA9fiAvXlxRJHF1b3RcRSguKilcUSRxdW90XEUuJC9zICA/ICgyMDExLCAkcG9zIC0gMikKICAgICAgICAgICAgICAgICAgICA6ICRjb2wgPX4gL14kcmVfcXVvdF9jaGFyLyAgICAgICAgICAgICAgPyAoMjAyNywgJHBvcyAtIDEpCiAgICAgICAgICAgICAgICAgICAgOiAoMjAzNCwgJHBvcyAtIGxlbmd0aCAkY29sKSAjIExvb3NlIHVuZXNjYXBlZCBxdW90ZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRwYWxhdGFibGUgPSAwOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGVsc2lmICgkdHlwZXMgYW5kICR0eXBlcy0+WyRpXSkgeyAjIElWIG9yIE5WCiAgICAgICAgICAgIF9jaGVja190eXBlKFwkY29sLCAkdHlwZXMtPlskaV0pOwogICAgICAgIH0KCiAgICAgICAgIyB1bnF1b3RlZAoKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIGlmICghJHNlbGYtPnt2ZXJiYXRpbX0gYW5kICRjb2wgPX4gL1xyXG58XG4vKSB7CiAgICAgICAgICAgICAgICB1bmxlc3MgKGRlZmluZWQgJGVvbCBhbmQgISRhbGxvd19lb2x7JGVvbH0pIHsKICAgICAgICAgICAgICAgICAgICAkY29sID1+IHMvKD86XHJcbnxcbikuKi8vc207CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY29sID1+IC9cUSRlc2NcRVxyJC8pIHsgIyBmb3IgdC8xNV9mbGFncyA6IHRlc3QgMTY1ICdFU0MgQ1InIGF0IGxpbmUgMjAzCiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCA0MDAzLCAkcG9zICk7CiAgICAgICAgICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY29sID1+IC8uXFEkZXNjXEUkLykgeyAjIGZvciB0LzY1X2FsbG93IDogdGVzdCA1My01NCBwYXJzZSgnZm9vXCcpIGF0IGxpbmUgNjIsIDY1CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCA0MDA0LCAkcG9zICk7CiAgICAgICAgICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJGNvbCBlcSAnJyBhbmQgJGJsYW5rX2lzX3VuZGVmICkgewogICAgICAgICAgICAgICAgJGNvbCA9IHVuZGVmOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcHVzaCBAcGFydCwkY29sOwogICAgICAgIHB1c2ggQHskbWV0YV9mbGFnfSwgJGZsYWcgaWYgKCRrZWVwX21ldGFfaW5mbyk7CgogICAgICAgICRpKys7CiAgICB9CgogICAgaWYgKCRwYWxhdGFibGUgYW5kICEgQHBhcnQpIHsKICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgIH0KCiAgICBpZiAoJHBhbGF0YWJsZSkgewogICAgICAgICRzZWxmLT57X0VSUk9SX0lOUFVUfSA9IHVuZGVmOwogICAgICAgICRzZWxmLT57X0ZJRUxEU30gICAgICA9IFxAcGFydDsKICAgIH0KCiAgICAkc2VsZi0+e19GRkxBR1N9ID0gJGtlZXBfbWV0YV9pbmZvID8gJG1ldGFfZmxhZyA6IFtdOwoKICAgIHJldHVybiAkc2VsZi0+e19TVEFUVVN9ID0gJHBhbGF0YWJsZTsKfQoKCnN1YiBfbWFrZV9yZWdleHBfc3BsaXRfY29sdW1uIHsKICAgIG15ICgkZXNjLCAkcXVvdCwgJHNlcCkgPSBAXzsKICAgIHFyLygKICAgICAgICBcUSRxdW90XEUKICAgICAgICAgICAgW15cUSRxdW90JGVzY1xFXSooPzpcUSRlc2NcRVtcUSRxdW90JGVzY1xFMF1bXlxRJHF1b3QkZXNjXEVdKikqCiAgICAgICAgXFEkcXVvdFxFCiAgICAgICAgfCAjIG9yCiAgICAgICAgW15cUSRzZXBcRV0qCiAgICAgICApCiAgICAgICBcUSRzZXBcRQogICAgL3hzOwp9CgoKc3ViIF9tYWtlX3JlZ2V4cF9zcGxpdF9jb2x1bW5fYWxsb3dfc3AgewogICAgbXkgKCRlc2MsICRxdW90LCAkc2VwKSA9IEBfOwogICAgcXIvW1x4MjBceDA5XSoKICAgICAgICgKICAgICAgICBcUSRxdW90XEUKICAgICAgICAgICAgW15cUSRxdW90JGVzY1xFXSooPzpcUSRlc2NcRVtcUSRxdW90JGVzY1xFMF1bXlxRJHF1b3QkZXNjXEVdKikqCiAgICAgICAgXFEkcXVvdFxFCiAgICAgICAgfCAjIG9yCiAgICAgICAgW15cUSRzZXBcRV0qPwogICAgICAgKQogICAgICAgW1x4MjBceDA5XSpcUSRzZXBcRVtceDIwXHgwOV0qCiAgICAveHM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBwcmludAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnQgewogICAgbXkgKCRzZWxmLCAkaW8sICRjb2xzKSA9IEBfOwoKICAgIHJlcXVpcmUgSU86OkhhbmRsZTsKCiAgICBpZihyZWYoJGNvbHMpIG5lICdBUlJBWScpewogICAgICAgIENhcnA6OmNyb2FrKCJFeHBlY3RlZCBmaWVsZHMgdG8gYmUgYW4gYXJyYXkgcmVmIik7CiAgICB9CgogICAgJHNlbGYtPmNvbWJpbmUoQCRjb2xzKSBvciByZXR1cm4gJyc7CgogICAgJGlvLT5wcmludCggJHNlbGYtPnN0cmluZyApOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZ2V0bGluZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgZ2V0bGluZSB7CiAgICBteSAoJHNlbGYsICRpbykgPSBAXzsKCiAgICByZXF1aXJlIElPOjpIYW5kbGU7CgogICAgJHNlbGYtPntfRU9GfSA9IGVvZigkaW8pID8gMSA6ICcnOwoKICAgIG15ICRsaW5lID0gJGlvLT5nZXRsaW5lKCk7CiAgICBteSAkcXVvdCA9ICRzZWxmLT57cXVvdGVfY2hhcn07CiAgICBteSAkcmUgICA9IHFyLyg/OlxRJHF1b3RcRSkvOwoKICAgICRsaW5lIC49ICRpby0+Z2V0bGluZSgpIHdoaWxlICggZGVmaW5lZCAkbGluZSBhbmQgc2NhbGFyKG15IEBsaXN0ID0gJGxpbmUgPX4gLyRyZS9nKSAlIDIgYW5kICFlb2YoJGlvKSApOwoKICAgIG15ICRlb2wgPSAkc2VsZi0+e2VvbH07CgogICAgaWYgKGRlZmluZWQgJGVvbCBhbmQgZGVmaW5lZCAkbGluZSkgewogICAgICAgICRsaW5lID1+IHMvXFEkZW9sXEUkLy87CiAgICB9CgogICAgJHNlbGYtPnBhcnNlKCRsaW5lKSBvciByZXR1cm47CgogICAgaWYgKCAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSApIHsKICAgICAgICBteSBAdmFscyAgPSAkc2VsZi0+ZmllbGRzKCk7CiAgICAgICAgbXkgKCAkbWF4LCAkY291bnQgKSA9ICggc2NhbGFyIEB2YWxzLCAwICk7CgogICAgICAgIGlmICggQHsgJHNlbGYtPntfQk9VTkRfQ09MVU1OU30gfSA8ICRtYXggKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDMwMDYpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8ICRtYXg7ICRpKysgKSB7CiAgICAgICAgICAgIG15ICRiaW5kID0gJHNlbGYtPntfQk9VTkRfQ09MVU1OU30tPlsgJGkgXTsKICAgICAgICAgICAgaWYgKCBTY2FsYXI6OlV0aWw6OnJlYWRvbmx5KCAkJGJpbmQgKSApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoMzAwOCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJCRiaW5kID0gJHZhbHNbICRpIF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBbICRzZWxmLT5maWVsZHMoKSBdOwogICAgfQoKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGdldGxpbmVfaHIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGdldGxpbmVfaHIgewogICAgbXkgKCAkc2VsZiwgJGlvKSA9IEBfOwogICAgbXkgJWhyOwoKICAgIHVubGVzcyAoICRzZWxmLT57X0NPTFVNTl9OQU1FU30gKSB7CiAgICAgICAgJHNlbGYtPlNldERpYWcoIDMwMDIgKTsKICAgIH0KCiAgICBteSAkZnIgPSAkc2VsZi0+Z2V0bGluZSggJGlvICkgb3IgcmV0dXJuIHVuZGVmOwoKICAgIEBocnsgQHsgJHNlbGYtPntfQ09MVU1OX05BTUVTfSB9IH0gPSBAJGZyOwoKICAgIFwlaHI7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjb2x1bW5fbmFtZXMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGNvbHVtbl9uYW1lcyB7CiAgICBteSAoICRzZWxmLCBAY2x1bW5zICkgPSBAXzsKCiAgICBAY2x1bW5zIG9yIHJldHVybiBkZWZpbmVkICRzZWxmLT57X0NPTFVNTl9OQU1FU30gPyBAeyRzZWxmLT57X0NPTFVNTl9OQU1FU319IDogdW5kZWY7CiAgICBAY2x1bW5zID09IDEgJiYgISBkZWZpbmVkICRjbHVtbnNbMF0gYW5kIHJldHVybiAkc2VsZi0+e19DT0xVTU5fTkFNRVN9ID0gdW5kZWY7CgogICAgaWYgKCBAY2x1bW5zID09IDEgJiYgcmVmICRjbHVtbnNbMF0gZXEgIkFSUkFZIiApIHsKICAgICAgICBAY2x1bW5zID0gQHsgJGNsdW1uc1swXSB9OwogICAgfQogICAgZWxzaWYgKCBqb2luICIiLCBtYXAgeyBkZWZpbmVkICRfID8gcmVmICRfIDogIlVOREVGIiB9IEBjbHVtbnMgKSB7CiAgICAgICAgJHNlbGYtPlNldERpYWcoIDMwMDEgKTsKICAgIH0KCiAgICBpZiAoICRzZWxmLT57X2lzX2JvdW5kfSAmJiBAY2x1bW5zICE9ICRzZWxmLT57X2lzX2JvdW5kfSApIHsKICAgICAgICAkc2VsZi0+U2V0RGlhZyggMzAwMyApOwogICAgfQoKICAgICRzZWxmLT57X0NPTFVNTl9OQU1FU30gPSBbIEBjbHVtbnMgXTsKCiAgICBAY2x1bW5zOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgYmluZF9jb2x1bW5zCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBiaW5kX2NvbHVtbnMgewogICAgbXkgKCAkc2VsZiwgQHJlZnMgKSA9IEBfOwoKICAgIEByZWZzIG9yIHJldHVybiBkZWZpbmVkICRzZWxmLT57X0JPVU5EX0NPTFVNTlN9ID8gQHskc2VsZi0+e19CT1VORF9DT0xVTU5TfX0gOiB1bmRlZjsKICAgIEByZWZzID09IDEgJiYgISBkZWZpbmVkICRyZWZzWzBdIGFuZCByZXR1cm4gJHNlbGYtPntfQk9VTkRfQ09MVU1OU30gPSB1bmRlZjsKCiAgICBpZiAoICRzZWxmLT57X0NPTFVNTl9OQU1FU30gJiYgQHJlZnMgIT0gQHskc2VsZi0+e19DT0xVTU5fTkFNRVN9fSApIHsKICAgICAgICAkc2VsZi0+U2V0RGlhZyggMzAwMyApOwogICAgfQoKICAgIGlmICggQHJlZnMgPiAyNTUgKSB7CiAgICAgICAgJHNlbGYtPlNldERpYWcoIDMwMDUgKTsKICAgIH0KCiAgICBpZiAoIGdyZXAgeyByZWYgJF8gbmUgIlNDQUxBUiIgfSBAcmVmcyApIHsgIyB3aHkgZG9uJ3QgdXNlIGdyZXA/CiAgICAgICAgJHNlbGYtPlNldERpYWcoIDMwMDQgKTsKICAgIH0KCiAgICAkc2VsZi0+e19pc19ib3VuZH0gPSBzY2FsYXIgQHJlZnM7ICNwYWNrKCJDIiwgc2NhbGFyIEByZWZzKTsKICAgICRzZWxmLT57X0JPVU5EX0NPTFVNTlN9ID0gWyBAcmVmcyBdOwogICAgQHJlZnM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBlb2YKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGVvZiB7CiAgICAkX1swXS0+e19FT0Z9Owp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdHlwZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgdHlwZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBpZiAoQF8pIHsKICAgICAgICBpZiAobXkgJHR5cGVzID0gc2hpZnQpIHsKICAgICAgICAgICAgJHNlbGYtPnsnX3R5cGVzJ30gPSBqb2luKCIiLCBtYXB7IGNocigkXykgfSBAJHR5cGVzKTsKICAgICAgICAgICAgJHNlbGYtPnsndHlwZXMnfSA9ICR0eXBlczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlbGV0ZSAkc2VsZi0+eyd0eXBlcyd9OwogICAgICAgICAgICBkZWxldGUgJHNlbGYtPnsnX3R5cGVzJ307CiAgICAgICAgICAgIHVuZGVmOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT57J3R5cGVzJ307CiAgICB9Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIG1ldGFfaW5mbyB7CiAgICAkX1swXS0+e19GRkxBR1N9ID8gQHsgJF9bMF0tPntfRkZMQUdTfSB9IDogdW5kZWY7Cn0KCnN1YiBpc19xdW90ZWQgewogICAgcmV0dXJuIHVubGVzcyAoZGVmaW5lZCAkX1swXS0+e19GRkxBR1N9KTsKICAgIHJldHVybiBpZiggJF9bMV0gPX4gL1xELyBvciAkX1sxXSA8IDAgb3IgICRfWzFdID4gJCN7ICRfWzBdLT57X0ZGTEFHU30gfSApOwoKICAgICRfWzBdLT57X0ZGTEFHU30tPlskX1sxXV0gJiBJU19RVU9URUQgPyAxIDogMDsKfQoKc3ViIGlzX2JpbmFyeSB7CiAgICByZXR1cm4gdW5sZXNzIChkZWZpbmVkICRfWzBdLT57X0ZGTEFHU30pOwogICAgcmV0dXJuIGlmKCAkX1sxXSA9fiAvXEQvIG9yICRfWzFdIDwgMCBvciAgJF9bMV0gPiAkI3sgJF9bMF0tPntfRkZMQUdTfSB9ICk7CiAgICAkX1swXS0+e19GRkxBR1N9LT5bJF9bMV1dICYgSVNfQklOQVJZID8gMSA6IDA7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBfY2hlY2tfdHlwZQojICB0YWtlIGFuIGFyZyBhcyBzY2FsYXIgcmVmZXJyZW5jZS4KIyAgaWYgbm90IG51bWVyaWMsIG1ha2UgdGhlIHZhbHVlIDAuIG90aGVyd2lzZSBJTlRFR0VSaXplZC4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIF9jaGVja190eXBlIHsKICAgIG15ICgkY29sX3JlZiwgJHR5cGUpID0gQF87CiAgICB1bmxlc3MgKCQkY29sX3JlZiA9fiAvXlsrLV0/KD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/JC8pIHsKICAgICAgICBDYXJwOjpjYXJwIHNwcmludGYoIkFyZ3VtZW50IFwiJXNcIiBpc24ndCBudW1lcmljIGluIHN1YnJvdXRpbmUgZW50cnkiLCQkY29sX3JlZik7CiAgICAgICAgJCRjb2xfcmVmID0gMDsKICAgIH0KICAgIGVsc2lmICgkdHlwZSA9PSBOVikgewogICAgICAgICQkY29sX3JlZiA9IHNwcmludGYoIiVHIiwkJGNvbF9yZWYpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJCRjb2xfcmVmID0gc3ByaW50ZigiJWQiLCQkY29sX3JlZik7CiAgICB9Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBfc2V0X2Vycm9yX2RpYWcKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIF9zZXRfZXJyb3JfZGlhZyB7CiAgICBteSAoICRzZWxmLCAkZXJyb3IsICRwb3MgKSA9IEBfOwoKICAgICRzZWxmLT57X0VSUk9SX0RJQUd9ID0gJGVycm9yOwoKICAgIGlmIChkZWZpbmVkICRwb3MpIHsKICAgICAgICAkX1swXS0+e19FUlJPUl9QT1N9ID0gJHBvczsKICAgIH0KCiAgICByZXR1cm47Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCkJFR0lOIHsKICAgIGZvciBteSAkbWV0aG9kIChxdy9xdW90ZV9jaGFyIGVzY2FwZV9jaGFyIHNlcF9jaGFyIGVvbCBhbHdheXNfcXVvdGUgYmluYXJ5IGFsbG93X3doaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gYWxsb3dfbG9vc2VfcXVvdGVzIGFsbG93X2xvb3NlX2VzY2FwZXMgdmVyYmF0aW0gYmxhbmtfaXNfdW5kZWYvKSB7CiAgICAgICAgZXZhbCBxcXwKICAgICAgICAgICAgc3ViICRtZXRob2QgewogICAgICAgICAgICAgICAgXCRfWzBdLT57JG1ldGhvZH0gPSBcJF9bMV0gaWYgKFxAXyA+IDEpOwogICAgICAgICAgICAgICAgXCRfWzBdLT57JG1ldGhvZH07CiAgICAgICAgICAgIH0KICAgICAgICB8OwogICAgfQp9CiMgICAgICAgICAgICAgICAgXCRfWzBdLT57JG1ldGhvZH0gPSBcJF9bMV0gaWYgKGRlZmluZWQgXCRfWzFdKTsKCnN1YiBTZXREaWFnIHsKICAgIGlmICggZGVmaW5lZCAkX1sxXSBhbmQgJF9bMV0gPT0gMCApIHsKICAgICAgICAkX1swXS0+e19FUlJPUl9ESUFHfSA9IHVuZGVmOwogICAgfQoKICAgICRfWzBdLT5fc2V0X2Vycm9yX2RpYWcoICRfWzFdICk7CiAgICBDYXJwOjpjcm9hayggJF9bMF0tPmVycm9yX2RpYWcgLiAnJyApOwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpwYWNrYWdlIFRleHQ6OkNTVjo6RXJyb3JEaWFnOwoKdXNlIHN0cmljdDsKdXNlIG92ZXJsb2FkICgKICAgICciIicgPT4gXCZzdHJpbmdpZnksCiAgICAnKycgID0+IFwmbnVtZXJpYywKICAgICctJyAgPT4gXCZudW1lcmljLAogICAgJyonICA9PiBcJm51bWVyaWMsCiAgICAnLycgID0+IFwmbnVtZXJpYywKKTsKCgpzdWIgbnVtZXJpYyB7CiAgICBteSAoJGxlZnQsICRyaWdodCkgPSBAXzsKICAgIHJldHVybiByZWYgJGxlZnQgPyAkbGVmdC0+WzBdIDogJHJpZ2h0LT5bMF07Cn0KCgpzdWIgc3RyaW5naWZ5IHsKICAgICRfWzBdLT5bMV07Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKMTsKX19FTkRfXwoKPWhlYWQxIE5BTUUKClRleHQ6OkNTVl9QUCAtIFRleHQ6OkNTVl9YUyBjb21wYXRpYmxlIHB1cmUtUGVybCBtb2R1bGUKCgo9aGVhZDEgU1lOT1BTSVMKCiB1c2UgVGV4dDo6Q1NWX1BQOwogCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcoKTsgICAgICMgY3JlYXRlIGEgbmV3IG9iamVjdAogIyBJZiB5b3Ugd2FudCB0byBoYW5kbGUgbm9uLWFzY2lpIGNoYXIuCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcoe2JpbmFyeSA9PiAxfSk7CiAKICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lKEBjb2x1bW5zKTsgICAgIyBjb21iaW5lIGNvbHVtbnMgaW50byBhIHN0cmluZwogJGxpbmUgICA9ICRjc3YtPnN0cmluZygpOyAgICAgICAgICAgICAjIGdldCB0aGUgY29tYmluZWQgc3RyaW5nCiAKICRzdGF0dXMgID0gJGNzdi0+cGFyc2UoJGxpbmUpOyAgICAgICAgIyBwYXJzZSBhIENTViBzdHJpbmcgaW50byBmaWVsZHMKIEBjb2x1bW5zID0gJGNzdi0+ZmllbGRzKCk7ICAgICAgICAgICAgIyBnZXQgdGhlIHBhcnNlZCBmaWVsZHMKIAogJHN0YXR1cyAgICAgICA9ICRjc3YtPnN0YXR1cyAoKTsgICAgICAjIGdldCB0aGUgbW9zdCByZWNlbnQgc3RhdHVzCiAkYmFkX2FyZ3VtZW50ID0gJGNzdi0+ZXJyb3JfaW5wdXQgKCk7ICMgZ2V0IHRoZSBtb3N0IHJlY2VudCBiYWQgYXJndW1lbnQKICRkaWFnICAgICAgICAgPSAkY3N2LT5lcnJvcl9kaWFnICgpOyAgIyBpZiBhbiBlcnJvciBvY2N1cmVkLCBleHBsYWlucyBXSFkKIAogJHN0YXR1cyA9ICRjc3YtPnByaW50ICgkaW8sICRjb2xyZWYpOyAjIFdyaXRlIGFuIGFycmF5IG9mIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IHRvIGEgZmlsZSAkaW8KICRjb2xyZWYgPSAkY3N2LT5nZXRsaW5lICgkaW8pOyAgICAgICAgIyBSZWFkIGEgbGluZSBmcm9tIGZpbGUgJGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhcnNlIGl0IGFuZCByZXR1cm4gYW4gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWYgb2YgZmllbGRzCiAkY3N2LT5jb2x1bW5fbmFtZXMgKEBuYW1lcyk7ICAgICAgICAgICMgU2V0IGNvbHVtbiBuYW1lcyBmb3IgZ2V0bGluZV9ociAoKQogJHJlZiA9ICRjc3YtPmdldGxpbmVfaHIgKCRpbyk7ICAgICAgICAjIGdldGxpbmUgKCksIGJ1dCByZXR1cm5zIGEgaGFzaHJlZgogJGVvZiA9ICRjc3YtPmVvZiAoKTsgICAgICAgICAgICAgICAgICAjIEluZGljYXRlIGlmIGxhc3QgcGFyc2Ugb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXRsaW5lICgpIGhpdCBFbmQgT2YgRmlsZQogCiAkY3N2LT50eXBlcyhcQHRfYXJyYXkpOyAgICAgICAgICAgICAgICMgU2V0IGNvbHVtbiB0eXBlcwoKCj1oZWFkMSBERVNDUklQVElPTgoKVGV4dDo6Q1NWX1BQIGhhcyBhbG1vc3Qgc2FtZSBmdW5jdGlvbnMgb2YgTDxUZXh0OjpDU1ZfWFM+IHdoaWNoIApwcm92aWRlcyBmYWNpbGl0aWVzIGZvciB0aGUgY29tcG9zaXRpb24gYW5kIGRlY29tcG9zaXRpb24gb2YKY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gQXMgaXRzIG5hbWUgc3VnZ2VzdHMsIEw8VGV4dDo6Q1NWX1hTPgppcyBhIFhTIG1vZHVsZSBhbmQgVGV4dDo6Q1NWX1BQIGlzIGEgUHVlciBQZXJsIG9uZS4KCgo9aGVhZDEgRlVOQ1RJT05TCgpUaGVzZSBtZXRob2RzIGFyZSBhbG1vc3Qgc2FtZSBhcyBUZXh0OjpDU1ZfWFMuCk1vc3Qgb2YgdGhlIGRvY3VtZW50YXRpb24gd2FzIHNoYW1lbGVzc2x5IGNvcGllZCBhbmQgcmVwbGFjZWQgZnJvbSBUZXh0OjpDU1ZfWFMuCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFM+LgoKPWhlYWQyIHZlcnNpb24gKCkKCihDbGFzcyBtZXRob2QpIFJldHVybnMgdGhlIGN1cnJlbnQgbW9kdWxlIHZlcnNpb24uCgo9aGVhZDIgbmV3IChcJWF0dHIpCgooQ2xhc3MgbWV0aG9kKSBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIFRleHQ6OkNTVl9YUy4gVGhlIG9iamVjdHMKYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSAob3B0aW9uYWwpIGhhc2ggcmVmIEM8XCVhdHRyPi4KQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlOgoKPW92ZXIgNAoKPWl0ZW0gZW9sCgpBbiBlbmQtb2YtbGluZSBzdHJpbmcgdG8gYWRkIHRvIHJvd3MsIHVzdWFsbHkgQzx1bmRlZj4gKG5vdGhpbmcsCmRlZmF1bHQpLCBDPCJcMDEyIj4gKExpbmUgRmVlZCkgb3IgQzwiXDAxNVwwMTIiPiAoQ2FycmlhZ2UgUmV0dXJuLApMaW5lIEZlZWQpLiBDYW5ub3QgYmUgbG9uZ2VyIHRoYW4gNyAoQVNDSUkpIGNoYXJhY3RlcnMuCgpJZiBib3RoIEM8JC8+IGFuZCBDPGVvbD4gZXF1YWwgQzwiXDAxNSI+LCBwYXJzaW5nIGxpbmVzIHRoYXQgZW5kIG9uCm9ubHkgYSBDYXJyaWFnZSBSZXR1cm4gd2l0aG91dCBMaW5lIEZlZWQsIHdpbGwgYmUgQzxwYXJzZT5kIGNvcnJlY3QuCkxpbmUgZW5kaW5ncywgd2hldGhlciBpbiBDPCQvPiBvciBDPGVvbD4sIG90aGVyIHRoYW4gQzx1bmRlZj4sCkM8IlxuIj4sIEM8IlxyXG4iPiwgb3IgQzwiXHIiPiBhcmUgbm90ICh5ZXQpIHN1cHBvcnRlZCBmb3IgcGFyc2luZy4KCj1pdGVtIHNlcF9jaGFyCgpUaGUgY2hhciB1c2VkIGZvciBzZXBhcmF0aW5nIGZpZWxkcywgYnkgZGVmYXVsdCBhIGNvbW1hLiAoQzwsPikuCkxpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlIHJhbmdlIGZyb20gMHgyMAooc3BhY2UpIHRvIDB4N2UgKHRpbGRlKS4KClRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBxdW90ZSBjaGFyYWN0ZXIuClRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBlc2NhcGUgY2hhcmFjdGVyLgoKPWl0ZW0gYWxsb3dfd2hpdGVzcGFjZQoKV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgd2hpdGVzcGFjZSAoVEFCJ3MgYW5kIFNQQUNFJ3MpCnN1cnJvdW5kaW5nIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gcGFyc2luZy4gU28KbGluZXMgbGlrZToKCiAgMSAsICJmb28iICwgYmFyICwgMyAsIHphcHAKCmFyZSBub3cgY29ycmVjdGx5IHBhcnNlZCwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIENTViBzcGVjcy4KTm90ZSB0aGF0IEI8YWxsPiB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gc3RhcnQgYW5kIGVuZCBvZiBlYWNoCmZpZWxkLiBUaGF0IHdvdWxkIG1ha2UgaXMgbW9yZSBhIEk8ZmVhdHVyZT4gdGhhbiBhIHdheSB0byBiZSBhYmxlCnRvIHBhcnNlIGJhZCBDU1YgbGluZXMsIGFzCgogMSwgICAyLjAsICAzLCAgIGFwZSAgLCBtb25rZXkKCndpbGwgbm93IGJlIHBhcnNlZCBhcwoKICgiMSIsICIyLjAiLCAiMyIsICJhcGUiLCAibW9ua2V5IikKCmV2ZW4gaWYgdGhlIG9yaWdpbmFsIGxpbmUgd2FzIHBlcmZlY3RseSBzYW5lIENTVi4KCj1pdGVtIGJsYW5rX2lzX3VuZGVmCgpVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgQ1NWIGRhdGEgbWFrZXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbgpxdW90ZWQtIGFuZCB1bnF1b3RlZCBlbXB0eSBmaWVsZHMuIFRoZXkgYm90aCBlbmQgdXAgaW4gYW4gZW1wdHkKc3RyaW5nIGZpZWxkIG9uY2UgcmVhZCwgc28KCiAxLCIiLCwiICIsMgoKaXMgcmVhZCBhcwoKICgiMSIsICIiLCAiIiwgIiAiLCAiMiIpCgpXaGVuIEk8d3JpdGluZz4gQ1NWIGZpbGVzIHdpdGggQzxhbHdheXNfcXVvdGU+IHNldCwgdGhlIHVucXVvdGVkIGVtcHR5CmZpZWxkIGlzIHRoZSByZXN1bHQgb2YgYW4gdW5kZWZpbmVkIHZhbHVlLiBUbyBtYWtlIGl0IHBvc3NpYmxlIHRvIGFsc28KbWFrZSB0aGlzIGRpc3RpbmN0aW9uIHdoZW4gcmVhZGluZyBDU1YgZGF0YSwgdGhlIEM8YmxhbmtfaXNfdW5kZWY+IG9wdGlvbgp3aWxsIGNhdXNlIHVucXVvdGVkIGVtcHR5IGZpZWxkcyB0byBiZSBzZXQgdG8gdW5kZWYsIGNhdXNpbmcgdGhlIGFib3ZlIHRvCmJlIHBhcnNlZCBhcwoKICgiMSIsICIiLCB1bmRlZiwgIiAiLCAiMiIpCgo9aXRlbSBxdW90ZV9jaGFyCgpUaGUgY2hhciB1c2VkIGZvciBxdW90aW5nIGZpZWxkcyBjb250YWluaW5nIGJsYW5rcywgYnkgZGVmYXVsdCB0aGUKZG91YmxlIHF1b3RlIGNoYXJhY3RlciAoQzwiPikuIEEgdmFsdWUgb2YgdW5kZWYgc3VwcHJlc3NlcwpxdW90ZSBjaGFycy4gKEZvciBzaW1wbGUgY2FzZXMgb25seSkuCkxpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlIHJhbmdlIGZyb20gMHgyMAooc3BhY2UpIHRvIDB4N2UgKHRpbGRlKS4KClRoZSBxdW90ZSBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIuCgo9aXRlbSBhbGxvd19sb29zZV9xdW90ZXMKCkJ5IGRlZmF1bHQsIHBhcnNpbmcgZmllbGRzIHRoYXQgaGF2ZSBDPHF1b3RlX2NoYXI+IGNoYXJhY3RlcnMgaW5zaWRlCmFuIHVucXVvdGVkIGZpZWxkLCBsaWtlCgogMSxmb28gImJhciIgYmF6LDQyCgp3b3VsZCByZXN1bHQgaW4gYSBwYXJzZSBlcnJvci4gVGhvdWdoIGl0IGlzIHN0aWxsIGJhZCBwcmFjdGljZSB0bwphbGxvdyB0aGlzIGZvcm1hdCwgd2UgY2Fubm90IGhlbHAgdGhlcmUgYXJlIHNvbWUgdmVuZG9ycyB0aGF0IG1ha2UKdGhlaXIgYXBwbGljYXRpb25zIHNwaXQgb3V0IGxpbmVzIHN0eWxlZCBsaWtlIHRoaXMuCgpJbiBjYXNlIHRoZXJlIGlzIEI8cmVhbGx5PiBiYWQgQ1NWIGRhdGEsIGxpa2UKCiAxLCJmb28gImJhciIgYmF6Iiw0MgoKb3IKCiAxLCIiZm9vIGJhciBiYXoiIiw0MgoKdGhlcmUgaXMgYSB3YXkgdG8gZ2V0IHRoYXQgcGFyc2VkLCBhbmQgbGVhdmUgdGhlIHF1b3RlcyBpbnNpZGUgdGhlIHF1b3RlZApmaWVsZCBhcy1pcy4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZyBDPGFsbG93X2xvb3NlX3F1b3Rlcz4gQjxBTkQ+Cm1ha2luZyBzdXJlIHRoYXQgdGhlIEM8ZXNjYXBlX2NoYXI+IGlzIEk8bm90PiBlcXVhbCB0byBDPHF1b3RlX2NoYXI+LgoKPWl0ZW0gZXNjYXBlX2NoYXIKClRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgZXNjYXBpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluc2lkZSBxdW90ZWQgZmllbGRzLgpMaW1pdGVkIHRvIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZSByYW5nZSBmcm9tIDB4MjAKKHNwYWNlKSB0byAweDdlICh0aWxkZSkuCgpUaGUgQzxlc2NhcGVfY2hhcj4gZGVmYXVsdHMgdG8gYmVpbmcgdGhlIGxpdGVyYWwgZG91YmxlLXF1b3RlIG1hcmsgKEM8Ij4pCmluIG90aGVyIHdvcmRzLCB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBDPHF1b3RlX2NoYXI+LiBUaGlzIG1lYW5zIHRoYXQKZG91YmxpbmcgdGhlIHF1b3RlIG1hcmsgaW4gYSBmaWVsZCBlc2NhcGVzIGl0OgoKICAiZm9vIiwiYmFyIiwiRXNjYXBlICIicXVvdGUgbWFyayIiIHdpdGggdHdvICIicXVvdGUgbWFya3MiIiIsImJheiIKCklmIHlvdSBjaGFuZ2UgdGhlIGRlZmF1bHQgcXVvdGVfY2hhciB3aXRob3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0CmVzY2FwZV9jaGFyLCB0aGUgZXNjYXBlX2NoYXIgd2lsbCBzdGlsbCBiZSB0aGUgcXVvdGUgbWFyay4gIElmIGluc3RlYWQgCnlvdSB3YW50IHRvIGVzY2FwZSB0aGUgcXVvdGVfY2hhciBieSBkb3VibGluZyBpdCwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UKdGhlIGVzY2FwZV9jaGFyIHRvIGJlIHRoZSBzYW1lIGFzIHdoYXQgeW91IGNoYW5nZWQgdGhlIHF1b3RlX2NoYXIgdG8uCgpUaGUgZXNjYXBlIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3Rlci4KCj1pdGVtIGFsbG93X2xvb3NlX2VzY2FwZXMKCkJ5IGRlZmF1bHQsIHBhcnNpbmcgZmllbGRzIHRoYXQgaGF2ZSBDPGVzY2FwZV9jaGFyPiBjaGFyYWN0ZXJzIHRoYXQKZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QgbmVlZCB0byBiZSBlc2NhcGVkLCBsaWtlOgoKIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBlc2NhcGVfY2hhciA9PiAiXFwiIH0pOwogJGNzdi0+cGFyc2UgKHFxezEsIm15IGJhclwncyIsYmF6LDQyfSk7Cgp3b3VsZCByZXN1bHQgaW4gYSBwYXJzZSBlcnJvci4gVGhvdWdoIGl0IGlzIHN0aWxsIGJhZCBwcmFjdGljZSB0bwphbGxvdyB0aGlzIGZvcm1hdCwgdGhpcyBvcHRpb24gZW5hYmxlcyB5b3UgdG8gdHJlYXQgYWxsIGVzY2FwZSBjaGFyYWN0ZXIKc2VxdWVuY2VzIGVxdWFsLgoKPWl0ZW0gYmluYXJ5CgpJZiB0aGlzIGF0dHJpYnV0ZSBpcyBUUlVFLCB5b3UgbWF5IHVzZSBiaW5hcnkgY2hhcmFjdGVycyBpbiBxdW90ZWQgZmllbGRzLAppbmNsdWRpbmcgbGluZSBmZWVkcywgY2FycmlhZ2UgcmV0dXJucyBhbmQgTlVMTCBieXRlcy4gKFRoZSBsYXR0ZXIgbXVzdApiZSBlc2NhcGVkIGFzIEM8IjA+LikgQnkgZGVmYXVsdCB0aGlzIGZlYXR1cmUgaXMgb2ZmLgoKPWl0ZW0gdHlwZXMKCkEgc2V0IG9mIGNvbHVtbiB0eXBlczsgdGhpcyBhdHRyaWJ1dGUgaXMgaW1tZWRpYXRlbHkgcGFzc2VkIHRvIHRoZQpJPHR5cGVzPiBtZXRob2QgYmVsb3cuIFlvdSBtdXN0IG5vdCBzZXQgdGhpcyBhdHRyaWJ1dGUgb3RoZXJ3aXNlLApleGNlcHQgZm9yIHVzaW5nIHRoZSBJPHR5cGVzPiBtZXRob2QuIEZvciBkZXRhaWxzIHNlZSB0aGUgZGVzY3JpcHRpb24Kb2YgdGhlIEk8dHlwZXM+IG1ldGhvZCBiZWxvdy4KCj1pdGVtIGFsd2F5c19xdW90ZQoKQnkgZGVmYXVsdCB0aGUgZ2VuZXJhdGVkIGZpZWxkcyBhcmUgcXVvdGVkIG9ubHksIGlmIHRoZXkgbmVlZCB0bywgZm9yCmV4YW1wbGUsIGlmIHRoZXkgY29udGFpbiB0aGUgc2VwYXJhdG9yLiBJZiB5b3Ugc2V0IHRoaXMgYXR0cmlidXRlIHRvCmEgVFJVRSB2YWx1ZSwgdGhlbiBhbGwgZmllbGRzIHdpbGwgYmUgcXVvdGVkLiBUaGlzIGlzIHR5cGljYWxseSBlYXNpZXIKdG8gaGFuZGxlIGluIGV4dGVybmFsIGFwcGxpY2F0aW9ucy4KCj1pdGVtIGtlZXBfbWV0YV9pbmZvCgpCeSBkZWZhdWx0LCB0aGUgcGFyc2luZyBvZiBpbnB1dCBsaW5lcyBpcyBhcyBzaW1wbGUgYW5kIGZhc3QgYXMKcG9zc2libGUuIEhvd2V2ZXIsIHNvbWUgcGFyc2luZyBpbmZvcm1hdGlvbiAtIGxpa2UgcXVvdGF0aW9uIG9mCnRoZSBvcmlnaW5hbCBmaWVsZCAtIGlzIGxvc3QgaW4gdGhhdCBwcm9jZXNzLiBTZXQgdGhpcyBmbGFnIHRvCnRydWUgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSB0aGF0IGluZm9ybWF0aW9uIGFmdGVyIHBhcnNpbmcgd2l0aAp0aGUgbWV0aG9kcyBDPG1ldGFfaW5mbyAoKT4sIEM8aXNfcXVvdGVkICgpPiwgYW5kIEM8aXNfYmluYXJ5ICgpPgpkZXNjcmliZWQgYmVsb3cuICBEZWZhdWx0IGlzIGZhbHNlLgoKPWl0ZW0gdmVyYmF0aW0KClRoaXMgaXMgYSBxdWl0ZSBjb250cm92ZXJzaWFsIGF0dHJpYnV0ZSB0byBzZXQsIGJ1dCBpdCBtYWtlcyBoYXJkCnRoaW5ncyBwb3NzaWJsZS4KClRoZSBiYXNpYyB0aG91Z2h0IGJlaGluZCB0aGlzIGlzIHRvIHRlbGwgdGhlIHBhcnNlciB0aGF0IHRoZSBub3JtYWxseQpzcGVjaWFsIGNoYXJhY3RlcnMgbmV3bGluZSAoTkwpIGFuZCBDYXJyaWFnZSBSZXR1cm4gKENSKSB3aWxsIG5vdCBiZQpzcGVjaWFsIHdoZW4gdGhpcyBmbGFnIGlzIHNldCwgYW5kIGJlIGRlYWx0IHdpdGggYXMgYmVpbmcgb3JkaW5hcnkKYmluYXJ5IGNoYXJhY3RlcnMuIFRoaXMgd2lsbCBlYXNlIHdvcmtpbmcgd2l0aCBkYXRhIHdpdGggZW1iZWRkZWQKbmV3bGluZXMuCgpXaGVuIEM8dmVyYmF0aW0+IGlzIHVzZWQgd2l0aCBDPGdldGxpbmUgKCk+LCBnZXRsaW5lCmF1dG8tY2hvbXAncyBldmVyeSBsaW5lLgoKSW1hZ2luZSBhIGZpbGUgZm9ybWF0IGxpa2UKCiAgTV5eSGFuc15KYW5zc2VuXktsYXMgMlxuMkFeSmFeMTEtMDYtMjAwNyNcclxuCgp3aGVyZSwgdGhlIGxpbmUgZW5kaW5nIGlzIGEgdmVyeSBzcGVjaWZpYyAiI1xyXG4iLCBhbmQgdGhlIHNlcF9jaGFyCmlzIGEgXiAoY2FyZXQpLiBOb25lIG9mIHRoZSBmaWVsZHMgaXMgcXVvdGVkLCBidXQgZW1iZWRkZWQgYmluYXJ5CmRhdGEgaXMgbGlrZWx5IHRvIGJlIHByZXNlbnQuIFdpdGggdGhlIHNwZWNpZmljIGxpbmUgZW5kaW5nLCB0aGF0CnNob3VsZG4ndCBiZSB0b28gaGFyZCB0byBkZXRlY3QuCgpCeSBkZWZhdWx0LCBUZXh0OjpDU1ZfUFAnIHBhcnNlIGZ1bmN0aW9uIGhvd2V2ZXIgaXMgaW5zdHJ1Y3RlZCB0byBvbmx5Cmtub3cgYWJvdXQgIlxuIiBhbmQgIlxyIiB0byBiZSBsZWdhbCBsaW5lIGVuZGluZ3MsIGFuZCBzbyBoYXMgdG8gZGVhbAp3aXRoIHRoZSBlbWJlZGRlZCBuZXdsaW5lIGFzIGEgcmVhbCBlbmQtb2YtbGluZSwgc28gaXQgY2FuIHNjYW4gdGhlIG5leHQKbGluZSBpZiBiaW5hcnkgaXMgdHJ1ZSwgYW5kIHRoZSBuZXdsaW5lIGlzIGluc2lkZSBhIHF1b3RlZCBmaWVsZC4KV2l0aCB0aGlzIGF0dHJpYnV0ZSBob3dldmVyLCB3ZSBjYW4gdGVsbCBwYXJzZSAoKSB0byBwYXJzZSB0aGUgbGluZQphcyBpZiBcbiBpcyBqdXN0IG5vdGhpbmcgbW9yZSB0aGFuIGEgYmluYXJ5IGNoYXJhY3Rlci4KCkZvciBwYXJzZSAoKSB0aGlzIG1lYW5zIHRoYXQgdGhlIHBhcnNlciBoYXMgbm8gaWRlYSBhYm91dCBsaW5lIGVuZGluZwphbnltb3JlLCBhbmQgZ2V0bGluZSAoKSBjaG9tcHMgbGluZSBlbmRpbmdzIG9uIHJlYWRpbmcuCgo9YmFjawoKVG8gc3VtIGl0IHVwLAoKICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoKTsKCmlzIGVxdWl2YWxlbnQgdG8KCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsKICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICcsJywKICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMCwKICAgICBiaW5hcnkgICAgICAgICAgICAgID0+IDAsCiAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICBhbGxvd19sb29zZV9lc2NhcGVzID0+IDAsCiAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICB2ZXJiYXRpbSAgICAgICAgICAgID0+IDAsCiAgICAgfSk7CgpGb3IgYWxsIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgZmxhZ3MsIHRoZXJlIGlzIGFuIGFjY2Vzc29yIG1ldGhvZAphdmFpbGFibGUgd2hlcmUgeW91IGNhbiBpbnF1aXJlIGZvciB0aGUgY3VycmVudCB2YWx1ZSwgb3IgY2hhbmdlCnRoZSB2YWx1ZQoKIG15ICRxdW90ZSA9ICRjc3YtPnF1b3RlX2NoYXI7CiAkY3N2LT5iaW5hcnkgKDEpOwoKSXQgaXMgdW53aXNlIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyBoYWxmd2F5IHRocm91Z2ggd3JpdGluZyBDU1YKZGF0YSB0byBhIHN0cmVhbS4gSWYgaG93ZXZlciwgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHN0cmVhbSB1c2luZwp0aGUgYXZhaWxhYmxlIENTViBvYmplY3QsIHRoZXJlIGlzIG5vIGhhcm0gaW4gY2hhbmdpbmcgdGhlbS4KCklmIHRoZSBDPG5ldyAoKT4gY29uc3RydWN0b3IgY2FsbCBmYWlscywgaXQgcmV0dXJucyBDPHVuZGVmPiwgYW5kIG1ha2VzCnRoZSBmYWlsIHJlYXNvbiBhdmFpbGFibGUgdGhyb3VnaCB0aGUgQzxlcnJvcl9kaWFnICgpPiBtZXRob2QuCgogJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGVjc19jaGFyID0+IDEgfSkgb3IKICAgICBkaWUgVGV4dDo6Q1NWX1BQLT5lcnJvcl9kaWFnICgpOwoKQzxlcnJvcl9kaWFnICgpPiB3aWxsIHJldHVybiBhIHN0cmluZyBsaWtlCgogIlVua25vd24gYXR0cmlidXRlICdlY3NfY2hhciciCgo9aGVhZDIgY29tYmluZQoKICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lIChAY29sdW1ucyk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgQ1NWIHN0cmluZyBmcm9tIHRoZSBhcmd1bWVudHMsIHJldHVybmluZwpzdWNjZXNzIG9yIGZhaWx1cmUuICBGYWlsdXJlIGNhbiByZXN1bHQgZnJvbSBsYWNrIG9mIGFyZ3VtZW50cyBvciBhbiBhcmd1bWVudApjb250YWluaW5nIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgVXBvbiBzdWNjZXNzLCBDPHN0cmluZyAoKT4gY2FuIGJlIGNhbGxlZCB0bwpyZXRyaWV2ZSB0aGUgcmVzdWx0YW50IENTViBzdHJpbmcuICBVcG9uIGZhaWx1cmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieQpDPHN0cmluZyAoKT4gaXMgdW5kZWZpbmVkIGFuZCBDPGVycm9yX2lucHV0ICgpPiBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlIGFuCmludmFsaWQgYXJndW1lbnQuCgo9aGVhZDIgcHJpbnQKCiAkc3RhdHVzID0gJGNzdi0+cHJpbnQgKCRpbywgJGNvbHJlZik7CgpTaW1pbGFyIHRvIGNvbWJpbmUsIGJ1dCBpdCBleHBlY3RzIGFuIGFycmF5IHJlZiBhcyBpbnB1dCAobm90IGFuIGFycmF5ISkKYW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIG5vdCByZWFsbHkgY3JlYXRlZCwgYnV0IGltbWVkaWF0ZWx5IHdyaXR0ZW4KdG8gdGhlIEk8JGlvPiBvYmplY3QsIHR5cGljYWxseSBhbiBJTyBoYW5kbGUgb3IgYW55IG90aGVyIG9iamVjdCB0aGF0Cm9mZmVycyBhIEk8cHJpbnQ+IG1ldGhvZC4gTm90ZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBpcyB3cm9uZzoKCiBvcGVuIEZJTEUsICI+IiwgIndoYXRldmVyIjsKICRzdGF0dXMgPSAkY3N2LT5wcmludCAoXCpGSUxFLCAkY29scmVmKTsKClRoZSBnbG9iIEM8XCpGSUxFPiBpcyBub3QgYW4gb2JqZWN0LCB0aHVzIGl0IGRvZXNuJ3QgaGF2ZSBhIHByaW50Cm1ldGhvZC4gVGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBhbiBJTzo6RmlsZSBvYmplY3Qgb3IgdG8gaGlkZSB0aGUKZ2xvYiBiZWhpbmQgYW4gSU86OldyYXAgb2JqZWN0LiBTZWUgTDxJTzo6RmlsZSgzKT4gYW5kIEw8SU86OldyYXAoMyk+CmZvciBkZXRhaWxzLgoKRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhlIHByaW50IG1ldGhvZCBkb2Vzbid0IGNyZWF0ZSBhIHJlc3VsdCBzdHJpbmcuCkluIHBhcnRpY3VsYXIgdGhlIEk8JGNzdi1FPGd0PnN0cmluZyAoKT4sIEk8JGNzdi1FPGd0PnN0YXR1cyAoKT4sCkk8JGNzdi0+ZmllbGRzICgpPiBhbmQgSTwkY3N2LUU8Z3Q+ZXJyb3JfaW5wdXQgKCk+IG1ldGhvZHMgYXJlIG1lYW5pbmdsZXNzCmFmdGVyIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KCj1oZWFkMiBzdHJpbmcKCiAkbGluZSA9ICRjc3YtPnN0cmluZyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHRvIEM8cGFyc2UgKCk+IG9yIHRoZSByZXN1bHRhbnQgQ1NWCnN0cmluZyBvZiBDPGNvbWJpbmUgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIHBhcnNlCgogJHN0YXR1cyA9ICRjc3YtPnBhcnNlICgkbGluZSk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiBkZWNvbXBvc2VzIGEgQ1NWIHN0cmluZyBpbnRvIGZpZWxkcywgcmV0dXJuaW5nCnN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEZhaWx1cmUgY2FuIHJlc3VsdCBmcm9tIGEgbGFjayBvZiBhcmd1bWVudCBvciB0aGUKZ2l2ZW4gQ1NWIHN0cmluZyBpcyBpbXByb3Blcmx5IGZvcm1hdHRlZC4gIFVwb24gc3VjY2VzcywgQzxmaWVsZHMgKCk+IGNhbgpiZSBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIGRlY29tcG9zZWQgZmllbGRzIC4gIFVwb24gZmFpbHVyZSwgdGhlIHZhbHVlCnJldHVybmVkIGJ5IEM8ZmllbGRzICgpPiBpcyB1bmRlZmluZWQgYW5kIEM8ZXJyb3JfaW5wdXQgKCk+IGNhbiBiZSBjYWxsZWQKdG8gcmV0cmlldmUgdGhlIGludmFsaWQgYXJndW1lbnQuCgpZb3UgbWF5IHVzZSB0aGUgSTx0eXBlcyAoKT4gbWV0aG9kIGZvciBzZXR0aW5nIGNvbHVtbiB0eXBlcy4gU2VlIHRoZQpkZXNjcmlwdGlvbiBiZWxvdy4KCj1oZWFkMiBnZXRsaW5lCgogJGNvbHJlZiA9ICRjc3YtPmdldGxpbmUgKCRpbyk7CgpUaGlzIGlzIHRoZSBjb3VudGVycGFydCB0byBwcmludCwgbGlrZSBwYXJzZSBpcyB0aGUgY291bnRlcnBhcnQgdG8KY29tYmluZTogSXQgcmVhZHMgYSByb3cgZnJvbSB0aGUgSU8gb2JqZWN0ICRpbyB1c2luZyAkaW8tPmdldGxpbmUgKCkKYW5kIHBhcnNlcyB0aGlzIHJvdyBpbnRvIGFuIGFycmF5IHJlZi4gVGhpcyBhcnJheSByZWYgaXMgcmV0dXJuZWQKYnkgdGhlIGZ1bmN0aW9uIG9yIHVuZGVmIGZvciBmYWlsdXJlLgoKV2hlbiBmaWVsZHMgYXJlIGJvdW5kIHdpdGggQzxiaW5kX2NvbHVtbnMgKCk+LCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEKcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGxpc3QuCgpUaGUgSTwkY3N2LUU8Z3Q+c3RyaW5nICgpPiwgSTwkY3N2LUU8Z3Q+ZmllbGRzICgpPiBhbmQgSTwkY3N2LUU8Z3Q+c3RhdHVzICgpPgptZXRob2RzIGFyZSBtZWFuaW5nbGVzcywgYWdhaW4uCgo9aGVhZDIgZ2V0bGluZV9ocgoKVGhlIEM8Z2V0bGluZV9ociAoKT4gYW5kIEM8Y29sdW1uX25hbWVzICgpPiBtZXRob2RzIHdvcmsgdG9nZXRoZXIgdG8gYWxsb3cKeW91IHRvIGhhdmUgcm93cyByZXR1cm5lZCBhcyBoYXNocmVmcy4gWW91IG11c3QgY2FsbCBDPGNvbHVtbl9uYW1lcyAoKT4KZmlyc3QgdG8gZGVjbGFyZSB5b3VyIGNvbHVtbiBuYW1lcy4gCgogJGNzdi0+Y29sdW1uX25hbWVzIChxdyggY29kZSBuYW1lIHByaWNlIGRlc2NyaXB0aW9uICkpOwogJGhyID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsKIHByaW50ICJQcmljZSBmb3IgJGhyLT57bmFtZX0gaXMgJGhyLT57cHJpY2V9IEVVUlxuIjsKCkM8Z2V0bGluZV9ociAoKT4gd2lsbCBjcm9hayBpZiBjYWxsZWQgYmVmb3JlIEM8Y29sdW1uX25hbWVzICgpPi4KCj1oZWFkMiBjb2x1bW5fbmFtZXMKClNldCB0aGUga2V5cyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgQzxnZXRsaW5lX2hyICgpPiBjYWxscy4gSWYgbm8ga2V5cwooY29sdW1uIG5hbWVzKSBhcmUgcGFzc2VkLCBpdCdsbCByZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZy4KCkM8Y29sdW1uX25hbWVzICgpPiBhY2NlcHRzIGEgbGlzdCBvZiBzY2FsYXJzICh0aGUgY29sdW1uIG5hbWVzKSBvciBhCnNpbmdsZSBhcnJheV9yZWYsIHNvIHlvdSBjYW4gcGFzcyBDPGdldGxpbmUgKCk+CgogICRjc3YtPmNvbHVtbl9uYW1lcyAoJGNzdi0+Z2V0bGluZSAoJGlvKSk7CgpDPGNvbHVtbl9uYW1lcyAoKT4gY3JvYWtzIG9uIGludmFsaWQgYXJndW1lbnRzLgoKPWhlYWQyIGJpbmRfY29sdW1ucwoKVGFrZXMgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gc2NhbGFycyAobWF4IDI1NSkgdG8gc3RvcmUgdGhlIGZpZWxkcyBmZXRjaGVkCkM8Z2V0bGluZSAoKT4gaW4uIFdoZW4geW91IGRvbid0IHBhc3MgZW5vdWdoIHJlZmVyZW5jZXMgdG8gc3RvcmUgdGhlCmZldGNoZWQgZmllbGRzIGluLCBDPGdldGxpbmUgKCk+IHdpbGwgZmFpbC4gSWYgeW91IHBhc3MgbW9yZSB0aGFuIHRoZXJlIGFyZQpmaWVsZHMgdG8gcmV0dXJuLCB0aGUgcmVtYWluaW5nIHJlZmVyZW5jZXMgYXJlIGxlZnQgdW50b3VjaGVkLgoKICAkY3N2LT5iaW5kX2NvbHVtbnMgKFwkY29kZSwgXCRuYW1lLCBcJHByaWNlLCBcJGRlc2NyaXB0aW9uKTsKICB3aGlsZSAoJGNzdi0+Z2V0bGluZSAoKSkgewogICAgICBwcmludCAiVGhlIHByaWNlIG9mIGEgJG5hbWUgaXMgXHh7MjBhY30gJHByaWNlXG4iOwogICAgICB9Cgo9aGVhZDIgZW9mCgogJGVvZiA9ICRjc3YtPmVvZiAoKTsKCklmIEM8cGFyc2UgKCk+IG9yIEM8Z2V0bGluZSAoKT4gd2FzIHVzZWQgd2l0aCBhbiBJTyBzdHJlYW0sIHRoaXMKbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgKDEpIGlmIHRoZSBsYXN0IGNhbGwgaGl0IGVuZCBvZiBmaWxlLCBvdGhlcndpc2UKaXQgd2lsbCByZXR1cm4gZmFsc2UgKCcnKS4gVGhpcyBpcyB1c2VmdWwgdG8gc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KYSBmYWlsdXJlIGFuZCBlbmQgb2YgZmlsZS4KCj1oZWFkMiB0eXBlcwoKICRjc3YtPnR5cGVzIChcQHRyZWYpOwoKVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmb3JjZSB0aGF0IGNvbHVtbnMgYXJlIG9mIGEgZ2l2ZW4gdHlwZS4gRm9yCmV4YW1wbGUsIGlmIHlvdSBoYXZlIGFuIGludGVnZXIgY29sdW1uLCB0d28gZG91YmxlIGNvbHVtbnMgYW5kIGEKc3RyaW5nIGNvbHVtbiwgdGhlbiB5b3UgbWlnaHQgZG8gYQoKICRjc3YtPnR5cGVzIChbVGV4dDo6Q1NWX1BQOjpJViAoKSwKICAgICAgICAgICAgICAgVGV4dDo6Q1NWX1BQOjpOViAoKSwKICAgICAgICAgICAgICAgVGV4dDo6Q1NWX1BQOjpOViAoKSwKICAgICAgICAgICAgICAgVGV4dDo6Q1NWX1BQOjpQViAoKV0pOwoKQ29sdW1uIHR5cGVzIGFyZSB1c2VkIG9ubHkgZm9yIGRlY29kaW5nIGNvbHVtbnMsIGluIG90aGVyIHdvcmRzCmJ5IHRoZSBJPHBhcnNlICgpPiBhbmQgSTxnZXRsaW5lICgpPiBtZXRob2RzLgoKWW91IGNhbiB1bnNldCBjb2x1bW4gdHlwZXMgYnkgZG9pbmcgYQoKICRjc3YtPnR5cGVzICh1bmRlZik7CgpvciBmZXRjaCB0aGUgY3VycmVudCB0eXBlIHNldHRpbmdzIHdpdGgKCiAkdHlwZXMgPSAkY3N2LT50eXBlcyAoKTsKCj1vdmVyIDQKCj1pdGVtIElWCgpTZXQgZmllbGQgdHlwZSB0byBpbnRlZ2VyLgoKPWl0ZW0gTlYKClNldCBmaWVsZCB0eXBlIHRvIG51bWVyaWMvZmxvYXQuCgo9aXRlbSBQVgoKU2V0IGZpZWxkIHR5cGUgdG8gc3RyaW5nLgoKPWJhY2sKCj1oZWFkMiBmaWVsZHMKCiBAY29sdW1ucyA9ICRjc3YtPmZpZWxkcyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHRvIEM8Y29tYmluZSAoKT4gb3IgdGhlIHJlc3VsdGFudApkZWNvbXBvc2VkIGZpZWxkcyBvZiBDPHBhcnNlICgpPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCj1oZWFkMiBtZXRhX2luZm8KCiBAZmxhZ3MgPSAkY3N2LT5tZXRhX2luZm8gKCk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSBmbGFncyBvZiB0aGUgaW5wdXQgdG8gQzxjb21iaW5lICgpPiBvcgp0aGUgZmxhZ3Mgb2YgdGhlIHJlc3VsdGFudCBkZWNvbXBvc2VkIGZpZWxkcyBvZiBDPHBhcnNlICgpPiwgd2hpY2hldmVyCndhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCkZvciBlYWNoIGZpZWxkLCBhIG1ldGFfaW5mbyBmaWVsZCB3aWxsIGhvbGQgZmxhZ3MgdGhhdCB0ZWxsIHNvbWV0aGluZyBhYm91dAp0aGUgZmllbGQgcmV0dXJuZWQgYnkgdGhlIEM8ZmllbGRzICgpPiBtZXRob2Qgb3IgcGFzc2VkIHRvIHRoZSBDPGNvbWJpbmUgKCk+Cm1ldGhvZC4gVGhlIGZsYWdzIGFyZSBiaXR3aXNlLW9yJ2QgbGlrZToKCj1vdmVyIDQKCj1pdGVtIDB4MDAwMQoKVGhlIGZpZWxkIHdhcyBxdW90ZWQuCgo9aXRlbSAweDAwMDIKClRoZSBmaWVsZCB3YXMgYmluYXJ5LgoKPWJhY2sKClNlZSB0aGUgQzxpc18qKiogKCk+IG1ldGhvZHMgYmVsb3cuCgo9aGVhZDIgaXNfcXVvdGVkCgogIG15ICRxdW90ZWQgPSAkY3N2LT5pc19xdW90ZWQgKCRjb2x1bW5faWR4KTsKCldoZXJlIEM8JGNvbHVtbl9pZHg+IGlzIHRoZSAoemVyby1iYXNlZCkgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB0aGUKbGFzdCByZXN1bHQgb2YgQzxwYXJzZSAoKT4uCgpUaGlzIHJldHVybnMgYSB0cnVlIHZhbHVlIGlmIHRoZSBkYXRhIGluIHRoZSBpbmRpY2F0ZWQgY29sdW1uIHdhcwplbmNsb3NlZCBpbiBDPHF1b3RlX2NoYXI+IHF1b3Rlcy4gVGhpcyBtaWdodCBiZSBpbXBvcnRhbnQgZm9yIGRhdGEKd2hlcmUgQzwsMjAwNzAxMDgsPiBpcyB0byBiZSB0cmVhdGVkIGFzIGEgbnVtZXJpYyB2YWx1ZSwgYW5kIHdoZXJlCkM8LCIyMDA3MDEwOCIsPiBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBjaGFyYWN0ZXIgc3RyaW5nIGRhdGEuCgo9aGVhZDIgaXNfYmluYXJ5CgogIG15ICRiaW5hcnkgPSAkY3N2LT5pc19iaW5hcnkgKCRjb2x1bW5faWR4KTsKCldoZXJlIEM8JGNvbHVtbl9pZHg+IGlzIHRoZSAoemVyby1iYXNlZCkgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB0aGUKbGFzdCByZXN1bHQgb2YgQzxwYXJzZSAoKT4uCgpUaGlzIHJldHVybnMgYSB0cnVlIHZhbHVlIGlmIHRoZSBkYXRhIGluIHRoZSBpbmRpY2F0ZWQgY29sdW1uCmNvbnRhaW5lZCBhbnkgYnl0ZSBpbiB0aGUgcmFuZ2UgW1x4MDAtXHgwOCxceDEwLVx4MUYsXHg3Ri1ceEZGXQoKPWhlYWQyIHN0YXR1cwoKICRzdGF0dXMgPSAkY3N2LT5zdGF0dXMgKCk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3MgKG9yIGZhaWx1cmUpIG9mIEM8Y29tYmluZSAoKT4gb3IKQzxwYXJzZSAoKT4sIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCgo9aGVhZDIgZXJyb3JfaW5wdXQKCiAkYmFkX2FyZ3VtZW50ID0gJGNzdi0+ZXJyb3JfaW5wdXQgKCk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSBlcnJvbmVvdXMgYXJndW1lbnQgKGlmIGl0IGV4aXN0cykgb2YKQzxjb21iaW5lICgpPiBvciBDPHBhcnNlICgpPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCj1oZWFkMiBlcnJvcl9kaWFnCgogJGNzdi0+ZXJyb3JfZGlhZyAoKTsKICRlcnJvcl9jb2RlICAgPSAwICArICRjc3YtPmVycm9yX2RpYWcgKCk7CiAkZXJyb3Jfc3RyICAgID0gIiIgLiAkY3N2LT5lcnJvcl9kaWFnICgpOwogKCRjZGUsICRzdHIsICRwb3MpID0gJGNzdi0+ZXJyb3JfZGlhZyAoKTsKCklmIChhbmQgb25seSBpZikgYW4gZXJyb3Igb2NjdXJlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkaWFnbm9zdGljcwpvZiB0aGF0IGVycm9yLgoKSWYgY2FsbGVkIGluIHZvaWQgY29udGV4dCwgaXQgd2lsbCBwcmludCB0aGUgaW50ZXJuYWwgZXJyb3IgY29kZSBhbmQgdGhlCmFzc29jaWF0ZWQgZXJyb3IgbWVzc2FnZSB0byBTVERFUlIuCgpJZiBjYWxsZWQgaW4gbGlzdCBjb250ZXh0LCBpdCB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIGVycm9yCm1lc3NhZ2UgaW4gdGhhdCBvcmRlci4gSWYgdGhlIGxhc3QgZXJyb3Igd2FzIGZyb20gcGFyc2luZywgdGhlIHRoaXJkCnZhbHVlIHJldHVybmVkIGlzIHRoZSBiZXN0IGd1ZXNzIGF0IHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGxpbmUgdGhhdCB3YXMKYmVpbmcgcGFyc2VkLiBJdCdzIHZhbHVlIGlzIDEtYmFzZWQuCgpOb3RlOiBDPCRwb3M+IGRvZXMgbm90IHNob3cgdGhlIGVycm9yIHBvaW50IGluIG1hbnkgY2FzZXMuCkl0IGlzIGZvciBjb25zY2llbmNlJ3Mgc2FrZS4KCklmIGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCwgaXQgd2lsbCByZXR1cm4gdGhlIGRpYWdub3N0aWNzIGluIGEgc2luZ2xlCnNjYWxhciwgYS1sYSAkIS4gSXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBjb2RlIGluIG51bWVyaWMgY29udGV4dCwgYW5kCnRoZSBkaWFnbm9zdGljcyBtZXNzYWdlIGluIHN0cmluZyBjb250ZXh0LgoKVG8gYWNoaWV2ZSB0aGlzIGJlaGF2aW9yIHdpdGggQ1NWX1BQLCB0aGUgcmV0dXJuZWQgZGlhZ25vc3RpY3MgaXMgYmxlc3NlZCBvYmplY3QuCgo9aGVhZDIgU2V0RGlhZwoKICRjc3YtPlNldERpYWcgKDApOwoKVXNlIHRvIHJlc2V0IHRoZSBkaWFnbm9zdGljdHMgaWYgeW91IGFyZSBkZWFsaW5nIHdpdGggZXJyb3JzLgoKPWhlYWQxIERJQUdOT1NUSUNTCgpJZiBhbiBlcnJvciBvY2N1cmVkLCAkY3N2LT5lcnJvcl9kaWFnICgpIGNhbiBiZSB1c2VkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uCm9uIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS4gTm90ZSB0aGF0IGZvciBzcGVlZCByZWFzb25zLCB0aGUgaW50ZXJuYWwgdmFsdWUKaXMgbmV2ZXIgY2xlYXJlZCBvbiBzdWNjZXNzLCBzbyB1c2luZyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZXJyb3JfZGlhZyAoKSBpbgpub3JtYWwgY2FzZXMgLSB3aGVuIG5vIGVycm9yIG9jY3VyZWQgLSBtYXkgY2F1c2UgdW5leHBlY3RlZCByZXN1bHRzLgoKTm90ZTogQ1NWX1BQJ3MgZGlhZ25vc3RpY3MgaXMgZGlmZmVyZW50IGZyb20gQ1NWX1hTJ3M6CgpUZXh0OjpDU1ZfWFMgcGFyc2VzIGNzdiBzdHJpbmdzIGJ5IGRpdmlkaW5nIG9uZSBjaGFyYWN0ZXIKd2hpbGUgVGV4dDo6Q1NWX1BQIGJ5IHVzaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zLgpUaGF0IGRpZmZlcmVuY2UgbWFrZXMgdGhlIGRpZmZlcmVudCBjYXVzZSBvZiB0aGUgZmFpbHVyZS4KCkN1cnJlbnRseSB0aGVzZSBlcnJvcnMgYXJlIGF2YWlsYWJsZToKCj1vdmVyIDIKCj1pdGVtIDEwMDEgInNlcF9jaGFyIGlzIGVxdWFsIHRvIHF1b3RlX2NoYXIgb3IgZXNjYXBlX2NoYXIiCgpUaGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgY2Fubm90IGJlIGVxdWFsIHRvIGVpdGhlciB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcgpvciB0aGUgZXNjYXBlIGNoYXJhY3RlciwgYXMgdGhhdCB3aWxsIGludmFsaWRhdGUgYWxsIHBhcnNpbmcgcnVsZXMuCgo9aXRlbSAyMDEwICJFQ1IgLSBRVU8gY2hhciBpbnNpZGUgcXVvdGVzIGZvbGxvd2VkIGJ5IENSIG5vdCBwYXJ0IG9mIEVPTCIKCj1pdGVtIDIwMTEgIkVDUiAtIENoYXJhY3RlcnMgYWZ0ZXIgZW5kIG9mIHF1b3RlZCBmaWVsZCIKCj1pdGVtIDIwMjEgIkVJUSAtIE5MIGNoYXIgaW5zaWRlIHF1b3RlcywgYmluYXJ5IG9mZiIKCj1pdGVtIDIwMjIgIkVJUSAtIENSIGNoYXIgaW5zaWRlIHF1b3RlcywgYmluYXJ5IG9mZiIKCj1pdGVtIDIwMjUgIkVJUSAtIExvb3NlIHVuZXNjYXBlZCBlc2NhcGUiCgo9aXRlbSAyMDI2ICJFSVEgLSBCaW5hcnkgY2hhcmFjdGVyIGluc2lkZSBxdW90ZWQgZmllbGQsIGJpbmFyeSBvZmYiCgo9aXRlbSAyMDI3ICJFSVEgLSBRdW90ZWQgZmllbGQgbm90IHRlcm1pbmF0ZWQiCgo9aXRlbSAyMDMwICJFSUYgLSBOTCBjaGFyIGluc2lkZSB1bnF1b3RlZCB2ZXJiYXRpbSwgYmluYXJ5IG9mZiIsCgo9aXRlbSAyMDMxICJFSUYgLSBDUiBjaGFyIGlzIGZpcnN0IGNoYXIgb2YgZmllbGQsIG5vdCBwYXJ0IG9mIEVPTCIsCgo9aXRlbSAyMDMyICJFSUYgLSBDUiBjaGFyIGluc2lkZSB1bnF1b3RlZCwgbm90IHBhcnQgb2YgRU9MIiwKCj1pdGVtIDIwMzQgIkVJRiAtIExvb3NlIHVuZXNjYXBlZCBxdW90ZSIsCgo9aXRlbSAyMDM3ICJFSUYgLSBCaW5hcnkgY2hhcmFjdGVyIGluIHVucXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIiwKCj1pdGVtIDIxMTAgIkVDQiAtIEJpbmFyeSBjaGFyYWN0ZXIgaW4gQ29tYmluZSwgYmluYXJ5IG9mZiIKCj1pdGVtIDQwMDIgIkVJUSAtIFVuZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkIgoKPWl0ZW0gNDAwMyAiRUlGIC0gRVNDIENSIgoKPWl0ZW0gNDAwNCAiRVVGIC0gIgoKPWl0ZW0gMzAwMSAiRUhSIC0gVW5zdXBwb3J0ZWQgc3ludGF4IGZvciBjb2x1bW5fbmFtZXMgKCkiCgo9aXRlbSAzMDAyICJFSFIgLSBnZXRsaW5lX2hyICgpIGNhbGxlZCBiZWZvcmUgY29sdW1uX25hbWVzICgpIgoKPWl0ZW0gMzAwMyAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGFuZCBjb2x1bW5fbmFtZXMgKCkgZmllbGRzIGNvdW50IG1pc21hdGNoIgoKPWl0ZW0gMzAwNCAiRUhSIC0gYmluZF9jb2x1bW5zICgpIG9ubHkgYWNjZXB0cyByZWZzIHRvIHNjYWxhcnMiCgo9aXRlbSAzMDA1ICJFSFIgLSBiaW5kX2NvbHVtbnMgKCkgdGFrZXMgMjU0IHJlZnMgbWF4IgoKPWl0ZW0gMzAwNiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGRpZCBub3QgcGFzcyBlbm91Z2ggcmVmcyBmb3IgcGFyc2VkIGZpZWxkcyIKCj1pdGVtIDMwMDcgIkVIUiAtIGJpbmRfY29sdW1ucyBuZWVkcyByZWZzIHRvIHdyaXRlYWJsZSBzY2FsYXJzIgoKPWl0ZW0gMzAwOCAiRUhSIC0gdW5leHBlY3RlZCBlcnJvciBpbiBib3VuZCBmaWVsZHMiCgo9YmFjawoKPWhlYWQxIEFVVEhPUgoKTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgoKVGV4dDo6Q1NWX1hTIHdhcyB3cml0dGVuIGJ5IEU8bHQ+am9lW2F0XWlzcHNvZnQuZGVFPGd0PgphbmQgbWFpbnRhaW5lZCBieSBFPGx0PmgubS5icmFuZFthdF14czRhbGwubmxFPGd0Pi4KClRleHQ6OkNTViB3YXMgd3JpdHRlbiBieSBFPGx0PmFsYW5bYXRdbWZncnRsLmNvbUU8Z3Q+LgoKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKCkNvcHlyaWdodCAyMDA1LTIwMDggYnkgTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIAoKPWhlYWQxIFNFRSBBTFNPCgpMPFRleHQ6OkNTVl9YUz4sIEw8VGV4dDo6Q1NWPgoKSSBnb3QgbWFueSByZWdleHAgYmFzZXMgZnJvbSBMPGh0dHA6Ly93d3cuZGluLm9yLmpwL35vaHpha2kvcGVybC5odG0+Cgo9Y3V0Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBJbXBvcnRFeHBvcnQueG1sLHYgMS4zIDIwMDgvMDEvMjQgMTY6MzM6NTYgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkltcG9ydEV4cG9ydCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSW1wb3J0RXhwb3J0IGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JbXBvcnQvRXhwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkltcG9ydC9FeHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZvcm1hdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS40IDIwMDgvMDUvMjEgMDk6MTM6MTUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9JbXBvcnRFeHBvcnQucG0sdiAxLjQgMjAwOC8wNS8yMSAwOToxMzoxNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9FeHBvcnQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4xNyAyMDA4LzA1LzIxIDA5OjEzOjE1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnQvRXhwb3J0JzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnSW1wb3J0L0V4cG9ydCBWZXJ3YWx0dW5nJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnTWFwcGluZy1UZW1wbGF0ZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW1wb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdFeHBvcnQgc3RhcnRlbic7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjaHJpdHQnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVrdC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdGb3JtYXQtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnTWFwcGluZy1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdTdWNoLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydCBJbmZvcm1hdGlvbmVuJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnU3BhbHRlJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IHBlciBTdWNoZSBlaXNjaHLkbmtlbic7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ1F1ZWxsLURhdGVpJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBlcmF0b3InfSAgICAgICAgICAgPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdTZW1pY29sb24gKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9wcGVscHVua3QgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVua3QgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnWmVpY2hlbnNhdHonOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4xOSAyMDA4LzA0LzE3IDExOjI4OjI0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChjb21tb24pCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MScgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKICAgICAgICBpZiAoICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEtPntPYmplY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT2JqZWN0JyApOwogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1hdCcgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgbXkgJFZhbGlkT3B0aW9uU3RyZyAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkVGVtcGxhdGVEYXRhLT57VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQxJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lICAgICAgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTEnICkgewogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoVGVtcGxhdGVJRCBPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJDYW4ndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISIgKQogICAgICAgICAgICBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgb2JqZWN0IGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1UZW1wbGF0ZUVkaXQyJlRlbXBsYXRlSUQ9JFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAob2JqZWN0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDInICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkT2JqZWN0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICAgICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJE9iamVjdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJlcXVpcmVkIG5vdGljZQogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChvYmplY3QpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlMicgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmb3JtCiAgICAgICAgbXkgJUF0dHJpYnV0ZVZhbHVlczsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBPYmplY3REYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKGZvcm1hdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQzJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJEZvcm1hdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRGb3JtYXRBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0M1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByZXF1aXJlZCBub3RpY2UKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoZm9ybWF0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTMnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRTdWJtaXRLZXkgKCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIGZvcm1hdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDQnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ09iamVjdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3dPYmplY3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTWFwcGluZ0Zvcm1hdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlNCcgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBNYXBwaW5nQWRkID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiAgICA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICBteSAkU3VibWl0QnV0dG9uID0gJyc7CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gICAgPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICAkU3VibWl0QnV0dG9uID0gJFN1Ym1pdEtleTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJE9iamVjdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU9iamVjdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtYXQgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkRm9ybWF0QXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdGb3JtYXQ6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+IFwlRm9ybWF0QXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIE1BUFBJTkdJRDoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoaXMgbWFwcGluZyByb3cKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRGVsZXRlOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgdXAKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nVXA6OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdVcCgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IGRvd24KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRG93bjo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Rvd24oCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhIG5ldyBtYXBwaW5nIHJvdwogICAgICAgIGlmICggJFN1Ym1pdEJ1dHRvbiBlcSAnTWFwcGluZ0FkZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDUnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGRhdGEKICAgICAgICBteSAkU2VhcmNoRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlc2NyaWN0IGV4cG9ydCBzdHJpbmcKICAgICAgICBteSAkUmVzdHJpY3RFeHBvcnRTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1Jlc3RyaWN0RXhwb3J0JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWx1ZSA9PiBzY2FsYXIga2V5cyAleyRTZWFyY2hEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFJlc3RyaWN0RXhwb3J0U3RyZyA9PiAkUmVzdHJpY3RFeHBvcnRTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlYXJjaERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCByZXN0cmljdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXN0cmljdEV4cG9ydCcgKSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBteSAkU2VhcmNoQXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBzZWFyY2ggZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVEZWxldGUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBkZWxldGUgdGVtcGxhdGUgZnJvbSBkYXRhYmFzZQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQgaW5mb3JtYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnRJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0SW5mb3JtYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdldCBzb3VyY2UgZmlsZQogICAgICAgIG15ICVTb3VyY2VGaWxlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CgogICAgICAgICRTb3VyY2VGaWxle0NvbnRlbnR9IHx8PSAnJzsKCiAgICAgICAgIyBpbXBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkltcG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXCRTb3VyY2VGaWxle0NvbnRlbnR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJywKICAgICAgICApIGlmICEkUmVzdWx0OwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZXhwb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5FeHBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJywKICAgICAgICApIGlmICEkUmVzdWx0OwoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgICAgIG15ICRFbXB0eURhdGFiYXNlID0gMTsKCiAgICAgICAgQ0xBU1M6CiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgJE9iamVjdExpc3QtPnskYX0gY21wICRPYmplY3RMaXN0LT57JGJ9IH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiAhJFRlbXBsYXRlTGlzdDsKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiByZWYgJFRlbXBsYXRlTGlzdCBuZSAnQVJSQVknOwogICAgICAgICAgICBuZXh0IENMQVNTIGlmICFAeyRUZW1wbGF0ZUxpc3R9OwoKICAgICAgICAgICAgJEVtcHR5RGF0YWJhc2UgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnskT2JqZWN0fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgb2JqZWN0CiAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAkVmFsaWRMaXN0eyAkVGVtcGxhdGVEYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlEYXRhYmFzZSkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJ1RlbXBsYXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gucG0sdiAxLjMgMjAwOC8wNC8wNCAxMDoyMTo1OSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciBjaGVja2JveCBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCIkUGFyYW17UHJlZml4fSRQYXJhbXtJdGVtfS0+e0tleX1cIiAiOwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkU3RyaW5nIC49ICJjaGVja2VkICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAiPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dERUTC5wbSx2IDEuMiAyMDA4LzA0LzA0IDEwOjIxOjU5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBEVEwgY29kZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi5wbSx2IDEuNyAyMDA4LzA0LzA0IDEwOjIxOjU5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3Igc2VsZWN0aW9uIGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwogICAgJFBhcmFte1ZhbHVlfSAgfHw9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICYmICRQYXJhbXtWYWx1ZX0gPX4gbXsgIyMjIyMgfXhtcyApIHsKICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gXEBWYWx1ZXM7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvcHRpb24gc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntQb3NzaWJsZU5vbmV9LAogICAgICAgIE11bHRpcGxlICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNdWx0aXBsZX0sCiAgICAgICAgU2l6ZSAgICAgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBARm9ybURhdGFzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgbXkgJEZvcm1EYXRhID0gam9pbiAnIyMjIyMnLCBARm9ybURhdGFzOwoKICAgIHJldHVybiAkRm9ybURhdGEgaWYgJEZvcm1EYXRhOwogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAhJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9OwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtLHYgMS42IDIwMDgvMDQvMDQgMTA6MjE6NTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHRleHQgZWxlbWVudHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIG15ICRTaXplID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNDA7CiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17UHJlZml4fSRQYXJhbXtJdGVtfS0+e0tleX1cIiBzaXplPVwiJFNpemVcIiAiOwoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU3RyaW5nIC49ICJ2YWx1ZT1cIiRWYWx1ZVwiICI7CiAgICB9CgogICAgIyBhZGQgbWF4aW11bSBsZW5ndGgKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofSApIHsKICAgICAgICAkU3RyaW5nIC49ICJtYXhsZW5ndGg9XCIkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9XCIgIjsKICAgIH0KCiAgICAkU3RyaW5nIC49ICI+ICI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgIyByZWdleCBjaGVjawogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gJiYgJEZvcm1EYXRhICF+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ2V4fSApIHsKCiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgcmV0dXJuICRGb3JtRGF0YTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwOC8wNC8wNCAxMDoyMTo1OSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEltcG9ydEV4cG9ydC5wbSx2IDEuMyAyMDA4LzAyLzA1IDExOjI5OjAxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dEltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aXRlbSBJbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIGlucHV0IGZpZWxkIGh0bWwgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiAnVmFsdWUnLCAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBsb29rdXAgaXRlbSB2YWx1ZQogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoKQoKcmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIGh0bWwgZm9ybSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCVQYXJhbSk7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKPWl0ZW0gX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKCkKCnRvIGxvYWQgYSBpbXBvcnQvZXhwb3J0IGxheW91dCBiYWNrZW5kIG1vZHVsZQoKICAgICRIYXNoUmVmID0gJExheW91dE9iamVjdC0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICApOwoKPWN1dAoKc3ViIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntJbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfTsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0JFBhcmFte1R5cGV9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSBvYmplY3QKICAgICRTZWxmLT57Q2FjaGV9LT57SW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwo=
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LmR0bCx2IDEuMTUgMjAwOC8wMi8xMiAxMDozMTo0MyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBtYXBwaW5nIHRlbXBsYXRlIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAwIj4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2JqZWN0T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZvcm1hdE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkUURhdGF7Ik9iamVjdE5hbWUifSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI5MCI+JFRleHR7IkRlbGV0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjkwIj4kVGV4dHsiU3RhcnQgSW1wb3J0In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iOTAiPiRUZXh0eyJTdGFydCBFeHBvcnQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSZUZW1wbGF0ZUlEPSRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOdW1iZXIifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJGb3JtYXROYW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VGVtcGxhdGVEZWxldGUmVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyJ4In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249SW1wb3J0SW5mb3JtYXRpb24mVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyJ4In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwb3J0JlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQxIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDEgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik9iamVjdE5hbWUifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik9iamVjdCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRm9ybWF0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZvcm1hdE5hbWUifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1hdCIgdmFsdWU9IiRRRGF0YXsiRm9ybWF0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MSAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MiAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmUyIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSAyICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBvYmplY3QgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik9iamVjdE5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ogo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvdyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDMgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlMyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gMyAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgZm9ybWF0IGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGb3JtYXROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1JvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IiRUZXh0eyIuLi5CYWNrIn0iPiZuYnNwOwogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIkVGV4dHsiTmV4dC4uLiJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzIC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0IC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDQgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7Ik9iamVjdE5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJGb3JtYXROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+PGhyIHdpZHRoPSIxMDAlIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dPYmplY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd09iamVjdCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93Rm9ybWF0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdVcDo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJVcCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRG93bjo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJEb3duIn0iPgogICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdEZWxldGU6OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPjxociB3aWR0aD0iMTAwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nQWRkIiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NCAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU1Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSA1ICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXN0cmljdEV4cG9ydFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4mbmJzcDs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NVJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ1Um93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7IkZpbmlzaCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ1IC0tPgo8IS0tIGR0bDpibG9jazpJbXBvcnRJbmZvcm1hdGlvbiAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkltcG9ydCBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJTb3VyY2UgRmlsZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9IlNvdXJjZUZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN0YXJ0IEltcG9ydCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpJbXBvcnRJbmZvcm1hdGlvbiAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBtLHYgMS4yNiAyMDA4LzA0LzE3IDExOjI5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQgLSBpbXBvcnQsIGV4cG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGVtcGxhdGVMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRm9ybWF0ID0+ICdDU1YnICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0gKSB8fCAnJzsKICAgIH0KICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VXNlcklEfSwgJ0ludGVnZXInICk7CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAxPTEgJzsKCiAgICBpZiAoICRQYXJhbXtPYmplY3R9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBpbWV4cG9ydF9vYmplY3QgPSAnJFBhcmFte09iamVjdH0nICI7CiAgICB9CiAgICBpZiAoICRQYXJhbXtGb3JtYXR9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBpbWV4cG9ydF9mb3JtYXQgPSAnJFBhcmFte0Zvcm1hdH0nICI7CiAgICB9CgogICAgIyBhZGQgb3JkZXIgb3B0aW9uCiAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCc7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRlbXBsYXRlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVGVtcGxhdGVMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQFRlbXBsYXRlTGlzdDsKfQoKPWl0ZW0gVGVtcGxhdGVHZXQoKQoKZ2V0IGEgaW1wb3J0IGV4cG9ydCB0ZW1wbGF0ZQoKUmV0dXJuCiAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9CiAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0KICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fQogICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9CiAgICAkVGVtcGxhdGVEYXRhe05hbWV9CiAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9CiAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkVGVtcGxhdGVEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VGVtcGxhdGVJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgIgogICAgICAgIC4gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAiCiAgICAgICAgLiAiaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9ICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9ICAgICA9ICRSb3dbMl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbM107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbNF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNV0gfHwgJyc7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbN107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOV07CgogICAgICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfSA9IHNwcmludGYgIiUwNmQiLCAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9OwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0gPSBcJVRlbXBsYXRlRGF0YTsKCiAgICByZXR1cm4gXCVUZW1wbGF0ZURhdGE7Cn0KCj1pdGVtIFRlbXBsYXRlQWRkKCkKCmFkZCBhIG5ldyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdUaWNrZXQnLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte0NvbW1lbnR9ID0gJFBhcmFte0NvbW1lbnR9IHx8ICcnOwoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBGdW5jdGlvbmFsaXR5IENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMgKHJlcGxhY2UgaXQgd2l0aCBTdHJpbmdDbGVhbigpIGluIE9UUlMgMi4zIGFuZCBsYXRlcikKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSAnJFBhcmFte09iamVjdH0nIEFORCBuYW1lID0gJyRQYXJhbXtOYW1lfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IHRlbXBsYXRlLCBpZiB0ZW1wbGF0ZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyB0ZW1wbGF0ZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAiCiAgICAgICAgICAgIC4gIihpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAiCiAgICAgICAgICAgIC4gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAiCiAgICAgICAgICAgIC4gIignJFBhcmFte09iamVjdH0nLCAnJFBhcmFte0Zvcm1hdH0nLCAiCiAgICAgICAgICAgIC4gIickUGFyYW17TmFtZX0nLCAkUGFyYW17VmFsaWRJRH0sICckUGFyYW17Q29tbWVudH0nLCAiCiAgICAgICAgICAgIC4gImN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSwgY3VycmVudF90aW1lc3RhbXAsICRQYXJhbXtVc2VySUR9KSIKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyB0ZW1wbGF0ZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSAiCiAgICAgICAgICAgIC4gIldIRVJFIGltZXhwb3J0X29iamVjdCA9ICckUGFyYW17T2JqZWN0fScgQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVGVtcGxhdGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWl0ZW0gVGVtcGxhdGVVcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSA9ICRQYXJhbXtDb21tZW50fSB8fCAnJzsKCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcyAocmVwbGFjZSBpdCB3aXRoIFN0cmluZ0NsZWFuKCkgaW4gT1RSUyAyLjMgYW5kIGxhdGVyKQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3Qgb2YgdGhpcyB0ZW1wbGF0ZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaW1leHBvcnRfb2JqZWN0IEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkT2JqZWN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlISBJIGNhbid0IGZpbmQgdGhlIHRlbXBsYXRlLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSAnJE9iamVjdCcgQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X3RlbXBsYXRlIFNFVCBuYW1lID0gJyRQYXJhbXtOYW1lfScsIgogICAgICAgICAgICAuICJ2YWxpZF9pZCA9ICRQYXJhbXtWYWxpZElEfSwgY29tbWVudHMgPSAnJFBhcmFte0NvbW1lbnR9JywgIgogICAgICAgICAgICAuICJjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSAkUGFyYW17VXNlcklEfSAiCiAgICAgICAgICAgIC4gIldIRVJFIGlkID0gJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICk7Cn0KCj1pdGVtIFRlbXBsYXRlRGVsZXRlKCkKCmRlbGV0ZSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlcwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgZGF0YQogICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHsgJFBhcmFte1RlbXBsYXRlSUR9IH0gKSB7CiAgICAgICAgJFNlbGYtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVGVtcGxhdGVJRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luICcsJywgQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICApOwp9Cgo9aXRlbSBPYmplY3RMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9iamVjdHMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCj1jdXQKCnN1YiBPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnCiAgICBteSAkTW9kdWxlTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgdGhlIG9iamVjdCBsaXN0CiAgICBteSAkT2JqZWN0TGlzdCA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlTGlzdH0gKSB7CiAgICAgICAgJE9iamVjdExpc3QtPnskTW9kdWxlfSA9ICRNb2R1bGVMaXN0LT57JE1vZHVsZX0tPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gJE9iamVjdExpc3Q7Cn0KCj1pdGVtIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gT2JqZWN0RGF0YUdldCgpCgpnZXQgdGhlIG9iamVjdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1RlbXBsYXRlSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aXRlbSBPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17T2JqZWN0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJFFEYXRhS2V5ICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJERhdGFLZXkpOwogICAgICAgIG15ICRRRGF0YVZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17T2JqZWN0RGF0YX0tPnskRGF0YUtleX0gKTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICRRRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gaW1leHBvcnRfb2JqZWN0ICIKICAgICAgICAgICAgICAgIC4gIih0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte1RlbXBsYXRlSUR9LCAnJFFEYXRhS2V5JywgJyRRRGF0YVZhbHVlJykiCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHsgJFBhcmFte1RlbXBsYXRlSUR9IH0gKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRUZW1wbGF0ZUlELCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIEZvcm1hdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKPWN1dAoKc3ViIEZvcm1hdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgZm9ybWF0IGxpc3QKICAgIG15ICRGb3JtYXRMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkRm9ybWF0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkRm9ybWF0TGlzdDsKfQoKPWl0ZW0gRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEZvcm1hdERhdGFHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkRm9ybWF0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtUZW1wbGF0ZUlEfSwgJ0ludGVnZXInICk7CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgIgogICAgICAgIC4gInRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IjsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWl0ZW0gRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte0Zvcm1hdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Zvcm1hdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17Rm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0Zvcm1hdERhdGF9LT57JERhdGFLZXl9ICk7CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICRRRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGltZXhwb3J0X2Zvcm1hdCAiCiAgICAgICAgICAgICAgICAuICIodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgIgogICAgICAgICAgICAgICAgLiAiKCRQYXJhbXtUZW1wbGF0ZUlEfSwgJyRRRGF0YUtleScsICckUURhdGFWYWx1ZScpIgogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEZvcm1hdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVGVtcGxhdGVJRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luICcsJywgQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIG1hcHBpbmcgZGF0YSBpZHMgc29ydGVkIGJ5IHBvc2l0aW9uIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VGVtcGxhdGVJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0gT1JERVIgQlkgcG9zaXRpb24iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBNYXBwaW5nTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWFwcGluZ0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxATWFwcGluZ0xpc3Q7Cn0KCj1pdGVtIE1hcHBpbmdBZGQoKQoKYWRkIGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGZpbmQgbWF4aW11bSBwb3NpdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgbWF4KHBvc2l0aW9uKSBGUk9NIGltZXhwb3J0X21hcHBpbmcgIgogICAgICAgICAgICAuICJXSEVSRSB0ZW1wbGF0ZV9pZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTmV3UG9zaXRpb24gPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbMF0gKSB7CiAgICAgICAgICAgICROZXdQb3NpdGlvbiA9ICRSb3dbMF07CiAgICAgICAgICAgICROZXdQb3NpdGlvbisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluc2VydCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmcgIgogICAgICAgICAgICAuICIodGVtcGxhdGVfaWQsIHBvc2l0aW9uKSBWQUxVRVMgIgogICAgICAgICAgICAuICIoJFBhcmFte1RlbXBsYXRlSUR9LCAkTmV3UG9zaXRpb24pIgogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyAiCiAgICAgICAgICAgIC4gIldIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IEFORCBwb3NpdGlvbiA9ICROZXdQb3NpdGlvbiIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTWFwcGluZ0lEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0lEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE1hcHBpbmdJRDsKfQoKPWl0ZW0gTWFwcGluZ0RlbGV0ZSgpCgpkZWxldGUgZXhpc3RpbmcgbWFwcGluZyBkYXRhIHJvd3MKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte01hcHBpbmdJRH0gKSB7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAjIGRlbGV0ZSBvbmUgbWFwcGluZyByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICAgICApOwoKICAgICAgICAjIHJlYnVpbGQgbWFwcGluZyBwb3NpdGlvbnMKICAgICAgICAkU2VsZi0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgcm93cyBvZiB0aGlzIHRlbXBsYXRlCiAgICAgICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBNYXBwaW5nVXAoKQoKbW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IHVwCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nVXAoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nVXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bMF07CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBnZXQgcG9zaXRpb24KICAgIG15ICRTUUwgPSAiU0VMRUNUIHBvc2l0aW9uIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IjsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUG9zaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRQb3NpdGlvbjsKCiAgICBteSAkUG9zaXRpb25VcHBlciA9ICRQb3NpdGlvbiAtIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSAkUG9zaXRpb24gIgogICAgICAgICAgICAuICJXSEVSRSB0ZW1wbGF0ZV9pZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSBBTkQgcG9zaXRpb24gPSAkUG9zaXRpb25VcHBlciIsCiAgICApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gJFBvc2l0aW9uVXBwZXIgIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdEb3duKCkKCm1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyBkb3duCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEb3duIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+Wy0xXTsKCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGdldCBwb3NpdGlvbgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gJFBhcmFte01hcHBpbmdJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ICRQb3NpdGlvbiAiCiAgICAgICAgICAgIC4gIldIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24iLAogICAgKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24gIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQoKQoKcmVidWlsZCB0aGUgcG9zaXRpb25zIG9mIGEgbWFwcGluZyBsaXN0CgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nUG9zaXRpb25SZWJ1aWxkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIHBvc2l0aW9uCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gJENvdW50ZXIgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAkTWFwcGluZ0lEIiwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9ICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRNYXBwaW5nSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nT2JqZWN0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nT2JqZWN0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdPYmplY3REYXRhfS0+eyREYXRhS2V5fSApOwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgb2JqZWN0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCAiCiAgICAgICAgICAgICAgICAuICIobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte01hcHBpbmdJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YUdldCgpCgpnZXQgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgIgogICAgICAgIC4gIm1hcHBpbmdfaWQgPSAkUGFyYW17TWFwcGluZ0lEfSI7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ09iamVjdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ09iamVjdERhdGE7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9ICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRNYXBwaW5nSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSgpCgpzYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ0Zvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nRm9ybWF0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfS0+eyREYXRhS2V5fSApOwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAiCiAgICAgICAgICAgICAgICAuICIobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte01hcHBpbmdJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgIgogICAgICAgIC4gIm1hcHBpbmdfaWQgPSAkUGFyYW17TWFwcGluZ0lEfSI7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0Zvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ0Zvcm1hdERhdGE7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiBhIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBzZWFyY2ggYXR0cmlidXRlIGxpc3Qgb2YgYW4gb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gU2VhcmNoRGF0YUdldCgpCgpnZXQgdGhlIHNlYXJjaCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRTZWFyY2hEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1RlbXBsYXRlSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZWFyY2hEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VhcmNoRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hEYXRhOwp9Cgo9aXRlbSBTZWFyY2hEYXRhU2F2ZSgpCgpzYXZlIHRoZSBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBTZWFyY2hEYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBTZWFyY2hEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoRGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtTZWFyY2hEYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJFFEYXRhS2V5ICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJERhdGFLZXkpOwogICAgICAgIG15ICRRRGF0YVZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17U2VhcmNoRGF0YX0tPnskRGF0YUtleX0gKTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkUURhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9zZWFyY2ggIgogICAgICAgICAgICAgICAgLiAiKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICIKICAgICAgICAgICAgICAgIC4gIigkUGFyYW17VGVtcGxhdGVJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTZWFyY2hEYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFRlbXBsYXRlSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiAnLCcsIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgKTsKfQoKPWl0ZW0gRXhwb3J0KCkKCmV4cG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CiAgICAkUmVzdWx0e1N1Y2Nlc3N9ICAgICAgICAgICAgPSAwOwogICAgJFJlc3VsdHtGYWlsZWR9ICAgICAgICAgICAgID0gMDsKICAgICRSZXN1bHR7RGVzdGluYXRpb25Db250ZW50fSA9IFtdOwoKICAgIEVYUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEV4cG9ydERhdGFSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHBvcnQgb25lIHJvdwogICAgICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRFeHBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJERlc3RpbmF0aW9uQ29udGVudFJvdyApIHsKICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3MhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJE9iamVjdEJhY2tlbmQ7CgogICAgIyBsb2FkIGZvcm1hdCBiYWNrZW5kCiAgICBteSAkRm9ybWF0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkUGFyYW17U291cmNlQ29udGVudH0sCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW1wb3J0RGF0YTsKCiAgICBteSAlUmVzdWx0OwogICAgJFJlc3VsdHtTdWNjZXNzfSA9IDA7CiAgICAkUmVzdWx0e0ZhaWxlZH0gID0gMDsKCiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgaW1wb3J0IG9uZSByb3cKICAgICAgICBteSAkU3VjY2VzcyA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEltcG9ydERhdGFSb3csCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgICAgICBuZXh0IElNUE9SVERBVEFST1c7CiAgICAgICAgfQoKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJJbXBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3MhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgYmFja2VuZCBtb2R1bGUKCiAgICAkSGFzaFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCcsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkQmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57TG9hZEJhY2tlbmR9LT57ICRQYXJhbXtNb2R1bGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRCYWNrZW5kfS0+eyAkUGFyYW17TW9kdWxlfSB9OwoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtNb2R1bGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFBhcmFte01vZHVsZX0tPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntMb2FkQmFja2VuZH0tPnsgJFBhcmFte01vZHVsZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKPWl0ZW0gX1N0cmluZ0NsZWFuKCkKCkRPTidUIFVTRSBUSElTIElOVEVSTkFMIEZVTkNUSU9OIElOIE9USEVSIE1PRFVMRVMhCgpUaGlzIGZ1bmN0aW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW06OlN0cmluZ0NsZWFuKCkgaW4gT1RSUyAyLjMgYW5kIGxhdGVyIQoKY2xlYW4gYSBnaXZlbiBzdHJpbmcKCiAgICBteSAkRXJyb3IgPSAkQ2hlY2tJdGVtT2JqZWN0LT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCdTdHJpbmcnLAogICAgICAgIFRyaW1MZWZ0ICAgICAgICAgID0+IDAsICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgVHJpbVJpZ2h0ICAgICAgICAgPT4gMCwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICk7Cgo9Y3V0CgpzdWIgX1N0cmluZ0NsZWFuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1N0cmluZ1JlZn0gfHwgcmVmICRQYXJhbXtTdHJpbmdSZWZ9IG5lICdTQ0FMQVInICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBhIHNjYWxhciByZWZlcmVuY2UhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkeyAkUGFyYW17U3RyaW5nUmVmfSB9OwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17VHJpbUxlZnR9ICA9IGRlZmluZWQgJFBhcmFte1RyaW1MZWZ0fSAgPyAkUGFyYW17VHJpbUxlZnR9ICA6IDE7CiAgICAkUGFyYW17VHJpbVJpZ2h0fSA9IGRlZmluZWQgJFBhcmFte1RyaW1SaWdodH0gPyAkUGFyYW17VHJpbVJpZ2h0fSA6IDE7CgogICAgbXkgJVRyaW1BY3Rpb24gPSAoCiAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gcXJ7IFtcblxyXGZdIH14bXMsCiAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gcXJ7IFx0ICAgICAgIH14bXMsCiAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gcXJ7IFsgXSAgICAgIH14bXMsCiAgICAgICAgVHJpbUxlZnQgICAgICAgICAgPT4gcXJ7IFxBIFxzKyAgIH14bXMsCiAgICAgICAgVHJpbVJpZ2h0ICAgICAgICAgPT4gcXJ7IFxzKyBceiAgIH14bXMsCiAgICApOwoKICAgIEFDVElPTjoKICAgIGZvciBteSAkQWN0aW9uICggc29ydCBrZXlzICVUcmltQWN0aW9uICkgewogICAgICAgIG5leHQgQUNUSU9OIGlmICEkUGFyYW17JEFjdGlvbn07CgogICAgICAgICR7ICRQYXJhbXtTdHJpbmdSZWZ9IH0gPX4gc3sgJFRyaW1BY3Rpb257JEFjdGlvbn0gfXt9eG1zZzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yNiAkICREYXRlOiAyMDA4LzA0LzE3IDExOjI5OjA0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMjIgMjAwOC8wNC8xNiAxNDoyOTozOCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RmlsZVRlbXA7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBJbXBvcnRFeHBvcnRPYmplY3QgPT4gJEltcG9ydEV4cG9ydE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0IEltcG9ydEV4cG9ydE9iamVjdCkpCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnVGV4dDo6Q1NWJykgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDUEFOIG1vZHVsZSBUZXh0OjpDU1YgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBDU1YgaW1wb3J0L2V4cG9ydCBtb2R1bGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0ZpbGVUZW1wT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGaWxlVGVtcC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIGF2YWlsYWJsZSBzZXBlcmF0b3JzCiAgICAkU2VsZi0+e0F2YWlsYWJsZVNlcGVyYXRvcnN9ID0gewogICAgICAgIFRhYnVsYXRvciA9PiAiXHQiLAogICAgICAgIFNlbWljb2xvbiA9PiAnOycsCiAgICAgICAgQ29sb24gICAgID0+ICc6JywKICAgICAgICBEb3QgICAgICAgPT4gJy4nLAogICAgfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgYXR0cmlidXRlcyBvZiBhIGZvcm1hdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEZvcm1hdEJhY2tlbmQtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVXNlcklEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ29sdW1uU2VwZXJhdG9yJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbiBTZXBlcmF0b3InLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGFidWxhdG9yID0+ICdUYWJ1bGF0b3IgKFRBQiknLAogICAgICAgICAgICAgICAgICAgIFNlbWljb2xvbiA9PiAnU2VtaWNvbG9uICg7KScsCiAgICAgICAgICAgICAgICAgICAgQ29sb24gICAgID0+ICdDb2xvbiAoOiknLAogICAgICAgICAgICAgICAgICAgIERvdCAgICAgICA9PiAnRG90ICguKScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgbWFwcGluZyBhdHRyaWJ1dGVzIG9mIGFuIGZvcm1hdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEZvcm1hdEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVXNlcklEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ29sdW1uJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdEVEwnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRRRGF0YXsiQ291bnRlciJ9JywKICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBJbXBvcnREYXRhR2V0KCkKCmdldCBpbXBvcnQgZGF0YSBhcyAyRC1hcnJheSByZWZlcmVuY2UKCiAgICBteSAkSW1wb3J0RGF0YSA9ICRGb3JtYXRCYWNrZW5kLT5JbXBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFN0cmluZ1JlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFtdIGlmICFkZWZpbmVkICRQYXJhbXtTb3VyY2VDb250ZW50fTsKCiAgICAjIGNoZWNrIHNvdXJjZSBjb250ZW50CiAgICBpZiAoIHJlZiAkUGFyYW17U291cmNlQ29udGVudH0gbmUgJ1NDQUxBUicgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTb3VyY2VDb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3JtYXQgZGF0YQogICAgaWYgKCAhJEZvcm1hdERhdGEgfHwgcmVmICRGb3JtYXREYXRhIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZvcm1hdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjaGFyc2V0CiAgICBteSAkQ2hhcnNldCA9ICRGb3JtYXREYXRhLT57Q2hhcnNldH0gfHw9ICcnOwogICAgJENoYXJzZXQgPX4gc3sgXHMqICh1dGYtOHx1dGY4KSBccyogfXtVVEYtOH14bXNpOwoKICAgICMgY2hlY2sgdGhlIGNoYXJzZXQKICAgIGlmICggISRDaGFyc2V0ICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNoYXJzZXQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgICRGb3JtYXREYXRhLT57Q29sdW1uU2VwZXJhdG9yfSB8fD0gJyc7CiAgICBteSAkU2VwZXJhdG9yID0gJFNlbGYtPntBdmFpbGFibGVTZXBlcmF0b3JzfS0+eyAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGVyYXRvcn0gfSB8fCAnJzsKCiAgICAjIGNoZWNrIHRoZSBzZXBlcmF0b3IKICAgIGlmICggISRTZXBlcmF0b3IgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgc2VwZXJhdG9yIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgcGFyc2VyIG9iamVjdAogICAgbXkgJFBhcnNlT2JqZWN0ID0gVGV4dDo6Q1NWLT5uZXcoCiAgICAgICAgewogICAgICAgICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICAgICAgICAgZXNjYXBlX2NoYXIgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIHNlcF9jaGFyICAgICAgICAgICAgPT4gJFNlcGVyYXRvciwKICAgICAgICAgICAgZW9sICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAxLAogICAgICAgICAgICBiaW5hcnkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIGtlZXBfbWV0YV9pbmZvICAgICAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9lc2NhcGVzID0+IDAsCiAgICAgICAgICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMCwKICAgICAgICAgICAgYmxhbmtfaXNfdW5kZWYgICAgICA9PiAwLAogICAgICAgICAgICB2ZXJiYXRpbSAgICAgICAgICAgID0+IDAsCiAgICAgICAgfQogICAgKTsKCiAgICAjIGNyZWF0ZSB0ZW1wIGZpbGUgYW5kIHdyaXRlIHNvdXJjZSBjb250ZW50CiAgICBteSAoICRGSCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+e0ZpbGVUZW1wT2JqZWN0fS0+VGVtcEZpbGUoKTsKCiAgICBwcmludCAkRkggJHsgJFBhcmFte1NvdXJjZUNvbnRlbnR9IH07CgogICAgIyByZXdpbmQgZmlsZSBoYW5kbGUKICAgIHNlZWsgJEZILCAwLCAwOwoKICAgICMgcGFyc2UgdGhlIGNvbnRlbnQKICAgIG15IEBJbXBvcnREYXRhOwogICAgUk9XOgogICAgd2hpbGUgKCBteSAkQ29sdW1uID0gJFBhcnNlT2JqZWN0LT5nZXRsaW5lKCRGSCkgKSB7CiAgICAgICAgcHVzaCBASW1wb3J0RGF0YSwgJENvbHVtbjsKICAgIH0KCiAgICByZXR1cm4gXEBJbXBvcnREYXRhIGlmICRDaGFyc2V0IG5lICdVVEYtOCc7CgogICAgIyBzZXQgdXRmOCBmbGFnCiAgICBmb3IgbXkgJFJvdyAoQEltcG9ydERhdGEpIHsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRSb3d9ICkgewogICAgICAgICAgICBFbmNvZGU6Ol91dGY4X29uKCRDZWxsKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASW1wb3J0RGF0YTsKfQoKPWl0ZW0gRXhwb3J0RGF0YVNhdmUoKQoKZXhwb3J0IG9uZSByb3cgb2YgdGhlIGV4cG9ydCBkYXRhCgogICAgbXkgJERlc3RpbmF0aW9uQ29udGVudCA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRXhwb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZXhwb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17RXhwb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4cG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBlcmF0b3J9IHx8PSAnJzsKICAgIG15ICRTZXBlcmF0b3IgPSAkU2VsZi0+e0F2YWlsYWJsZVNlcGVyYXRvcnN9LT57ICRGb3JtYXREYXRhLT57Q29sdW1uU2VwZXJhdG9yfSB9IHx8ICcnOwoKICAgICMgY2hlY2sgdGhlIHNlcGVyYXRvcgogICAgaWYgKCAhJFNlcGVyYXRvciApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBzZXBlcmF0b3IgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgb2JqZWN0CiAgICBteSAkUGFyc2VPYmplY3QgPSBUZXh0OjpDU1YtPm5ldygKICAgICAgICB7CiAgICAgICAgICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICAgICAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAkU2VwZXJhdG9yLAogICAgICAgICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDEsCiAgICAgICAgICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICAgICAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgICAgICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgICAgICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggISRQYXJzZU9iamVjdC0+Y29tYmluZSggQHsgJFBhcmFte0V4cG9ydERhdGFSb3d9IH0gKSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjb21iaW5lIHRoZSBleHBvcnQgZGF0YSB0byBhIHN0cmluZyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBDU1Ygc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFBhcnNlT2JqZWN0LT5zdHJpbmc7CgogICAgcmV0dXJuICRTdHJpbmcgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIEVuY29kZTo6X3V0Zjhfb24oJFN0cmluZyk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMjIgJCAkRGF0ZTogMjAwOC8wNC8xNiAxNDoyOTozOCAkCgo9Y3V0Cg==
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnQsdiAxLjE0IDIwMDgvMDQvMDcgMTA6MTY6MzYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSW1wb3J0RXhwb3J0JyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIHRlbXBsYXRlIG5hbWVzCm15IEBUZW1wbGF0ZU5hbWU7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDUgKSB7CgogICAgcHVzaCBAVGVtcGxhdGVOYW1lLCAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIG9iamVjdCBuYW1lcwpteSBAT2JqZWN0TmFtZTsKcHVzaCBAT2JqZWN0TmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiMgY3JlYXRlIG5lZWRlZCBmb3JtYXQgbmFtZXMKbXkgQEZvcm1hdE5hbWUgPSAoJ0NTVicpOwoKIyBnZXQgb3JpZ2luYWwgdGVtcGxhdGUgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzIChhbGwgZWxlbWVudHMpCm15ICRUZW1wbGF0ZUxpc3QxQWxsID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MU9iamVjdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0Q29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0Q29tbWVudCBVUERBVEUzJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAiIFx0IFxuIFxyICIgLiAkT2JqZWN0TmFtZVswXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgRm9ybWF0ICA9PiAiIFx0IFxuIFxyICIgLiAkRm9ybWF0TmFtZVswXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyICIgLiAkVGVtcGxhdGVOYW1lWzJdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzJdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyICIgLiAkVGVtcGxhdGVOYW1lWzJdIC4gIlVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAnIMaVIMaYICcgLiAkT2JqZWN0TmFtZVswXSAuICcgxrUgxrsgJywKICAgICAgICAgICAgRm9ybWF0ICA9PiAnIMeTIMejICcgLiAkRm9ybWF0TmFtZVswXSAuICcgx6Ugx64gJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnIMe3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ8aVxpgnIC4gJE9iamVjdE5hbWVbMF0gLiAnxrXGuycsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICfHk8ejJyAuICRGb3JtYXROYW1lWzBdIC4gJ8elx64nLAogICAgICAgICAgICBOYW1lICAgICA9PiAnx7cgyJwgJyAuICRUZW1wbGF0ZU5hbWVbM10gLiAnIMieIMigJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBBZGRlZFRlbXBsYXRlSURzOwoKVEVNUExBVEU6CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKCAleyAkSXRlbS0+e0FkZH0gfSApOwoKICAgICAgICBpZiAoJFRlbXBsYXRlSUQpIHsKICAgICAgICAgICAgcHVzaCBAQWRkZWRUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRlbXBsYXRlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUFkZCgpIC0gVGVtcGxhdGVLZXk6ICRUZW1wbGF0ZUlEIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKCAkVGVtcGxhdGVJRCwgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSIgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0ZW1wbGF0ZSB3YXMgYWRkZWQKICAgICAgICBteSAkVGVtcGxhdGVHZXQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRBZGRlZFRlbXBsYXRlSURzWy0xXSwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGVtcGxhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCB0ZW1wbGF0ZSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRBZGRlZFRlbXBsYXRlSURzWy0xXSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTi4gUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGZpcnN0LiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBURU1QTEFURTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkVGVtcGxhdGVBdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CgogICAgIyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDEgKGNoZWNrIGFycmF5IHJlZmVyZW5jZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGFycmF5IHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkVGVtcGxhdGVMaXN0MUFsbCBlcSAnQVJSQVknICYmIHJlZiAkVGVtcGxhdGVMaXN0MU9iamVjdCBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBhcnJheSByZWZlcmVuY2VzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAyIChsaXN0IG11c3QgYmUgZW1wdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGxpc3QKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MU9iamVjdH0gZXEgMCwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gZW1wdHkgbGlzdCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAoY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZUxpc3QyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkVGVtcGxhdGVMaXN0MiBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBhcnJheSByZWZlcmVuY2UiLAopOwoKbXkgJFRlbXBsYXRlTGlzdENvdW50ID0gc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDJ9IC0gc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFBbGx9OwoKIyBjaGVjayBjb3JyZWN0IG51bWJlciBvZiBuZXcgaXRlbXMKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVMaXN0Q291bnQgZXEgc2NhbGFyIEBBZGRlZFRlbXBsYXRlSURzLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBjb3JyZWN0IG51bWJlciBvZiBuZXcgaXRlbXMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlRGVsZXRlIHRlc3QgMSAoYWRkIG9uZSB0ZW1wbGF0ZSBhbmQgZGVsZXRlIGl0KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGFkZCBhIHRlc3QgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbNF0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIG9uZSBtb3JlIGVsZW1lbnQKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxICggc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QyfSApIC0gMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgLSBudW1iZXIgb2YgbGlzdGVkIGVsZW1lbnRzIiwKKTsKCiMgZGVsZXRlIHRoZSBuZXcgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlMSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURlbGV0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgc3VjY2Vzc2Z1bGwKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVEZWxldGUxLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSIsCik7CgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZWxlbWVudHMKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0M30sCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAyIChkZWxldGUgYWxsIHVuaXR0ZXN0IHRlbXBsYXRlcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRUZW1wbGF0ZUlEIChAQWRkZWRUZW1wbGF0ZUlEcykgewoKICAgICMgZGVsZXRlIHRoZSB0ZW1wbGF0ZQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHN1Y2Nlc3MKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgVGVtcGxhdGVJRCAkVGVtcGxhdGVJRCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdExpc3QgdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIHRlc3QgbGlzdApteSAkT2JqZWN0TGlzdDFUZXN0TGlzdCA9IHsKICAgIFVuaXRUZXN0MSA9PiB7CiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpVbml0VGVzdDEnLAogICAgICAgIE5hbWUgICA9PiAnVW5pdCBUZXN0IDEnLAogICAgfSwKICAgIFVuaXRUZXN0MiA9PiB7CiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpVbml0VGVzdDInLAogICAgICAgIE5hbWUgICA9PiAnVW5pdCBUZXN0IDInLAogICAgfSwKfTsKCiMgZ2V0IG9yaWdpbmFsIG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0T3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKIyBzZXQgdGVzdCBsaXN0CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdDFUZXN0TGlzdCwKKTsKCiMgZ2V0IG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKIyBsaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gaGFzaCByZWZlcmVuY2UiLAopOwoKIyBjaGVjayB0aGUgbGlzdApLRVk6CmZvciBteSAkS2V5ICgga2V5cyAleyRPYmplY3RMaXN0MX0gKSB7CgogICAgaWYgKCAhJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fSApIHsKICAgICAgICAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+e0R1bW15fSA9IDE7CiAgICB9CgogICAgbmV4dCBLRVkgaWYgJE9iamVjdExpc3QxLT57JEtleX0gbmUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fS0+e05hbWV9OwoKICAgIGRlbGV0ZSAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9Owp9CgokU2VsZi0+VHJ1ZSgKICAgICEleyRPYmplY3RMaXN0MVRlc3RMaXN0fSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIGNvbnRlbnQgaXMgdmFsaWQiLAopOwoKIyByZXN0b3JlIG9yaWdpbmFsIG9iamVjdCBsaXN0CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdE9yZywKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJEZvcm1hdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdE9yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIGtleXMgJXskRm9ybWF0TGlzdDF9ICkgewoKICAgIGlmICggISRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRGb3JtYXRMaXN0MS0+eyRLZXl9IG5lICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskRm9ybWF0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgoxOwo=
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydEZvcm1hdENTVi50LHYgMS43IDIwMDgvMDQvMTQgMTU6MDI6MjEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YtPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBob21lIGRpcmVjdG9yeQokU2VsZi0+e0hvbWV9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiMgYWRkIHNvbWUgdGVzdCB0ZW1wbGF0ZXMgZm9yIGxhdGVyIGNoZWNrcwpteSBAVGVtcGxhdGVJRHM7CmZvciAoIDEgLi4gMzAgKSB7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgRm9ybWF0ICA9PiAnQ1NWJywKICAgICAgICBOYW1lICAgID0+ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgcHVzaCBAVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwp9CgpteSAkVGVzdENvdW50ID0gMTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgQ1NWIGl0ZW0pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBsaXN0Cm15ICRGb3JtYXRMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKIyBjaGVjayBmb3JtYXQgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRMaXN0MSAmJiByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJyAmJiAkRm9ybWF0TGlzdDEtPntDU1Z9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gQ1NWIGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGVyYXRvcicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbiBTZXBlcmF0b3InLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgQ29sb24gICAgID0+ICdDb2xvbiAoOiknLAogICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQpteSAkRm9ybWF0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJEZvcm1hdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwoKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgIE5hbWUgID0+ICdDb2x1bW4nLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgIERhdGEgICAgID0+ICckUURhdGF7IkNvdW50ZXIifScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSk7CgokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBJbXBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJbXBvcnREYXRhVGVzdHMgPSBbCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBzb3VyY2UgY29udGVudCBhcmUgZ2l2ZW4gKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBbXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gc2VwZXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNoYXJzZXQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIGJ1dCBzb3VyY2UgY29udGVudCBpcyBlbXB0eSAoZW1wdHkgYXJyYXkgcmVmZXJlbmNlIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbM10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7Jyd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBpcyBvbmx5IGEgc3RyaW5nIHdpdGggc3BhY2VzIChvbmUgY2VsbCBhcnJheSB3aXRoIHRoZSBzcGFjZXMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s0XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnICAnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJyAgJ10sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuLCBidXQgVGFidWxhdG9yIGlzIHVzZWQgYXMgc2VwZXJhdG9yIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJ1JvdzEtQ29sMTtSb3cxLUNvbDI7Um93MS1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93Mi1Db2wxO1JvdzItQ29sMjtSb3cyLUNvbDMnXSwKICAgICAgICAgICAgWydSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMyddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiwgYnV0IFNlbWljb2xvbiBpcyB1c2VkIGFzIHNlcGVyYXRvciAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyJSb3cxLUNvbDFcdFJvdzEtQ29sMlx0Um93MS1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93Mi1Db2wxXHRSb3cyLUNvbDJcdFJvdzItQ29sMyJdLAogICAgICAgICAgICBbIlJvdzMtQ29sMVx0Um93My1Db2wyXHRSb3czLUNvbDMiXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAnVGVzdCAxIC0gMicsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBJbXBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEltcG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VJbXBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VJbXBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IEltcG9ydERhdGFHZXQKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gPSB7fTsKICAgIH0KCiAgICAjIHNldCBzb3VyY2UgY29udGVudAogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9CiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0gZXEgJ1NvdXJjZUZpbGUnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkU291cmNlRmlsZSA9ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfTsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgbXkgJFNvdXJjZUNvbnRlbnQgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntIb21lfSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS8nIC4gJFNvdXJjZUZpbGUsCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0gPSAkU291cmNlQ29udGVudDsKICAgIH0KCiAgICAjIHNldCB0aGUgZm9ybWF0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fS0+SW1wb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkSW1wb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkSW1wb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRJbXBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgaW1wb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkSW1wb3J0Um93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRJbXBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gaW1wb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRJbXBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gc2FtZSBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEltcG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkRXhwb3J0RGF0YVRlc3RzID0gWwoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gc2VwZXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBzZXBlcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI7IiI7IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiXCJcdFwiXCJcdFwiXCIiLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI6IiI6IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiLiIiLiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOyIiOycsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlx0XCJcIlx0IiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICc6IiI6JywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnLiIiLicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciUm93MS1Db2wxIjsiUm93MS1Db2wyIjsiUm93MS1Db2wzIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlJvdzEtQ29sMVwiXHRcIlJvdzEtQ29sMlwiXHRcIlJvdzEtQ29sM1wiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIuIlJvdzEtQ29sMiIuIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjsiVGVzdCBcbiAyIjsiVGVzdCAzIFxcblxcdFxcclxccyI7IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjoiVGVzdCBcbiAyIjoiVGVzdCAzIFxcblxcdFxcclxccyI6IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiLiJUZXN0IFxuIDIiLiJUZXN0IDMgXFxuXFx0XFxyXFxzIi4iVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgIlwiICBUZXN0ICBcIlx0XCIgICAgXCJcdFwiVGVzdCAgXCJcdFwiICAgIFRlc3RcIlx0XCJcIlx0XCJUZXN0XCJcdFwiXCJcdFwiIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICI6IiAgICAiOiJUZXN0ICAiOiIgICAgVGVzdCI6IiI6IlRlc3QiOiIiOiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI7Ij48QH5cJ317W11cIjsiIjsiIiIiIjs7OjouLi0tX18jIyInCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIj48QH5cJ317W11cXCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiIiIiOzs6Oi4uLS1fXyMjIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0Ii4iPjxAflwnfXtbXVxcIi4iIi4iIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI7ItGvING0ING/Ijsi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIiDRqiDRrCDRslwiXHRcItGvING0ING/XCJcdFwi0oIg0oog0pYgXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIjoi0a8g0bQg0b8iOiLSgiDSiiDSliAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiLiLRryDRtCDRvyIuItKCINKKINKWICInLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRFeHBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBFeHBvcnREYXRhU2F2ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9ID0ge307CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEgcm93CiAgICBteSAkRXhwb3J0U3RyaW5nID0gJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fS0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJEV4cG9ydFN0cmluZyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e0V4cG9ydERhdGFSb3d9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBleHBvcnQgc3RyaW5nCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4cG9ydFN0cmluZywKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNsZWFuIHRoZSBzeXN0ZW0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWxldGUgdGhlIHRlc3QgdGVtcGxhdGVzCiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+IFxAVGVtcGxhdGVJRHMsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgoxOwo=
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
/Pbk3zvc1sQNCt/k9vw7xNbcDQo=
/Pbk3wnc1sQNCt/k9vwJxNbcDQo=
Ivz25N8iOiLc1sQiDQoi3+T2/CI6IsTW3CINCg==
Ivz25N8iOyLc1sQiDQoi3+T2/CI7IsTW3CINCg==
Ivz25N8iCSLc1sQiDQoi3+T2/CIJIsTW3CINCg==
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==