SystemMonitoring
9.0.3
OFORK
https://o-fork.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
New release.
Added new functions.
Init release.
Basic mail interface to System Monitoring Suites. Also provides deeper integration to Nagios and Icinga2 (acknowledge on lock and check script).
Einfache Email Schnittstelle zu System Monitoring Suites. Weitergehende Integration mit Nagios und Icinga2 (Acknowledge on lock and Checkscript).
9.0.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package SystemMonitoring.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket SystemMonitoring zu installieren.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
For configuration instructions please refer to the enclosed PDF documentation.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Eine Anleitung zur Konfiguration des SystemMonitoring Moduls findet sich in der Datei PDF.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package SystemMonitoring.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket SystemMonitoring zu aktualisieren.<br>
<br>
<br>
((enjoy))<br>
<br>
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUpgradePre();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_2_2_92();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2020-03-10 08:09:26
localhost
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMxLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QmFzaWMgbWFpbCBpbnRlcmZhY2UgdG8gU3lzdGVtIE1vbml0b3JpbmcgU3VpdGVzLiBVc2UgdGhpcyBibG9jayBpZiB0aGUgZmlsdGVyIHNob3VsZCBydW4gQUZURVIgUG9zdE1hc3RlckZpbHRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJvbUFkZHJlc3NSZWdFeHAiPm5hZ2lvc0BleGFtcGxlLmNvbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhdGVSZWdFeHAiPlxzKlN0YXRlOlxzKyhcUyspPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJIb3N0UmVnRXhwIj5ccypIb3N0OlxzKyguKilccyo8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VSZWdFeHAiPlxzKlNlcnZpY2U6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmV3VGlja2V0UmVnRXhwIj5DUklUSUNBTHxET1dOPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZVRpY2tldFJlZ0V4cCI+T0t8VVA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlQWN0aW9uU3RhdGUiPmNsb3NlZCBzdWNjZXNzZnVsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZVBlbmRpbmdUaW1lIj4xNzI4MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRTZXJ2aWNlIj5Ib3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcmVlVGV4dEhvc3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0U2VydmljZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VuZGVyVHlwZSI+c3lzdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlVHlwZSI+bm90ZS1yZXBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0U3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlIyMjMDAtU3lzdGVtTW9uaXRvcmluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBCRUZPUkUgUG9zdE1hc3RlckZpbHRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJvbUFkZHJlc3NSZWdFeHAiPm5hZ2lvc0BleGFtcGxlLmNvbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhdGVSZWdFeHAiPlxzKlN0YXRlOlxzKyhcUyspPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJIb3N0UmVnRXhwIj5ccypIb3N0OlxzKyguKilccyo8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VSZWdFeHAiPlxzKlNlcnZpY2U6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmV3VGlja2V0UmVnRXhwIj5DUklUSUNBTHxET1dOPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZVRpY2tldFJlZ0V4cCI+T0t8VVA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlQWN0aW9uU3RhdGUiPmNsb3NlZCBzdWNjZXNzZnVsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZVBlbmRpbmdUaW1lIj4xNzI4MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRTZXJ2aWNlIj5Ib3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcmVlVGV4dEhvc3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0U2VydmljZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VuZGVyVHlwZSI+c3lzdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcnRpY2xlVHlwZSI+bm90ZS1yZXBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0U3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iU3lzdGVtTW9uaXRvcmluZzo6U2V0SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgc3lzdGVtIG1vbml0b3JpbmcgZW1haWwgYXJyaXZlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN5c3RlbU1vbml0b3Jpbmc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJTeXN0ZW1Nb25pdG9yaW5nOjpMaW5rVGlja2V0V2l0aENJIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpbmsgYW4gYWxyZWFkeSBvcGVuZWQgaW5jaWRlbnQgdGlja2V0IHdpdGggdGhlIGFmZmVjdGVkIENJLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgd2hlbiBhIHN1YnNlcXVlbnQgc3lzdGVtIG1vbml0b3JpbmcgZW1haWwgYXJyaXZlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN5c3RlbU1vbml0b3Jpbmc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpGcmVlRmllbGQ6Okhvc3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TmFtZSBvZiB0aGUgRHluYW1pYyBGaWVsZCBmb3IgSG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN5c3RlbU1vbml0b3Jpbmc6Ok5hZ2lvczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkR5bmFtaWNGaWVsZF9UaWNrZXRGcmVlVGV4dDE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5OYW1lIG9mIHRoZSBEeW5hbWljIEZpZWxkIGZvciBTZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+RHluYW1pY0ZpZWxkX1RpY2tldEZyZWVUZXh0MjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmUgTmFnaW9zIGFja25vd2xlZGdlIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpOYWdpb3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJwaXBlIiBUcmFuc2xhdGFibGU9IjEiPnBpcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Imh0dHAiIFRyYW5zbGF0YWJsZT0iMSI+SFRUUDwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGNvbW1hbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpOYWdpb3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5lY2hvICcmbHQ7T1VUUFVUU1RSSU5HJmd0OycgPiAvdXNyL2xvY2FsL25hZ2lvcy92YXIvcncvbmFnaW9zLmNtZDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpIb3N0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk5hbWVkIHBpcGUgYWNrbm93bGVkZ2UgZm9ybWF0IGZvciBob3N0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+WyZsdDtVTklYVElNRSZndDtdIEFDS05PV0xFREdFX0hPU1RfUFJPQkxFTTsmbHQ7SE9TVF9OQU1FJmd0OzsxOzE7MTsmbHQ7TE9HSU4mZ3Q7OyZsdDthIGhyZWY9IiZsdDtDT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O0NPTkZJR19GUUROJmd0Oy8mbHQ7Q09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb20mYW1wO1RpY2tldElEPSZsdDtUaWNrZXRJRCZndDsiJmd0OyZsdDtDT05GSUdfVGlja2V0OjpIb29rJmd0OyZsdDtUaWNrZXROdW1iZXImZ3Q7Jmx0Oy9hJmd0OzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk5hbWVkIHBpcGUgYWNrbm93bGVkZ2UgZm9ybWF0IGZvciBzZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+WyZsdDtVTklYVElNRSZndDtdIEFDS05PV0xFREdFX1NWQ19QUk9CTEVNOyZsdDtIT1NUX05BTUUmZ3Q7OyZsdDtTRVJWSUNFX05BTUUmZ3Q7OzE7MTsxOyZsdDtMT0dJTiZndDs7Jmx0O2EgaHJlZj0iJmx0O0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7Q09ORklHX0ZRRE4mZ3Q7LyZsdDtDT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbSZhbXA7VGlja2V0SUQ9Jmx0O1RpY2tldElEJmd0OyImZ3Q7Jmx0O0NPTkZJR19UaWNrZXQ6Okhvb2smZ3Q7Jmx0O1RpY2tldE51bWJlciZndDsmbHQ7L2EmZ3Q7PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzktTmFnaW9zQWNrbm93bGVkZ2UiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGV2ZW50IG1vZHVsZSB0byBzZW5kIGFuIGFja25vd2xlZGdlIHRvIE5hZ2lvcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpOYWdpb3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRMb2NrVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlVSTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgSFRUUCBhY2tub3dsZWRnZSBVUkwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpOYWdpb3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5odHRwOi8vbmFnaW9zLmV4YW1wbGUuY29tL25hZ2lvcy9jZ2ktYmluL2NtZC5jZ2k/Y21kX3R5cD0mbHQ7Q01EX1RZUCZndDsmYW1wO2NtZF9tb2Q9MiZhbXA7aG9zdD0mbHQ7SE9TVF9OQU1FJmd0OyZhbXA7c2VydmljZT0mbHQ7U0VSVklDRV9OQU1FJmd0OyZhbXA7c3RpY2t5X2Fjaz1vbiZhbXA7c2VuZF9ub3RpZmljYXRpb249b24mYW1wO3BlcnNpc3RlbnQ9b24mYW1wO2NvbV9kYXRhPSZsdDtUaWNrZXROdW1iZXImZ3Q7JmFtcDtidG5TdWJtaXQ9Q29tbWl0PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBIVFRQIGFja25vd2xlZGdlIHVzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpOYWdpb3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5Kb2huPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgSFRUUCBhY2tub3dsZWRnZSBwYXNzd29yZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN5c3RlbU1vbml0b3Jpbmc6Ok5hZ2lvczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPnNvbWVfcGFzczwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkVuYWJsZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWNpbmdhMiBhY2tub3dsZWRnZW1lbnQgZW5hYmxlZD88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN5c3RlbU1vbml0b3Jpbmc6OkljaW5nYTI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzktSWNpbmdhMkFja25vd2xlZGdlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhbiBhY2tub3dsZWRnZSB0byBJY2luZ2EyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OkljaW5nYTI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6SWNpbmdhMkFja25vd2xlZGdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0TG9ja1VwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJY2luZ2EyOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk5hbWUgb2YgdGhlIER5bmFtaWMgRmllbGQgZm9yIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+RHluYW1pY0ZpZWxkX1RpY2tldEZyZWVUZXh0MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5OYW1lIG9mIHRoZSBEeW5hbWljIEZpZWxkIGZvciBTZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6SWNpbmdhMjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkR5bmFtaWNGaWVsZF9UaWNrZXRGcmVlVGV4dDI8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkljaW5nYTI6OkFja25vd2xlZGdlOjpIVFRQOjpVUkwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWNpbmdhIEFQSSBVUkwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+aHR0cDovL2ljaW5nYTIuZXhhbXBsZS5jb206NTY2NS92MS9hY3Rpb25zL2Fja25vd2xlZGdlLXByb2JsZW08L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkljaW5nYTI6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBIVFRQIGFja25vd2xlZGdlIHVzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+Sm9objwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkhUVFA6OlBhc3N3b3JkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBIVFRQIGFja25vd2xlZGdlIHBhc3N3b3JkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6SWNpbmdhMjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPnNvbWVfcGFzczwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkF1dGhvciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JY2luZ2EyIGFja25vd2xlZGdlbWVudCBhdXRob3IuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJY2luZ2EyOjpBY2tub3dsZWRnZTo6Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JY2luZ2EyIGFja25vd2xlZGdlbWVudCBjb21tZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3lzdGVtTW9uaXRvcmluZzo6SWNpbmdhMjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPlRpY2tldCMmbHQ7VGlja2V0TnVtYmVyJmd0OzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6OlN0aWNreSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JY2luZ2EyIGFja25vd2xlZGdlbWVudCBzdGlja3kuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSWNpbmdhMjo6QWNrbm93bGVkZ2U6Ok5vdGlmeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JY2luZ2EyIGFja25vd2xlZGdlbWVudCBub3RpZnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTeXN0ZW1Nb25pdG9yaW5nOjpJY2luZ2EyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L29mb3JrX2NvbmZpZz4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE1IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KIyBGb3IgcG9zc2libGUgc2VhcmNoIG9wdGlvbnMgc2VlOgojIGh0dHA6Ly9vdHJzLmdpdGh1Yi5pby9kb2MvYXBpL290cnMvc3RhYmxlL1BlcmwvS2VybmVsL1N5c3RlbS9UaWNrZXQvVGlja2V0U2VhcmNoLnBtLmh0bWwgLT4gVGlja2V0U2VhcmNoKCkKIyBFeGFtcGxlcyBzZWUgYmVsb3cKIyAtLQoKJUNvbmZpZyA9ICgKICAgU2VhcmNoID0+IHsKCiAgICAgICAjIHRpY2tldHMgY3JlYXRlZCBpbiB0aGUgbGFzdCAxMjAgbWludXRlcwogICAgICAgVGlja2V0Q3JlYXRlVGltZU5ld2VyTWludXRlcyA9PiAxMjAsCgogICAgICAgIyB0aWNrZXQgbnVtYmVyIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgojICAgICAgICBUaWNrZXROdW1iZXIgPT4gJyUxMjM1NDYlJywKIyAgICAgICAgVGlja2V0TnVtYmVyID0+IFsnJTEyMzU0NiUnLCAnJTEyMzY2NiUnXSwKCiAgICAgICAjIHRpY2tldCBxdWV1ZXMKIyAgICAgICAgUXVldWVzICAgPT4gWydzeXN0ZW0gcXVldWUnLCAnb3RoZXIgcXVldWUnXSwKCiAgICAgICAjIHRpY2tldCB0eXBlcwojICAgICAgICBUeXBlcyAgID0+IFsnbm9ybWFsJywgJ2NoYW5nZScsICdpbmNpZGVudCddLAoKICAgICAgICMgdGlja2V0IHByaW9yaXRpZXMKIyAgICAgICAgUHJpb3JpdGllcyAgPT4gWycxIHZlcnkgbG93JywgJzIgbG93JywgJzMgbm9ybWFsJ10sCgogICAgICAgIyB0aWNrZXQgc2VydmljZXMKIyAgICAgICAgU2VydmljZXMgICA9PiBbJ1NlcnZpY2UgQScsICdTZXJ2aWNlIEInXSwKCiAgICAgICAjIHRpY2tldCBsb2NrcwojICAgICAgICBMb2NrcyAgID0+IFsndW5sb2NrJ10sCgogICAgICAgIyB0aWNrZXQgY3VzdG9tZXJzCiMgICAgICAgIEN1c3RvbWVySUQgPT4gJzEyMycsCiMgICAgICAgIEN1c3RvbWVySUQgPT4gWycxMjMnLCAnQUJDJ10sCgogICAgICAgIyAxLi4xNiBmcmVlIHRleHQgZmllbGRzCiMgICAgICAgIFRpY2tldEZyZWVLZXkxICA9PiAnUHJvZHVjdCcsCiMgICAgICAgIFRpY2tldEZyZWVUZXh0MSA9PiAnYWRhc2QnLAoKICAgICAgICMgb3Igd2l0aCBtdWx0aSBvcHRpb25zIGFzIGFycmF5IHJlZiBvciBzdHJpbmcgcG9zc2libGUKIyAgICAgICAgVGlja2V0RnJlZUtleTIgID0+IFsnUHJvZHVjdCcsICdQcm9kdWN0MiddLAojICAgICAgICBUaWNrZXRGcmVlVGV4dDIgPT4gWydCcm93c2VyJywgJ1NvdW5kJywgJ01vdXNlJ10sCiAgIH0sCgojIERlY2xhcmF0aW9uIG9mIHRocmVzaG9sZHMKIyBtaW5fd2Fybl90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtYXhfd2Fybl90cmVzaG9sZCA8IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtaW5fY3JpdF90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IEFMQVJNCiMgbWF4X3dhcm5fdHJlc2hvbGQgPCBOdW1iZXIgb2YgdGlja2V0cyAtPiBBTEFSTQoKICAgbWluX3dhcm5fdHJlc2hvbGQgPT4gNSwKICAgbWF4X3dhcm5fdHJlc2hvbGQgPT4gMTAsCiAgIG1pbl9jcml0X3RyZXNob2xkID0+IDIsCiAgIG1heF9jcml0X3RyZXNob2xkID0+IDIwLAoKIyBJbmZvcm1hdGlvbiB1c2VkIGJ5IE5hZ2lvcwojIE5hbWUgb2YgY2hlY2sgc2hvd24gaW4gTmFnaW9zIFN0YXR1cyBJbmZvcm1hdGlvbgogICBjaGVja25hbWUgPT4gJ09UUlMgQ2hlY2tlcicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGV2ZXJ5dGhpbmcgaXMgT0sKICAgT0tfVFhUICAgID0+ICdlbmpveSAgIHRpY2tldHM6JywKCiMgVGV4dCBzaG93biBpbiBTdGF0dXMgSW5mb3JtYXRpb24gaWYgd2FybmluZyB0aHJlc2hvbGQgcmVhY2hlZAogICBXQVJOX1RYVCAgPT4gJ251bWJlciBvZiB0aWNrZXRzOicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGNyaXRpY2FsIHRocmVzaG9sZCByZWFjaGVkCiAgIENSSVRfVFhUICA9PiAnY3JpdGljYWwgbnVtYmVyIG9mIHRpY2tldHM6JywKCik7Cgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX1N5c3RlbU1vbml0b3Jpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgbWFpbCBpbnRlcmZhY2UgdG8gU3lzdGVtIE1vbml0b3JpbmcgU3VpdGVzLiBVc2UgdGhpcyBibG9jayBpZiB0aGUgZmlsdGVyIHNob3VsZCBydW4gQUZURVIgUG9zdE1hc3RlckZpbHRlci4nfSA9CiAgICAgICAgJ0dydW5kbGVnZW5kZXMgTWFpbC1JbnRlcmZhY2UgenUgU3lzdGVtIE1vbml0b3JpbmcgQW53ZW5kdW5nZW4uIEJlbnV0emVuIFNpZSBkaWVzZW4gQWJzY2huaXR0LCB3ZW5uIGRlciBGaWx0ZXIgTkFDSCBkZW0gUG9zdE1hc3Rlci1GaWx0ZXIgYXVzZ2Vmw7xocnQgd2VyZGVuIHNvbGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIG1haWwgaW50ZXJmYWNlIHRvIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gVXNlIHRoaXMgYmxvY2sgaWYgdGhlIGZpbHRlciBzaG91bGQgcnVuIEJFRk9SRSBQb3N0TWFzdGVyRmlsdGVyLid9ID0KICAgICAgICAnR3J1bmRsZWdlbmRlcyBNYWlsLUludGVyZmFjZSB6dSBTeXN0ZW0gTW9uaXRvcmluZyBBbndlbmR1bmdlbi4gQmVudXR6ZW4gU2llIGRpZXNlbiBBYnNjaG5pdHQsIHdlbm4gZGVyIEZpbHRlciBWT1IgZGVtIFBvc3RNYXN0ZXItRmlsdGVyIGF1c2dlZsO8aHJ0IHdlcmRlbiBzb2xsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgTmFnaW9zIGFja25vd2xlZGdlIHR5cGUuJ30gPSAnRGVmaW5pZXJlIE5hZ2lvcy1CZXN0w6R0aWd1bmdzLVR5cCAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hUVFAnfSA9ICdIVFRQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljaW5nYSBBUEkgVVJMLid9ID0gJ0ljaW5nYSBBUEkgVVJMLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJY2luZ2EyIGFja25vd2xlZGdlbWVudCBhdXRob3IuJ30gPSAnSWNpbmdhMiBCZXN0w6R0aWd1bmdzdmVyZmFzc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljaW5nYTIgYWNrbm93bGVkZ2VtZW50IGNvbW1lbnQuJ30gPSAnSWNpbmdhMiBCZXN0w6R0aWd1bmdza29tbWVudGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljaW5nYTIgYWNrbm93bGVkZ2VtZW50IGVuYWJsZWQ/J30gPSAnSWNpbmdhMiBCZXN0w6R0aWd1bmcgYWt0aXZpZXJ0Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJY2luZ2EyIGFja25vd2xlZGdlbWVudCBub3RpZnkuJ30gPSAnSWNpbmdhMiBCZXN0w6R0aWd1bmdzbmFjaHJpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ljaW5nYTIgYWNrbm93bGVkZ2VtZW50IHN0aWNreS4nfSA9ICdJY2luZ2EyIGFja25vd2xlZGdlbWVudCBzdGlja3kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgYW4gYWxyZWFkeSBvcGVuZWQgaW5jaWRlbnQgdGlja2V0IHdpdGggdGhlIGFmZmVjdGVkIENJLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgd2hlbiBhIHN1YnNlcXVlbnQgc3lzdGVtIG1vbml0b3JpbmcgZW1haWwgYXJyaXZlcy4nfSA9CiAgICAgICAgJ1Zlcmxpbmt1bmcgZWluZXMgYmVyZWl0cyBnZcO2ZmZuZXRlbiBJbmNpZGVudCBUaWNrZXRzIG1pdCBlaW5lbSBiZXRyb2ZmZW5lbiBDSS4gRGllcyBpc3QgbnVyIG3DtmdsaWNoLCB3ZW5uIGVpbmUgZW50c3ByZWNoZW5kZSBTeXN0ZW0gTW9uaXRvcmluZyBFLU1haWwgZWludHJpZmZ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIG9mIHRoZSBEeW5hbWljIEZpZWxkIGZvciBIb3N0Lid9ID0gJ05hbWUgZGVzIGR5bmFtaXNjaGVuIEZlbGRlcyBmw7xyIGRlbiBIb3N0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIG9mIHRoZSBEeW5hbWljIEZpZWxkIGZvciBTZXJ2aWNlLid9ID0gJ05hbWUgZGVzIGR5bmFtaXNjaGVuIEZlbGRlcyBmw7xyIGRlbiBTZXJ2aWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lZCBwaXBlIGFja25vd2xlZGdlIGNvbW1hbmQuJ30gPSAnTmFtZWQgUGlwZSBCZXN0w6R0aWd1bmdza29tbWFuZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZWQgcGlwZSBhY2tub3dsZWRnZSBmb3JtYXQgZm9yIGhvc3QuJ30gPSAnTmFtZWQgUGlwZS1BY2tub3dsZWRnZS1Gb3JtYXQgZsO8ciBIb3N0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3Igc2VydmljZS4nfSA9ICdOYW1lZCBQaXBlLUFja25vd2xlZGdlLUZvcm1hdCBmw7xyIFNlcnZpY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBzeXN0ZW0gbW9uaXRvcmluZyBlbWFpbCBhcnJpdmVzLid9ID0KICAgICAgICAnU2V0enQgZGVuIFZvcmZhbGxzdGF0dXMgZWluZXMgQ29uZmlndXJhdGlvbiBJdGVtIGF1dG9tYXRpc2NoLCB3ZW5uIGVpbmUgRS1NYWlsIHZvbSBTeXN0ZW0tTW9uaXRvcmluZyBlaW50cmlmZnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBIVFRQIGFja25vd2xlZGdlIFVSTC4nfSA9ICdEaWUgVVJMIGRlciBIVFRQLUJlc3TDpHRpZ3VuZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIEhUVFAgYWNrbm93bGVkZ2UgcGFzc3dvcmQuJ30gPSAnRGFzIEhUVFAtQmVzdMOkdGlndW5nc3Bhc3N3b3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgSFRUUCBhY2tub3dsZWRnZSB1c2VyLid9ID0gJ0RlciBIVFRQLUJlc3TDpHRpZ3VuZ3NiZW51dHplci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGV2ZW50IG1vZHVsZSB0byBzZW5kIGFuIGFja25vd2xlZGdlIHRvIEljaW5nYTIuJ30gPSAnVGlja2V0LUVyZWlnbmlzbW9kdWwsIHVtIGVpbmUgQmVzdMOkdGlndW5nIGFuIEljaW5nYTIgenUgc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZXZlbnQgbW9kdWxlIHRvIHNlbmQgYW4gYWNrbm93bGVkZ2UgdG8gTmFnaW9zLid9ID0gJ1RpY2tldC1FcmVpZ25pc21vZHVsLCB1bSBlaW5lIEJlc3TDpHRpZ3VuZyB6dSBOYWdpb3MgenUgc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwaXBlJ30gPSAnUGlwZSc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpCYXNlQ29tbWFuZCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdPVFJTIE5hZ2lvcyBjaGVja2VyLicpOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnY29uZmlnLWZpbGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZS4iLAogICAgICAgIFJlcXVpcmVkICAgID0+IDEsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKi9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAndmVyYm9zZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkFjdGl2YXRlIHRoZSB2ZXJib3NlIG1vZGUuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLiovc214LAogICAgKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2FzLWNoZWNrZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJSdW5zIHRoZSBzY3JpcHQgYXMgTmFnaW9zY2hlY2tlci4iLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMCwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKi9zbXgsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57Q29uZmlnRmlsZX0gPSAkU2VsZi0+R2V0T3B0aW9uKCdjb25maWctZmlsZScpIHx8ICcnOwoKICAgIGlmICggISRTZWxmLT57Q29uZmlnRmlsZX0gKSB7CiAgICAgICAgZGllICJFUlJPUjogTmVlZCAtLWNvbmZpZy1maWxlIENPTkZJR0ZJTEVcbiI7CgogICAgfQogICAgZWxzaWYgKCAhLWUgJFNlbGYtPntDb25maWdGaWxlfSApIHsKICAgICAgICBkaWUgIkVSUk9SOiBObyBzdWNoIGZpbGUgJFNlbGYtPntDb25maWdGaWxlfVxuIjsKICAgIH0KCiAgICBteSAlQ29uZmlnID0gZG8gJFNlbGYtPntDb25maWdGaWxlfTsKICAgIGlmICggISVDb25maWcgKSB7CiAgICAgICAgZGllICJFUlJPUjogSW52YWxpZCBjb25maWcgZmlsZSAkU2VsZi0+e0NvbmZpZ0ZpbGV9OiAkQFxuIjsKICAgIH0KCiAgICAjIHN0b3JlIGNvbmZpZyBmb3IgdXNlIGl0IGxhdGVyCiAgICAkU2VsZi0+e0NvbmZpZ30gPSBcJUNvbmZpZzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5TdGFydGluZyBOYWdpb3MgY2hlY2suLi48L3llbGxvdz5cbiIpOwoKICAgICMgcmVhZCBjb25maWd1cmF0aW9uCiAgICBteSAlQ29uZmlnID0gJXsgJFNlbGYtPntDb25maWd9IHx8IHt9IH07CgogICAgIyBnZXQgVGlja2V0IE9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIHNlYXJjaCB0aWNrZXRzCiAgICBteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICV7ICRDb25maWd7U2VhcmNofSB9LAogICAgICAgIExpbWl0ICA9PiAxMDBfMDAwLAogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICRUaWNrZXRDb3VudCA9IHNjYWxhciBAVGlja2V0SURzOwoKICAgICMgdmVyYm9zZSBtb2RlCiAgICBpZiAoICRTZWxmLT5HZXRPcHRpb24oJ3ZlcmJvc2UnKSApIHsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIiRUaWNrZXR7VGlja2V0SUR9OiRUaWNrZXR7VGlja2V0TnVtYmVyfVxuIik7CiAgICAgICAgfQogICAgfQoKICAgICMgbm8gY2hlY2tlciBtb2RlCiAgICBpZiAoICEkU2VsZi0+R2V0T3B0aW9uKCdhcy1jaGVja2VyJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCIkVGlja2V0Q291bnRcbiIpOwoKICAgICAgICAkU2VsZi0+RXhpdENvZGVPaygpOwogICAgfQoKICAgICMgY2xlYW51cCBjb25maWcgZmlsZQogICAgbXkgJU1hcCA9ICgKICAgICAgICBtYXhfY3JpdF90cmVzaGhvbGQgPT4gJ21heF9jcml0X3RyZXNob2xkJywKICAgICAgICBtYXhfd2Fybl90cmVzaGhvbGQgPT4gJ21heF93YXJuX3RyZXNob2xkJywKICAgICAgICBtaW5fY3JpdF90cmVzaGhvbGQgPT4gJ21pbl9jcml0X3RyZXNob2xkJywKICAgICAgICBtaW5fd2Fybl90cmVzaGhvbGQgPT4gJ21pbl93YXJuX3RyZXNob2xkJywKICAgICk7CiAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJU1hcCApIHsKICAgICAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3skVHlwZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJOT1RJQ0U6IFR5cG8gaW4gY29uZmlnIG5hbWUsIHVzZSAkTWFweyRUeXBlfSBpbnN0ZWFkIG9mICRUeXBlXG4iKTsKICAgICAgICAgICAgJENvbmZpZ3sgJE1hcHskVHlwZX0gfSA9ICRDb25maWd7JFR5cGV9OwogICAgICAgICAgICBkZWxldGUgJENvbmZpZ3skVHlwZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gY3JpdGljYWwgYW5kIHdhcm5pbmcgY2hlY2sKICAgIGZvciBteSAkVHlwZSAocXcoY3JpdF90cmVzaG9sZCB3YXJuX3RyZXNob2xkKSkgewogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlneyAnbWluXycgLiAkVHlwZSB9ICkgewogICAgICAgICAgICBpZiAoICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gPj0gJFRpY2tldENvdW50ICkgewogICAgICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkV4aXRDb2RlRXJyb3IoMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlID1+IC9ed2Fybl8vICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBXQVJOSU5HICRDb25maWd7V0FSTl9UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIgogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlneyAnbWF4XycgLiAkVHlwZSB9ICkgewogICAgICAgICAgICBpZiAoICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gPD0gJFRpY2tldENvdW50ICkgewogICAgICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkV4aXRDb2RlRXJyb3IoMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlID1+IC9ed2Fybl8vICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBXQVJOSU5HICRDb25maWd7V0FSTl9UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIgogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIE9LCiAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBPSyAkQ29uZmlne09LX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iCiAgICApOwoKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cbiIpOwogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zQ2hlY2tUaWNrZXRDb3VudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ09UUlMgTmFnaW9zIGNoZWNrZXIuJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdjb25maWctZmlsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdhcy1jaGVja2VyJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiUnVucyB0aGUgc2NyaXB0IGFzIE5hZ2lvc2NoZWNrZXIuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLiovc214LAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0NvbmZpZ0ZpbGV9ID0gJFNlbGYtPkdldE9wdGlvbignY29uZmlnLWZpbGUnKSB8fCAnJzsKCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ0ZpbGV9ICkgewogICAgICAgIGRpZSAiRVJST1I6IE5lZWQgLS1jb25maWctZmlsZSBDT05GSUdGSUxFXG4iOwogICAgfQogICAgZWxzaWYgKCAhLWUgJFNlbGYtPntDb25maWdGaWxlfSApIHsKICAgICAgICBkaWUgIkVSUk9SOiBObyBzdWNoIGZpbGUgJFNlbGYtPntDb25maWdGaWxlfVxuIjsKICAgIH0KCiAgICBteSAlQ29uZmlnID0gZG8gJFNlbGYtPntDb25maWdGaWxlfTsKICAgIGlmICggISVDb25maWcgKSB7CiAgICAgICAgZGllICJFUlJPUjogSW52YWxpZCBjb25maWcgZmlsZSAkU2VsZi0+e0NvbmZpZ0ZpbGV9OiAkQFxuIjsKICAgIH0KCiAgICAjIHN0b3JlIGNvbmZpZyBmb3IgdXNlIGl0IGxhdGVyCiAgICAkU2VsZi0+e0NvbmZpZ30gPSBcJUNvbmZpZzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5TdGFydGluZyB0aWNrZXQgY291bnQgY2hlY2suLi48L3llbGxvdz5cbiIpOwoKICAgICMgcmVhZCBjb25maWd1cmF0aW9uCiAgICBteSAlQ29uZmlnID0gJXsgJFNlbGYtPntDb25maWd9IHx8IHt9IH07CgogICAgIyBzZWFyY2ggdGlja2V0cwogICAgbXkgJFRpY2tldENvdW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZWFyY2goCiAgICAgICAgJXsgJENvbmZpZ3tTZWFyY2h9IH0sCiAgICAgICAgTGltaXQgID0+IDEwMF8wMDAsCiAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgbm8gY2hlY2tlciBtb2RlCiAgICBpZiAoICEkU2VsZi0+R2V0T3B0aW9uKCdhcy1jaGVja2VyJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCIkVGlja2V0Q291bnRcbiIpOwoKICAgICAgICAkU2VsZi0+RXhpdENvZGVPaygpOwogICAgfQoKICAgICMgY2xlYW51cCBjb25maWcgZmlsZQogICAgbXkgJU1hcCA9ICgKICAgICAgICBtYXhfY3JpdF90cmVzaGhvbGQgPT4gJ21heF9jcml0X3RyZXNob2xkJywKICAgICAgICBtYXhfd2Fybl90cmVzaGhvbGQgPT4gJ21heF93YXJuX3RyZXNob2xkJywKICAgICAgICBtaW5fY3JpdF90cmVzaGhvbGQgPT4gJ21pbl9jcml0X3RyZXNob2xkJywKICAgICAgICBtaW5fd2Fybl90cmVzaGhvbGQgPT4gJ21pbl93YXJuX3RyZXNob2xkJywKICAgICk7CiAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJU1hcCApIHsKICAgICAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3skVHlwZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJOT1RJQ0U6IFR5cG8gaW4gY29uZmlnIG5hbWUsIHVzZSAkTWFweyRUeXBlfSBpbnN0ZWFkIG9mICRUeXBlXG4iKTsKICAgICAgICAgICAgJENvbmZpZ3sgJE1hcHskVHlwZX0gfSA9ICRDb25maWd7JFR5cGV9OwogICAgICAgICAgICBkZWxldGUgJENvbmZpZ3skVHlwZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gY3JpdGljYWwgYW5kIHdhcm5pbmcgY2hlY2sKICAgIGZvciBteSAkVHlwZSAocXcoY3JpdF90cmVzaG9sZCB3YXJuX3RyZXNob2xkKSkgewogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlneyAnbWluXycgLiAkVHlwZSB9ICkgewogICAgICAgICAgICBpZiAoICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gPj0gJFRpY2tldENvdW50ICkgewogICAgICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkV4aXRDb2RlRXJyb3IoMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlID1+IC9ed2Fybl8vICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBXQVJOSU5HICRDb25maWd7V0FSTl9UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIgogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ3sgJ21heF8nIC4gJFR5cGUgfSA8PSAkVGlja2V0Q291bnQgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRUeXBlID1+IC9eY3JpdF8vICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBDUklUSUNBTCAkQ29uZmlne0NSSVRfVFhUfSAkVGlja2V0Q291bnR8dGlja2V0cz0kVGlja2V0Q291bnQ7JENvbmZpZ3ttaW5fd2Fybl90cmVzaG9sZH06JENvbmZpZ3ttYXhfd2Fybl90cmVzaG9sZH07JENvbmZpZ3ttaW5fY3JpdF90cmVzaG9sZH06JENvbmZpZ3ttYXhfY3JpdF90cmVzaG9sZH1cbiIKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+RXhpdENvZGVFcnJvcigyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgICAgICAgICAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBPSwogICAgJFNlbGYtPlByaW50KAogICAgICAgICIkQ29uZmlne2NoZWNrbmFtZX0gT0sgJENvbmZpZ3tPS19UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIgogICAgKTsKCiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUG9zdE1hc3Rlci9GaWx0ZXIvU3lzdGVtTW9uaXRvcmluZy5wbQojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogU3lzdGVtTW9uaXRvcmluZy5wbSx2IDEuMiAyMDE5LzExLzExIDA4OjQyOjAwIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3Jpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAopOwoKI3RoZSBiYXNlIG5hbWUgZm9yIGR5bmFtaWMgZmllbGRzCm91ciAkRHluYW1pY0ZpZWxkVGlja2V0VGV4dFByZWZpeCAgPSAnVGlja2V0RnJlZVRleHQnOwpvdXIgJER5bmFtaWNGaWVsZEFydGljbGVUZXh0UHJlZml4ID0gJ0FydGljbGVGcmVlVGV4dCc7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY2hlY2sgaWYgQ0kgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNldCBhdXRvbWF0aWNhbGx5CiAgICAjIHRoaXMgcmVxdWlyZXMgdGhlIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudCBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU3lzdGVtTW9uaXRvcmluZzo6U2V0SW5jaWRlbnRTdGF0ZScpICkgewoKICAgICAgICAkU2VsZi0+X0luY2lkZW50U3RhdGVOZXcoKTsKICAgIH0KCiAgICAjIERlZmF1bHQgU2V0dGluZ3MKICAgICRTZWxmLT57Q29uZmlnfSA9IHsKICAgICAgICBTdGF0ZVJlZ0V4cCAgICAgICA9PiAnXHMqU3RhdGU6XHMrKFxTKyknLAogICAgICAgIEZyb21BZGRyZXNzUmVnRXhwID0+ICdzeXNtb25AZXhhbXBsZS5jb20nLAogICAgICAgIE5ld1RpY2tldFJlZ0V4cCAgID0+ICdDUklUSUNBTHxET1dOJywKICAgICAgICBDbG9zZVRpY2tldFJlZ0V4cCA9PiAnT0t8VVAnLAogICAgICAgIENsb3NlQWN0aW9uU3RhdGUgID0+ICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAgICAgQ2xvc2VQZW5kaW5nVGltZSAgPT4gNjAgKiA2MCAqIDI0ICogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgMiBkYXlzCiAgICAgICAgSG9zdFJlZ0V4cCAgICAgICAgPT4gJ1xzKkFkZHJlc3M6XHMrKFxkK1wuXGQrXC5cZCtcLlxkKylccyonLAogICAgICAgIEZyZWVUZXh0SG9zdCAgICAgID0+ICcxJywKICAgICAgICBGcmVlVGV4dFNlcnZpY2UgICA9PiAnMicsCiAgICAgICAgRnJlZVRleHRTdGF0ZSAgICAgPT4gJzEnLAogICAgICAgIFNlcnZpY2VSZWdFeHAgICAgID0+ICdccypTZXJ2aWNlOlxzKyguKilccyonLAogICAgICAgIERlZmF1bHRTZXJ2aWNlICAgID0+ICdIb3N0JywKICAgICAgICBTZW5kZXJUeXBlICAgICAgICA9PiAnc3lzdGVtJywKICAgICAgICBBcnRpY2xlVHlwZSAgICAgICA9PiAnbm90ZS1yZXBvcnQnLAogICAgfTsKCiAgICAjIGdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QgYW5kIE1lc3NhZ2VJRAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q29tbXVuY2F0aW9uTG9nUmVxdWlyZWR9IHx8ICRQYXJhbXtDb21tdW5jYXRpb25Mb2dSZXF1aXJlZH0gKSB7CiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fQogICAgICAgICAgICB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgX0dldER5bmFtaWNGaWVsZERlZmluaXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25maWcgS2V5IERlZmF1bHQgQmFzZSBOYW1lIE9iamVjdFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDb25maWcgICAgID0gJFBhcmFte0NvbmZpZ307CiAgICBteSAkS2V5ICAgICAgICA9ICRQYXJhbXtLZXl9OyAgICAgICAgICAgI0ZyZWVUZXh0SG9zdCB0aGUgY29uZmlnIGtleQogICAgbXkgJERlZmF1bHQgICAgPSAkUGFyYW17RGVmYXVsdH07ICAgICAgICMxIHRoZSBkZWZhdWx0IHZhbHVlCiAgICBteSAkQmFzZSAgICAgICA9ICRQYXJhbXtCYXNlfTsgICAgICAgICAgIyBEeW5hbWljRmllbGRUaWNrZXRUZXh0UHJlZml4CiAgICBteSAkTmFtZSAgICAgICA9ICRQYXJhbXtOYW1lfTsgICAgICAgICAgI0hvc3ROYW1lCiAgICBteSAkT2JqZWN0VHlwZSA9ICRQYXJhbXtPYmplY3RUeXBlfTsgICAgI0hvc3ROYW1lCgogICAgbXkgJENvbmZpZ0ZyZWVUZXh0ID0gJENvbmZpZy0+eyRLZXl9OwoKICAgIGlmICggISRDb25maWdGcmVlVGV4dCApIHsKICAgICAgICAkQ29uZmlnRnJlZVRleHQgPSAkRGVmYXVsdDsKICAgIH0KCiAgICBpZiAoICRDb25maWdGcmVlVGV4dCA9fiAvXlxkKyQvICkgewogICAgICAgIGlmICggKCAkQ29uZmlnRnJlZVRleHQgPCAxICkgfHwgKCAkQ29uZmlnRnJlZVRleHQgPiAxNiApICkgewogICAgICAgICAgICBkaWUgIkJhZCB2YWx1ZSAkQ29uZmlnRnJlZVRleHQgZm9yIENJIENvbmZpZyAkS2V5ISI7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgZGllICJCYWQgdmFsdWUgJENvbmZpZ0ZyZWVUZXh0IGZvciBDSSBDb25maWcgJEtleSEiOwogICAgfQoKICAgIG15ICRGaWVsZE5hbWVIb3N0ID0gJEJhc2UgLiAkQ29uZmlnRnJlZVRleHQ7CgogICAgIyBkZWZpbmUgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBTeXN0ZW0gTW9uaXRvcmluZywgdGhlc2UgbmVlZCB0byBiZSBjaGFuZ2VkIGFzIHdlbGwgaWYgdGhlCiAgICAjIGNvbmZpZyBjaGFuZ2VzCiAgICByZXR1cm4gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGROYW1lSG9zdCwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnU3lzdGVtTW9uaXRvcmluZyAnIC4gJE5hbWUsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICRPYmplY3RUeXBlLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0KICAgICk7Cn0KCnN1YiBHZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWcgPSAkUGFyYW17Q29uZmlnfTsKCiAgICBwdXNoIEB7ICRQYXJhbXtOZXdGaWVsZHN9IH0sICRTZWxmLT5fR2V0RHluYW1pY0ZpZWxkRGVmaW5pdGlvbigKICAgICAgICBDb25maWcgICAgID0+ICRDb25maWcsCiAgICAgICAgS2V5ICAgICAgICA9PiAnRnJlZVRleHRIb3N0JywKICAgICAgICBEZWZhdWx0ICAgID0+IDEsCiAgICAgICAgQmFzZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkVGlja2V0VGV4dFByZWZpeCwKICAgICAgICBOYW1lICAgICAgID0+ICdIb3N0TmFtZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CiAgICBwdXNoIEB7ICRQYXJhbXtOZXdGaWVsZHN9IH0sICRTZWxmLT5fR2V0RHluYW1pY0ZpZWxkRGVmaW5pdGlvbigKICAgICAgICBDb25maWcgICAgID0+ICRDb25maWcsCiAgICAgICAgS2V5ICAgICAgICA9PiAnRnJlZVRleHRTZXJ2aWNlJywKICAgICAgICBEZWZhdWx0ICAgID0+IDIsCiAgICAgICAgQmFzZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkVGlja2V0VGV4dFByZWZpeCwKICAgICAgICBOYW1lICAgICAgID0+ICdTZXJ2aWNlTmFtZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CiAgICBwdXNoIEB7ICRQYXJhbXtOZXdGaWVsZHN9IH0sICRTZWxmLT5fR2V0RHluYW1pY0ZpZWxkRGVmaW5pdGlvbigKICAgICAgICBDb25maWcgICAgID0+ICRDb25maWcsCiAgICAgICAgS2V5ICAgICAgICA9PiAnRnJlZVRleHRTdGF0ZScsCiAgICAgICAgRGVmYXVsdCAgICA9PiAxLAogICAgICAgIEJhc2UgICAgICAgPT4gJER5bmFtaWNGaWVsZEFydGljbGVUZXh0UHJlZml4LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YXRlTmFtZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQXJ0aWNsZScsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0luY2lkZW50U3RhdGVJbmNpZGVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IHRoZSBDSSBpbmNpZGVudCBzdGF0ZSB0byAnSW5jaWRlbnQnCiAgICAkU2VsZi0+X1NldEluY2lkZW50U3RhdGUoCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAkU2VsZi0+e0hvc3R9LAogICAgICAgIEluY2lkZW50U3RhdGUgPT4gJ0luY2lkZW50JywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSW5jaWRlbnRTdGF0ZU9wZXJhdGlvbmFsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIENJIGluY2lkZW50IHN0YXRlIHRvICdPcGVyYXRpb25hbCcKICAgICRTZWxmLT5fU2V0SW5jaWRlbnRTdGF0ZSgKICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57SG9zdH0sCiAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyB0aGVzZSBhcmUgb3B0aW9uYWwgbW9kdWxlcyBmcm9tIHRoZSBJVFNNIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZyBhbmQgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtCgpzdWIgX0luY2lkZW50U3RhdGVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBtYWluIG9iamVjdAogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcmVxdWlyZSB0aGUgZ2VuZXJhbCBjYXRhbG9nIG1vZHVsZQogICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJykgKSB7CgogICAgICAgICMgY3JlYXRlIGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgICMgcmVxdWlyZSB0aGUgY29uZmlnIGl0ZW0gbW9kdWxlCiAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKSApIHsKCiAgICAgICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX01haWxQYXJzZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtHZXRQYXJhbX0gfHwgISRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSApIHsKCiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTmVlZCBTdWJqZWN0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdWJqZWN0ID0gJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9OwoKICAgICMgVHJ5IHRvIGdldCBTdGF0ZSwgSG9zdCBhbmQgU2VydmljZSBmcm9tIGVtYWlsIHN1YmplY3QKICAgIG15IEBTdWJqZWN0TGluZXMgPSBzcGxpdCAvXG4vLCAkU3ViamVjdDsKICAgIGZvciBteSAkTGluZSAoQFN1YmplY3RMaW5lcykgewogICAgICAgIGZvciBteSAkSXRlbSAocXcoU3RhdGUgSG9zdCBTZXJ2aWNlKSkgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC8kU2VsZi0+e0NvbmZpZ30tPnsgJEl0ZW0gLiAnUmVnRXhwJyB9LyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57JEl0ZW19ID0gJDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyAgRG9uJ3QgVHJ5IHRvIGdldCBTdGF0ZSwgSG9zdCBhbmQgU2VydmljZSBmcm9tIGVtYWlsIGJvZHksIHdlIHdhbnQgaXQgZnJvbSB0aGUgc3ViamVjdCBhbG9uZQoKICAgICMgc3BsaXQgdGhlIGJvZHkgaW50byBzZXBhcmF0ZSBsaW5lcwogICAgaWYgKCAhJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9ICkgewoKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJOZWVkIEJvZHkhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBteSAkQm9keSA9ICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fTsKCiAgICBteSBAQm9keUxpbmVzID0gc3BsaXQgL1xuLywgJEJvZHk7CgogICAgIyB0byByZW1lbWJlciBpZiBhbiBlbGVtZW50IHdhcyBmb3VuZCBiZWZvcmUKICAgIG15ICVBbHJlYWR5TWF0Y2hlZDsKCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lIChAQm9keUxpbmVzKSB7CgogICAgICAgICMgVHJ5IHRvIGdldCBTdGF0ZSwgSG9zdCBhbmQgU2VydmljZSBmcm9tIGVtYWlsIGJvZHkKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoU3RhdGUgSG9zdCBTZXJ2aWNlKSkgewoKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRBbHJlYWR5TWF0Y2hlZHskRWxlbWVudH07CgogICAgICAgICAgICBteSAkUmVnZXggPSAkU2VsZi0+e0NvbmZpZ30tPnsgJEVsZW1lbnQgLiAnUmVnRXhwJyB9OwoKICAgICAgICAgICAgaWYgKCAkTGluZSA9fiAvJFJlZ2V4LyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgZm91bmQgZWxlbWVudCB2YWx1ZQogICAgICAgICAgICAgICAgJFNlbGYtPnskRWxlbWVudH0gPSAkMTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRoYXQgd2UgZm91bmQgdGhpcyBlbGVtZW50IGFscmVhZHkKICAgICAgICAgICAgICAgICRBbHJlYWR5TWF0Y2hlZHskRWxlbWVudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0xvZ01lc3NhZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17TWVzc2FnZVRleHR9ICkgewoKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJOZWVkIE1lc3NhZ2VUZXh0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRNZXNzYWdlVGV4dCA9ICRQYXJhbXtNZXNzYWdlVGV4dH07CgogICAgIyBsb2dnaW5nCiAgICAjIGRlZmluZSBsb2cgbWVzc2FnZQogICAgJFNlbGYtPntTZXJ2aWNlfSB8fD0gIk5vIFNlcnZpY2UiOwogICAgJFNlbGYtPntTdGF0ZX0gICB8fD0gIk5vIFN0YXRlIjsKICAgICRTZWxmLT57SG9zdH0gICAgfHw9ICJObyBIb3N0IjsKCiAgICBteSAkTG9nTWVzc2FnZSA9ICRNZXNzYWdlVGV4dCAuICIgLSAiCiAgICAgICAgLiAiSG9zdDogJFNlbGYtPntIb3N0fSwgIgogICAgICAgIC4gIlN0YXRlOiAkU2VsZi0+e1N0YXRlfSwgIgogICAgICAgIC4gIlNlcnZpY2U6ICRTZWxmLT57U2VydmljZX0iOwoKICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICBQcmlvcml0eSAgICAgID0+ICdOb3RpY2UnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1N5c3RlbU1vbml0b3JpbmcgTWFpbDogJyAuICRMb2dNZXNzYWdlLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9UaWNrZXRTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIElzIHRoZXJlIGEgdGlja2V0IGZvciB0aGlzIEhvc3QvU2VydmljZSBwYWlyPwogICAgbXkgJVF1ZXJ5ID0gKAogICAgICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgIFN0YXRlVHlwZSA9PiAnT3BlbicsCiAgICApOwoKICAgIGZvciBteSAkVHlwZSAocXcoSG9zdCBTZXJ2aWNlKSkgewogICAgICAgIG15ICRGcmVlVGV4dEZpZWxkID0gJFNlbGYtPntDb25maWd9LT57ICdGcmVlVGV4dCcgLiAkVHlwZSB9OwogICAgICAgIG15ICRLZXlOYW1lICAgICAgID0gIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZFRpY2tldFRleHRQcmVmaXggLiAkRnJlZVRleHRGaWVsZDsKICAgICAgICBteSAkS2V5VmFsdWUgICAgICA9ICRTZWxmLT57JFR5cGV9OwoKICAgICAgICAkUXVlcnl7JEtleU5hbWV9LT57RXF1YWxzfSA9ICRLZXlWYWx1ZTsKICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAjIENoZWNrIGlmIGR5bmFtaWMgZmllbGRzIHJlYWxseSBleGlzdHMuCiAgICAjIElmIGR5bmFtaWMgZmllbGRzIGRvbid0IGV4aXN0cywgVGlja2V0U2VhcmNoIHdpbGwgcmV0dXJuIGFsbCB0aWNrZXRzCiAgICAjIGFuZCB0aGVuIHRoZSBuZXcgYXJ0aWNsZS90aWNrZXQgY291bGQgdGFrZSB3cm9uZyBwbGFjZS4KICAgICMgVGhlIGxlc3NlciBvZiB0aGUgdGhyZWUgZXZpbHMgaXMgdG8gY3JlYXRlIGEgbmV3IHRpY2tldAogICAgIyBpbnN0ZWFkIG9mIGRlZmFjaW5nIGV4aXN0aW5nIHRpY2tldHMgb3IgZHJvcHBpbmcgaXQuCiAgICAjIFRoaXMgYmVoYXZpb3Igd2lsbCBjb21lIHRydWUgaWYgdGhlIGR5bmFtaWMgZmllbGRzCiAgICAjIGFyZSBuYW1lZCBsaWtlIFRpY2tldEZyZWVUZXh0SG9zdC4gSXRzIGFsc28gYmFkLgogICAgbXkgJEVycm9ycyA9IDA7CiAgICBmb3IgbXkgJFR5cGUgKHF3KEhvc3QgU2VydmljZSkpIHsKICAgICAgICBteSAkRnJlZVRleHRGaWVsZCA9ICRTZWxmLT57Q29uZmlnfS0+eyAnRnJlZVRleHQnIC4gJFR5cGUgfTsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkVGlja2V0VGV4dFByZWZpeCAuICRGcmVlVGV4dEZpZWxkLAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGQpIHx8ICRGcmVlVGV4dEZpZWxkICF+IG17XGQrfXhtcyApIHsKCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJEeW5hbWljRmllbGQgIgogICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZFRpY2tldFRleHRQcmVmaXgKICAgICAgICAgICAgICAgICAgICAuICRGcmVlVGV4dEZpZWxkCiAgICAgICAgICAgICAgICAgICAgLiAiIGRvZXMgbm90IGV4aXN0cyBvciBtaXNuYW1lZC4iCiAgICAgICAgICAgICAgICAgICAgLiAiIFRoZSBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIER5bmFtaWMgZmllbGRzLCBzbyB0aGUgbnVtYmVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIGlzIGV4cGVjdGVkIgogICAgICAgICAgICAgICAgICAgIC4gIiAod3JvbmcgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgRnJlZVRleHQiIC4gJFR5cGUgLiAiIGlzIHNldCkuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRFcnJvcnMgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZUZyZWVUZXh0RmllbGQgPSAkU2VsZi0+e0NvbmZpZ30tPnsnRnJlZVRleHRTdGF0ZSd9OwogICAgbXkgJER5bmFtaWNGaWVsZEFydGljbGUgID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZEFydGljbGVUZXh0UHJlZml4IC4gJEFydGljbGVGcmVlVGV4dEZpZWxkLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQXJ0aWNsZSkgfHwgJEFydGljbGVGcmVlVGV4dEZpZWxkICF+IG17XGQrfXhtcyApIHsKCiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRHluYW1pY0ZpZWxkICIKICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZEFydGljbGVUZXh0UHJlZml4CiAgICAgICAgICAgICAgICAuICRBcnRpY2xlRnJlZVRleHRGaWVsZAogICAgICAgICAgICAgICAgLiAiIGRvZXMgbm90IGV4aXN0cyBvciBtaXNuYW1lZC4iCiAgICAgICAgICAgICAgICAuICIgVGhlIGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24gZHluYW1pYyBmaWVsZHMsIHNvIHRoZSBudW1iZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgaXMgZXhwZWN0ZWQiCiAgICAgICAgICAgICAgICAuICIgKHdyb25nIHZhbHVlIGZvciBkeW5hbWljIGZpZWxkIEZyZWVUZXh0U3RhdGUgaXMgc2V0KS4iLAogICAgICAgICk7CgogICAgICAgICRFcnJvcnMgPSAxOwogICAgfQoKICAgIG15IEBUaWNrZXRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCglUXVlcnkpOwoKICAgICMgZ2V0IHRoZSBmaXJzdCBhbmQgb25seSB0aWNrZXQgaWQKICAgIG15ICRUaWNrZXRJRDsKICAgIGlmICggISRFcnJvcnMgJiYgQFRpY2tldElEcyApIHsKICAgICAgICAkVGlja2V0SUQgPSBzaGlmdCBAVGlja2V0SURzOwogICAgfQoKICAgIHJldHVybiAkVGlja2V0SUQ7Cn0KCiMgdGhlIHN1YiB0YWtlcyB0aGUgcGFyYW0gYXMgYSBoYXNoIHJlZmVyZW5jZSBub3QgYXMgYSBjb3B5LCBiZWNhdXNlIGl0IGlzIHVwZGF0ZWQKCnN1YiBfVGlja2V0VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEIFBhcmFtKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17VGlja2V0SUR9OwogICAgbXkgJFBhcmFtICAgID0gJFBhcmFte1BhcmFtfTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHRpY2tldCBudW1iZXIKICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgYnVpbGQgc3ViamVjdAogICAgJFBhcmFtLT57R2V0UGFyYW19LT57U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRQYXJhbS0+e0dldFBhcmFtfS0+e1N1YmplY3R9LAogICAgKTsKCiAgICAjIHNldCBzZW5kZXIgdHlwZSBhbmQgYXJ0aWNsZSB0eXBlCiAgICAkUGFyYW0tPntHZXRQYXJhbX0tPnsnWC1PRk9SSy1Gb2xsb3dVcC1TZW5kZXJUeXBlJ30gID0gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX07CiAgICAkUGFyYW0tPntHZXRQYXJhbX0tPnsnWC1PRk9SSy1Gb2xsb3dVcC1BcnRpY2xlVHlwZSd9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9OwoKICAgICMgU2V0IEFydGljbGUgRnJlZSBGaWVsZCBmb3IgU3RhdGUKICAgIG15ICRBcnRpY2xlRnJlZVRleHROdW1iZXIgPSAkU2VsZi0+e0NvbmZpZ30tPnsnRnJlZVRleHRTdGF0ZSd9OwogICAgJFBhcmFtLT57R2V0UGFyYW19LT57ICdYLU9GT1JLLUZvbGxvd1VwLUFydGljbGVLZXknIC4gJEFydGljbGVGcmVlVGV4dE51bWJlciB9ID0gJ1N0YXRlJzsKICAgICRQYXJhbS0+e0dldFBhcmFtfS0+eyAnWC1PRk9SSy1Gb2xsb3dVcC1BcnRpY2xlVmFsdWUnIC4gJEFydGljbGVGcmVlVGV4dE51bWJlciB9CiAgICAgICAgPSAkU2VsZi0+e1N0YXRlfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRTZWxmLT57U3RhdGV9ID1+IC8kU2VsZi0+e0NvbmZpZ30tPntDbG9zZVRpY2tldFJlZ0V4cH0vICkgewoKICAgICAgICAjIENsb3NlIFRpY2tldCBDb25kaXRpb24gLT4gVGFrZSBDbG9zZSBBY3Rpb24KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0Nsb3NlQWN0aW9uU3RhdGV9IG5lICdPTEQnICkgewogICAgICAgICAgICAkUGFyYW0tPntHZXRQYXJhbX0tPnsnWC1PRk9SSy1Gb2xsb3dVcC1TdGF0ZSd9ID0gJFNlbGYtPntDb25maWd9LT57Q2xvc2VBY3Rpb25TdGF0ZX07CgogICAgICAgICAgICAjIGdldCBkYXRldGltZSBvYmplY3QKICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkU2VsZi0+e0NvbmZpZ30tPntDbG9zZVBlbmRpbmdUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbS0+e0dldFBhcmFtfS0+eydYLU9GT1JLLUZvbGxvd1VwLVN0YXRlLVBlbmRpbmdUaW1lJ30KICAgICAgICAgICAgICAgID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbG9nIG1lc3NhZ2UKICAgICAgICAkU2VsZi0+X0xvZ01lc3NhZ2UoIE1lc3NhZ2VUZXh0ID0+ICdSZWNvdmVyZWQnICk7CgogICAgICAgICMgaWYgdGhlIENJIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzZXQKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtTW9uaXRvcmluZzo6U2V0SW5jaWRlbnRTdGF0ZScpICkgewogICAgICAgICAgICAkU2VsZi0+X0luY2lkZW50U3RhdGVPcGVyYXRpb25hbCgpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEF0dGFjaCBub3RlIHRvIGV4aXN0aW5nIHRpY2tldAogICAgICAgICRTZWxmLT5fTG9nTWVzc2FnZSggTWVzc2FnZVRleHQgPT4gJ05ldyBOb3RpY2UnICk7CiAgICB9CgogICAgIyBsaW5rIHRpY2tldCB3aXRoIENJLCB0aGlzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHRpY2tldCBhbHJlYWR5IGV4aXN0cywKICAgICMgZS5nLiBpbiBhIHN1YnNlcXVlbnQgZW1haWwgcmVxdWVzdCwgYmVjYXVzZSB3ZSBuZWVkIGEgdGlja2V0IGlkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtTW9uaXRvcmluZzo6TGlua1RpY2tldFdpdGhDSScpICkgewoKICAgICAgICAjIGxpbmsgdGlja2V0IHdpdGggQ0kKICAgICAgICAkU2VsZi0+X0xpbmtUaWNrZXRXaXRoQ0koCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZWxmLT57SG9zdH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIHRoZSBzdWIgdGFrZXMgdGhlIHBhcmFtIGFzIGEgaGFzaCByZWZlcmVuY2Ugbm90IGFzIGEgY29weSwgYmVjYXVzZSBpdCBpcyB1cGRhdGVkCgpzdWIgX1RpY2tldENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAkUGFyYW0gKSA9IEBfOwoKICAgICMgQ3JlYXRlIFRpY2tldCBDb25kaXRpb24gLT4gQ3JlYXRlIG5ldyBUaWNrZXQgYW5kIHJlY29yZCBIb3N0IGFuZCBTZXJ2aWNlCiAgICBmb3IgbXkgJEl0ZW0gKHF3KEhvc3QgU2VydmljZSkpIHsKCiAgICAgICAgIyBnZXQgdGhlIGZyZWV0ZXh0IG51bWJlciBmcm9tIGNvbmZpZwogICAgICAgIG15ICRUaWNrZXRGcmVlVGV4dE51bWJlciA9ICRTZWxmLT57Q29uZmlnfS0+eyAnRnJlZVRleHQnIC4gJEl0ZW0gfTsKCiAgICAgICAgIyBzZWUgdGhlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpOZXdUaWNrZXQgIHdoZXJlIHRoaXMgaXMgcmVhZAogICAgICAgICRQYXJhbS0+e0dldFBhcmFtfS0+eyAnWC1PRk9SSy1UaWNrZXRLZXknIC4gJFRpY2tldEZyZWVUZXh0TnVtYmVyIH0gICA9ICRJdGVtOwogICAgICAgICRQYXJhbS0+e0dldFBhcmFtfS0+eyAnWC1PRk9SSy1UaWNrZXRWYWx1ZScgLiAkVGlja2V0RnJlZVRleHROdW1iZXIgfSA9ICRTZWxmLT57JEl0ZW19OwogICAgfQoKICAgICMgU2V0IEFydGljbGUgRnJlZSBGaWVsZCBmb3IgU3RhdGUKICAgIG15ICRBcnRpY2xlRnJlZVRleHROdW1iZXIgPSAkU2VsZi0+e0NvbmZpZ30tPnsnRnJlZVRleHRTdGF0ZSd9OwogICAgJFBhcmFtLT57R2V0UGFyYW19LT57ICdYLU9GT1JLLUFydGljbGVLZXknIC4gJEFydGljbGVGcmVlVGV4dE51bWJlciB9ICAgPSAnU3RhdGUnOwogICAgJFBhcmFtLT57R2V0UGFyYW19LT57ICdYLU9GT1JLLUFydGljbGVWYWx1ZScgLiAkQXJ0aWNsZUZyZWVUZXh0TnVtYmVyIH0gPSAkU2VsZi0+e1N0YXRlfTsKCiAgICAjIHNldCBzZW5kZXIgdHlwZSBhbmQgYXJ0aWNsZSB0eXBlCiAgICAkUGFyYW0tPntHZXRQYXJhbX0tPnsnWC1PRk9SSy1TZW5kZXJUeXBlJ30gID0gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX07CiAgICAkUGFyYW0tPntHZXRQYXJhbX0tPnsnWC1PRk9SSy1BcnRpY2xlVHlwZSd9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9OwoKICAgICMgc2V0IGxvZyBtZXNzYWdlCiAgICAkU2VsZi0+X0xvZ01lc3NhZ2UoIE1lc3NhZ2VUZXh0ID0+ICdOZXcgVGlja2V0JyApOwoKICAgICMgaWYgdGhlIENJIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzZXQKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTeXN0ZW1Nb25pdG9yaW5nOjpTZXRJbmNpZGVudFN0YXRlJykgKSB7CiAgICAgICAgJFNlbGYtPl9JbmNpZGVudFN0YXRlSW5jaWRlbnQoKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyB0aGUgc3ViIHRha2VzIHRoZSBwYXJhbSBhcyBhIGhhc2ggcmVmZXJlbmNlIG5vdCBhcyBhIGNvcHksIGJlY2F1c2UgaXQgaXMgdXBkYXRlZAoKc3ViIF9UaWNrZXREcm9wIHsKICAgIG15ICggJFNlbGYsICRQYXJhbSApID0gQF87CgogICAgIyBObyBleGlzdGluZyB0aWNrZXQgYW5kIG5vIG9wZW4gY29uZGl0aW9uIC0+IGRyb3Agc2lsZW50bHkKICAgICRQYXJhbS0+e0dldFBhcmFtfS0+eydYLU9GT1JLLUlnbm9yZSd9ID0gJ3llcyc7CiAgICAkU2VsZi0+X0xvZ01lc3NhZ2UoCiAgICAgICAgTWVzc2FnZVRleHQgPT4gJ01haWwgRHJvcHBlZCwgbm8gbWF0Y2hpbmcgdGlja2V0IGZvdW5kLCBubyBvcGVuIG9uIHRoaXMgc3RhdGUgJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb3B0aW9ucywgdXNlIGRlZmF1bHRzIHVubGVzcyB2YWx1ZSBzcGVjaWZpZWQKICAgIGlmICggJFBhcmFte0pvYkNvbmZpZ30gJiYgcmVmICRQYXJhbXtKb2JDb25maWd9IGVxICdIQVNIJyApIHsKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzKCAleyAkUGFyYW17Sm9iQ29uZmlnfSB9ICkgKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICEkU2VsZi0+e0NvbmZpZ30tPnskS2V5fTsKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57JEtleX0gPSAkUGFyYW17Sm9iQ29uZmlnfS0+eyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHNlbmRlciBpcyBvZiBpbnRlcmVzdAogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtHZXRQYXJhbX0tPntGcm9tfTsKICAgIHJldHVybiAxIGlmICRQYXJhbXtHZXRQYXJhbX0tPntGcm9tfSAhfiAvJFNlbGYtPntDb25maWd9LT57RnJvbUFkZHJlc3NSZWdFeHB9L2k7CgogICAgJFNlbGYtPl9NYWlsUGFyc2UoJVBhcmFtKTsKCiAgICAjIHdlIG5lZWQgU3RhdGUgYW5kIEhvc3QgdG8gcHJvY2VlZAogICAgaWYgKCAhJFNlbGYtPntTdGF0ZX0gfHwgISRTZWxmLT57SG9zdH0gKSB7CgogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZycsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1N5c3RlbU1vbml0b3JpbmcgTWFpbDogJwogICAgICAgICAgICAgICAgLiAnU3lzdGVtTW9uaXRvcmluZzogQ291bGQgbm90IGZpbmQgaG9zdCBhZGRyZXNzICcKICAgICAgICAgICAgICAgIC4gJ2FuZC9vciBzdGF0ZSBpbiBtYWlsID0+IElnbm9yaW5nJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIENoZWNrIGZvciBTZXJ2aWNlCiAgICAkU2VsZi0+e1NlcnZpY2V9IHx8PSAkU2VsZi0+e0NvbmZpZ30tPntEZWZhdWx0U2VydmljZX07CgogICAgbXkgJFRpY2tldElEID0gJFNlbGYtPl9UaWNrZXRTZWFyY2goKTsKCiAgICAjIE9LLCBmb3VuZCB0aWNrZXQgdG8gZGVhbCB3aXRoCiAgICBpZiAoJFRpY2tldElEKSB7CiAgICAgICAgJFNlbGYtPl9UaWNrZXRVcGRhdGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUGFyYW0gICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N0YXRlfSA9fiAvJFNlbGYtPntDb25maWd9LT57TmV3VGlja2V0UmVnRXhwfS8gKSB7CiAgICAgICAgJFNlbGYtPl9UaWNrZXRDcmVhdGUoIFwlUGFyYW0gKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fVGlja2V0RHJvcCggXCVQYXJhbSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NldEluY2lkZW50U3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBJbmNpZGVudFN0YXRlICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJOZWVkICRBcmd1bWVudCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29uZmlnaXRlbSBvYmplY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fTsKCiAgICAjIHNlYXJjaCBjb25maWdpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICBOYW1lID0+ICRQYXJhbXtOYW1lfSwKICAgICk7CgogICAgIyBpZiBubyBjb25maWcgaXRlbSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQKICAgIGlmICggISRDb25maWdJdGVtSURzIHx8IHJlZiAkQ29uZmlnSXRlbUlEcyBuZSAnQVJSQVknIHx8ICFAeyRDb25maWdJdGVtSURzfSApIHsKCiAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJDb3VsZCBub3QgZmluZCBhbnkgQ0kgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9Jy4gIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBtb3JlIHRoYW4gb25lIGNvbmZpZyBpdGVtIHdpdGggdGhpcyBuYW1lIHdhcyBmb3VuZAogICAgaWYgKCBzY2FsYXIgQHskQ29uZmlnSXRlbUlEc30gPiAxICkgewoKICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZycsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkNhbiBub3Qgc2V0IGluY2lkZW50IHN0YXRlIGZvciBDSSB3aXRoIHRoZSBuYW1lICckUGFyYW17TmFtZX0nLiAiCiAgICAgICAgICAgICAgICAuICJNb3JlIHRoYW4gb25lIENJIHdpdGggdGhpcyBuYW1lIHdhcyBmb3VuZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdlIG9ubHkgZm91bmQgb25lIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gc2hpZnQgQHskQ29uZmlnSXRlbUlEc307CgogICAgIyBnZXQgbGF0ZXN0IHZlcnNpb24gZGF0YSBvZiBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICByZXR1cm4gaWYgISRWZXJzaW9uOwogICAgcmV0dXJuIGlmIHJlZiAkVmVyc2lvbiBuZSAnSEFTSCc7CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbmNpU3RhdGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCc7CgogICAgIyByZXZlcnNlIHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgaXMgdmFsaWQKICAgIGlmICggISRSZXZlcnNlSW5jaVN0YXRlTGlzdHsgJFBhcmFte0luY2lkZW50U3RhdGV9IH0gKSB7CgogICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiSW52YWxpZCBpbmNpZGVudCBzdGF0ZSAnJFBhcmFte0luY2lkZW50U3RhdGV9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBhIG5ldyB2ZXJzaW9uIHdpdGggdGhlIG5ldyBpbmNpZGVudCBzdGF0ZQogICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25BZGQoCiAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgPT4gJFJldmVyc2VJbmNpU3RhdGVMaXN0eyAkUGFyYW17SW5jaWRlbnRTdGF0ZX0gfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFZlcnNpb25JRDsKfQoKc3ViIF9MaW5rVGlja2V0V2l0aENJIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTmVlZCAkQXJndW1lbnQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNvbmZpZ2l0ZW0gb2JqZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH07CgogICAgIyBzZWFyY2ggY29uZmlnaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgICMgaWYgbm8gY29uZmlnIGl0ZW0gd2l0aCB0aGlzIG5hbWUgd2FzIGZvdW5kCiAgICBpZiAoICEkQ29uZmlnSXRlbUlEcyB8fCByZWYgJENvbmZpZ0l0ZW1JRHMgbmUgJ0FSUkFZJyB8fCAhQHskQ29uZmlnSXRlbUlEc30gKSB7CgogICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ291bGQgbm90IGZpbmQgYW55IENJIHdpdGggdGhlIG5hbWUgJyRQYXJhbXtOYW1lfScuICIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgbW9yZSB0aGFuIG9uZSBjb25maWcgaXRlbSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQKICAgIGlmICggc2NhbGFyIEB7JENvbmZpZ0l0ZW1JRHN9ID4gMSApIHsKCiAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJDYW4gbm90IHNldCBpbmNpZGVudCBzdGF0ZSBmb3IgQ0kgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9Jy4gIgogICAgICAgICAgICAgICAgLiAiTW9yZSB0aGFuIG9uZSBDSSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3ZSBvbmx5IGZvdW5kIG9uZSBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9IHNoaWZ0IEB7JENvbmZpZ0l0ZW1JRHN9OwoKICAgICMgbGluayB0aGUgdGlja2V0IHdpdGggdGhlIENJCiAgICBteSAkTGlua1Jlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRhcmdldEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFR5cGUgICAgICAgICA9PiAnUmVsZXZhbnRUbycsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkTGlua1Jlc3VsdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpOYWdpb3NBY2tub3dsZWRnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgp1c2UgTFdQOjpVc2VyQWdlbnQ7CnVzZSBVUkk6OkVzY2FwZSBxdygpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb3JyZWN0IEZyZWVGaWVsZHMKICAgICRTZWxmLT57Rmhvc3R9ICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpGcmVlRmllbGQ6Okhvc3QnKTsKICAgICRTZWxmLT57RnNlcnZpY2V9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpGcmVlRmllbGQ6OlNlcnZpY2UnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIERhdGEtPntUaWNrZXRJRH0hIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBhY2tub3dsZWRnZSBpcyBhY3RpdmUKICAgIG15ICRUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpUeXBlJyk7CgogICAgcmV0dXJuIDEgaWYgISRUeXBlOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjaGVjayBpZiBpdCdzIGEgTmFnaW9zIHJlbGF0ZWQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CiAgICBpZiAoICEkVGlja2V0eyAkU2VsZi0+e0Zob3N0fSB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gTmFnaW9zIFRpY2tldCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2hlY2sgaWYgaXQncyBhbiBhY2tub3dsZWRnZQogICAgcmV0dXJuIDEgaWYgJFRpY2tldHtMb2NrfSBuZSAnbG9jayc7CgogICAgIyBhZ2VudCBsb29rdXAKICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLCAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCAtPiAwfDEgKGRlZmF1bHQgMCkKICAgICk7CgogICAgbXkgJFJldHVybjsKICAgIGlmICggJFR5cGUgZXEgJ3BpcGUnICkgewogICAgICAgICRSZXR1cm4gPSAkU2VsZi0+X1BpcGUoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlciAgID0+IFwlVXNlciwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnaHR0cCcgKSB7CiAgICAgICAgJFJldHVybiA9ICRTZWxmLT5fSFRUUCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gTmFnaW9zIGFja25vd2xlZGdlIHR5cGUgKCRUeXBlKSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmICgkUmV0dXJuKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJTZW50IEFja25vd2xlZGdlIHRvIE5hZ2lvcyAoJFR5cGUpLiIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiV2FzIG5vdCBhYmxlIHRvIHNlbmQgQWNrbm93bGVkZ2UgdG8gTmFnaW9zICgkVHlwZSkhIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KfQoKc3ViIF9QaXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXQgVXNlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyICAgPSAleyAkUGFyYW17VXNlcn0gfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNlbmQgYWNrbm93bGVkZ2UgdG8gbmFnaW9zCiAgICBteSAkQ01EID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCcpOwogICAgbXkgJERhdGE7CiAgICBpZiAoICRUaWNrZXR7ICRTZWxmLT57RnNlcnZpY2V9IH0gIX4gL15ob3N0JC9pICkgewogICAgICAgICREYXRhID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OlNlcnZpY2UnKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6Okhvc3QnKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKICAgIFRJQ0tFVDoKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVUaWNrZXQgKSB7CiAgICAgICAgbmV4dCBUSUNLRVQgaWYgIWRlZmluZWQgJFRpY2tldHskS2V5fTsKCiAgICAgICAgIyBzdHJpcCBub3QgYWxsb3dlZCBjaGFyYWN0ZXJzCiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLycvL2c7CiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLzsvL2c7CiAgICAgICAgJERhdGEgICAgICAgICA9fiBzLzwkS2V5Pi8kVGlja2V0eyRLZXl9L2c7CiAgICB9CgogICAgIyByZXBsYWNlIGNvbmZpZyB0YWdzCiAgICAkRGF0YSA9fiBzezxDT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKCiAgICAjIHJlcGxhY2UgbG9naW4KICAgICREYXRhID1+IHMvPExPR0lOPi8kVXNlcntVc2VyTG9naW59L2c7CgogICAgIyByZXBsYWNlIGhvc3QKICAgICREYXRhID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJERhdGEgPX4gcy88U0VSVklDRV9OQU1FPi8kVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICBteSAkVGltZSA9IHRpbWUoKTsKICAgICREYXRhID1+IHMvPFVOSVhUSU1FPi8kVGltZS9nOwoKICAgICMgcmVwbGFjZSBPVVRQVVRTVFJJTkcKICAgICRDTUQgPX4gcy88T1VUUFVUU1RSSU5HPi8kRGF0YS9nOwoKICAgICNwcmludCBTVERPVVQgIiRDTURcbiI7CiAgICBzeXN0ZW0oJENNRCk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSFRUUCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlVXNlciAgID0gJXsgJFBhcmFte1VzZXJ9IH07CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJFVSTCAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlVSTCcpOwogICAgbXkgJFVzZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlVzZXInKTsKICAgIG15ICRQdyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCcpOwoKICAgIGlmICggJFRpY2tldHsgJFNlbGYtPntGc2VydmljZX0gfSAhfiAvXmhvc3QkL2kgKSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zNC9nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zMy9nOwogICAgfQoKICAgICMgcmVwbGFjZSBob3N0CiAgICAkVVJMID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJFVSTCA9fiBzLzxTRVJWSUNFX05BTUU+LyRUaWNrZXR7JFNlbGYtPntGc2VydmljZX19L2c7CgogICAgIyByZXBsYWNlIHRpY2tldCB0YWdzCiAgICBUSUNLRVQ6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlVGlja2V0ICkgewogICAgICAgIG5leHQgVElDS0VUIGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgVVJMZW5jb2RlIHZhbHVlcwogICAgICAgICRUaWNrZXR7JEtleX0gPSBVUkk6OkVzY2FwZTo6dXJpX2VzY2FwZV91dGY4KCAkVGlja2V0eyRLZXl9ICk7CiAgICAgICAgJFVSTCA9fiBzLzwkS2V5Pi8kVGlja2V0eyRLZXl9L2c7CiAgICB9CgogICAgIyByZXBsYWNlIGNvbmZpZyB0YWdzCiAgICAkVVJMID1+IHN7PENPTkZJR18oLis/KT59eyRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgkMSl9ZWd4OwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCk7CiAgICAkVXNlckFnZW50LT50aW1lb3V0KDE1KTsKCiAgICBteSAkUmVxdWVzdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyggR0VUID0+ICRVUkwgKTsKICAgICRSZXF1ZXN0LT5hdXRob3JpemF0aW9uX2Jhc2ljKCAkVXNlciwgJFB3ICk7CiAgICBteSAkUmVzcG9uc2UgPSAkVXNlckFnZW50LT5yZXF1ZXN0KCRSZXF1ZXN0KTsKICAgIGlmICggISRSZXNwb25zZS0+aXNfc3VjY2VzcygpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVxdWVzdCAkVVJMOiAiIC4gJFJlc3BvbnNlLT5zdGF0dXNfbGluZSgpLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjICAgIHJldHVybiAkUmVzcG9uc2UtPmNvbnRlbnQoKTsKICAgIHJldHVybiAxOwp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpJY2luZ2EyQWNrbm93bGVkZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAopOwoKdXNlIExXUDo6VXNlckFnZW50Owp1c2UgSU86OlNvY2tldDo6U1NMOwp1c2UgVVJJOjpFc2NhcGUgcXcoKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QuCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGNvcnJlY3QgRnJlZUZpZWxkcy4KICAgICRTZWxmLT57Rmhvc3R9ICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdJY2luZ2EyOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0Jyk7CiAgICAkU2VsZi0+e0ZzZXJ2aWNlfSA9ICRDb25maWdPYmplY3QtPkdldCgnSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZScpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IENvbmZpZykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBEYXRhLT57VGlja2V0SUR9IScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYWNrbm93bGVkZ2UgaXMgYWN0aXZlLgogICAgbXkgJEVuYWJsZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ljaW5nYTI6OkFja25vd2xlZGdlOjpFbmFibGVkJyk7CgogICAgcmV0dXJuIDEgaWYgISRFbmFibGVkOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBDaGVjayBpZiBpdCdzIGEgSWNpbmdhMiByZWxhdGVkIHRpY2tldC4KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIGlmICggISRUaWNrZXR7ICRTZWxmLT57Rmhvc3R9IH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gSWNpbmdhMiBUaWNrZXQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIENoZWNrIGlmIGl0J3MgYW4gYWNrbm93bGVkZ2UuCiAgICByZXR1cm4gMSBpZiAkVGlja2V0e0xvY2t9IG5lICdsb2NrJzsKCiAgICAjIEFnZW50IGxvb2t1cC4KICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICBteSAkUmV0dXJuID0gJFNlbGYtPl9IVFRQKAogICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgKTsKCiAgICBpZiAoJFJldHVybikgewoKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlbnQgQWNrbm93bGVkZ2UgdG8gSWNpbmdhMi4nLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdXYXMgbm90IGFibGUgdG8gc2VuZCBBY2tub3dsZWRnZSB0byBJY2luZ2EyLicsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9Cn0KCnN1YiBfSFRUUCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCAgID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyRGF0YSA9ICV7ICRQYXJhbXtVc2VyfSB9OwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRVUkwgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdJY2luZ2EyOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMJyk7CiAgICBteSAkVXNlciAgICA9ICRDb25maWdPYmplY3QtPkdldCgnSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkhUVFA6OlVzZXInKTsKICAgIG15ICRQdyAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdJY2luZ2EyOjpBY2tub3dsZWRnZTo6SFRUUDo6UGFzc3dvcmQnKTsKICAgIG15ICRBdXRob3IgID0gJENvbmZpZ09iamVjdC0+R2V0KCdJY2luZ2EyOjpBY2tub3dsZWRnZTo6QXV0aG9yJyk7CiAgICBteSAkQ29tbWVudCA9ICRDb25maWdPYmplY3QtPkdldCgnSWNpbmdhMjo6QWNrbm93bGVkZ2U6OkNvbW1lbnQnKTsKICAgIG15ICRTdGlja3kgID0gJENvbmZpZ09iamVjdC0+R2V0KCdJY2luZ2EyOjpBY2tub3dsZWRnZTo6U3RpY2t5Jyk7CiAgICBteSAkTm90aWZ5ICA9ICRDb25maWdPYmplY3QtPkdldCgnSWNpbmdhMjo6QWNrbm93bGVkZ2U6Ok5vdGlmeScpOwogICAgbXkgJEV4cGlyeTsKCiAgICBpZiAoICRUaWNrZXR7ICRTZWxmLT57RnNlcnZpY2V9IH0gIX4gL15ob3N0JC9pICkgewoKICAgICAgICBteSAkRmlsdGVyID0gc3ByaW50ZigKICAgICAgICAgICAgJ21hdGNoKCIlcyIsaG9zdC5uYW1lKSYmbWF0Y2goIiVzIixzZXJ2aWNlLm5hbWUpJywKICAgICAgICAgICAgJFRpY2tldHsgJFNlbGYtPntGaG9zdH0gfSwKICAgICAgICAgICAgJFRpY2tldHsgJFNlbGYtPntGc2VydmljZX0gfQogICAgICAgICk7CiAgICAgICAgJFVSTCAuPSBzcHJpbnRmKCAiP3R5cGU9U2VydmljZSZmaWx0ZXI9JXMiLCBVUkk6OkVzY2FwZTo6dXJpX2VzY2FwZSgkRmlsdGVyKSApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRGaWx0ZXIgPSBzcHJpbnRmKCAnbWF0Y2goIiVzIixob3N0Lm5hbWUpJywgJFRpY2tldHsgJFNlbGYtPntGaG9zdH0gfSApOwogICAgICAgICRVUkwgLj0gc3ByaW50ZiggIj90eXBlPUhvc3QmZmlsdGVyPSVzIiwgVVJJOjpFc2NhcGU6OnVyaV9lc2NhcGUoJEZpbHRlcikgKTsKICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCRBdXRob3IpICkgewoKICAgICAgICAkQXV0aG9yID0gJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX07CiAgICB9CgogICAgIyBSZXBsYWNlIHRpY2tldCB0YWdzLgogICAgVElDS0VUOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IFRJQ0tFVCBpZiAhZGVmaW5lZCAkVGlja2V0eyRLZXl9OwoKICAgICAgICAjIFVSTGVuY29kZSB2YWx1ZXMuCiAgICAgICAgJFRpY2tldHskS2V5fSA9IFVSSTo6RXNjYXBlOjp1cmlfZXNjYXBlX3V0ZjgoICRUaWNrZXR7JEtleX0gKTsKICAgICAgICAkQ29tbWVudCA9fiBzLzwkS2V5Pi8kVGlja2V0eyRLZXl9L2c7CiAgICB9CgogICAgIyByZXBsYWNlIGNvbmZpZyB0YWdzCiAgICAkQ29tbWVudCA9fiBzezxDT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKCiAgICAjIGdldCBqc29uIG9iamVjdAogICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgIG15ICVJY2luZ2EyUGFyYW0gPSAoCiAgICAgICAgJ2F1dGhvcicgID0+ICRBdXRob3IsCiAgICAgICAgJ2NvbW1lbnQnID0+ICIkQ29tbWVudCIsCiAgICAgICAgJ3N0aWNreScgID0+ICRTdGlja3kgPT0gMSA/ICRKU09OT2JqZWN0LT5UcnVlKCkgOiAkSlNPTk9iamVjdC0+RmFsc2UoKSwKICAgICAgICAnbm90aWZ5JyAgPT4gJE5vdGlmeSA9PSAxID8gJEpTT05PYmplY3QtPlRydWUoKSA6ICRKU09OT2JqZWN0LT5GYWxzZSgpLAogICAgKTsKICAgIGlmICgkRXhwaXJ5KSB7CgogICAgICAgICRJY2luZ2EyUGFyYW17J2V4cGlyeSd9ID0gJEV4cGlyeTsKICAgIH0KICAgIG15ICRKc29uID0gJEpTT05PYmplY3QtPkVuY29kZSggRGF0YSA9PiBcJUljaW5nYTJQYXJhbSApOwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KAogICAgICAgIHRpbWVvdXQgID0+IDMwLAogICAgICAgIHNzbF9vcHRzID0+IHsKICAgICAgICAgICAgdmVyaWZ5X2hvc3RuYW1lID0+IDAsCiAgICAgICAgICAgIFNTTF92ZXJpZnlfbW9kZSA9PiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORSwKICAgICAgICB9CiAgICApOwogICAgbXkgJFJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoIFBPU1QgPT4gJFVSTCApOwogICAgJFJlcXVlc3QtPmF1dGhvcml6YXRpb25fYmFzaWMoICRVc2VyLCAkUHcgKTsKICAgICRSZXF1ZXN0LT5oZWFkZXIoICdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi9qc29uJyApOwogICAgJFJlcXVlc3QtPmNvbnRlbnQoJEpzb24pOwogICAgbXkgJFJlc3BvbnNlID0gJFVzZXJBZ2VudC0+cmVxdWVzdCgkUmVxdWVzdCk7CiAgICBpZiAoICEkUmVzcG9uc2UtPmlzX3N1Y2Nlc3MoKSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZXF1ZXN0ICRVUkw6ICIgLiAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRSZXNwb25zZVN0cmluZyA9ICRSZXNwb25zZS0+ZGVjb2RlZF9jb250ZW50KCk7CiAgICAgICAgaWYgKCRSZXNwb25zZVN0cmluZykgewoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlSlNPTiA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRSZXNwb25zZVN0cmluZwogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFJlc3BvbnNlSlNPTikgKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igc2VuZGluZyBhY2sgdG8gSWNpbmdhMi4gRmFpbCB0byBkZWNvZGUganNvbiAoaHR0cCAlcyk6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgJFJlc3BvbnNlLT5zdGF0dXNfbGluZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2VTdHJpbmcKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFJlc3VsdHMgPSAkUmVzcG9uc2VKU09OLT57cmVzdWx0c307CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRSZXNwb25zZUpTT04KICAgICAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSgkUmVzdWx0cykKICAgICAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUmVzdWx0cy0+WzBdICkKICAgICAgICAgICAgICAgICYmICRSZXN1bHRzLT5bMF0tPntzdGF0dXN9CiAgICAgICAgICAgICAgICAmJiAkUmVzdWx0cy0+WzBdLT57Y29kZX0gPiAyOTkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHNlbmRpbmcgYWNrIHRvIEljaW5nYTI6ICVzICglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXN1bHRzLT5bMF0tPntzdGF0dXN9CiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRDb21tYW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpTeXN0ZW1Nb25pdG9yaW5nOjpOYWdpb3NDaGVjaycpOwoKbXkgJENvbmZpZ0ZpbGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS9OYWdpb3NDaGVja1Rlc3RpbmcucG0nOwoKbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLWNvbmZpZy1maWxlJywgJENvbmZpZ0ZpbGUsICctLWFzLWNoZWNrZXInLCAnLS12ZXJib3NlJywgKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiTWFpbnQ6OlN5c3RlbU1vbml0b3Jpbmc6Ok5hZ2lvc0NoZWNrIGV4aXQgY29kZSIsCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRDb21tYW5kT2JqZWN0CiAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zQ2hlY2tUaWNrZXRDb3VudCcpOwoKbXkgJENvbmZpZ0ZpbGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS9OYWdpb3NDaGVja1Rlc3RpbmcucG0nOwoKbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLWNvbmZpZy1maWxlJywgJENvbmZpZ0ZpbGUsICctLWFzLWNoZWNrZXInLCApOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJNYWludDo6U3lzdGVtTW9uaXRvcmluZzo6TmFnaW9zQ2hlY2tUaWNrZXRDb3VudCBleGl0IGNvZGUiLAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI7CgojIGFkZCBvciB1cGRhdGUgZHluYW1pYyBmaWVsZHMgaWYgbmVlZGVkCm15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgpteSBARHluYW1pY2ZpZWxkSURzOwpteSBARHluYW1pY0ZpZWxkVXBkYXRlOwpteSAlTmVlZGVkRHluYW1pY2ZpZWxkcyA9ICgKICAgIFRpY2tldEZyZWVUZXh0MSAgPT4gMSwKICAgIFRpY2tldEZyZWVUZXh0MiAgPT4gMSwKICAgIEFydGljbGVGcmVlVGV4dDEgPT4gMSwKKTsKCiMgbGlzdCBhdmFpbGFibGUgZHluYW1pYyBmaWVsZHMKbXkgJER5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0KAogICAgVmFsaWQgICAgICA9PiAwLAogICAgUmVzdWx0VHlwZSA9PiAnSEFTSCcsCik7CiREeW5hbWljRmllbGRzID0gKCByZWYgJER5bmFtaWNGaWVsZHMgZXEgJ0hBU0gnID8gJER5bmFtaWNGaWVsZHMgOiB7fSApOwokRHluYW1pY0ZpZWxkcyA9IHsgcmV2ZXJzZSAleyREeW5hbWljRmllbGRzfSB9OwoKZm9yIG15ICRGaWVsZE5hbWUgKCBzb3J0IGtleXMgJU5lZWRlZER5bmFtaWNmaWVsZHMgKSB7CiAgICBpZiAoICEkRHluYW1pY0ZpZWxkcy0+eyRGaWVsZE5hbWV9ICkgewoKICAgICAgICAjIGNyZWF0ZSBhIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkRmllbGRJRCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGROYW1lLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICRGaWVsZE5hbWUgLiAiX3Rlc3QiLAogICAgICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTEsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAnYSB2YWx1ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGR5bmFtaWMgZmllbGQgY3JlYXRpb24KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEZpZWxkSUQsCiAgICAgICAgICAgICJEeW5hbWljRmllbGRBZGQoKSBzdWNjZXNzZnVsIGZvciBGaWVsZCAkRmllbGROYW1lIiwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRJRHMsICRGaWVsZElEOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCggSUQgPT4gJER5bmFtaWNGaWVsZHMtPnskRmllbGROYW1lfSApOwoKICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntWYWxpZElEfSA+IDEgKSB7CiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZFVwZGF0ZSwgJER5bmFtaWNGaWVsZDsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e1ZhbGlkSUR9ID0gMTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3NVcGRhdGUgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgUmVvcmRlciA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB2ZXJpZnkgZHluYW1pYyBmaWVsZCBjcmVhdGlvbgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzVXBkYXRlLAogICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZFVwZGF0ZSgpIHN1Y2Nlc3NmdWwgdXBkYXRlIGZvciBGaWVsZCAkRHluYW1pY0ZpZWxkLT57TmFtZX0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7Cm15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKbXkgJEZpbGVBcnJheSA9ICRNYWluT2JqZWN0LT5GaWxlUmVhZCgKICAgIExvY2F0aW9uID0+ICRDb25maWdPYmplY3QtPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL3Rlc3Qvc2FtcGxlL1N5c3RlbU1vbml0b3JpbmcxLmJveCcsCiAgICBSZXN1bHQgICA9PiAnQVJSQVknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgLSBTQ0FMQVJ8QVJSQVkKKTsKCm15ICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkxvZycsCiAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiAnRW1haWwnLAogICAgICAgIERpcmVjdGlvbiA9PiAnSW5jb21pbmcnLAogICAgfSwKKTsKJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0YXJ0KCBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJyApOwoKbXkgJFBvc3RNYXN0ZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlci0+bmV3KAogICAgJXskU2VsZn0sCiAgICBFbWFpbCAgICAgICAgICAgICAgICAgID0+ICRGaWxlQXJyYXksCiAgICBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ID0+ICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LAopOwoKbXkgQFJldHVybiA9ICRQb3N0TWFzdGVyT2JqZWN0LT5SdW4oKTsKJFNlbGYtPklzKAogICAgJFJldHVyblswXSB8fCAwLAogICAgMSwKICAgICJSdW4oKSAtIE5ld1RpY2tldCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFJldHVyblsxXSB8fCAwLAogICAgIlJ1bigpIC0gTmV3VGlja2V0L1RpY2tldElEIiwKKTsKCiRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICBTdGF0dXMgICAgICAgID0+ICdTdWNjZXNzZnVsJywKKTsKJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKAogICAgU3RhdHVzID0+ICdTdWNjZXNzZnVsJywKKTsKCm15ICRUaWNrZXRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7Cm15ICVUaWNrZXQgICAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCAgICAgID0+ICRSZXR1cm5bMV0sCiAgICBEeW5hbWljRmllbGRzID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0e0R5bmFtaWNGaWVsZF9UaWNrZXRGcmVlVGV4dDF9LAogICAgJ2RlbHBoaW4nLAogICAgIkhvc3QgY2hlY2siLAopOwoKJFNlbGYtPklzKAogICAgJFRpY2tldHtEeW5hbWljRmllbGRfVGlja2V0RnJlZVRleHQyfSwKICAgICdIb3N0JywKICAgICJTZXJ2aWNlIGNoZWNrIiwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtTdGF0ZX0sCiAgICAnbmV3JywKICAgICJSdW4oKSAtIFRpY2tldCBTdGF0ZSIsCik7CgokRmlsZUFycmF5ID0gJE1haW5PYmplY3QtPkZpbGVSZWFkKAogICAgTG9jYXRpb24gPT4gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3lzdGVtTW9uaXRvcmluZzIuYm94JywKICAgIFJlc3VsdCAgID0+ICdBUlJBWScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAtIFNDQUxBUnxBUlJBWQopOwoKbXkgJENvbW11bmljYXRpb25Mb2dPYmplY3QyID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkxvZycsCiAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiAnRW1haWwnLAogICAgICAgIERpcmVjdGlvbiA9PiAnSW5jb21pbmcnLAogICAgfSwKKTsKJENvbW11bmljYXRpb25Mb2dPYmplY3QyLT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScgKTsKCiRQb3N0TWFzdGVyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXItPm5ldygKICAgICV7JFNlbGZ9LAogICAgRW1haWwgICAgICAgICAgICAgICAgICA9PiAkRmlsZUFycmF5LAogICAgQ29tbXVuaWNhdGlvbkxvZ09iamVjdCA9PiAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdDIsCik7CgpAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1bigpOwokU2VsZi0+SXMoCiAgICAkUmV0dXJuWzBdIHx8IDAsCiAgICAyLAogICAgIlJ1bigpIC0gTmV3VGlja2V0IiwKKTsKJFNlbGYtPlRydWUoCiAgICAkUmV0dXJuWzFdID09ICRUaWNrZXR7VGlja2V0SUR9LAogICAgIlJ1bigpIC0gTmV3VGlja2V0L1RpY2tldElEIiwKKTsKCiRDb21tdW5pY2F0aW9uTG9nT2JqZWN0Mi0+T2JqZWN0TG9nU3RvcCgKICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgU3RhdHVzICAgICAgICA9PiAnU3VjY2Vzc2Z1bCcsCik7CiRDb21tdW5pY2F0aW9uTG9nT2JqZWN0Mi0+Q29tbXVuaWNhdGlvblN0b3AoCiAgICBTdGF0dXMgPT4gJ1N1Y2Nlc3NmdWwnLAopOwoKIyBnZXQgdGlja2V0IG9iamVjdAokVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwolVGlja2V0ICAgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFJldHVyblsxXSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtTdGF0ZX0sCiAgICAnY2xvc2VkIHN1Y2Nlc3NmdWwnLAogICAgIlJ1bigpIC0gVGlja2V0IFN0YXRlIiwKKTsKCiMgZGVsZXRlIHRpY2tldApteSAkRGVsZXRlID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgVGlja2V0SUQgPT4gJFJldHVyblsxXSwKICAgIFVzZXJJRCAgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJERlbGV0ZSB8fCAwLAogICAgIlRpY2tldERlbGV0ZSgpIiwKKTsKCiMgcmV2ZXJ0IGNoYW5nZXMgdG8gZHluYW1pYyBmaWVsZHMKZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRVcGRhdGUpIHsKICAgIG15ICRTdWNjZXNzVXBkYXRlID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgJXskRHluYW1pY0ZpZWxkfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2Vzc1VwZGF0ZSwKICAgICAgICAiUmV2ZXJ0ZWQgY2hhbmdlcyBvbiBWYWxpZElEIGZvciAkRHluYW1pY0ZpZWxkLT57TmFtZX0gZmllbGQuIiwKICAgICk7Cn0KCmZvciBteSAkRHluYW1pY0ZpZWxkSUQgKEBEeW5hbWljZmllbGRJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgZHluYW1pYyBmaWVsZAogICAgbXkgJEZpZWxkRGVsZXRlID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZpZWxkRGVsZXRlLAogICAgICAgICJEZWxldGVkIGR5bmFtaWMgZmllbGQgd2l0aCBpZCAkRHluYW1pY0ZpZWxkSUQuIiwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgolQ29uZmlnID0gKAogICAgU2VhcmNoID0+IHsKCiAgICAgICAgIyB0aWNrZXRzIGNyZWF0ZWQgaW4gdGhlIGxhc3QgMTIwIG1pbnV0ZXMKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgfSwKCiAgICAjIERlY2xhcmF0aW9uIG9mIHRocmVzaG9sZHMKICAgICMgbWluX3dhcm5fdHJlc2hvbGQgPiBOdW1iZXIgb2YgdGlja2V0cyAtPiBXQVJOSU5HCiAgICAjIG1heF93YXJuX3RyZXNob2xkIDwgTnVtYmVyIG9mIHRpY2tldHMgLT4gV0FSTklORwogICAgIyBtaW5fY3JpdF90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IEFMQVJNCiAgICAjIG1heF93YXJuX3RyZXNob2xkIDwgTnVtYmVyIG9mIHRpY2tldHMgLT4gQUxBUk0KCiAgICBtaW5fd2Fybl90cmVzaG9sZCA9PiAwLAogICAgbWF4X3dhcm5fdHJlc2hvbGQgPT4gMTAsCiAgICBtaW5fY3JpdF90cmVzaG9sZCA9PiAwLAogICAgbWF4X2NyaXRfdHJlc2hvbGQgPT4gMjAsCgogICAgIyBJbmZvcm1hdGlvbiB1c2VkIGJ5IE5hZ2lvcwogICAgIyBOYW1lIG9mIGNoZWNrIHNob3duIGluIE5hZ2lvcyBTdGF0dXMgSW5mb3JtYXRpb24KICAgIGNoZWNrbmFtZSA9PiAnT1RSUyBDaGVja2VyJywKCiAgICAjIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGV2ZXJ5dGhpbmcgaXMgT0sKICAgIE9LX1RYVCA9PiAnZW5qb3kgICB0aWNrZXRzOicsCgogICAgIyBUZXh0IHNob3duIGluIFN0YXR1cyBJbmZvcm1hdGlvbiBpZiB3YXJuaW5nIHRocmVzaG9sZCByZWFjaGVkCiAgICBXQVJOX1RYVCA9PiAnbnVtYmVyIG9mIHRpY2tldHM6JywKCiAgICAjIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGNyaXRpY2FsIHRocmVzaG9sZCByZWFjaGVkCiAgICBDUklUX1RYVCA9PiAnY3JpdGljYWwgbnVtYmVyIG9mIHRpY2tldHM6JywKCik7Cg==
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFBST0JMRU0gYWxlcnQgMSAtIGRlbHBoaW4gaG9zdCBpcyBET1dOICoqCk1lc3NhZ2UtSWQ6IDwyMDA3MDMxNzIzMTU0Ni4wREZENTVEQzAwRkBoNTM3OTUuZXhhbXBsZS5jb20+CkRhdGU6IFN1biwgMTggTWFyIDIwMDcgMDA6MTU6NDYgKzAxMDAgKENFVCkKRnJvbTogbmFnaW9zQGV4YW1wbGUuY29tCk1pbWUtVmVyc2lvbjogMS4wCgoqKioqKiBOYWdpb3MgICoqKioqCgpOb3RpZmljYXRpb24gVHlwZTogUFJPQkxFTQpIb3N0OiBkZWxwaGluClN0YXRlOiBET1dOIGZvciAwZCAwaCAwbSAwcwpBZGRyZXNzOiAxMjcuMS4xLjEKSW5mbzoKCkNSSVRJQ0FMIC0gVGltZSB0byBsaXZlIGV4Y2VlZGVkICgxMjcuMS4xLjEpCgpEYXRlL1RpbWU6IFN1biBNYXIgMTggMDA6MTg6MzAgQ0VUIDIwMDcKCkFDSyBieTogCkNvbW1lbnQ6CiAKCgo=
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFJFQ09WRVJZIGFsZXJ0IDIgLSBkZWxwaGluIGhvc3QgaXMgVVAgKioKTWVzc2FnZS1JZDogPDIwMDcwMzE3MjMxOTQ2LjBERkQ1NURDMDBGQGg1Mzc5NS5leGFtcGxlLmNvbT4KRGF0ZTogU3VuLCAxOCBNYXIgMjAwNyAwMDoxOTo0NiArMDEwMCAoQ0VUKQpGcm9tOiBuYWdpb3NAZXhhbXBsZS5jb20KTWltZS1WZXJzaW9uOiAxLjAKCioqKioqIE5hZ2lvcyAgKioqKioKCk5vdGlmaWNhdGlvbiBUeXBlOiBSRUNPVkVSWQpIb3N0OiBkZWxwaGluClN0YXRlOiBVUCBmb3IgMGQgMGggMG0gMHMKQWRkcmVzczogMTcyLjEuMS4xCkluZm86CgpQSU5HIE9LIC0gUGFja2V0IGxvc3MgPSAwJSwgUlRBID0gMTUuMDkgbXMKCkRhdGUvVGltZTogU3VuIE1hciAxOCAwMDoxOTo0NiBDRVQgMjAwNwoKQUNLIGJ5OiAKQ29tbWVudDogCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpTeXN0ZW1Nb25pdG9yaW5nOwojIyBubyBjcml0aWMoUGVybDo6Q3JpdGljOjpQb2xpY3k6Ok9UUlM6OlJlcXVpcmVDYW1lbENhc2UpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKdmFyOjpwYWNrYWdlc2V0dXA6OlN5c3RlbU1vbml0b3JpbmcgLSBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6U3lzdGVtTW9uaXRvcmluZycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIEZvcmNlIGEgcmVsb2FkIG9mIFpaWkF1dG8ucG0gYW5kIFpaWkFBdXRvLnBtIHRvIGdldCB0aGUgZnJlc2ggY29uZmlndXJhdGlvbiB2YWx1ZXMuCiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAlSU5DICkgewogICAgICAgIGlmICggJE1vZHVsZSA9fiBtL1paWkFBP3V0b1wucG0kLyApIHsKICAgICAgICAgICAgZGVsZXRlICRJTkN7JE1vZHVsZX07CiAgICAgICAgfQogICAgfQoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICAjIGRlZmluZSBmaWxlIHByZWZpeAogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdTeXN0ZW1Nb25pdG9yaW5nJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0NyZWF0ZUR5bmFtaWNGaWVsZHMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVQcmUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcHJlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlUHJlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIGNvbmZpZyBvcHRpb24gZXhpc3RzCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUnKTsKCiAgICAjIHVwZGF0ZS9yZW5hbWUgY29uZmlnIG9wdGlvbgogICAgaWYgKCAkQ29uZmlnICYmICRDb25maWctPnsnMDAwMS1TeXN0ZW1Nb25pdG9yaW5nJ30gKSB7CgogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpLT5TZXR0aW5nc1NldCgKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudHMgPT4gJ0RlcGxveW1lbnQgZnJvbSBDb2RlVXBncmFkZVByZSBpbiB2YXIvcGFja2FnZXNldHVwL1N5c3RlbU1vbml0b3JpbmcucG0nLAogICAgICAgICAgICBTZXR0aW5ncyA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1Bvc3RNYXN0ZXI6OlByZUZpbHRlck1vZHVsZSMjIzAwLVN5c3RlbU1vbml0b3JpbmcnLAogICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRDb25maWctPnsnMDAwMS1TeXN0ZW1Nb25pdG9yaW5nJ30sCiAgICAgICAgICAgICAgICAgICAgSXNWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzJfMl85MigpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gMi4yLjkyLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fMl8yXzkyKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzJfMl85MiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIFN5c3RlbU1vbml0b3JpbmcKICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgY2xlYW4gdXAgdGhlIG1pZ3JhdGVkIGZyZWV0ZXh0IGFuZCBmcmVldGltZSBmaWVsZHMKICAgICMgZS5nLiBkZWxldGUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgZmllbGRzIHRoYXQgdXNlIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmV3IChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIGdldCBleGlzdGluZyBkeW5hbWljIGZpZWxkIGRhdGEKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2xkID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+ICREeW5hbWljRmllbGROZXctPntOYW1lfSApOwoKICAgICAgICBpZiAoICFkZWZpbmVkICREeW5hbWljRmllbGRPbGQtPntJRH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgb2xkIEZpZWxkIGRvZXMgbm90IGV4aXN0ICREeW5hbWljRmllbGROZXctPntOYW1lfSwgc2tpcHBpbmcuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICBJRCAgICAgICAgID0+ICREeW5hbWljRmllbGRPbGQtPntJRH0sCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZE9sZC0+e0ZpZWxkT3JkZXJ9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREeW5hbWljRmllbGROZXctPntOYW1lfSwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57TGFiZWx9LAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICREeW5hbWljRmllbGROZXctPntGaWVsZFR5cGV9LAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGROZXctPntPYmplY3RUeXBlfSwKICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57Q29uZmlnfSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NyZWF0ZUR5bmFtaWNGaWVsZHMoKQoKY3JlYXRlcyBhbGwgZHluYW1pYyBmaWVsZHMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciBTeXN0ZW1Nb25pdG9yaW5nCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQ3JlYXRlRHluYW1pY0ZpZWxkcygpOwoKPWN1dAoKc3ViIF9DcmVhdGVEeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgIyBnZXQgYWxsIGN1cnJlbnQgZHluYW1pYyBmaWVsZHMKICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBvcmRlciBudW1iZXJzIChpcyBhbHJlYWR5IHNvcnRlZCkuCiAgICBteSBARHluYW1pY2ZpZWxkT3JkZXJMaXN0OwogICAgZm9yIG15ICREeW5hbWljZmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRPcmRlckxpc3QsICREeW5hbWljZmllbGQtPntGaWVsZE9yZGVyfTsKICAgIH0KCiAgICAjIGdldCB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIG9yZGVyIGxpc3QgYW5kIGFkZCAxCiAgICBteSAkTmV4dE9yZGVyTnVtYmVyID0gMTsKICAgIGlmIChARHluYW1pY2ZpZWxkT3JkZXJMaXN0KSB7CiAgICAgICAgJE5leHRPcmRlck51bWJlciA9ICREeW5hbWljZmllbGRPcmRlckxpc3RbLTFdICsgMTsKICAgIH0KCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgYWxsIGR5bmFtaWMgZmllbGRzIGZvcgogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgIyBjcmVhdGUgZHluYW1pYyBmaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgICAgIG15ICRPbGREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCgkT2xkRHluYW1pY0ZpZWxkKSApIHsKICAgICAgICAgICAgaWYgKCBleGlzdHMoICRPbGREeW5hbWljRmllbGQtPntMYWJlbH0gKSApIHsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAoICRPbGREeW5hbWljRmllbGQtPntMYWJlbH0gZXEgJER5bmFtaWNGaWVsZC0+e0xhYmVsfSApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGaWVsZCBhbHJlYWR5IGV4aXN0cyBMYWJlbDokRHluYW1pY0ZpZWxkLT57TGFiZWx9LCBza2lwcGluZy4iCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsgICAgIyBza2lwIHRoZSByZWNvcmQsIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYWxyZWFkeQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICREeW5hbWljRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJE5leHRPcmRlck51bWJlciwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0NvbmZpZ30sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRmllbGRJRDsKCiAgICAgICAgIyBpbmNyZWFzZSB0aGUgb3JkZXIgbnVtYmVyCiAgICAgICAgJE5leHRPcmRlck51bWJlcisrOwoKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCkKCnJldHVybnMgdGhlIGRlZmluaXRpb24gZm9yIFN5c3RlbSBNb25pdG9yaW5nIHJlbGF0ZWQgZHluYW1pYyBmaWVsZHMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9HZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKPWN1dAoKc3ViIF9HZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBBbGxOZXdGaWVsZHMgPSAoKTsgICAgIyB0aGUgZmllbGRzIHRoYXQgYXJlIGZpbGxlZCBvdXQKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdAogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcnVuIGFsbCBQcmVGaWx0ZXJNb2R1bGVzIChtb2RpZnkgZW1haWwgcGFyYW1zKQogICAgZm9yIG15ICRLZXkgKCdQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUnKSB7CiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCRLZXkpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJEtleSkgfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntNb2R1bGV9IG5lICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEpPQjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBATmV3RmllbGRzOwoKICAgICAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICRKb2JzeyRKb2J9LT57TW9kdWxlfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb21tdW5jYXRpb25Mb2dSZXF1aXJlZCA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRGaWx0ZXJPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IGNyZWF0ZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gb2JqZWN0ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEpPQjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkUnVuID0gJEZpbHRlck9iamVjdC0+R2V0RHluYW1pY0ZpZWxkc0RlZmluaXRpb24oCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgID0+ICRKb2JzeyRKb2J9LCAgICAjIHRoZSBqb2IgY29uZmlnCiAgICAgICAgICAgICAgICAgICAgTmV3RmllbGRzID0+IFxATmV3RmllbGRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFJ1biApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGUgR2V0RHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKSBvZiAkS2V5ICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBBbGxOZXdGaWVsZHMsIChATmV3RmllbGRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQEFsbE5ld0ZpZWxkczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==