ImportExport
1.1.1
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
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.6
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-05-04 16:33:07
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+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS4zIDIwMDgvMDMvMTkgMTU6MTA6MDQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgKCRTZWxmKSA9IEBfOwogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9JbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAwOC8wMy8xOSAxNToxMDowNCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4xNiAyMDA4LzA0LzE2IDE0OjI5OjU3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ01hcHBpbmctVGVtcGxhdGUgaGluenVm/Gdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTY2hyaXR0JzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICdPYmpla3QtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01hcHBpbmctSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnU3VjaC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQgSW5mb3JtYXRpb25lbic7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NwYWx0ZSc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBwZXIgU3VjaGUgZWlzY2hy5G5rZW4nOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICdRdWVsbC1EYXRlaSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwZXJhdG9yJ30gICAgICAgICAgID0gJ1NwYWx0ZW50cmVubmVyJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnU2VtaWNvbG9uICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcHBlbHB1bmt0ICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bmt0ICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ1plaWNoZW5zYXR6JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
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+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXh