ITSMIncidentProblemManagement
5.0.35
OTRS AG
https://otrs.com/
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
Build for OTRS::ITSM 5 patch level 35.
Build for OTRS::ITSM 5 patch level 34.
Build for OTRS::ITSM 5 patch level 33.
Build for OTRS::ITSM 5 patch level 32.
Build for OTRS::ITSM 5 patch level 31.
Build for OTRS::ITSM 5 patch level 30.
Build for OTRS::ITSM 5 patch level 29.
Build for OTRS::ITSM 5 patch level 28.
Build for OTRS::ITSM 5 patch level 27.
Build for OTRS::ITSM 5 patch level 26.
Build for OTRS::ITSM 5 patch level 25.
Build for OTRS::ITSM 5 patch level 24.
Build for OTRS::ITSM 5 patch level 23.
Build for OTRS::ITSM 5 patch level 22.
Build for OTRS::ITSM 5 patch level 21.
Build for OTRS::ITSM 5 patch level 20.
Build for OTRS::ITSM 5 patch level 19.
Build for OTRS::ITSM 5 patch level 18.
Build for OTRS::ITSM 5 patch level 17.
Build for OTRS::ITSM 5 patch level 16.
Build for OTRS::ITSM 5 patch level 15.
Build for OTRS::ITSM 5 patch level 14.
Build for OTRS::ITSM 5 patch level 13.
Build for OTRS::ITSM 5 patch level 12.
Build for OTRS::ITSM 5 patch level 11.
Build for OTRS::ITSM 5 patch level 10.
Build for OTRS::ITSM 5 patch level 9.
Build for OTRS::ITSM 5 patch level 8.
Build for OTRS::ITSM 5 patch level 7.
Build for OTRS::ITSM 5 patch level 6.
Build for OTRS::ITSM 5 patch level 5.
Build for OTRS::ITSM 5 patch level 4.
Build for OTRS::ITSM 5 patch level 3.
Build for OTRS::ITSM 5 patch level 2.
Build for OTRS::ITSM 5.
Build for OTRS::ITSM 5 rc1.
Build for OTRS::ITSM 5 beta3.
Build for OTRS::ITSM 5 beta2.
Build for OTRS::ITSM 5 beta1.
The OTRS::ITSM Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
Paquete Incident and Problem Management de OTRS::ITSM.
Az OTRS::ITSM incidens- és problémamenedzsment csomag.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de instalar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMIncidentProblemManagement OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, the ticket types and states that were added during installation will be deactivated.
They can be activated again in the admin area.
<br/>
<br/>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Ticket-Typen und -Status deaktiviert.
Diese können jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Si usted desinstala este paquete, los tipos de ticket y estados que fueron agregados durante la instalación serán desactivados.
Pueden ser activados de nuevo en el área de admin.
<br/>
<br/>
Las estadísticas asociadas a este paquete no estarán disponibles si desinstala el paquete.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során hozzáadott jegytípusok és állapotok ki lesznek kapcsolva.
Ezek az adminisztrációs területen kapcsolhatók be ismét.
<br/>
<br/>
Az ehhez a csomaghoz hozzárendelt statisztikák többé nem lesznek elérhetők, ha a csomagot eltávolítják.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de actualizar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMIncidentProblemManagement OTRS csomag frissítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 5.0.35</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
ITSMCore
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# uninstall Feature AddOn OTRSServiceIncidentState that has been integrated in OTRS::ITSM 3.2.91 (OTRS::ITSM 5.0.35 Beta 1)
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSServiceIncidentState',
);
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_3_2_91();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_4_0_2();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
{
# cleanup stats list
$Kernel::OM->Get('Kernel::System::Stats')->StatsCleanUp(
UserID => 1,
);
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2019-04-09 15:08:37
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkFkZGl0aW9uYWwgSVRTTSBGaWVsZHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGlja2V0PC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LlRpY2tldEFjdGlvbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpY2tldERlY2lzaW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgZGVjaXNpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkRlY2lzaW9uPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzE1LUFkZHRsSVRTTUZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM0MjAtRGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkFkZCBhIGRlY2lzaW9uITwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudFRpY2tldERlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRUaWNrZXREZWNpc2lvbjtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBvcHVwVHlwZSI+VGlja2V0QWN0aW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUmVxdWlyZWRMb2NrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzbid0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU2VydmljZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHNlcnZpY2UgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU0xBTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgU0xBIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNRdWV1ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBxdWV1ZSBpbiB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNPd25lciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNPd25lck1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHRpY2tldCBvd25lciBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNSZXNwb25zaWJsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmNsb3NlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcmVtaW5kZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5vcGVuPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI05vdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI05vdGVNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBub3RlIG11c3QgYmUgZmlsbGVkIGluIGJ5IHRoZSBhZ2VudC4gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IFRpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N1YmplY3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlslIFRyYW5zbGF0ZSgiTm90ZSIpIHwgaHRtbCAlXTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFRleHRBcmVhPjwvVGV4dEFyZWE+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0ludm9sdmVkQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0luZm9ybUFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVUeXBlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ub3RlLWludGVybmFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVUeXBlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWludGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWV4dGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLXJlcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVjb3ZlcnlTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkFkZE5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSGlzdG9yeUNvbW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+JSVGcmVlVGV4dDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVxdWlyZWRMb2NrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1RpY2tldFR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU2VydmljZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHNlcnZpY2UgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU0xBTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgU0xBIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNRdWV1ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBxdWV1ZSBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI093bmVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjT3duZXJNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiB0aWNrZXQgb3duZXIgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPm9wZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5vcGVuPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI05vdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjTm90ZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIG5vdGUgbXVzdCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFnZW50LiBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3ViamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5bJSBUcmFuc2xhdGUoIkRlY2lzaW9uIikgfCBodG1sICVdPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0JvZHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT5bJSBUcmFuc2xhdGUoIlJlYXNvbiIpIHwgaHRtbCAlXTo8L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0luZm9ybUFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZVR5cGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjMgbm9ybWFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1RpdGxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25SZXN1bHQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvbkRhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSGlzdG9yeVR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5BZGROb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlDb21tZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+JSVOb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRFbWFpbCMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RW1haWxOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Q2xvc2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGcmVlVGV4dCMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXROb3RlIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdOb3RlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0T3duZXIjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld093bmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGVuZGluZyMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGVuZGluZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW9yaXR5IyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFJlc3BvbnNpYmxlIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdSZXNwb25zaWJsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBQ0xLZXlzTGV2ZWwzOjpBY3Rpb25zIyMjMTAwLURlZmF1bHQtSVRTTSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHdoaWNoIGl0ZW1zIGFyZSBhdmFpbGFibGUgZm9yICdBY3Rpb24nIGluIHRoaXJkIGxldmVsIG9mIHRoZSBBQ0wgc3RydWN0dXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEFDTDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BZ2VudFRpY2tldERlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6VHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmUjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBwaG9uZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1Bob25lTmV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01JbXBhY3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRFbWFpbCMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IGVtYWlsIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RW1haWxOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUR1ZURhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlYXJjaCMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJldmlld1JlcXVpcmVkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25SZXN1bHQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXBhaXJTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZWNvdmVyeVN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTURlY2lzaW9uRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUR1ZURhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFpvb20jIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1pvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUNyaXRpY2FsaXR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmV2aWV3UmVxdWlyZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlcGFpclN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlY292ZXJ5U3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01JbXBhY3QiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENsb3NlIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgY2xvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdDbG9zZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmV2aWV3UmVxdWlyZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBjb21wb3NlIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Q29tcG9zZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmV2aWV3UmVxdWlyZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW9yaXR5IyMjVGlja2V0VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW9yaXR5IyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9Cf0YDQvtC80LXQvdC4IElUU00g0L/QvtC70LXRgtCw0YLQsCDQvdCwINCx0LjQu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAn0JrRgNC40YLQuNGH0L3QvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0JLQu9C40Y/QvdC40LUnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9CY0LfQuNGB0LrQstCwINC/0YDQtdCz0LvQtdC20LTQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GC0LDRgiDQvtGCINGA0LXRiNC10L3QuNC10YLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn0JLRgNC10LzQtSDQvdCwINGB0YLQsNGA0YLQuNGA0LDQvdC1INC90LAg0YDQtdC80L7QvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ9CS0YDQtdC80LUg0L3QsCDRgdGC0LDRgNGC0LjRgNCw0L3QtSDQvdCwINCy0YrQt9GB0YLQsNC90L7QstGP0LLQsNC90LXRgtC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfQlNCw0YLQsCDQt9CwINGA0LXRiNCw0LLQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfQmtGA0LDQudC90LAg0LTQsNGC0LAnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfQv9GA0LjQutC70Y7Rh9C10L0g0YEg0L7QsdGF0L7QtNC90L4g0YDQtdGI0LXQvdC40LUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9CU0L7Qv9GK0LvQvdC40YLQtdC70L3QuCBJVFNNINC/0L7Qu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn0KDQtdGI0LXQvdC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ptxJtuYSBJVFNNIHBvbMOtIHYgdGlrZXR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0acSNbm9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdWbGl2JzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdWecW+YWR1amUgUMWZZWhsZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnVsO9c2xlZGVrIMWYZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnxIxhcyB6YWjDoWplbsOtIG9wcmF2eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnxIxhcyB6YWjDoWplbsOtIG9ibm92ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0dW0gxZhlxaFlbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAndXphdsWZZW5vIGRvxI1hc27DvW0gxZllxaFlbsOtbSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0RvcGzFiHRlIMWZZcWhZW7DrSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvcGzFiGtvdsOhIElUU00gcG9sZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnWm3Em8WIdGUgSVRNUyBwb2xlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ8WYZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1JldCBzYWdlbnMgSVRTTSBmZWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdQw6V2aXJrbmluZyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnQW5tZWxkZWxzZSBrcsOmdmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0Jlc2x1dG5pbmdzcmVzdWx0YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1N0YXJ0dGlkIGZvciByZXBlcmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgZ2VuZXRhYmxlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRm9yZmFsZHNkYXRvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnTHVra2V0IG1lZCB3b3JrYXJvdW5kJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnVGlsZsO4aiBlbiBiZXNsdXRuaW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnWWRlcmxpZ2UgSVRTTSBmZWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ1JldCBJVFNNIGZlbHRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdCZXNsdXRuaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdEaWUgRW50c2NoZWlkdW5nIGRlcyBUaWNrZXRzIMOkbmRlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ8OEbmRlcm4gZGVyIElUU00gRmVsZGVyIGRlcyBUaWNrZXRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdTZXJ2aWNlIFZvcmZhbGxzc3RhdHVzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1RpY2tldCB2ZXJrbsO8cGZlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3JpdGlrYWxpdMOkdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdBdXN3aXJrdW5nJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdOYWNoYmVhcmJlaXR1bmcgZXJmb3JkZXJsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ0dlbmVobWlndCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnUmVwYXJhdHVyIFN0YXJ0emVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnV2llZGVyaGVyc3RlbGx1bmcgU3RhcnR6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdFbnRzY2hlaWR1bmdzZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGw6RsbGlna2VpdHNkYXR1bSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ3Byb3Zpc29yaXNjaCBnZXNjaGxvc3Nlbic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0hpbnp1ZsO8Z2VuIGVpbmVyIEVudHNjaGVpZHVuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ1p1c8OkdHpsaWNoZSBJVFNNIEZlbGRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdadXPDpHR6bGljaGUgSVRTTSBUaWNrZXRmZWxkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VybGF1YnQgZGFzIEhpbnp1ZsO8Z2VuIHZvbiBOb3RpemVuIGluIGRlciB6dXPDpHR6bGljaGVuIElUU00tT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRXJsYXVidCBkYXMgSGluenVmw7xnZW4gdm9uIE5vdGl6ZW4gaW0gRW50c2NoZWlkdW5ncy1CaWxkc2NoaXJtIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ8OEbmRlcm4gZGVyIElUU00tRmVsZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnQmVzdGltbXQsIG9iIGRpZXNlciBTY3JlZW4gaW0gQWdlbnRlbi1JbnRlcmZhY2UgZGFzIFNwZXJyZW4gZGVzIFRpY2tldHMgdm9yYXVzc2V0enQuIERhcyBUaWNrZXQgd2lyZCAoZmFsbHMgbsO2dGlnKSBnZXNwZXJydCB1bmQgZGVyIGFrdHVlbGxlIEFnZW50IHdpcmQgYWxzIEJlc2l0emVyIGdlc2V0enQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0Jlc3RpbW10LCBvYiBkaWVzZXIgU2NyZWVuIGltIEFnZW50ZW4tSW50ZXJmYWNlIGRhcyBTcGVycmVuIGRlcyBUaWNrZXRzIHZvcmF1c3NldHp0LiBEYXMgVGlja2V0IHdpcmQgKGZhbGxzIG7DtnRpZykgZ2VzcGVycnQgdW5kIGRlciBha3R1ZWxsZSBBZ2VudCB3aXJkIGFscyBCZXNpdHplciBnZXNldHp0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlc3RpbW10LCBvYiBkZXIgU2VydmljZSBJbmNpZGVudCBTdGF0dXMgd8OkaHJlbmQgZGVyIFNlcnZpY2UtQXVzd2FobCBpbSBBZ2VudGVuLUludGVyZmFjZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkZW4gU3RhbmRhcmQtSW5oYWx0IGVpbmVyIE5vdGl6IGluIGRlciB6dXPDpHR6bGljaGUgSVRTTSBGZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRlbiBTdGFuZGFyZC1JbmhhbHQgZWluZXIgTm90aXogaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmVzdGltbXQgZGVuIEZvbGdlc3RhdHVzIGbDvHIgVGlja2V0cywgZsO8ciBkaWUgw7xiZXIgZGllIHp1c8OkdHpsaWNoZW4gSVRTTSBGZWxkZXIgaW0gQWdlbnRlbi1JbnRlcmZhY2UgZWluZSBOb3RpeiBoaW56dWdlZsO8Z3Qgd3VyZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZXN0aW1tdCBkZW4gRm9sZ2VzdGF0dXMgZsO8ciBUaWNrZXRzLCBmw7xyIGRpZSBpbiBkZXIgRW50c2NoZWlkdW5zLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlIGVpbmUgTm90aXogaGluenVnZWbDvGd0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkLUJldHJlZmYgZWluZXIgTm90aXogaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNIEZlbGRlci1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkLUJldHJlZmYgZWluZXIgTm90aXogaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIFN0YW5kYXJkLVByaW9yaXTDpHQgaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNIEZlbGRlci1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBTdGFuZGFyZC1Qcmlvcml0w6R0IGluIGRlciBFbnRzY2hlaWR1bmdzLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkZW4gU3RhbmRhcmQtVHlwIGVpbmVyIE5vdGl6IGluIGRlciB6dXPDpHR6bGljaGUgSVRTTSBGZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkLVR5cCBlaW5lciBOb3RpeiBpbiBkZXIgRW50c2NoZWlkdW5ncy1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdTdGV1ZXJ0IGRlbiBIaXN0b3JpZW4tS29tbWVudGFyIGbDvHIgZGllIEFrdGlvbmVuIGluIGRlciBPYmVyZmzDpGNoZSB6dXPDpHR6bGljaGUgSVRTTS1GZWxkZXIgaW0gQWdlbnRlbmJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdTdGV1ZXJ0IGRlbiBIaXN0b3JpZW4tS29tbWVudGFyIGbDvHIgZGllIEVudHNjaGVpZHVuZ3MtQWt0aW9uIGltIEFnZW50ZW5iZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXR6dCBkZW4gU2VydmljZSBpbiBkZXIgenVzw6R0emxpY2hlIElUU00tRmVsZGVyLU9iZXJmbMOkY2hlIGbDvHIgVGlja2V0cyBpbSBBZ2VudGVuYmVyZWljaCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXZpZXJ0IHNlaW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXR6dCBkZW4gU2VydmljZSBpbiBkZXIgRW50c2NoZWlkdW5ncy1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2ggKFRpY2tldDo6U2VydmljZSBtdXNzIGFrdGl2aWVydCBzZWluKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXR6dCBkZW4gVGlja2V0LUJlc2l0emVyIGluIGRlciB6dXPDpHR6bGljaGUgSVRTTSBGZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXR6dCBkZW4gQmVzaXR6ZXIgaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldHp0IGRlbiBUaWNrZXQtVmVyYW50d29ydGxpY2hlbiBpbiBkZXIgenVzw6R0emxpY2hlIElUU00gRmVsZGVyLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0enQgZGVuIFRpY2tldC1WZXJhbnR3b3J0bGljaGVuIGluIGRlciBFbnRzY2hlaWR1bmdzLU9iZXJmbMOkY2hlIGbDvHIgVGlja2V0cyBpbSBBZ2VudGVuYmVyZWljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXR6dCBkZW4gVGlja2V0LVR5cCBpbiBkZXIgenVzw6R0emxpY2hlIElUU00tRmVsZGVyLU9iZXJmbMOkY2hlIGbDvHIgVGlja2V0cyBpbSBBZ2VudGVuYmVyZWljaCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXZpZXJ0IHNlaW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0enQgZGVuIFRpY2tldC1UeXAgaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoIChUaWNrZXQ6OlR5cGUgbXVzcyBha3RpdmllcnQgc2VpbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGluIGRlciBBZ2VudGVuLU9iZXJmbMOkY2hlIGltVGlja2V0LU1lbsO8IGVpbmVuIExpbmsgYW4gdW0gZGllIEVudHNjaGVpZHVuZyBhbiBlaW5lbSBUaWNrZXQgenUgw6RuZGVybic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGVpbmVuIExpbmsgaW4gZGVyIE1lbnUtTGVpc3RlIGluIGRlciBab29tLUFuc2ljaHQgaW0gQWdlbnRlbi1JbnRlcmZhY2UgYW4sIGRlciBlcyBlcm3DtmdsaWNodCBkaWUgenVzw6R0emxpY2hlbiBJVFNNLUZlbGRlciB6dSBiZWFyYmVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBpbiBkZXIgT2JlcmZsw6RjaGUgenVzw6R0emxpY2hlIElUU00tRmVsZGVyIGRlciBBZ2VudGVuLU9iZXJmbMOkY2hlIGVpbmUgTGlzdGUgYWxsZXIgYW0gVGlja2V0IGJldGVpbGlndGVuIEFnZW50ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyIE9iZXJmbMOkY2hlIEVudHNjaGVpZHVuZyBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBlaW5lIExpc3RlIGFsbGVyIGFtIFRpY2tldCBiZXRlaWxpZ3RlbiBBZ2VudGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgZGllIFRpY2tldC1Qcmlvcml0w6R0IGluIGRlciB6dXPDpHR6bGljaGUgSVRTTS1GZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBkaWUgVGlja2V0LVByaW9yaXTDpHQgaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGRlbiBUaWNrZXQtVGl0ZWwgaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNLUZlbGRlci1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgZGVuIFRpY2tldC1UaXRlbCBpbiBkZXIgRW50c2NoZWlkdW5ncy1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdDYW1iaWFyIERlY2lzacOzbiBkZWwgVGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdNb2RpZmljYXIgY2FtcG9zIElUU00gZGVsIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkZWwgU2VydmljaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnVmluY3VsYXIgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdVcmdlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3RvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpc2nDs24gUmVxdWVyaWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFkbyBkZSBEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHJvYmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICdQb3NwdWVzdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnUHJlLWFwcm9iYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnUmVjaGF6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnRmVjaGEgSW5pY2lhbCBkZSBSZXBhcmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnRmVjaGEgSW5pY2lhbCBkZSBSZWN1cGVyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdGZWNoYSBkZSBEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGZWNoYSBkZSB2ZW5jaW1pZW50byc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0NlcnJhZG8gY29uIHNvbHVjacOzbiBwcm92aXNpb25hbCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ8KhQWdyZWd1ZSB1bmEgZGVjaXNpw7NuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIElUU00gQWRpY2lvbmFsZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnQ2FtcG9zIGFkaWNpb25hbGVzIGRlbCB0aWNrZXQgZW4gSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFncmVnYXIgbm90YXMgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdNb2RpZmljYXIgbG9zIGNhbXBvcyBJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZXRlcm1pbmEgc2kgZXMgbmVjZXNhcmlvIHF1ZSBlbCB0aWNrZXQgZXN0w6kgYmxvcXVlYWRvIHBhcmEgYWNjZWRlciBhIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoc2kgZWwgdGlja2V0IG5vIGVzdMOhIGJsb3F1ZWFkbyBhw7puLCBzZSBibG9xdWVhIHkgZWwgYWdlbnRlIGFjdHVhbCBzZSBjb252ZXJ0aXLDoSBhdXRvbcOhdGljYW1lbnRlIGVuIHN1IHByb3BpZXRhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGV0ZXJtaW5hIHNpIGVzIG5lY2VzYXJpbyBxdWUgZWwgdGlja2V0IGVzdMOpIGJsb3F1ZWFkbyBwYXJhIGFjY2VkZXIgYSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChzaSBlbCB0aWNrZXQgbm8gZXN0w6EgYmxvcXVlYWRvIGHDum4sIHNlIGJsb3F1ZWEgeSBlbCBhZ2VudGUgYWN0dWFsIHNlIGNvbnZlcnRpcsOhIGF1dG9tw6F0aWNhbWVudGUgZW4gc3UgcHJvcGlldGFyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBzaSBlbCBlc3RhZG8gZGUgbGEgaW5jaWRlbmNpYSBlbiBlbCBzZXJ2aWNpbyBkZWJlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGxhIHNlbGVjY2nDs24gZGVsIHNlcnZpY2lvIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQgcG9yIGRlZmF1bHQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0IHBvciBkZWZhdWx0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBhc3VudG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgYXN1bnRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbGEgcHJpb3JpZGFkIGRlZmF1bHQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIGVsIGNvbWVudGFyaW8gZGVsIGhpc3RvcmlhbCBwYXJhIGxhIGFjY2nDs24gZGUgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBjb21lbnRhcmlvIGRlbCBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwgcGFyYSBsYSBhY2Npw7NuIGRlIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIG1pc21hIHF1ZSBlcyB1c2FkYSBwb3IgZWwgaGlzdG9yaWFsIGRlbCB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7DoW1pY29zIG1vc3RyYWRvcyBlbiBwYW50YWxsYSBkZSBDYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBlbiBsYSBpbnRlcmZheiBkZSBBZ2VudGUuIENvbmZpZ3VyYWNpw7NuIHBvc2libGU6IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSByZXF1ZXJpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOhbWljb3MgbW9zdHJhZG9zIGVuIHBhbnRhbGxhIGRlIERlc2ljacOzbiBlbiBsYSBpbnRlcmZheiBkZSBBZ2VudGUuIENvbmZpZ3VyYWNpw7NuIHBvc2libGU6IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSByZXF1ZXJpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOhbWljb3MgbW9zdHJhZG9zIGVuIHBhbnRhbGxhIGRlIELDunNxdWVkYSBkZSBUaWNrZXRzIGVuIGxhIGludGVyZmF6IGRlIEFnZW50ZS4gQ29uZmlndXJhY2nDs24gcG9zaWJsZTogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6FtaWNvcyBtb3N0cmFkb3MgZW4gcGFudGFsbGEgZGUgUmVzdW1lbiBkZWwgVGlja2V0IGVuIGxhIGludGVyZmF6IGRlIEFnZW50ZS4gQ29uZmlndXJhY2nDs24gcG9zaWJsZTogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnSGFiaWxpdGEsIGVuIGVsIG3Ds2R1bG8gZGUgZXN0YWTDrXN0aWNhcywgbGEgZ2VuZXJhY2nDs24gZGUgZXN0YWTDrXN0aWNhcyBhY2VyY2EgZGVsIHRhc2EgcHJvbWVkaW8gZGUgc29sdWNpw7NuIGRlIHByaW1lciBuaXZlbCBkZSB0aWNrZXRzIElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnSGFiaWxpdGEsIGVuIGVsIG3Ds2R1bG8gZGUgZXN0YWTDrXN0aWNhcywgbGEgZ2VuZXJhY2nDs24gZGUgZXN0YWTDrXN0aWNhcyBhY2VyY2EgZGVsIHByb21lZGlvIGRlIHNvbHVjacOzbiBkZSB0aWNrZXRzIElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NpIHVuYSBub3RhIGVzIGFncmVnYWRhIHBvciB1biBhZ2VudGUsIGRlZmluZSBlbCBlc3RhZG8gZGUgdW4gdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2kgdW5hIG5vdGEgZXMgYWdyZWdhZGEgcG9yIHVuIGFnZW50ZSwgZGVmaW5lIGVsIGVzdGFkbyBkZSB1biB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24sIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgbmVjZXNhcmlvcyBwYXJhIHVzYXIgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHNlcnZpY2lvIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoVGlja2V0OjpTZXJ2aWNlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHNlcnZpY2lvIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHByb3BpZXRhcmlvIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBwcm9waWV0YXJpbyBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCByZXNwb25zYWJsZSBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcmVzcG9uc2FibGUgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgdGlwbyBkZSB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlR5cGUgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHRpcG8gZGUgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6VHlwZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIG1vZGlmaWNhciBsYSBkZWNpc2nDs24gZGUgdW4gdGlja2V0LCBlbiBlbCBkZXRhbGxlIGRlIGRpY2hvIHRpY2tldCwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBtb2RpZmljYXIgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGVsIGRldGFsbGUgZGVsIHRpY2tldCBjb3JyZXNwb25kaWVudGUsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RhIHVuYSBsaXN0YSBkZSB0b2RvcyBsb3MgYWdlbnRlcyBpbnZvbHVjcmFkb3MgZW4gZXN0ZSB0aWNrZXQsIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgcG9zaWJsZXMgKGFxdWVsbG9zIGNvbiBwZXJtaXNvcyBwYXJhIGFncmVnYXIgbm90YXMgZW4gbGEgZmlsYSBvIHRpY2tldCksIHBhcmEgZGV0ZXJtaW5hciBxdWnDqW4vcXVpw6luZXMgZGViZW4gc2VyIGluZm9ybWFkb3MgYWNlcmNhIGRlIMOpc3RhIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIHBvc2libGVzIChhcXVlbGxvcyBjb24gcGVybWlzb3MgcGFyYSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIGZpbGEgbyB0aWNrZXQpLCBwYXJhIGRldGVybWluYXIgcXVpw6luL3F1acOpbmVzIGRlYmVuIHNlciBpbmZvcm1hZG9zIGFjZXJjYSBkZSDDqXN0YSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbGFzIG9wY2lvbmVzIGRlIHByaW9yaWRhZCBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbGFzIG9wY2lvbmVzIGRlIHByaW9yaWRhZCBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbG9zIGNhbXBvcyBkZWwgdMOtdHVsbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSBsb3MgY2FtcG9zIGRlbCB0w610dWxvIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdEZWNpc2nDs24gZGVsIFRpY2tldC4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0dCX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0xpbmsgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdDcml0aWNhbGl0eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3QnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JldmlldyBSZXF1aXJlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdEZWNpc2lvbiBSZXN1bHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHByb3ZlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnUmVwYWlyIFN0YXJ0IFRpbWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1JlY292ZXJ5IFN0YXJ0IFRpbWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RlY2lzaW9uIERhdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdEdWUgRGF0ZSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGQgYSBkZWNpc2lvbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdDaGFuZ2UgdGhlIElUU00gZmllbGRzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnVGlja2V0IGRlY2lzaW9uLic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfYqti624zbjNixINiq2LXZhduM2YUg2K/Ysdiu2YjYp9iz2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9iq2LrbjNuM2LEg2YHbjNmE2K/Zh9in24wgSVRTTSDYr9ix2K7ZiNin2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ9in2LHYqtio2KfYtyDYr9ix2K7ZiNin2LPYqic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAn2KfZh9mF24zYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICfYp9ir2LEnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9mG24zYp9iyINio2Ycg2KjYp9iy2KjbjNmG24wg2K/Yp9ix2K8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn2YbYqtuM2KzZhyDYqti12YXbjNmFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqti52YXbjNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqNmH2KjZiNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINiq2LXZhduM2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfYqtin2LHbjNiuINin2YbYrNin2YUnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfZhdmI2YLYqtinINio2LPYqtmHINi02K8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfbjNqpINiq2LXZhduM2YUg2KfYttin2YHZhyDaqdmG24zYryEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9mB24zZhNiv2YfYp9uMINin2LbYp9mB2YcgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAn2YHbjNmE2K/Zh9in24wgSVRTTSDYsdinINiq2LrbjNuM2LEg2K/Zh9uM2K8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn2KrYtdmF24zZhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWVyIGxlcyBjaGFtcHMgSVRTTSBkdSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2l0w6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0JzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZ1ZSByZXF1aXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1LDqXN1bHRhdCBkZSBsYSBEw6ljaXNpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHByb3V2w6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0RhdGUgZGUgZMOpYnV0IGRlIHLDqXBhcmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdEYXRlIGRlIGTDqWJ1dCBkZSByZXRvdXIgw6AgbGEgbm9ybWFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0ZSBkZSBkw6ljaXNpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfDiWNow6lhbmNlJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnRmVybcOpIGF2ZWMgY29udG91cm5lbWVudCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0Fqb3V0ZXIgdW5lIGTDqWNpc2lvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2hhbXBzIElUU00gYWRkaXRpb25lbHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ01vZGlmaWV6IGxlcyBjaGFtcHMgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEw6ljaXNpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmdsX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdDYW1iaWFyIGEgZGVjaXNpw7NuIGRvIHTDrWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0NhbWJpZSBvcyBjYW1wb3MgSVRTTSBkbyB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbmNpZGVudGUgZGUgU2Vydml6byc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdWaW5jdWxlIHRpY2tldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnQ3JpdGljaWRhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3RvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdQcmVjaXNhIHJldmlzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSZXN1bHRhZG8gZGEgZGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdIb3JhIGRlIGluaWNpbyBkYSByZXBhcmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnVGVtcG8gZGUgSW5pY2lvIGRlIFJlY3VwZXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGEgZGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkZSB2ZW5jZW1lbnRvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAncGVjaGFkbyBjb24gYXBhw7FvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnRW5nYWRhIHVuaGEgZGVjaXNpw7NuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIElUU00gQWRpY2lvbsOhaXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZW5nYWRpciBub3RhcyBuYSBwYW50YWxsYSBjYW1wbyBhZGljaW9uYWwgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZW5nYWRpciBub3RhcyBuYSBwYW50YWxsYSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdDYW1iaWUgb3MgY2FtcG9zIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmUgc2UgdW4gYmxvcXVlbyBkZSB0aWNrZXQgw6kgcmVxdWlyaWRvIG5hIHBhbnRhbGxhIGRlIGNhbXBvIGFkaWNpb25hbCBJVFNNIGRhIGludGVyZmFjZSBkZSBheGVudGUgKHNlIG8gdGlja2V0IGHDrW5kYSBub24gZXN0w6EgYmxvcXVlYWRvLCBvIHRpY2tldCBibG9xdcOpYXNlIGUgbyBheGVudGUgYWN0dWFsIHZhaSBzZXIgYXV0b21hdGljYW1lbnRlIG8gc2V1IHByb3BpZXRhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVuIGJsb3F1ZW8gZGUgdGlja2V0IMOpIHJlcXVpcmlkbyBuYSBwYW50YWxsYSBkZSBzZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUgKHNlIG8gdGlja2V0IGHDrW5kYSBub24gZXN0w6EgYmxvcXVlYWRvLCBvIHRpY2tldCBibG9xdcOpYXNlIGUgbyBheGVudGUgYWN0dWFsIHZhaSBzZXIgYXV0b21hdGljYW1lbnRlIG8gc2V1IHByb3BpZXRhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgc2UgbyBlc3RhZG8gZGUgaW5jaWRlbnRlIGRlIHNlcnZpem8gZGViZSBzZXIgbW9zdHJhZG8gZHVyYW50ZSBhIHNlbGVjY2nDs24gZGUgc2Vydml6byBuYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb3JwbyBwb3IgZGVmZWN0byBkdW5oYSBub3RhIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gY29ycG8gcG9yIGRlZmVjdG8gZHVuaGEgbm90YSBuYSBwYW50YWxsYSBkZWRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBwb3IgZGVmZWN0byBkdW4gdGlja2V0IGRlc3BvaXMgZGUgZW5nYWRpciB1bmhhIG5vdGEsIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcG9yIGRlZmVjdG8gZHVuIHRpY2tldCBkZXNwb2lzIGRlIGVuZ2FkaXIgdW5oYSBub3RhLCBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGVtYSBwb3IgZGVmZWN0byBkdW5oYSBub3RhIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGVtYSBwb3IgZGVmZWN0byBkdW5oYSBub3RhIG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGEgcHJpb3JpZGFkZSBkbyB0aWNrZXQgcG9yIGRlZmVjdG8gbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGEgcHJpb3JpZGFkZSBkbyB0aWNrZXQgcG9yIGRlZmVjdG8gbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBwb3IgZGVmZWN0byBkdW5oYSBub3RhIG5hIHBhbnRhbGxhIGRlIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIHBvciBkZWZlY3RvIGR1bmhhIG5vdGEgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gaGlzdMOzcmljbyBkb3MgY29tZW50YXJpb3MgcGFyYSBhIGFjY2nDs24gZGEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwsIG8gY2FsIMOpIHVzYWRvIHBhcmEgbyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGhpc3TDs3JpY28gZG9zIGNvbWVudGFyaW9zIHBhcmEgYSBhY2Npw7NuIGRhIHBhbnRhbGxhIGRlIGRlY2lzacOzbiwgbyBjYWwgw6kgdXNhZG8gcGFyYSBvIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGhpc3TDs3JpY28gZG9zIHRpcG9zIHBhcmEgYSBhY2Npw7NuIGRhIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsLCBvIGNhbCDDqSB1c2FkbyBwYXJhIG8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBoaXN0w7NyaWNvIGRvcyB0aXBvcyBwYXJhIGEgYWNjacOzbiBkYSBwYW50YWxsYSBkZSBkZWNpc2nDs24sIG8gY2FsIMOpIHVzYWRvIHBhcmEgbyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gc2VndWludGUgZXN0YWRvIGR1biB0aWNrZXQgZGVzcG9pcyBkZSBlbmdhZGlyIHVuaGEgbm90YSwgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZWd1aW50ZSBlc3RhZG8gZHVuIHRpY2tldCBkZXNwb2lzIGRlIGVuZ2FkaXIgdW5oYSBub3RhLCBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7DoW1pY29zIG1vc3RyYWRvcyBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLiBBeHVzdGVzIHBvc2libGVzOiAwID0gRGVzYWN0aXZhZG8sIDEgPSBBY3RpdmFkbywgMiA9IEFjdGl2YWRvIGUgcmVxdWVyaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6FtaWNvcyBtb3N0cmFkb3MgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuIEF4dXN0ZXMgcG9zaWJsZXM6IDAgPSBEZXNhY3RpdmFkbywgMSA9IEFjdGl2YWRvLCAyID0gQWN0aXZhZG8gZSByZXF1ZXJpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7DoW1pY29zIG1vc3RyYWRvcyBuYSBwYW50YWxsYSBidXNjYSBkZSB0aWNrZXQgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4gQXh1c3RlcyBwb3NpYmxlczogMCA9IERlc2FjdGl2YWRvLCAxID0gQWN0aXZhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6FtaWNvcyBtb3N0cmFkb3MgbmEgcGFudGFsbGEgem9vbSBkZSB0aWNrZXQgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4gQXh1c3RlcyBwb3NpYmxlczogMCA9IERlc2FjdGl2YWRvLCAxID0gQWN0aXZhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdBY3RpdmFyIG3Ds2R1bG8gZXN0YXTDrXN0aWNvIHBhcmEgeGVyYXIgZXN0YXTDrXN0aWNhcyBzb2JyZSBhIG1lZGlhIGRhIHRheGEgZGUgcmVzb2x1Y2nDs24gZW4gcHJpbWVpcm8gbml2ZWwgZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ0FjdGl2YXIgbcOzZHVsbyBlc3RhdMOtc3RpY28gcGFyYSB4ZXJhciBlc3RhdMOtc3RpY2FzIHNvYnJlIGEgbWVkaWEgZGEgcmVzb2x1Y2nDs24gZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bmhhIG5vdGEgw6kgZW5nYWRpZGEgcG9yIHVuIGF4ZW50ZSwgZXN0YWJsZWNlIG8gZXN0YWRvIGR1biB0aWNrZXQgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bmhhIG5vdGEgw6kgZW5nYWRpZGEgcG9yIHVuIGF4ZW50ZSwgZXN0YWJsZWNlIG8gZXN0YWRvIGR1biB0aWNrZXQgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgcmVxdWlyaWRvcyBwYXJhIHVzYXIgYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBuYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgcmVxdWlyaWRvcyBwYXJhIHVzYXIgYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gbmEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0VzdGFibGVjZSBvIHNlcnZpem8gbmEgcGFudGFsbGEgZGUgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZSAoVGlja2V0OjpTZXJ2aXpvIGRlYmUgc2VyIGFjdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gc2Vydml6byBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZSAoVGlja2V0OjpTZXJ2aXpvIGRlYmUgc2VyIGFjdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyBwcm9waWV0YXJpbyBkZSB0aWNrZXQgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VzdGFibGVjZSBvIHByb3BpZXRhcmlvIGRlIHRpY2tldCBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyByZXNwb25zYWJsZSBkZSB0aWNrZXQgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VzdGFibGVjZSBvIHByb3BpZXRhcmlvIGRlIHRpY2tldCBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyB0aXBvIGRlIHRpY2tldCBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChUaWNrZXQ6OlRpcG8gdGVuIHF1ZSBzZXIgYWN0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gdGlwbyBkZSB0aWNrZXQgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUgKFRpY2tldDo6VGlwbyB0ZW4gcXVlIHNlciBhY3RpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1biBlbmxhY2Ugbm8gbWVudSBwYXJhIGNhbWJpYXIgYSBkZWNpc2nDs24gZHVuIHRpY2tldCBuYSBzw7phIHZpc3RhIHpvb20gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW4gZW5sYWNlIG5vIG1lbnUgcGFyYSBjYW1iaWFyIGNhbXBvcyBJVFNNIGFkaWNpb27DoWlzIG5hIHZpc3RhIHpvb20gZGUgdGlja2V0IGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bmhhIGxpc3RhIGRlIHTDs2RvbG9zIGF4ZW50ZXMgaW1wbGljYWRvcyBuZXN0ZSB0aWNrZXQsIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVuaGEgbGlzdGEgZGUgdMOzZG9sb3MgYXhlbnRlcyBpbXBsaWNhZG9zIG5lc3RlIHRpY2tldCwgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVuaGEgbGlzdGEgZGUgdMOzZG9sb3MgcG9zaWJsZXMgYXhlbnRlcyAodMOzZG9sb3MgYXhlbnRlcyBjb24gcGVybWlzb3MgZGUgbm90YSBuZXN0YSBjb2xhL3RpY2tldCkgcGFyYSBkZXRlcm1pbmFyIHF1ZW4gZGViZSBzZXIgaW5mb3JtYWRvIHNvYnJlIGVzdGEgbm90YSwgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bmhhIGxpc3RhIGRlIHTDs2RvbG9zIHBvc2libGVzIGF4ZW50ZXMgKHTDs2RvbG9zIGF4ZW50ZXMgY29uIHBlcm1pc29zIGRlIG5vdGEgbmVzdGEgY29sYS90aWNrZXQpIHBhcmEgZGV0ZXJtaW5hciBxdWVuIGRlYmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcGNpw7NucyBkZSBwcmlvcmlkYWRlIGRlIHRpY2tldCBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9wY2nDs25zIGRlIHByaW9yaWRhZGUgZGUgdGlja2V0IG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgY2FtcG9zIGRlIHTDrXR1bG8gbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NucyBkYSBpbnRlcmZhY2UgZG8gYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdKZWd5IGTDtm50w6lzw6luZWsgbcOzZG9zw610w6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnSmVneSBJVFNNIG1lesWRaW5layBtw7Nkb3PDrXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdTem9sZ8OhbHRhdMOhcyBpbmNpZGVuc8OhbGxhcG90JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0plZ3kgw7Zzc3pla2FwY3NvbMOhc2EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa3Vzc8OhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdIYXTDoXMnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ8OBdHRla2ludMOpcyBzesO8a3PDqWdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdEw7ZudMOpcyBlcmVkbcOpbnllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnSsOzdsOhaGFneXZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ0VsaGFsYXN6dHZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ0VsxZF6ZXRlc2VuIGrDs3bDoWhhZ3l2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ0VsdXRhc8OtdHZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnSmF2w610w6FzIGluZMOtdMOhc2kgaWRlamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0hlbHlyZcOhbGzDrXTDoXMgaW5kw610w6FzaSBpZGVqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRMO2bnTDqXMgZMOhdHVtYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ0hhdMOhcmlkxZEnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdsZXrDoXJ2YSBrZXLDvGzFkSBtZWdvbGTDoXNzYWwnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGpvbiBob3p6w6EgZWd5IGTDtm50w6lzdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ1RvdsOhYmJpIElUU00gbWV6xZFrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ1RvdsOhYmJpIElUU00gamVneW1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTGVoZXTFkXbDqSB0ZXN6aSBqZWd5emV0ZWsgaG96esOhYWTDoXPDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0xlaGV0xZF2w6kgdGVzemkgamVneXpldGVrIGhvenrDoWFkw6Fzw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ1bDoWx0b3p0YXNzYSBtZWcgYXogSVRTTSBtZXrFkWtldCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEw7ZudMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSwgaG9neSBzesO8a3PDqWdlcy1lIGplZ3l6w6Fyb2zDoXMgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luIChoYSBhIGplZ3kgbcOpZyBuaW5jcyB6w6Fyb2x2YSwgYWtrb3IgYSBqZWd5IHrDoXJvbHZhIGxlc3osIMOpcyBheiBha3R1w6FsaXMgw7xneWludMOpesWRIGF1dG9tYXRpa3VzYW4gYW5uYWsgdHVsYWpkb25vc2Frw6ludCBsZXN6IGJlw6FsbMOtdHZhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSwgaG9neSBzesO8a3PDqWdlcy1lIGplZ3l6w6Fyb2zDoXMgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4gKGhhIGEgamVneSBtw6lnIG5pbmNzIHrDoXJvbHZhLCBha2tvciBhIGplZ3kgesOhcm9sdmEgbGVzeiwgw6lzIGF6IGFrdHXDoWxpcyDDvGd5aW50w6l6xZEgYXV0b21hdGlrdXNhbiBhbm5hayB0dWxhamRvbm9zYWvDqW50IGxlc3ogYmXDoWxsw610dmEpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEsIGhvZ3kgYSBzem9sZ8OhbHRhdMOhcyBpbmNpZGVuc8OhbGxhcG90w6F0IG1lZyBrZWxsLWUgamVsZW7DrXRlbmkgYSBzem9sZ8OhbHRhdMOhcyBraXbDoWxhc3p0w6FzYSBrw7Z6YmVuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBlZ3kgamVneXpldCBhbGFww6lydGVsbWV6ZXR0IHTDtnJ6c8OpdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBlZ3kgamVneXpldCBhbGFww6lydGVsbWV6ZXR0IHTDtnJ6c8OpdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5IGFsYXDDqXJ0ZWxtZXpldHQga8O2dmV0a2V6xZEgw6FsbGFwb3TDoXQgZWd5IGplZ3l6ZXQgaG96esOhYWTDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3kgYWxhcMOpcnRlbG1lemV0dCBrw7Z2ZXRrZXrFkSDDoWxsYXBvdMOhdCBlZ3kgamVneXpldCBob3p6w6FhZMOhc2EgdXTDoW4gYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w6FyZ3nDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w6FyZ3nDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGF6IGFsYXDDqXJ0ZWxtZXpldHQgamVneSBwcmlvcml0w6FzdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXogYWxhcMOpcnRlbG1lemV0dCBqZWd5cHJpb3JpdMOhc3QgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w61wdXPDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w61wdXPDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnQXp0IGF6IGVsxZF6bcOpbnkgbWVnamVneXrDqXN0IGhhdMOhcm96emEgbWVnIGEgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRIG3FsXZlbGV0w6luw6lsLCBhbWVseWV0IGEgamVneSBlbMWRem3DqW55ZWluw6lsIHN6b2t0YWsgaGFzem7DoWxuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0F6dCBheiBlbMWRem3DqW55IG1lZ2plZ3l6w6lzdCBoYXTDoXJvenphIG1lZyBhIGTDtm50w6lzaSBrw6lwZXJuecWRIG3FsXZlbGV0w6luw6lsLCBhbWVseWV0IGEgamVneSBlbMWRem3DqW55ZWluw6lsIHN6b2t0YWsgaGFzem7DoWxuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdBenQgYXogZWzFkXptw6lueSB0w61wdXN0IGhhdMOhcm96emEgbWVnIGEgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRIG3FsXZlbGV0w6luw6lsLCBhbWVseWV0IGEgamVneSBlbMWRem3DqW55ZWluw6lsIHN6b2t0YWsgaGFzem7DoWxuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0F6dCBheiBlbMWRem3DqW55IHTDrXB1c3QgaGF0w6Fyb3p6YSBtZWcgYSBkw7ZudMOpc2kga8OpcGVybnnFkSBtxbF2ZWxldMOpbsOpbCwgYW1lbHlldCBhIGplZ3kgZWzFkXptw6lueWVpbsOpbCBzem9rdGFrIGhhc3puw6FsbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3kga8O2dmV0a2V6xZEgw6FsbGFwb3TDoXQgZWd5IGplZ3l6ZXQgaG96esOhYWTDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGVneSBqZWd5emV0IGhvenrDoWFkw6FzYSB1dMOhbiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0F6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbiBtZWdqZWxlbsOtdGV0dCBkaW5hbWlrdXMgbWV6xZFrLiBMZWhldHPDqWdlcyBiZcOhbGzDrXTDoXNvazogMCA9IExldGlsdHZhLCAxID0gRW5nZWTDqWx5ZXp2ZSwgMiA9IEVuZ2Vkw6lseWV6dmUgw6lzIGvDtnRlbGV6xZEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0F6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luIG1lZ2plbGVuw610ZXR0IGRpbmFtaWt1cyBtZXrFkWsuIExlaGV0c8OpZ2VzIGJlw6FsbMOtdMOhc29rOiAwID0gTGV0aWx0dmEsIDEgPSBFbmdlZMOpbHllenZlLCAyID0gRW5nZWTDqWx5ZXp2ZSDDqXMga8O2dGVsZXrFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQXogw7xneWludMOpesWRaSBmZWzDvGxldCBqZWd5a2VyZXPDqXMga8OpcGVybnnFkWrDqW4gbWVnamVsZW7DrXRldHQgZGluYW1pa3VzIG1lesWRay4gTGVoZXRzw6lnZXMgYmXDoWxsw610w6Fzb2s6IDAgPSBMZXRpbHR2YSwgMSA9IEVuZ2Vkw6lseWV6dmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdBeiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGplZ3luYWd5w610w6FzIGvDqXBlcm55xZFqw6luIG1lZ2plbGVuw610ZXR0IGRpbmFtaWt1cyBtZXrFkWsuIExlaGV0c8OpZ2VzIGJlw6FsbMOtdMOhc29rOiAwID0gTGV0aWx0dmEsIDEgPSBFbmdlZMOpbHllenZlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnRW5nZWTDqWx5ZXppIGEgc3RhdGlzenRpa8OhayBtb2R1bHQgYXogSVRTTSBqZWd5IGVsc8WRIHN6aW50xbEgbWVnb2xkw6FzaSBhcsOhbnnDoW5hayDDoXRsYWfDoXZhbCBrYXBjc29sYXRvcyBzdGF0aXN6dGlrw6FrIGVsxZHDoWxsw610w6Fzw6Fob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnRW5nZWTDqWx5ZXppIGEgc3RhdGlzenRpa8OhayBtb2R1bHQgYXogSVRTTSBqZWd5IG1lZ29sZMOhc8OhbmFrIMOhdGxhZ8OhdmFsIGthcGNzb2xhdG9zIHN0YXRpc3p0aWvDoWsgZWzFkcOhbGzDrXTDoXPDoWhvei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSGEgZWd5IMO8Z3lpbnTDqXrFkSBob3p6w6FhZG90dCBlZ3kgbWVnamVneXrDqXN0LCBha2tvciBiZcOhbGzDrXRqYSBlZ3kgamVneSDDoWxsYXBvdMOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSGEgZWd5IMO8Z3lpbnTDqXrFkSBob3p6w6FhZG90dCBlZ3kgbWVnamVneXrDqXN0LCBha2tvciBiZcOhbGzDrXRqYSBlZ3kgamVneSDDoWxsYXBvdMOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rIGEgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbmVrIGhhc3puw6FsYXTDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rIGEgZMO2bnTDqXNpIGvDqXBlcm55xZEgaGFzem7DoWxhdMOhaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgc3pvbGfDoWx0YXTDoXN0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbiAoYSBUaWNrZXQ6OlNlcnZpY2UgbGVoZXTFkXPDqWduZWsgYmVrYXBjc29sdmEga2VsbCBsZW5uaWUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBhIHN6b2xnw6FsdGF0w6FzdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbiAoYSBUaWNrZXQ6OlNlcnZpY2UgbGVoZXTFkXPDqWduZWsgYmVrYXBjc29sdmEga2VsbCBsZW5uaWUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgamVneSB0dWxhamRvbm9zw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgamVneSB0dWxhamRvbm9zw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgamVneSBmZWxlbMWRc8OpdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBhIGplZ3kgZmVsZWzFkXPDqXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBqZWd5IHTDrXB1c8OhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4gKGEgVGlja2V0OjpUeXBlIGxlaGV0xZFzw6lnbmVrIGJla2FwY3NvbHZhIGtlbGwgbGVubmllKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgamVneSB0w61wdXPDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4gKGEgVGlja2V0OjpUeXBlIGxlaGV0xZFzw6lnbmVrIGJla2FwY3NvbHZhIGtlbGwgbGVubmllKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRWd5IGhpdmF0a296w6FzdCBqZWxlbsOtdCBtZWcgYSBtZW7DvGJlbiBlZ3kgamVneSBkw7ZudMOpc8OpbmVrIG1lZ3bDoWx0b3p0YXTDoXPDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4gYXogZWxlbSBuYWd5w610w6FzaSBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGEgdG92w6FiYmkgSVRTTSBtZXrFkWsgbcOzZG9zw610w6Fzw6Fob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldCBqZWd5bmFnecOtdMOhcyBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnamVsZW7DrXRpIGEgamVneWVuIHLDqXN6dCB2ZXbFkSDDtnNzemVzIMO8Z3lpbnTDqXrFkSBsaXN0w6Fqw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYSBqZWd5ZW4gcsOpc3p0IHZldsWRIMO2c3N6ZXMgw7xneWludMOpesWRIGxpc3TDoWrDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnamVsZW7DrXRpIGF6IMO2c3N6ZXMgbGVoZXRzw6lnZXMgw7xneWludMOpesWRIChhIHbDoXLDs2xpc3TDoW4gdmFneSBqZWd5ZW4gamVneXpldCBqb2dvc3VsdHPDoWdnYWwgcmVuZGVsa2V6xZEgw7Zzc3plcyDDvGd5aW50w6l6xZEpIGxpc3TDoWrDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luIGFubmFrIG1lZ2hhdMOhcm96w6Fzw6Fob3osIGhvZ3kga2l0IGtlbGwgdMOhasOpa296dGF0bmkgZXJyxZFsIGEgamVneXpldHLFkWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYXogw7Zzc3plcyBsZWhldHPDqWdlcyDDvGd5aW50w6l6xZEgKGEgdsOhcsOzbGlzdMOhbiB2YWd5IGplZ3llbiBqZWd5emV0IGpvZ29zdWx0c8OhZ2dhbCByZW5kZWxrZXrFkSDDtnNzemVzIMO8Z3lpbnTDqXrFkSkgbGlzdMOhasOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbiBhbm5hayBtZWdoYXTDoXJvesOhc8OhaG96LCBob2d5IGtpdCBrZWxsIHTDoWrDqWtvenRhdG5pIGVycsWRbCBhIGplZ3l6ZXRyxZFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGplZ3kgcHJpb3JpdMOhc2kgbGVoZXTFkXPDqWdla2V0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGplZ3kgcHJpb3JpdMOhc2kgbGVoZXTFkXPDqWdla2V0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYSBjw61tbWV6xZFrZXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGPDrW1tZXrFkWtldCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJ0plZ3lkw7ZudMOpcy4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmlkX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICd1YmFoIGtlcHV0dXNhbiB0aWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAndWJhaCBiaWRhbmcgSVRTTSB0aWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU3RhdHVzIGxheWFuYW4gaW5zaWRlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICd0aWtldCB0YXV0YW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdEYW1wYWsnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ01lbWVybHVrYW4gcGVuaW5qYXVhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdIYXNpbCBrZXB1dHVzYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdEaXNldHVqdWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1dha3R1IG11bGFpIHBlcmJhaWthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnV2FrdHUgYXdhbCBwZW11bGloYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ1RhbmdnYWwga2VwdXR1c2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAndGFuZ2dhbCBqYXR1aCB0ZW1wbyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0RpdHV0dXAgZGVuZ2FuIHNvbHVzaSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0JlcmlrYW4gc2VidWFoIGtlcHV0dXNhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0JpZGFuZyBJVFNNIHRhbWJhaGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ2JpZGFuZyB0aWtldCBJVFNNIHRhbWJhaGFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJemlua2FuIG1lbmFtYmFoa2FuIGNhdGF0YW4gZGkgZGFsYW0gbGF5YXIgYmlkYW5nIElUUyB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW5rYW4gbWVuYW1iYWhrYW4gY2F0YXRhbiBkaSBkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ1ViYWggYmlkYW5nIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnS2VwdXR1c2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBqaWthIGt1bmNpIHRpa2V0IGRpcGVybHVrYW4gcGFkYSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChqaWthIHRpa2V0IGJlbHVtIHRlcmt1bmNpLCB0aWtldCBha2FuIHRlcmt1bmNpIGRhbiBhZ2VuIHNhYXQgaXR1IHNlY2FyYSBvdG9tYXRpcyBha2FuIG1lbmphZGkgcGVtaWxpa255YSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIGppa2Ega3VuY2kgdGlrZXQgZGlwZXJsdWthbiBkaSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbiAoamlrYSB0aWtldCBiZWx1bSB0ZXJrdW5jaSwgdGlrZXQgYWthbiB0ZXJrdW5jaSBkYW4gYWdlbiBzYWF0IGl0dSBha2FuIG1lbmphZGkgcGVtaWxpa255YSBzZWNhcmEgb3RvbWF0aXMpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIGppa2Egc3RhdHVzIGxheWFuYW4gaW5zaWRlbiBoYXJ1cyBkaSB0YW1waWxrYW4ga2V0aWthIHBlbWlsaWhhbiBsYXlhbmFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIGlzaSBkZWZhdWx0IGNhdGF0YW4gZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBpc2kgZGVmYXVsdCBjYXRhdGFuIGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHN0YXR1cyBkZWZhdWx0IGJlcmlrdXRueWEgZGFyaSBzZWJ1YWggdGlrZXQgc2V0ZWxhaCBtZW5hbWJhaGthbiBjYXRhdGFuLCBkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gc3RhdHVzIGRlZmF1bHQgYmVyaWt1dG55YSBkYXJpIHNlYnVhaCB0aWtldCBzZXRlbGFoIG1lbmFtYmFoa2FuIGNhdGF0YW4sIGRhbGFtIExheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdWJqZWsgZGVmYXVsdCBkYXJpIHNlYnVhaCBjYWNhdGFuIGRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gc3ViamVrIGRlZmF1bHQgZGFyaSBzZWJ1YWggY2FjYXRhbiBkYWxhbSBsYXlhciBLZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHByaW9yaXRhcyBkZWZhdWx0IHRpa2V0IGRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHByaW9yaXRhcyBkZWZhdWx0IHRpa2V0IGRhbGFtIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHRpcGUgZGVmYXVsdCBjYXRhdGFuIGRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiB0aXBlIGRlZmF1bHQgY2F0YXRhbiBkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiByaXdheWF0IGtvbWVudGFyIHVudHVrIHRpbmRha2FuIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuLCB5YW5nIGRpZ3VuYWthbiBwYWRhIHJpd2F5YXQgdGlrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiByaXdheWF0IGtvbWVudGFyIHVudHVrIHRpbmRha2FuIGxheWFyIGtlcHV0dXNhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHRpcGUgcml3YXlhdCB1bnR1ayB0aW5kYWthbiBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gdGlwZSByaXdheWF0IHVudHVrIHRpbmRha2FuIGxheWFyIGtlcHV0dXNhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdGF0dXMgdGlrZXQgYmVyaWt1dG55YSBzZXRlbGFoIG1lbmFtYmFoa2FuIGNhdGF0YW4sIGRpZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdGF0dXMgdGlrZXQgYmVyaWt1dG55YXNldGFsYWggbWVuYW1iYWhrYW4gY2F0YXRhbiwgZGkgZGFsYW0gbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdCaWRhbmcgZGluYW1pcyB5YW5nIGRpIHR1bmp1a2FuIGRpZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4gMCA9IGRpbm9uYWt0aWZrYW4sIDEgPSBkaSBha3RpZmthbiwgMiA9IGRpYWt0aWZrYW4gZGFuIGRpcGVybHVrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0JpZGFuZyBkaW5hbWlzIHlhbmcgZGkgdHVuanVrYW4gZGlkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4gMCA9IGRpbm9uYWt0aWZrYW4sIDEgPSBkaSBha3RpZmthbiwgMiA9IGRpYWt0aWZrYW4gZGFuIGRpcGVybHVrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ0JpZGFuZyBkaW5hbWlzIHlhbmcgZGkgdHVuanVrYW4gZGlkYWxhbSBsYXlhciBwZW5jYXJpYW4gdGlrZXQgcGFkYSBhbnRhcm11a2EgYWdlbi4gMCA9IGRpbm9uYWt0aWZrYW4sIDEgPSBkaSBha3RpZmthbiwgMiA9IGRpYWt0aWZrYW4gZGFuIGRpcGVybHVrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdCaWRhbmcgZGluYW1pcyB5YW5nIGRpIHR1bmp1a2FuIGRpZGFsYW0gbGF5YXIgcGVtYmVzYXJhbiB0aWtldCBwYWRhIGFudGFybXVrYSBhZ2VuLiAwID0gZGlub25ha3RpZmthbiwgMSA9IGRpIGFrdGlma2FuLCAyID0gZGlha3RpZmthbiBkYW4gZGlwZXJsdWthbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ2FrdGlma2FuIG1vZHVsIHN0YXRzIHVudHVrIG1lbmdoYXNpbGthbiBzdGF0aXN0aWsgdGVudGFuZyByYXRhLXJhdGEgdGluZ2thdCBwZW55ZWxlc2FpYW4gbGV2ZWwgcGVydGFtYSB0aWtldCBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ2FrdGlma2FuIG1vZHVsIHN0YXRzIHVudHVrIG1lbmdoYXNpbGthbiBzdGF0aXN0aWsgdGVudGFuZyByYXRhLXJhdGEgcGVueWVsZXNhaWFuIHRpa2V0IElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSmlrYSBzZWJ1YWggY2F0YXRhbiB5YW5nIGRpIHRhbWJhaGthbiBvbGVoIGFnZW4sIHRlbnR1a2FuIHN0YXR1cyB0aWtldCBkaWRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSmlrYSBzZWJ1YWggY2F0YXRhbiBkaXRhbWJhaGthbiBvbGVoIGFnZW4sIHRlbnR1a2FuIHN0YXR1cyB0aWtldCBkaWRhbGFtIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWVybHVrYW4gaXppbiB1bnR1ayBtZW5nZ3VuYWthbiBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBpemluIHVudHVrIG1lbmdndW5ha2FuIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnVGVudHVrYW4gbGF5YW5hbiBkaSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChUaWNrZXQ6OlNlcnZpY2UgcGVybHUgZGkgYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdUZW50dWthbiBsYXlhbmFuIGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChUaWNrZXQ6OlNlcnZpY2UgcGVybHUgZGkgYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1RlbnR1a2FuIHBlbWlsaWsgdGlrZXQgZGkgbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1RlbnR1a2FuIHBlbWlsaWsgdGlrZXQgZGkgbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGVudHVrYW4gcGVuYW5nZ3VuZyBqYXdhYiB0aWtldCBkaSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGVudHVrYW4gcGVuYW5nZ3VuZyBqYXdhYiB0aWtldCBkaSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdUZW50dWthbiB0aXBlIHRpa2V0IGRpIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4gKFRpY2tldDo6VHlwZSBwZXJsdSBkaSBha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdUZW50dWthbiB0aXBlIHRpa2V0IGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChUaWNrZXQ6OlR5cGUgcGVybHUgZGkgYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUdW5qdWthbiB0YXV0YW4gZGkgbWVudSB1bnR1a21lbmd1YmFoIGtlcHV0dXNhbiBzZWJ1YWggdGlrZXQgcGFkYSB0YW1waWxhbiBwZW1iZXNhcmFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gdGF1dGFuIGRpIG1lbnUgdW50dWsgbWVtb2RpZmlrYXNpIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGRpIHRhbXBpbGFuIHBlbWJlc2FyYW4gdGlrZXQgcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gZGFmdGFyIGRhcmkgc2VtdWEgYWdlbiB5YW5nIHRlcmxpYmF0IHBhZGEgdGlrZXQgaW5pLCBkaWRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gZGFmdGFyIGRhcmkgc2VtdWEgYWdlbiB5YW5nIHRlcmxpYmF0IHBhZGEgdGlrZXQgaW5pLCBkaWRhbGFtIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGRhZnRhciBzZW11YSBhZ2VuIHlhbmcgbWVtdW5na2lua2FuIChzZW11YSBhZ2VuIGRlbmdhbiBpemluIGNhdGF0YW4gcGFkYSBhbnRyaWFuL3Rpa2V0KSB1bnR1ayBtZW5lbnR1a2FuIHNpYXBhIHlhbmcgaGFydXMgZGkgaW5mb3JtYXNpa2FuIHRlbnRhbmcgY2F0YXRhbiBpbmksIGRpIGRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXIgbXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gZGFmdGFyIHNlbXVhIGFnZW4geWFuZyBtZW11bmdraW5rYW4gKHNlbXVhIGFnZW4gZGVuZ2FuIGl6aW4gY2F0YXRhbiBwYWRhIGFudHJpYW4vdGlrZXQpIHVudHVrIG1lbmVudHVrYW4gc2lhcGEgeWFuZyBoYXJ1cyBkaSBpbmZvcm1hc2lrYW4gdGVudGFuZyBjYXRhdGFuIGluaSwgZGkgZGFsYW0gbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gcGlsaWhhbiBwcmlvcml0YXMgdGlrZXQgZGlkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gcGlsaWhhbiBwcmlvcml0YXMgdGlrZXQgZGlkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gYmlkYW5nIGp1ZHVsIGRpIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gYmlkYW5nIGp1ZHVsIGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdLZXB1dHVzYW4gdGlrZXQuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWNhIGNhbXBpIElUU00gZGVsIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0NvbGxlZ2EgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdVcmdlbnppYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhdHRvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSaWNoaWVzdGEgcmV2aXNpb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jpc3VsdGF0byBhcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHByb3ZhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmlwYXJhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmVjdXBlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGkgYXBwcm92YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkaSBzY2FkZW56YSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWdnaXVuZ2kgdW5hIHJpc29sdXppb25lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcGkgSVRTTSBhZ2dpdW50aXZpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdDb25zZW50ZSBkaSBhZ2dpdW5nZXJlIG5vdGUgbmVsbGEgc2NoZXJtYXRhIGRpIGRlY2lzaW9uZSBkZWxsXCdpbnRlcmZhY2NpYSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQ2FtYmlhIGkgY2FtcGkgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdBcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfjg4HjgrHjg4Pjg4jjga7lpInmm7TmsbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+ODgeOCseODg+ODiOOBrklUU03poIXnm67jgpLlpInmm7TjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+OCteODvOODk+OCueOCpOODs+OCt+ODh+ODs+ODiOeKtuazgSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfjg4HjgrHjg4Pjg4jjgpLjg6rjg7Pjgq/jgZnjgosnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgeW6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn7/luqYnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ+ODrOODk+ODpeODvOW/hemgiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprntZDmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICfmib/oqo0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ+S/rueQhumWi+Wni+aZgumWkyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn5Zue5b6p6ZaL5aeL5pmC6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfmsbrlrprml6Xku5gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICflr77lv5zmnJ/pmZAnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfjg6/jg7zjgq/jgqLjg6njgqbjg7Pjg4njgaflrozkuoYnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmsbrlrprjgpLov73liqDjgZnjgovvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ+i/veWKoOOBrklUU03poIXnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAn6L+95Yqg44GuIElUU00g44OB44Kx44OD44OI772l44OV44Kj44O844Or44OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+OCqOODvOOCuOOCp+ODs+ODiOOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruOCouODh+OCo+OCt+ODp+ODiuODq0lUU03poIXnm67nlLvpnaLjgafov73liqDjga7jg47jg7zjg4jjgpLoqLHlj6/jgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7msbrlrpog55S76Z2i44Gn44CB44Oh44Oi44Gu6L+95Yqg44KS6Kix5Y+v44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnSVRTTemgheebruOCkuWkieabtOOBmeOCi++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ+axuuWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBp+OCteODvOODk+OCuemBuOaKnuaZguOBq+OCteODvOODk+OCueOCpOODs+OCt+ODh+ODs+ODiOeKtuazgeOCkuihqOekuuOBmeOCi+OBi+Wumue+qeOBmeOCi+OBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7ov73liqDjga5JVFNN44Gu44OV44Kj44O844Or44OJ55S76Z2i44Gn55So44GE44KL44OH44OV44Kp44Or44OI44Gu44Oh44Oi5pys5paH44KS5a6a576p44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44OV44Kn44O844K544Gu5rG65a6a55S76Z2i44Gn55So44GE44KL44OH44OV44Kp44Or44OI44Gu44Oh44Oi5pys5paH44KS5a6a576p44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44OV44Kn44O844K544Gu6L+95Yqg44GuSVRTTeOBruODleOCo+ODvOODq+ODieeUu+mdouOBp+OAgeODoeODoui/veWKoOW+jOOBruOAjOasoeOBrueKtuaFi+OAjeOBq+OBpOOBhOOBpuODh+ODleOCqeODq+ODiOOBrumBuOaKnuiCouOCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44OV44Kn44O844K544Gu5rG65a6a55S76Z2i44Gn44CB44Oh44Oi6L+95Yqg5b6M44Gu44CM5qyh44Gu54q25oWL44CN44Gr44Gk44GE44Gm44OH44OV44Kp44Or44OI44Gu6YG45oqe6IKi44KS5a6a576p44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBrui/veWKoCBJVFNN44OV44Kj44O844Or44OJ55S76Z2i44Gn6KGo56S644GV44KM44KL5YuV55qE44OV44Kj44O844Or44OJ44CCIOmBuOaKnuWPr+iDveOBquioreWumuWApDogMCA9IOeEoeWKuSwgMSA9IOacieWKuSwgMiA9IOacieWKueOBi+OBpOW/hemgiOmgheebric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7msbrlrprnlLvpnaLjgafooajnpLrjgZXjgozjgovli5XnmoTjg5XjgqPjg7zjg6vjg4njgIIg6YG45oqe5Y+v6IO944Gq6Kit5a6a5YCkOiAwID0g54Sh5Yq5LCAxID0g5pyJ5Yq5LCAyID0g5pyJ5Yq544GL44Gk5b+F6aCI6aCF55uuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruODgeOCseODg+ODiOaknOe0oueUu+mdouOBp+ihqOekuuOBleOCjOOCi+WLleeahOODleOCo+ODvOODq+ODieOAgiDpgbjmip7lj6/og73jgaroqK3lrprlgKQ6IDAgPSDnhKHlirksIDEgPSDmnInlirknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruODgeOCseODg+ODiOOCuuODvOODoOeUu+mdouOBp+ihqOekuuOBleOCjOOCi+WLleeahOODleOCo+ODvOODq+ODieOAgiDpgbjmip7lj6/og73jgaroqK3lrprlgKQ6IDAgPSDnhKHlirksIDEgPSDmnInlirknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdVYmFoIEtlcHV0dXNhbiBUaWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnUGVydWJhaGFuIGJpZGFuZyBJVFNNIHRpa2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdLZWFkYWFuIEluc2lkZW4gUGVya2hpZG1hdGFuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1BhdXRhbiB0aWtldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3JpdGlrYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnS2VzYW4nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ2tlcmphIHNlbXVsYSBkaXBlcmx1a2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0tlcHV0dXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ0RpbHVsdXNrYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1BlcmJhaWtpIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnUGVtdWxpaGFuIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnVGFyaWtoIEtlcHV0dXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1RhcmlraCBkaXNlYmFia2FuJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnZGl0dXR1cCBkZW5nYW4ga2VyamEgZGkgc2VraXRhcic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ1RhbWJhaCBrZXB1dHVzYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdUYW1iYWhhbiBJVFNNIE1lZGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ3RhbWJhaGFuIGthd2FzYW4ta2F3YXNhbiB0aWtldCBJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWJlbmFya2FuIHBlbmFtYmFoYW4gY2F0YXRhbiBkYWxhbSBza3JpbiBtZWRhbiBJVFNNIHRhbWJhaGFuIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtYmVuYXJrYW4gcGVuYW1iYWhhbiBub3RhIGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIHJ1YW5nIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnw4RuZGVybiBkZXIgSVRTTS1GZWxkZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRW50c2NoZWlkdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIGppa2Ega3VuY2kgdGlrZXQgZGlwZXJsdWthbiBkaSBza3JpbiBtZWRhbiBJVFNNIHRhbWJhaGFuIGFudGFyYSBtdWthIGVqZW4gKGppa2EgdGlrZXQgdGlkYWsgZGlrdW5jaSBsYWdpLCB0aWtldCBtZW5qYWRpIGJlcmt1bmNpIGRhbiBlamVuIHNlbWFzYSBha2FuIGRpc2V0a2FuIHNlY2FyYSBhdXRvbWF0aWsgc2ViYWdhaSBwZW1pbGlrbnlhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnTWVuZW50dWthbiBqaWthIGt1bmNpIHRpa2V0IGRpcGVybHVrYW4gZGkgc2tyaW4ga2VwdXR1c2FuIGFudGFyYSBtdWthIGVqZW4gKGppa2EgdGlrZXQgdGlkYWsgZGlrdW5jaSBsYWdpLCB0aWtldCBtZW5qYWRpIGJlcmt1bmNpIGRhbiBlamVuIHNlbWFzYSBha2FuIGRpc2V0a2FuIHNlY2FyYSBhdXRvbWF0aWsgc2ViYWdhaSBwZW1pbGlrbnlhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gamlrYSBrZWFkYWFuIGluc2lkZW4gcGVya2hpZG1hdGFuIGhlbmRha2xhaCBkaXR1bmp1a2thbiBzZW1hc2EgcGVtaWxpaGFuIHBlcmtoaWRtYXRhbiBkYWxhbSBydWFuZyBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIGJhZGFuIGxhbGFpIG5vdGEgZGkgc2tyaW4gbWVkYW4gSVRTTSB0YW1iYWhhbiBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbmVudHVrYW4gYmFkYW4gbGFsYWkgbm90YSBkaSBza3JpbiBrZXB1dHVzYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4ga2VhZGFhbiBsYWxhaSBzZXRlcnVzbnlhIGRhcmkgdGlrZXQgc2VsZXBhcyBtZW5hbWJhaCBub3RhLCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBkYXJpIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBhc2FsIGtlYWRhYW4gc2V0ZXJ1c255YSBkYXJpIHRpa2V0IHNlbGVwYXMgbWVuYW1iYWggbm90YSwgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGRhcmkgcGFwYXJhbiBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIHN1YmplayBsYWxhaSBub3RhIGRpIHNrcmluIG1lZGFuIElUU00gdGFtYmFoYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIHN1YmplayBsYWxhaSBub3RhIGRpIHNrcmluIGtlcHV0dXNhbiBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtldXRhbWFhbiB0aWtldCBkZWZhdWx0IGRpIHNrcmluIG1lZGFuIElUU00gdGFtYmFoYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtldXRhbWFhbiB0aWtldCBkZWZhdWx0IGRpIHNrcmluIGtlcHV0dXNhbiBhbnRhcmEgbXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbmVudHVrYW4gamVuaXMgZGVmYXVsdCBub3RhIGRpIHNrcmluIG1lZGFuIElUU00gdGFtYmFoYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBqZW5pcyBkZWZhdWx0IG5vdGEgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGFudGFyYSBtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnTWVuZW50dWthbiBrb21lbiBzZWphcmFoIHVudHVrIG1lZGFuIHNrcmluIHRpbmRha2FuIElUU00gdGFtYmFoYW4sICB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBzZWphcmFoIHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtvbWVuIHNlamFyYWggYmFnaSB0aW5kYWthbiBza3JpbiBrZXB1dHVzYW4sIHlhbmcgYWthbiBkaWd1bmFrYW4gdW50dWsgc2VqYXJhaCB0aWtldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gamVuaXMgc2VqYXJhaCBiYWdpIHRpbmRha2FuIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuLCB5YW5nIGFrYW4gZGlndW5ha2FuIHVudHVrIHNlamFyYWggdGlrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gamVuaXMgc2VqYXJhaCBiYWdpIHRpbmRha2FuIHNrcmluIGtlcHV0dXNhbiwgeWFuZyBha2FuIGRpZ3VuYWthbiB1bnR1ayBzZWphcmFoIHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4ga2VhZGFhbiBzZXRlcnVzbnlhIHRpa2V0IHNlbGVwYXMgbWVuYW1iYWggbm90YSwgZGFsYW0gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBrZWFkYWFuIHNldGVydXNueWEgdGlrZXQgc2VsZXBhcyBtZW5hbWJhaCBub3RhLCBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQmlkYW5nIGRpbmFtaWsgeWFuZyBkaXR1bmp1a2thbiBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uIFRldGFwYW4gS2VtdW5na2luYW46IDAgPSBEaWx1bXB1aGthbiwgMSA9IERpYWt0aWZrYW4sIDIgPSBEaWFrdGlma2FuIGRhbiBEaXBlcmx1a2FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdCaWRhbmcgZGluYW1payB5YW5nIGRpdHVuanVra2FuIGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uIFRldGFwYW4gS2VtdW5na2luYW46IDAgPSBEaWx1bXB1aGthbiwgMSA9IERpYWt0aWZrYW4sIDIgPSBEaWFrdGlma2FuIGRhbiBEaXBlcmx1a2FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdNZWRhbiBEaW5hbWlrIGRpdHVuanVra2FuIGRhbGFtIHNrcmluIGNhcmlhbiB0aWtldCBkYXJpIHBhcGFyYW4gZWplbi4gVGV0YXBhbiBLZW11bmdraW5hbjogMCA9IERpbHVtcHVoa2FuLCAxID0gRGlha3RpZmthbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ01lZGFuIERpbmFtaWsgZGl0dW5qdWtrYW4gZGFsYW0gc2tyaW4genVtIHRpa2V0IGRhcmkgcGFwYXJhbiBlamVuLiBUZXRhcGFuIEtlbXVuZ2tpbmFuOiAwID0gRGlsdW1wdWhrYW4sIDEgPSBEaWFrdGlma2FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnTWVtYm9sZWhrYW4gbW9kdWwgc3RhdGlzdGlrIHVudHVrIG1lbmphbmEgc3RhdGlzdGlrIHRlbnRhbmcgcHVyYXRhIHRpa2V0IElUU00gcGVyaW5na2F0IHBlcnRhbWEga2FkYXIgcGVueWVsZXNhaWFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ01lbWJvbGVoa2FuIG1vZHVsIHN0YXRpc3RpayB1bnR1ayBtZW5qYW5hIHN0YXRpc3RpayB0ZW50YW5nIHB1cmF0YSBwZW55ZWxlc2FpYW4gdGlrZXQgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSmlrYSBub3RhIGRpdGFtYmFoIG9sZWggZWplbiwgdGV0YXBrYW4ga2VhZGFhbiB0aWtldCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSmlrYSBub3RhIGRpdGFtYmFoIG9sZWggZWplbiwgdGV0YXBrYW4ga2VhZGFhbiB0aWtldCBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0tlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gZGFsYW0gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0tlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4ga2VwdXR1c2FuIGRhbGFtIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXQgcGVya2hpZG1hdGFuIGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbiAoVGlrZXQ6OlBlcmtoaWRtYXRhbiBwZXJsdSBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0IHBlcmtoaWRtYXRhbiBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuIChUaWtldDo6UGVya2hpZG1hdGFuIHBlcmx1IGRpYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldCBwZW1pbGlrIHRpa2V0IGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldCBwZW1pbGlrIHRpa2V0IGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0IHRpa2V0IHlhbmcgYmVydGFuZ2d1bmdqYXdhYiBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXQgdGlrZXQgeWFuZyBiZXJ0YW5nZ3VuZ2phd2FiIGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnTWVuZXRhcGthbiBqZW5pcyB0aWtldCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4gKFRpa2V0OjpKZW5pcyBwZXJsdSBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ01lbmV0YXBrYW4gamVuaXMgdGlrZXQgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGJhZ2kgYW50YXJhIG11a2EgZWplbiAoVGlrZXQ6OkplbmlzIHBlcmx1IGRpYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBwYXV0YW4gZGFsYW0gbWVudSB1bnR1ayBtZW5ndWJhaCBrZXB1dHVzYW4gdGlrZXQgZGFsYW0gcGFuZGFuZ2FuIHp1bSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBhdXRhbiBkYWxhbSBtZW51IHVudHVrIG1lbmd1YmFoIHN1YWkgYmlkYW5nIElUU00gdGFtYmFoYW4gZGFsYW0gcGFuZGFuZ2FuIHp1bSB0aWtldCBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWFwYXJrYW4gc2VuYXJhaSBzZW11YSBlamVuIHlhbmcgdGVybGliYXQgZGFsYW0gdGlrZXQgaW5pLCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtYXBhcmthbiBzZW5hcmFpIHNlbXVhIGVqZW4geWFuZyB0ZXJsaWJhdCBkYWxhbSB0aWtldCBpbmksIGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtYXBhcmthbiBzZW5hcmFpIHNlbXVhIGtlbXVuZ2tpbmFuIGVqZW4gKCBzZW11YSBlamVuIGRlbmdhbiBrZWJlbmFyYW4gbm90YSBtZW5nZW5haSBiYXJpc2FuIC8gdGlrZXQpIHVudHVrIG1lbmVudHVrYW4gc2lhcGEgeWFuZyBwZXJsdSBkaWJlcml0YWh1IHRlbnRhbmcgbm90YSBpbmkgLCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW1hcGFya2FuIHNlbmFyYWkgc2VtdWEga2VtdW5na2luYW4gZWplbiAoc2VtdWEgZWplbiBkZW5nYW4ga2ViZW5hcmFuIG5vdGEgbWVuZ2VuYWkgYmFyaXNhbi90aWtldCkgdW50dWsgbWVuZW50dWthbiBzaWFwYSB5YW5nIHBlcmx1IGRpYmVyaXRhaHUgdGVudGFuZyBub3RhIGluaSwgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBwaWxpaGFuIGtldXRhbWFhbiB0aWtldCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBwaWxpaGFuIGtldXRhbWFhbiB0aWtldCBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBiaWRhbmcgdGFqdWsgZGFsYW0gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIGJpZGFuZyB0YWp1ayBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAna2VwdXR1c2FuIHRpa2V0JzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdFbmRyZSBzYWtlbnMgYmVzbHV0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnRW5kcmUgc2FrZW5zIElUU00tZmVsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdIZW5kZWxzZXN0aWxzdGFuZCBmb3IgdGplbmVzdGVuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0tvYmxlIHNhayc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3JpdGlrYWxpdGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ09tZmFuZyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnRXZhbHVlcmluZyBrcmV2ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnQmVzbHV0bmluZ3NyZXN1bHRhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ0dvZGtqZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgcmVwYXJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnU3RhcnR0aWQgZm9yIGdqZW5vcHByZXR0aW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdCZXNsdXRuaW5nc2RhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGb3JmYWxsc2RhdG8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdMdWtrZXQgbWVkIG1pZGxlcnRpZGlnIGzDuHNuaW5nJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnTGVnZyB0aWwgZW4gYmVzbHV0bmluZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0Vrc3RyYSBJVFNNLWZlbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnRWtzdHJhIElUU00tZmVsdCBmb3Igc2FrZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1RpbGxhdGVyIMOlIGxlZ2dlIHRpbCBub3Rpc2VyIGkgZGUgZWtzdHJhIElUU00tZmVsdGVuZSBpIHNha3NiZWhhbmRsZXJkZWxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0VuZHJlIElUU00tZmVsdGVuZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdCZXNsdXRuaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJ0Jlc2x1dG5pbmcgZm9yIHNha2VuLic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ZlcmFuZGVyZW4gdmFuIElUU00gdmVsZGVuIHZhbiB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ1VyZ2VudGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdCc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnUmV2aWV3IGJlbm9kaWdkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFhdCBiZXNsaXNzaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnQWFuZ2Vub21lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnQmVnaW50aWpkIHJlcGFyYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnQmVnaW50aWpkIGhlcnN0ZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0Jlc2xpc3NpbmdzZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdWZXJ2YWxkYXR1bSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2dlc2xvdGVuIG1ldCB3b3JrYXJvdW5kJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQmVzbGlzc2luZyB0b2V2b2VnZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdFeHRyYSBJVFNNIHZlbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnVmVyYW5kZXJlbiB2YW4gSVRTTSB2ZWxkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQmVzbGlzc2luZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdabWllxYQgZGVjeXpqxJkgdyB6Z8WCb3N6ZW5pdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnWm1pZcWEIHBvbGEgSVRTTSB6Z8WCb3N6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1BvxYLEhWN6IHpnxYJvc3plbmllJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcnl0eWN6bm/Fm8SHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ1dwxYJ5dyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnV3ltYWdhbnkgcHJ6ZWdsxIVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1JlenVsdGF0IGRlY3l6amknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdaYXR3aWVyZHpvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG5hcHJhd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG9kenlza2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZWN5emppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnQ3phcyB6YWtvxYRjemVuaWEnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdyb3p3acSFemFuZSB6IG9iZWrFm2NpZW0nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb2RhaiBkZWN5emrEmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0a293ZSBwb2xhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvendhbGEgbmEgZG9kYXdhbmllIG5vdGF0ZWsgbmEgZWtyYW5pZSB6IGRvZGF0a293eW1pIHBvbGFtaSBJVFNNIHcgcGFuZWx1IGFnZW50YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQb3p3YWxhIG5hIGRvZGF3YW5pZSBub3RhdGVrIG5hIGVrcmFuaWUgZGVjeXpqaSB3IHBhbmVsdSBhZ2VudGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnWm1pZcWEIHBvbGEgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWN5emphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdBbHRlcmFyIERlY2lzw6NvIGRlIENoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0FsdGVyYXIgb3MgY2FtcG9zIElUU00gZG8gY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkbyBTZXJ2acOnbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdBc3NvY2lhciBjaGFtYWRvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdDcml0aWNhbGlkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdG8nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1Jldmlzw6NvIFJlcXVpc2l0YWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0RlY2lzw6NvIFJlc3VsdGFudGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHJvdmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICdQcm9ycm9nYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ1Byw6ktYXByb3ZhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICdSZWplaXRhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdIb3LDoXJpbyBJbmljaWFsIGRlIFJlcGFybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnSG9yw6FyaW8gSW5pY2lhbCBkZSBSZWN1cGVyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEYXRhIGRlIERlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkZSB2ZW5jaW1lbnRvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnZmVjaGFkbyBjb20gc29sdcOnw6NvIGRlIGNvbnRvcm5vJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWRpY2lvbmFyIHVtYSBkZWNpc8OjbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0NhbXBvcyBhZGljaW9uYWlzIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnQ2FtcG9zIGFkaWNpb25haXMgZGUgVGlja2V0IElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZGljaW9uYXIgbm90YXMgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZGljaW9uYXIgbm90YXMgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0FsdGVyYXIgY2FtcG9zIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRGVjaXPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSB1bSBibG9xdWVpbyBkZSBjaGFtYWRvIMOpIGV4aWdpZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUgKHNlIG8gY2hhbWFkbyBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvIGFpbmRhLCBvIGNoYW1hZG8gc2Vyw6EgYmxvcXVlYWRvZSBvIGF0ZW5kZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSB1bSBibG9xdWVpbyBkZSBjaGFtYWRvIMOpIGV4aWdpZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlIChzZSBvIGNoYW1hZG8gbsOjbyBlc3RpdmVyIGJsb3F1ZWFkbyBhaW5kYSwgbyBjaGFtYWRvIHNlcsOhIGJsb3F1ZWFkb2UgbyBhdGVuZGVudGUgYXR1YWwgc2Vyw6EgYXV0b21hdGljYW1lbnRlIGRlZmluaWRvIGNvbW8gc2V1IHByb3ByaWV0w6FyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSBvIGVzdGFkbyBkZSBpbmNpZGVudGUgZG8gc2VydmnDp28gZGV2ZSBzZXIgbW9zdHJhZG8gZHVyYW50ZSBhIHNlbGXDp8OjbyBkZSBzZXJ2acOnbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb3JwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvcnBvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBwYWRyw6NvIGRlIHVtIGNoYW1hZG8gYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcGFkcsOjbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGFzc3VudG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgYSBwcmlvcmlkYWRlIHBhZHLDo28gZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGEgcHJpb3JpZGFkZSBwYWRyw6NvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gY29tZW50w6FyaW8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00sIHF1ZSDDqSB1c2FkbyBubyBoaXN0w7NyaWNvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHF1ZSDDqSB1c2FkbyBubyBoaXN0w7NyaWNvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSwgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGRlY2lzw6NvLCBxdWUgw6kgdXNhZG8gbm8gaGlzdMOzcmljbyBkbyBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gY2hhbWFkbyBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gY2hhbWFkbyBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8gZSByZXF1ZXJpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8gZSByZXF1ZXJpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIHBlc3F1aXNhIGRlIGNoYW1hZG8gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGV0YWxoZXMgZG8gY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIGNoYW1hZG9zIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIGNoYW1hZG9zIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW1hIG5vdGEgw6kgYWRpY2lvbmFkYSBwb3IgdW0gYXRlbmRlbnRlLCBkZWZpbmUgbyBlc3RhZG8gZGUgdW0gY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhdGVuZGVudGUsIGRlZmluZSBvIGVzdGFkbyBkZSB1bSBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRkIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIGEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIGEgdGVsYSBkZSBkZWNpc8OjbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gc2VydmnDp28gYWRpY2lvbmFsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBpbnRlcmZhY2UgZG8gYXRlbmRlbnRlIChDaGFtYWRvOjpTZXJ2acOnbyBwcmVjaXNhIGVzdGFyIGF0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUgKENoYW1hZG86OlNlcnZpw6dvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHJvcHJpZXTDoXJpbyBkbyBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHJvcHJpZXTDoXJpbyBkbyBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyBjaGFtYWRvIGRlIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcmVzcG9uc8OhdmVsIHBlbG8gY2hhbWFkbyBuYSB0ZWxhIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiAoQ2hhbWFkbzo6VGlwbyBwcmVjaXNhIGVzdGFyIGF0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoQ2hhbWFkbzo6VGlwbyBwcmVjaXNhIGVzdGFyIGF0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgYWx0ZXJhciBhIGRlY2lzw6NvIGRlIHVtIGNoYW1hZG8gbmEgc3VhIHZpc8OjbyBlbSBkZXRhbGhlcyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBtb2RpZmljYXIgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBuYSB2aXPDo28gZW0gZGV0YWxoZXMgZGUgdW0gY2hhbWFkbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGF0ZW5kZW50ZXMgZW52b2x2aWRvcyBuZXN0ZSBjaGFtYWRvLCBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGF0ZW5kZW50ZXMgZW52b2x2aWRvcyBuZXN0ZSBjaGFtYWRvLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhdGVuZGVudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGF0ZW5kZW50ZXMgY29tIHBlcm1pc3PDtWVzIGRlIG5vdGEgbmEgZmlsYS9jaGFtYWRvKSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBwb3Nzw612ZWlzICh0b2RvcyBvcyBhdGVuZGVudGVzIGNvbSBwZXJtaXNzw7VlcyBub3RhIG5hIGZpbGEvY2hhbWFkbykgcGFyYSBkZXRlcm1pbmFyIHF1ZW0gZGV2ZSBzZXIgaW5mb3JtYWRvIHNvYnJlIGVzdGEgbm90YSwgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBwcmlvcmlkYWRlIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgYXMgb3DDp8O1ZXMgZGUgcHJpb3JpZGFkZSBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBvcyBjYW1wb3MgZGUgdMOtdHVsbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdEZWNpc8OjbyBkZSBDaGFtYWRvLic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdBbHRlcmFyIGRlY2lzw6NvIGRvIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnQWx0ZXJhciBvcyBjYW1wb3MgSVRTTSBkbyB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbmNpZGVudGUgZG8gU2VydmnDp28nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnQXNzb2NpYXIgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdDcml0aWNpZGFkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3RvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdBdmFsaWHDp8OjbyBuZWNlc3PDoXJpYSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmVzdWx0YWRvIGRhIGRlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnQXByb3ZhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGUgUmVwYXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGEgUmVjdXBlcmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkYSBEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ0RhdGEgdmVuY2ltZW50byc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2ZlY2hhZG8gY29tIHNvbHXDp8OjbyBkZSBjb250b3Jubyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0FkaWNpb25hciB1bWEgZGVjaXPDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBhZGljaW9uYWlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ0NhbXBvcyBhZGljaW9uYWlzIGRlIHRpY2tldCBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBhbyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZGljaW9uYXIgbm90YXMgYW8gZm9ybXVsw6FyaW9kZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0FsdGVyYXIgY2FtcG9zIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRGVjaXPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSBvIGJsb3F1ZWlvIGRvIHRpY2tldCDDqSBvYnJpZ2F0w7NyaW8gbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlIChzZSBvIHRpY2tldCBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvLCBzZXLDoSBibG9xdWVhZG8gZSBvIGFnZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSBvIGJsb3F1ZWlvIGRvIHRpY2tldCDDqSBvYnJpZ2F0w7NyaW8gbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZSAoc2UgbyB0aWNrZXQgbsOjbyBlc3RpdmVyIGJsb3F1ZWFkbywgc2Vyw6EgYmxvcXVlYWRvIGUgbyBhZ2VudGUgYXR1YWwgc2Vyw6EgYXV0b21hdGljYW1lbnRlIGRlZmluaWRvIGNvbW8gc2V1IHByb3ByaWV0w6FyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSBvIGVzdGFkbyBkZSBpbmNpZGVudGUgZG8gc2VydmnDp28gZGV2ZSBzZXIgbW9zdHJhZG8gZHVyYW50ZSBhIHNlbGXDp8OjbyBkZSBzZXJ2acOnbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyB0ZXh0byBwb3Igb21pc3PDo28gZGUgdW1hIG5vdGEgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRleHRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBwb3Igb21pc3PDo28gZGUgdW0gdGlja2V0IGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBvciBvbWlzc8OjbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwb3Igb21pc3PDo28gZGUgdW1hIG5vdGEgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGFzc3VudG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgYSBQcmlvcmlkYWRlIHBvciBvbWlzc8OjbyBkZSB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgYSBQcmlvcmlkYWRlIHBvciBvbWlzc8OjbyBkZSB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgdXRpbGl6YWRvIG5vIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gdGlja2V0IGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gdGlja2V0IGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8gZSByZXF1ZXJpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8gZSByZXF1ZXJpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIHBlc3F1aXNhIGRlIGNoYW1hZG8gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGV0YWxoZXMgZG8gY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIHRpY2tldHMgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgdGlja2V0cyBJVFNNIG5vIHByaW1laXJvIG7DrXZlbCBkZSBzb2x1w6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NlIHVtYSBub3RhIMOpIGFkaWNpb25hZGEgcG9yIHVtIGFnZW50ZSwgZGVmaW5lIG8gZXN0YWRvIGRvIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW1hIG5vdGEgw6kgYWRpY2lvbmFkYSBwb3IgdW0gYWdlbnRlLCBkZWZpbmUgbyBlc3RhZG8gZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXRpbGl6YXIgbyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHV0aWxpemFyIG8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gc2VydmnDp28gYWRpY2lvbmFsIGFvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGUgaW50ZXJmYWNlIGRvIGFnZW50ZSAodGlja2V0OjpTZXJ2acOnbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUgKHRpY2tldDo6U2VydmnDp28gbmVjZXNzaXRhIGRlIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByb3ByaWV0w6FyaW8gZG8gdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkMCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLiAodGlja2V0OjpUaXBvIG5lY2Vzc2l0YSBkZSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUgKHRpY2tldDo6VGlwbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgYWx0ZXJhciBhIGRlY2lzw6NvIGRlIHVtIHRpY2tldCBuYSB2aXN0YSBkZSBkZXRhbGhlcyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIG1vZGlmaWNhciBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIG5hIHZpc3RhIGRlIGRldGFsaGVzIGRvIHRpY2tldCBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYWdlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIHRpY2tldCwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhZ2VudGVzIGVudm9sdmlkb3MgbmVzdGUgdGlja2V0LCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkb3MgYWdlbnRlcyBwb3Nzw612ZWlzICh0b2RvcyBvcyBhZ2VudGVzIGNvbSBwZXJtaXNzw7VlcyBkZSBub3RhIG5hIGZpbGEvdGlja2V0KSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZG9zIGFnZW50ZXMgcG9zc8OtdmVpcyAodG9kb3Mgb3MgYWdlbnRlcyBjb20gcGVybWlzc8O1ZXMgbm90YSBuYSBmaWxhL3RpY2tldCkgcGFyYSBkZXRlcm1pbmFyIHF1ZW0gZGV2ZSBzZXIgaW5mb3JtYWRvIHNvYnJlIGVzdGEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBQcmlvcmlkYWRlIGRvIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBQcmlvcmlkYWRlIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBvcyBjYW1wb3MgZGUgdMOtdHVsbyBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnRGVjaXPDo28gZGUgdGlja2V0Lic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfQmNC30LzQtdC90LjRgtGMINGA0LXRiNC10L3QuNC1INC/0L4g0LfQsNGP0LLQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfQmNC30LzQtdC90LjRgtGMIElUU00g0L/QvtC70Y8g0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0KHQtdGA0LLQuNGB0LAnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn0KHQstGP0LfQsNGC0Ywg0LfQsNGP0LLQutGDJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICfQmtGA0LjRgtC40YfQvdC+0YHRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ9Ch0YLQtdC/0LXQvdGMINCy0LvQuNGP0L3QuNGPJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfQndC10L7QsdGF0L7QtNC40Lwg0L/RgNC+0YHQvNC+0YLRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfQoNC10LfRg9C70YzRgtCw0YIg0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICfQo9GC0LLQtdGA0LbQtNC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn0JTQsNGC0LAg0L3QsNGH0LDQu9CwINGA0LDQsdC+0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ9CU0LDRgtCwINCy0L7RgdGB0YLQsNC90L7QstC70LXQvdC40Y8g0YHQtdGA0LLQuNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ9CU0LDRgtCwINGA0LXRiNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn0JTQsNGC0LAg0LjRgdC/0L7Qu9C90LXQvdC40Y8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfQt9Cw0LrRgNGL0YLQviDRgSDQvtCx0YXQvtC00L3Ri9C8INGA0LXRiNC10L3QuNC10LwnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINGA0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAn0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINC30LDRj9Cy0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KDQsNC30YDQtdGI0LDQtdGCINC00L7QsdCw0LLQuNGC0Ywg0LfQsNC80LXRgtC60YMg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cg0LDQt9GA0LXRiNCw0LXRgiDQtNC+0LHQsNCy0LjRgtGMINC30LDQvNC10YLQutGDINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ9CY0LfQvNC10L3QuNGC0YwgSVRTTSDQv9C+0LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ9Cg0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfQntC/0YDQtdC00LXQu9GP0LXRgiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLRjCDQsdC70L7QutC40YDQvtCy0LrQuCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0LfQsNGP0LLQutCwINC10YnQtSDQvdC1INCx0LvQvtC60LjRgNC+0LLQsNC90LAsINC+0L3QsCDQsdC70L7QutC40YDRg9C10YLRgdGPINC4INGC0LXQutGD0YnQuNC5INCw0LPQtdC90YIg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0L3QsNC30L3QsNGH0LDQtdGC0YHRjyDQtdC1INCy0LvQsNC00LXQu9GM0YbQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCINC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtGMINCx0LvQvtC60LjRgNC+0LLQutC4INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKNC10YHQu9C4INC30LDRj9Cy0LrQsCDQtdGJ0LUg0L3QtSDQsdC70L7QutC40YDQvtCy0LDQvdCwLCDQvtC90LAg0LHQu9C+0LrQuNGA0YPQtdGC0YHRjyDQuCDRgtC10LrRg9GJ0LjQuSDQsNCz0LXQvdGCINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC90LDQt9C90LDRh9Cw0LXRgtGB0Y8g0LXQtSDQstC70LDQtNC10LvRjNGG0LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCLCDQv9C+0LrQsNC30YvQstCw0YLRjCDQu9C4INGB0L7RgdGC0L7Rj9C90LjQtSDQodC10YDQstC40YHQsCDQv9GA0Lgg0LXQs9C+INCy0YvQsdC+0YDQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQtdC60YHRgiDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwICjQtdGB0LvQuCDQvdC10L7QsdGF0L7QtNC40LzQviknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC10LrRgdGCINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Rg9GOINGC0LXQvNGDINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YPRjiDRgtC10LzRgyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC40L8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQuNC/INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtC40L8g0LrQvtC80LzQtdC90YLQsNGA0LjRjyDQsiDQuNGB0YLQvtGA0LjQuCDQtNC70Y8g0LTQtdC50YHRgtCy0LjQuSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLQuNC/INC60L7QvNC80LXQvdGC0LDRgNC40Y8g0LIg0LjRgdGC0L7RgNC40Lgg0LTQu9GPINC00LXQudGB0YLQstC40Lkg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdC70LXQtNGD0Y7RidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDRj9Cy0LrQuCDQv9C+0YHQu9C1INC00L7QsdCw0LLQu9C10L3QuNGPINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0Y/QstC60Lgg0L/QvtGB0LvQtSDQtNC+0LHQsNCy0LvQtdC90LjRjyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ9Ch0L/QuNGB0L7QuiDQlNC40L3QsNC80LjRh9C10YHQutC40YUg0L/QvtC70LXQuSwg0L/QvtC60LDQt9GL0LLQsNC10LzRi9GFINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LjRgdC60LAg0LfQsNCy0L7QuiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LTRgNC+0LHQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAg0LfQsNGP0LLQutC4INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgLSDQvdC1INC/0L7QutCw0LfRi9Cy0LDRgtGMLCAxIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ9CS0LrQu9GO0YfQsNC10YIg0LzQvtC00YPQu9GMINC+0YLRh9C10YLQvtCyINC00LvRjyDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0L7RgtGH0LXRgtC+0LIg0L4g0YHRgNC10LTQvdC10LwgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICfQktC60LvRjtGH0LDQtdGCINC80L7QtNGD0LvRjCDQvtGC0YfQtdGC0L7QsiDQtNC70Y8g0YTQvtGA0LzQuNGA0L7QstCw0L3QuNGPINC+0YLRh9C10YLQvtCyINC+INGB0YDQtdC00L3QtdC8IElUU00gdGlja2V0IHNvbHV0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQktC+0LfQvNC+0LbQvdC+0YHRgtGMINGD0YHRgtCw0L3QvtCy0LjRgtGMINC90L7QstC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDQstC60Lgg0L/RgNC4INC00L7QsdCw0LLQu9C10L3QuNC4INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JLQvtC30LzQvtC20L3QvtGB0YLRjCDRg9GB0YLQsNC90L7QstC40YLRjCDQvdC+0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LLQutC4INC/0YDQuCDQtNC+0LHQsNCy0LvQtdC90LjQuCDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQv9GD0L3QutGC0LAg0LzQtdC90Y4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0L/Rg9C90LrRgtCwINC80LXQvdGOINCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKFRpY2tldDo6U2VydmljZSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LDQutGC0LjQstC40YDQvtCy0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpTZXJ2aWNlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCS0LvQsNC00LXQu9GM0YbQsCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0JLQu9Cw0LTQtdC70YzRhtCwINC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7Qs9C+INC30LAg0LfQsNGP0LLQutGDINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCe0YLQstC10YLRgdGC0LLQtdC90L3QvtCz0L4g0LfQsCDQt9Cw0Y/QstC60YMg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KLQuNC/INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwIChUaWNrZXQ6OlR5cGUg0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0LrRgtC40LLQuNGA0L7QstCw0L0pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQotC40L8g0LfQsNGP0LLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpUeXBlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHRgdGL0LvQutGDINC90LAg0L/Rg9C90LrRgiDQvNC10L3RjiDQtNC70Y8g0LjQt9C80LXQvdC10L3QuNGPINCg0LXRiNC10L3QuNGPINC/0L4g0LfQsNGP0LLQutC1INCyINC+0LrQvdC1INC/0L7QtNGA0L7QsdC90L7Qs9C+INC/0YDQvtGB0LzQvtGC0YDQsCAoVGlja2V0Wm9vbSkg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0YHRi9C70LrRgyDQvdCwINC/0YPQvdC60YIg0LzQtdC90Y4g0LTQu9GPINC40LfQvNC10L3QtdC90LjRjyDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9GFIElUU00g0L/QvtC70LXQuSDQt9Cw0Y/QstC60Lgg0LIg0L7QutC90LUg0L/QvtC00YDQvtCx0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwIChUaWNrZXRab29tKSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0L/QuNGB0L7QuiDQtNC70Y8g0LLRi9Cx0L7RgNCwINCy0YHQtdGFINCy0L7QstC70LXRh9C10L3QvdGL0YUg0LDQs9C10L3RgtC+0LIg0L/QviDRjdGC0L7QuSDQt9Cw0Y/QstC60LUg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LLQu9C10YfQtdC90L3Ri9GFINCw0LPQtdC90YLQvtCyINC/0L4g0Y3RgtC+0Lkg0LfQsNGP0LLQutC1INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LfQvNC+0LbQvdGL0YUg0LDQs9C10L3RgtC+0LIgKCDRgSDQv9GA0LDQstCw0LzQuCDQvdCwINGB0L7Qt9C00LDQvdC40LUg0LfQsNC80LXRgtC+0LogKG5vdGUpINC00LvRjyDQvtGH0LXRgNC10LTQuC/Qt9Cw0Y/QstC60LggKSwg0LrQvtGC0L7RgNGL0YUg0L3QsNC00L4g0LjQvdGE0L7RgNC80LjRgNC+0LLQsNGC0Ywg0L7QsSDRjdGC0L7QuSDQt9Cw0LzQtdGC0LrQtSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHQv9C40YHQvtC6INC00LvRjyDQstGL0LHQvtGA0LAg0LLRgdC10YUg0LLQvtC30LzQvtC20L3Ri9GFINCw0LPQtdC90YLQvtCyICgg0YEg0L/RgNCw0LLQsNC80Lgg0L3QsCDRgdC+0LfQtNCw0L3QuNC1INC30LDQvNC10YLQvtC6IChub3RlKSDQtNC70Y8g0L7Rh9C10YDQtdC00Lgv0LfQsNGP0LLQutC4ICksINC60L7RgtC+0YDRi9GFINC90LDQtNC+INC40L3RhNC+0YDQvNC40YDQvtCy0LDRgtGMINC+0LEg0Y3RgtC+0Lkg0LfQsNC80LXRgtC60LUg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINC/0L7Qu9C1INCy0YvQsdC+0YDQsCDQv9GA0LjQvtGA0LjRgtC10YLQsCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0LLRi9Cx0L7RgNCwINC/0YDQuNC+0YDQuNGC0LXRgtCwINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0KLQtdC80LAg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9C+0LvQtSDQotC10LzQsCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICfQoNC10YjQtdC90LjQtSDQv9C+INC30LDRj9Cy0LrQtS4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0N5cmxfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJ9Cf0YDQvtC80LXQvdC4INCe0LTQu9GD0LrRgyDQotC40LrQtdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9CY0LfQvNC10L3QsCDigJ5JVFNN4oCdINC/0L7RmdCwINGC0LjQutC10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn0JjQvdGG0LjQtNC10L3RgtC90L4g0YHRgtCw0ZrQtSDRgdC10YDQstC40YHQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfQn9C+0LLQtdC20Lgg0YLQuNC60LXRgic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAn0JrRgNC40YLQuNGH0L3QvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0KPRgtC40YbQsNGYJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfQntCx0LDQstC10LfQvdCwINGA0LXRhtC10L3Qt9C40ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfQoNC10LfRg9C70YLQsNGCIG/QtNC70YPQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAn0J7QtNC+0LHRgNC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICfQntC00LvQvtC20LXQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ9Cj0L3QsNC/0YDQtdC0INC+0LTQvtCx0YDQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICfQntC00LHQuNGY0LXQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn0JLRgNC10LzQtSDQv9C+0YfQtdGC0LrQsCDQv9C+0L/RgNCw0LLQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfQktGA0LXQvNC1INC/0L7Rh9C10YLQutCwINC+0L/QvtGA0LDQstC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ9CU0LDRgtGD0Lwg0J7QtNC70YPQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn0KDQvtC6JzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAn0LfQsNGC0LLQvtGA0LXQvdC+INGB0LAg0LDQu9GC0LXRgNC90LDRgtC40LLQvdC40Lwg0YDQtdGI0LXRmtC10LwnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfQlNC+0LTQsNGYINC+0LTQu9GD0LrRgyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9CU0L7QtNCw0YLQvdCwIOKAnklUU03igJ0g0L/QvtGZ0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAn0JTQvtC00LDRgtC90LAg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CU0L7Qt9Cy0L7RmdCw0LLQsCDQtNC+0LTQsNCy0LDRmtC1INC90LDQv9C+0LzQtdC90LAg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCd0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CU0L7Qt9Cy0L7RmdCw0LLQsCDQtNC+0LTQsNCy0LDRmtC1INC90LDQv9C+0LzQtdC90LAg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INC40L3RgtC10YDRhNC10ZjRgdCwINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICfQmNC30LzQtdC90LAg4oCeSVRTTeKAnSDQv9C+0ZnQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfQntC00LvRg9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LTQsCDQu9C4INGY0LUg0L3QtdC+0L/RhdC+0LTQvdC+INC30LDQutGZ0YPRh9Cw0LLQsNGa0LUg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAgKNCw0LrQviDRgtC40LrQtdGCINGY0L7RiCDRg9Cy0LXQuiDQvdC40ZjQtSDQt9Cw0LrRmdGD0YfQsNC9LCDRgtC40LrQtdGCINGb0LUg0LTQvtCx0LjRgtC4INGB0YLQsNGC0YPRgSDQt9Cw0LrRmdGD0YfQsNC9INC4INGC0YDQtdC90YPRgtC90Lgg0L7Qv9C10YDQsNGC0LXRgCDRm9C1INCx0LjRgtC4INCw0YPRgtC+0LzQsNGC0YHQutC4INC/0L7RgdGC0LDQstGZ0LXQvSDQutCw0L4g0LLQu9Cw0YHQvdC40LopLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC00LAg0LvQuCDRmNC1INC90LXQvtC/0YXQvtC00L3QviDQt9Cw0LrRmdGD0YfQsNCy0LDRmtC1INGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwICjQsNC60L4g0YLQuNC60LXRgiDRmNC+0Ygg0YPQstC10Log0L3QuNGY0LUg0LfQsNC60ZnRg9GH0LDQvSwg0YLQuNC60LXRgiDRm9C1INC00L7QsdC40YLQuCDRgdGC0LDRgtGD0YEg0LfQsNC60ZnRg9GH0LDQvSDQuCDRgtGA0LXQvdGD0YLQvdC4INC+0L/QtdGA0LDRgtC10YAg0ZvQtSDQsdC40YLQuCDQsNGD0YLQvtC80LDRgtGB0LrQuCDQv9C+0YHRgtCw0LLRmdC10L0g0LrQsNC+INCy0LvQsNGB0L3QuNC6KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC00LAg0LvQuCDRm9C1INGB0YLQsNGC0YPRgSDQuNC90YbQuNC00LXQvdGC0LAg0YHQtdGA0LLQuNGB0LAg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvSDRgtC+0LrQvtC8INC40LfQsdC+0YDQsCDRgdC10YDQstC40YHQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0YHQsNC00YDQttCw0Zgg0L3QsNC/0L7QvNC10L3QtSDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QvtCzIOKAnklUU03igJ0g0L/QvtGZ0LAgINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INGB0LDQtNGA0LbQsNGYINC90LDQv9C+0LzQtdC90LUg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INC90LDRgNC10LTQvdC4INGB0YLQsNGC0YPRgSDRgtC40LrQtdGC0LAg0L/QvtGB0LvQtSDQtNC+0LTQsNCy0LDRmtCwINC90LDQv9C+0LzQtdC90LUsINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INC90LDRgNC10LTQvdC4INGB0YLQsNGC0YPRgSDRgtC40LrQtdGC0LAg0L/QvtGB0LvQtSDQtNC+0LTQsNCy0LDRmtCwINC90LDQv9C+0LzQtdC90LUsINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L/RgNC10LTQvNC10YIg0L3QsNC/0L7QvNC10L3QtSwg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCdINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INC/0YDQtdC00LzQtdGCINC90LDQv9C+0LzQtdC90LUsINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INC/0YDQuNC+0YDQuNGC0LXRgiDRgtC40LrQtdGC0LAsINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L/RgNC40L7RgNC40YLQtdGCINGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0YLQuNC/INC90LDQv9C+0LzQtdC90LUsINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC4INGC0LjQvyDQvdCw0L/QvtC80LXQvdC1INC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQutC+0LzQtdC90YLQsNGAINC30LAg0LjRgdGC0L7RgNC40ZjQsNGCINC30LAg0LDQutGG0LjRmNGDINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAnSDQv9C+0ZnQsCDQutC+0ZjQtSDRm9C1INGB0LUg0LrQvtGA0LjRgdGC0LjRgtC4INC30LAg0LjRgdGC0L7RgNC40ZjQsNGCINGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LrQvtC80LXQvdGC0LDRgCDQt9CwINC40YHRgtC+0YDQuNGY0LDRgiDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0LrQvtGY0Lgg0ZvQtSDRgdC1INC60L7RgNC40YHRgtC40YLQuCDQt9CwINC40YHRgtC+0YDQuNGY0LDRgiDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDRgtC40L8g0LjRgdGC0L7RgNC40ZjQsNGC0LAg0LfQsCDQsNC60YbQuNGY0YMg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCdINC/0L7RmdCwINC60L7RmNC1INGb0LUg0YHQtSDQutC+0YDQuNGB0YLQuNGC0Lgg0LfQsCDQuNGB0YLQvtGA0LjRmNCw0YIg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDRgtC40L8g0LjRgdGC0L7RgNC40ZjQsNGC0LAg0L3QsCDQsNC60YbQuNGY0YMg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INC60L7RmNC4INGb0LUg0YHQtSDQutC+0YDQuNGB0YLQuNGC0Lgg0LfQsCDQuNGB0YLQvtGA0LjRmNCw0YIg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INGB0LvQtdC00LXRm9C4INGB0YLQsNGC0YPRgSDRgtC40LrQtdGC0LAg0L3QsNC60L7QvSDQtNC+0LTQsNCy0LDRmtCwINC90LDQv9C+0LzQtdC90LUg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCd0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDRgdC70LXQtNC10ZvQuCDRgdGC0LDRgtGD0YEg0YLQuNC60LXRgtCwINC90LDQutC+0L0g0LTQvtC00LDQstCw0ZrQsCDQvdCw0L/QvtC80LXQvdC1INC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfQlNC40L3QsNC80LjRh9C60LAg0L/QvtGZ0LAg0L/RgNC40LrQsNC30LDQvdCwINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAndC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4g0JzQvtCz0YPRm9CwINC/0L7QtNC10YjQsNCy0LDRmtCwOiAwID0g0J7QvdC10LzQvtCz0YPRm9C10L3QviwgMSA9INCe0LzQvtCz0YPRm9C10L3QviwgMiA9INCe0LzQvtCz0YPRm9C10L3QviDQuCDQvdC10L7Qv9GF0L7QtNC90L4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ9CU0LjQvdCw0LzQuNGH0LrQsCDQv9C+0ZnQsCDQv9GA0LjQutCw0LfQsNC90LAg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4g0JzQvtCz0YPRm9CwINC/0L7QtNC10YjQsNCy0LDRmtCwOiAwID0g0J7QvdC10LzQvtCz0YPRm9C10L3QviwgMSA9INCe0LzQvtCz0YPRm9C10L3QviwgMiA9INCe0LzQvtCz0YPRm9C10L3QviDQuCDQvdC10L7Qv9GF0L7QtNC90L4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ9CU0LjQvdCw0LzQuNGH0LrQsCDQv9C+0ZnQsCDQv9GA0LjQutCw0LfQsNC90LAg0L3QsCDQtdC60YDQsNC90YMg0L/RgNC10YLRgNCw0LPQtSDRgtC40LrQtdGC0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLiDQnNC+0LPRg9Gb0LAg0L/QvtC00LXRiNCw0LLQsNGa0LA6IDAgPSDQntC90LXQvNC+0LPRg9Gb0LXQvdC+LCAxID0g0J7QvNC+0LPRg9Gb0LXQvdC+Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAn0JTQuNC90LDQvNC40YfQutCwINC/0L7RmdCwINC/0YDQuNC60LDQt9Cw0L3QsCDQvdCwINC10LrRgNCw0L3RgyDQtNC10YLQsNGZ0L3QvtCzINC/0YDQuNC60LDQt9CwINGC0LjQutC10YLQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuINCc0L7Qs9GD0ZvQsCDQv9C+0LTQtdGI0LDQstCw0ZrQsDogMCA9INCe0L3QtdC80L7Qs9GD0ZvQtdC90L4sIDEgPSDQntC80L7Qs9GD0ZvQtdC90L4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICfQkNC60YLQuNCy0LjRgNCwINGB0YLQsNGC0LjRgdGC0LjRh9C60Lgg0LzQvtC00YPQuyDQt9CwINCz0LXQvdC10YDQuNGB0LDRmtC1INGB0YLQsNGC0LjRgdGC0LjQutC1INC+INC/0YDQvtGB0LXQutGDINGA0LXRiNCw0LLQsNGa0LAg4oCeSVRTTeKAnSDRgtC40LrQtdGC0LAg0L3QsCDQv9GA0LLQvtC8INC90LjQstC+0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAn0JDQutGC0LjQstC40YDQsCDRgdGC0LDRgtC40YHRgtC40YfQutC4INC80L7QtNGD0Lsg0LfQsCDQs9C10L3QtdGA0LjRgdCw0ZrQtSDRgdGC0LDRgtC40YHRgtC40LrQtSDQviDQv9GA0L7RgdC10LrRgyDRgNC10YjQsNCy0LDRmtCwIOKAnklUU03igJ0g0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQkNC60L4g0ZjQtSDQvtC/0LXRgNCw0YLQtdGAINC00L7QtNCw0L4g0L3QsNC/0L7QvNC10L3Rgywg0L/QvtC00LXRiNCw0LLQsCDRgdGC0LDRgtGD0YEg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAndC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQkNC60L4g0ZjQtSDQvtC/0LXRgNCw0YLQtdGAINC00L7QtNCw0L4g0L3QsNC/0L7QvNC10L3Rgywg0L/QvtC00LXRiNCw0LLQsCDRgdGC0LDRgtGD0YEg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAndC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7RgtGA0LXQsdC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDRg9C/0L7RgtGA0LXQsdGDINC10LrRgNCw0L3QsCDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC00LXRiNCw0LLQsCDRgdC10YDQstC40YEg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSDigJ5JVFNN4oCdINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAo0KLQuNC60LXRgjo60KHQtdGA0LLQuNGBINGC0YDQtdCx0LAg0LDQutGC0LjQstC40YDQsNGC0LgpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LTQtdGI0LDQstCwINGB0LXRgNCy0LjRgSDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwICjQotC40LrQtdGCOjrQodC10YDQstC40YEg0YLRgNC10LHQsCDQsNC60YLQuNCy0LjRgNCw0YLQuCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQstC70LDRgdC90LjQutCwINGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QvtCzIOKAnklUU03igJ0g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQstC70LDRgdC90LjQutCwINGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L7QtNCz0L7QstC+0YDQvdC+0LMg0LfQsCDRgtC40LrQtdGCINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC+0LMg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC+0LTQs9C+0LLQvtGA0L3QvtCzINC30LAg0YLQuNC60LXRgiDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7QtNC10YjQsNCy0LAg0YLQuNC/INGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QvtCzIOKAnklUU03igJ0g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwICjQotC40LrQtdGCOjrQotC40L8g0YLRgNC10LHQsCDQsNC60YLQuNCy0LjRgNCw0YLQuCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LTQtdGI0LDQstCwINGC0LjQvyDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAo0KLQuNC60LXRgjo60KLQuNC/INGC0YDQtdCx0LAg0LDQutGC0LjQstC40YDQsNGC0LgpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0L/RgNC+0LzQtdC90YMg0L7QtNC70YPQutC1INGC0LjQutC10YLQsCDQvdCwINC00LXRgtCw0ZnQvdC+0Lwg0L/RgNC40LrQsNC30YMg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CjINC80LXQvdC40ZjRgyDQv9GA0LjQutCw0LfRg9GY0LUg0LLQtdC30YMg0LfQsCDQv9GA0L7QvNC10L3RgyDQtNC+0LTQsNGC0L3QuNGFIOKAnklUU03igJ0g0L/QvtGZ0LAg0L3QsCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC70LjRgdGC0YMg0YHQstC40YUg0YPQutGZ0YPRh9C10L3QuNGFINC+0L/QtdGA0LDRgtC10YDQsCDQvdCwINC+0LLQsNGYINGC0LjQutC10YIg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCdINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9GA0LjQutCw0LfRg9GY0LUg0LvQuNGB0YLRgyDRgdCy0LjRhSDRg9C60ZnRg9GH0LXQvdC40YUg0L7Qv9C10YDQsNGC0LXRgNCwINC90LAg0L7QstCw0Zgg0YLQuNC60LXRgiDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQu9C40YHRgtGDINGB0LLQuNGFINC80L7Qs9GD0ZvQuNGFINC+0L/QtdGA0LDRgtC10YDQsCAo0YHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwINC00L7Qt9Cy0L7Qu9C+0Lwg0LfQsCDQvdCw0L/QvtC80LXQvdGDINC30LAg0YDQtdC0L9GC0LjQutC10YIpINGA0LDQtNC4INGD0YLQstGA0ZLQuNCy0LDRmtCwINC60L4g0YLRgNC10LHQsCDQtNCwINCx0YPQtNC1INC40L3RhNC+0YDQvNC40YHQsNC9INC+INC+0LLQvtGYINC90LDQv9C+0LzQtdC90LgsINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUg4oCeSVRTTeKAnSDQv9C+0ZnQsCDRgtC40LrQtdGC0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC70LjRgdGC0YMg0YHQstC40YUg0LzQvtCz0YPRm9C40YUg0L7Qv9C10YDQsNGC0LXRgNCwICjRgdCy0Lgg0L7Qv9C10YDQsNGC0LXRgNC4INGB0LAg0LTQvtC30LLQvtC70L7QvCDQt9CwINC90LDQv9C+0LzQtdC90YMg0LfQsCDRgNC10LQv0YLQuNC60LXRgikg0YDQsNC00Lgg0YPRgtCy0YDRktC40LLQsNGa0LAg0LrQviDRgtGA0LXQsdCwINC00LAg0LHRg9C00LUg0LjQvdGE0L7RgNC80LjRgdCw0L0g0L4g0L7QstC+0Zgg0L3QsNC/0L7QvNC10L3QuCwg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGC0LjQutC10YLQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC+0L/RhtC40ZjQtSDQv9GA0LjQvtGA0LjRgtC10YLQsCDQt9CwINGC0LjQutC10YIg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90L7QsyDigJ5JVFNN4oCdINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQvtC/0YbQuNGY0LUg0L/RgNC40L7RgNC40YLQtdGC0LAg0LfQsCDRgtC40LrQtdGCINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQv9C+0ZnQsCDQvdCw0YHQu9C+0LLQsCDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QvtCzIOKAnklUU03igJ0g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQv9C+0ZnQsCDQvdCw0YHQu9C+0LLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAn0J7QtNC70YPQutCwINGC0LjQutC10YLQsC4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0xhdG5fSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJ1Byb21lbmkgT2RsdWt1IFRpa2V0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnSXptZW5hIOKAnklUU03igJ0gcG9samEgdGlrZXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdJbmNpZGVudG5vIHN0YW5qZSBzZXJ2aXNhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1BvdmXFvmkgdGlrZXQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpxI1ub3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ1V0aWNhaic7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnT2JhdmV6bmEgcmVjZW56aWphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1JlenVsdGF0IG9kbHVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ09kb2JyZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ09kbG/FvmVubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICdVbmFwcmVkIG9kb2JyZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnT2RiaWplbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdWcmVtZSBwb8SNZXRrYSBwb3ByYXZrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnVnJlbWUgcG/EjWV0a2Egb3BvcmF2a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdHVtIE9kbHVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1Jvayc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ3phdHZvcmVubyBzYSBhbHRlcm5hdGl2bmltIHJlxaFlbmplbSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0RvZGFqIG9kbHVrdSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0bmEg4oCeSVRTTeKAnSBwb2xqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdEb2RhdG5hIOKAnklUU03igJ0gcG9samEgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEb3p2b2xqYXZhIGRvZGF2YW5qZSBuYXBvbWVuYSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnXBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRG96dm9samF2YSBkb2RhdmFuamUgbmFwb21lbmEgbmEgZWtyYW51IG9kbHVrZSBpbnRlcmZlanNhIG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdJem1lbmEg4oCeSVRTTeKAnSBwb2xqYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdPZGx1a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBkYSBsaSBqZSBuZW9waG9kbm8gemFrbGp1xI1hdmFuamUgdGlrZXRhIG5hIGVrcmFudSBkb2RhdG5paCDigJ5JVFNN4oCdIHBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKGFrbyB0aWtldCBqb8WhIHV2ZWsgbmlqZSB6YWtsanXEjWFuLCB0aWtldCDEh2UgZG9iaXRpIHN0YXR1cyB6YWtsanXEjWFuIGkgdHJlbnV0bmkgb3BlcmF0ZXIgxIdlIGJpdGkgYXV0b21hdHNraSBwb3N0YXZsamVuIGthbyB2bGFzbmlrKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnT2RyZcSRdWplIGRhIGxpIGplIG5lb3Bob2RubyB6YWtsanXEjWF2YW5qZSB0aWtldGEgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhIChha28gdGlrZXQgam/FoSB1dmVrIG5pamUgemFrbGp1xI1hbiwgdGlrZXQgxIdlIGRvYml0aSBzdGF0dXMgemFrbGp1xI1hbiBpIHRyZW51dG5pIG9wZXJhdGVyIMSHZSBiaXRpIGF1dG9tYXRza2kgcG9zdGF2bGplbiBrYW8gdmxhc25paykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIGRhIGxpIMSHZSBzdGF0dXMgaW5jaWRlbnRhIHNlcnZpc2EgYml0aSBwcmlrYXphbiB0b2tvbSBpemJvcmEgc2VydmlzYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBzYWRyxb5haiBuYXBvbWVuZSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnSBwb2xqYSAgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBzYWRyxb5haiBuYXBvbWVuZSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHBvZHJhenVtZXZhbmkgbmFyZWRuaSBzdGF0dXMgdGlrZXRhIHBvc2xlIGRvZGF2YW5qYSBuYXBvbWVuZSwgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb2RyYXp1bWV2YW5pIG5hcmVkbmkgc3RhdHVzIHRpa2V0YSBwb3NsZSBkb2RhdmFuamEgbmFwb21lbmUsIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHBvZHJhenVtZXZhbmkgcHJlZG1ldCBuYXBvbWVuZSwgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBwcmVkbWV0IG5hcG9tZW5lLCBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBwcmlvcml0ZXQgdGlrZXRhLCBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBwcmlvcml0ZXQgdGlrZXRhIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSB0aXAgbmFwb21lbmUsIG5hIGVrcmFudSBkb2RhdG5vZyDigJ5JVFNN4oCdIHBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSB0aXAgbmFwb21lbmUgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBrb21lbnRhciB6YSBpc3RvcmlqYXQgemEgYWtjaWp1IG5hIGVrcmFudSBkb2RhdG5vZyDigJ5JVFNN4oCdIHBvbGphIGtvamUgxIdlIHNlIGtvcmlzdGl0aSB6YSBpc3RvcmlqYXQgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnT2RyZcSRdWplIGtvbWVudGFyIHphIGlzdG9yaWphdCBuYSBla3JhbnUgb2RsdWtlIGtvamkgxIdlIHNlIGtvcmlzdGl0aSB6YSBpc3RvcmlqYXQgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSB0aXAgaXN0b3JpamF0YSB6YSBha2NpanUgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEga29qZSDEh2Ugc2Uga29yaXN0aXRpIHphIGlzdG9yaWphdCB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdPZHJlxJF1amUgdGlwIGlzdG9yaWphdGEgbmEgYWtjaWp1IG5hIGVrcmFudSBvZGx1a2Uga29qaSDEh2Ugc2Uga29yaXN0aXRpIHphIGlzdG9yaWphdCB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBzbGVkZcSHaSBzdGF0dXMgdGlrZXRhIG5ha29uIGRvZGF2YW5qYSBuYXBvbWVuZSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnXBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmnFoWUgc2xlZGXEh2kgc3RhdHVzIHRpa2V0YSBuYWtvbiBkb2RhdmFuamEgbmFwb21lbmUgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnRGluYW1pxI1rYSBwb2xqYSBwcmlrYXphbmEgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ1wb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLiBNb2d1xIdhIHBvZGXFoWF2YW5qYTogMCA9IE9uZW1vZ3XEh2VubywgMSA9IE9tb2d1xIdlbm8sIDIgPSBPbW9ndcSHZW5vIGkgbmVvcGhvZG5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdEaW5hbWnEjWthIHBvbGphIHByaWthemFuYSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuIE1vZ3XEh2EgcG9kZcWhYXZhbmphOiAwID0gT25lbW9ndcSHZW5vLCAxID0gT21vZ3XEh2VubywgMiA9IE9tb2d1xIdlbm8gaSBuZW9waG9kbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ0RpbmFtacSNa2EgcG9samEgcHJpa2F6YW5hIG5hIGVrcmFudSBwcmV0cmFnZSB0aWtldGEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4gTW9ndcSHYSBwb2RlxaFhdmFuamE6IDAgPSBPbmVtb2d1xIdlbm8sIDEgPSBPbW9ndcSHZW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnRGluYW1pxI1rYSBwb2xqYSBwcmlrYXphbmEgbmEgZWtyYW51IGRldGFsam5vZyBwcmlrYXphIHRpa2V0YSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLiBNb2d1xIdhIHBvZGXFoWF2YW5qYTogMCA9IE9uZW1vZ3XEh2VubywgMSA9IE9tb2d1xIdlbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdBa3RpdmlyYSBzdGF0aXN0acSNa2kgbW9kdWwgemEgZ2VuZXJpc2FuamUgc3RhdGlzdGlrZSBvIHByb3Nla3UgcmXFoWF2YW5qYSDigJ5JVFNN4oCdIHRpa2V0YSBuYSBwcnZvbSBuaXZvdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdBa3RpdmlyYSBzdGF0aXN0acSNa2kgbW9kdWwgemEgZ2VuZXJpc2FuamUgc3RhdGlzdGlrZSBvIHByb3Nla3UgcmXFoWF2YW5qYSDigJ5JVFNN4oCdIHRpa2V0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQWtvIGplIG9wZXJhdGVyIGRvZGFvIG5hcG9tZW51LCBwb2RlxaFhdmEgc3RhdHVzIHRpa2V0YSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnXBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQWtvIGplIG9wZXJhdGVyIGRvZGFvIG5hcG9tZW51LCBwb2RlxaFhdmEgc3RhdHVzIHRpa2V0YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG90cmVibmUgZG96dm9sZSB6YSB1cG90cmVidSBla3JhbmEgZG9kYXRub2cg4oCeSVRTTeKAnXBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQb3RyZWJuZSBkb3p2b2xlIHphIHVwb3RyZWJ1IGVrcmFuYSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1BvZGXFoWF2YSBzZXJ2aXMgbmEgZWtyYW51IGRvZGF0bmloIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYSAoVGlrZXQ6OlNlcnZpcyB0cmViYSBha3RpdmlyYXRpKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUG9kZcWhYXZhIHNlcnZpcyBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKFRpa2V0OjpTZXJ2aXMgdHJlYmEgYWt0aXZpcmF0aSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHZsYXNuaWthIHRpa2V0YSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHZsYXNuaWthIHRpa2V0YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIG9kZ292b3Jub2cgemEgdGlrZXQgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBvZGdvdm9ybm9nIHphIHRpa2V0IG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdQb2RlxaFhdmEgdGlwIHRpa2V0YSBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhIChUaWtldDo6VGlwIHRyZWJhIGFrdGl2aXJhdGkpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUG9kZcWhYXZhIHRpcCB0aWtldGEgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhIChUaWtldDo6VGlwIHRyZWJhIGFrdGl2aXJhdGkpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcm9tZW51IG9kbHVrZSB0aWtldGEgbmEgZGV0YWxqbm9tIHByaWthenUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcm9tZW51IGRvZGF0bmloIOKAnklUU03igJ0gcG9samEgbmEgZGV0YWxqbm9tIHByaWthenUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIGxpc3R1IHN2aWggdWtsanXEjWVuaWggb3BlcmF0ZXJhIG5hIG92YWogdGlrZXQgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgbGlzdHUgc3ZpaCB1a2xqdcSNZW5paCBvcGVyYXRlcmEgbmEgb3ZhaiB0aWtldCBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIGxpc3R1IHN2aWggbW9ndcSHaWggb3BlcmF0ZXJhIChzdmkgb3BlcmF0ZXJpIHNhIGRvenZvbG9tIHphIG5hcG9tZW51IHphIHJlZC90aWtldCkgcmFkaSB1dHZyxJFpdmFuamEga28gdHJlYmEgZGEgYnVkZSBpbmZvcm1pc2FuIG8gb3ZvaiBuYXBvbWVuaSwgbmEgZWtyYW51IGRvZGF0bmloIOKAnklUU03igJ0gcG9samEgdGlrZXRhIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgbGlzdHUgc3ZpaCBtb2d1xIdpaCBvcGVyYXRlcmEgKHN2aSBvcGVyYXRlcmkgc2EgZG96dm9sb20gemEgbmFwb21lbnUgemEgcmVkL3Rpa2V0KSByYWRpIHV0dnLEkWl2YW5qYSBrbyB0cmViYSBkYSBidWRlIGluZm9ybWlzYW4gbyBvdm9qIG5hcG9tZW5pLCBuYSBla3JhbnUgb2RsdWtlIHRpa2V0YSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1ByaWthenVqZSBvcGNpamUgcHJpb3JpdGV0YSB6YSB0aWtldCBuYSBla3JhbnUgZG9kYXRub2cg4oCeSVRTTeKAnSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIG9wY2lqZSBwcmlvcml0ZXRhIHphIHRpa2V0IG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIHBvbGphIG5hc2xvdmEgbmEgZWtyYW51IGRvZGF0bm9nIOKAnklUU03igJ0gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgcG9samEgbmFzbG92YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdPZGx1a2EgdGlrZXRhLic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN3X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdCYWRpbGlzaGEgdGlrZXRpIHlhIHVhbXV6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnQmFkaWxpIHRpa2V0aSB5YSB1Z2Egd2EgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnSGFsaSB5YSB0dWtpbyB5YSBodWR1bWEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnVGlrZXRpIGtpdW5nbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3dhIGtpbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnTWFkaGFyYSc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnbWFwaXRpbyB5YW5haGl0YWppa2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnTWF0b2tlbyB5YSB1YW11emknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdLdWlkaGluaXNoYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnTXVkYSB3YSBrdWFuemEgd2EgbWF0ZW5nZW5lem8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ011ZGEgd2Ega3VhbnphIHdhIHVyZWplc2hpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdUYXJlaGUgeWEgdWFtdXppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnVGFyZWhlIHVrb21vJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnRnVuZ3dhIG5hIG1rdXNhbnlpa28ga2F6aSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ09uZ2V6YSB1YW11emkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdVZ2EgemlsaXpvb25nZXp3YSBaYSBJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2EgbnlvbmdlemEgeWEgSVRTTSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0JhZGlsaSB1Z2Egd2EgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdVYW11emknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2FtYSBrdWZ1bmd3YSBrd2EgdGlrZXRpIGt1bmF0YWtpd2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYSAoa2FtYSB0aWtldGkgaGFpamFmdW5nd2EgYmFkbywgdGlrZXRpIGluYWZ1bmd3YSBuYSB3YWthbGEgd2Egc2FzYSBhdGF3ZWt3YSBvdG9tYXRpa2kga2FtYSBtbWlsaWtpIHdha2UpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGthbWEga3VmdW5nd2Ega3dhIHRpa2V0aSBrdW5hdGFraXdhIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYSAoa2FtYSB0aWtldGkgaGFpamFmdW5nd2EgYmFkbywgdGlrZXRpIGluYWZ1bmd3YSBuYSB3YWthbGEgd2Egc2FzYSBhdGF3ZWt3YSBvdG9tYXRpa2kga2FtYSBtbWlsaWtpIHdha2UpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgIGthbWEgaGFsaSB5YSB0dWtpbyB5YSBodWR1bWEgaW9ueWVzaHdlIHdha2F0aSB3YSBjaGFndW8gbGEgaHVkdW1hIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBraWluaSBjaGEgY2hhZ3VvLW1zaW5naSBjaGEga2lkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpaW5pIGNoYSBjaGFndW8tbXNpbmdpIGNoYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBoYWxpIG5heW9mdWF0YSB5YSBjaGFndW8tbXNpbmdpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBoYWxpIGluYXlvZnVhdGEgY2hhZ3VvLW1zaW5naSB5YSB0aWtldGkgYmFhZGEgeWEga3VvbmdlemEga2lkb2tlem8sIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBzb21vIGNoYWd1by1tc2luZ2kgbGEga2lkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHNvbW8gY2hhZ3VvLW1zaW5naSBsYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpcGF1bWJlbGUgY2hhIHRpa2V0aSBjaGFndW8gbXNpbmdpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpaW9uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2lwYXVtYmVsZSBjaGEgdGlrZXRpIGNoYWd1byBtc2luZ2kga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgYWluYSB5YSBjaGFndW8gbXNpbmdpIHlhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgYWluYSB5YSBjaGFndW8gbXNpbmdpIHlhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgbWFvbmkgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSwgYW1iYWNobyBraW5hdHVtaWthIGt3YSBhamlsaSB5YSBoaXN0b3JpYSB5YSB0aWtldGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgbWFvbmkgeWEgaGlzdG9yaWEga3dhIGFpamlsaSB5YSBraXRlbmRvIGNoYSBza3JpbmkgeWEgbWFhbXV6aSwgYW1iYWNobyBraW5hdHVtaWthIGt3YSBhamlsaSB5YSBoaXN0b3JpYSB5YSB0aWtldGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIGFpbmEgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSAsIGFtYmFjaG8ga2luYXR1bWlrYSBrd2EgYWppbGkgeWEgaGlzdG9yaWEgeWEgdGlrZXRpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIGFpbmEgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSBtYWFtdXppLCBhbWJhY2hvIGtpbmF0dW1pa2Ega3dhIGFqaWxpIHlhIGhpc3RvcmlhIHlhIHRpa2V0aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZWxlemVhIGhhbGkgaWZ1YXRheW8geWEgdGlrZXRpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZWxlemVhIGhhbGkgaWZ1YXRheW8geWEgdGlrZXRpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdVZ2Egd2VueWUgbmd1dnUgdW5hb255ZXNod2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuIE1pcGFuZ2lsaW8gaW5heW93ZXpla2E6IDA9S3V0b2t1d2V6ZXNoYSwgMT13ZXplc2hhLCAyPVdlemVzaGEgbmEgaW5haGl0YWppa2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ1VnYSB3ZW55ZSBuZ3V2dSB1bmFvbnllc2h3YSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuIE1pcGFuZ2lsaW8gaW5heW93ZXpla2E6IDA9S3V0b2t1d2V6ZXNoYSwgMT13ZXplc2hhLCAyPVdlemVzaGEgbmEgaW5haGl0YWppa2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ1VnYSB3ZW55ZSBuZ3V2dSB1bmFvbnllc2h3YSBrYXRpa2Egc2tyaW5pIHlhIGt1dGFmdXRhIHRpa2V0aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4gTWlwYW5naWxpbyBpbmF5b3dlemVrYTogMD1LdXRva3V3ZXplc2hhLCAxPXdlemVzaGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdVZ2Egd2VueWUgbmd1dnUgdW5hb255ZXNod2Ega2F0aWthIHNrcmluaSBpbGl5b2t1endhIHlhIHRpa2V0aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4gTWlwYW5naWxpbyBpbmF5b3dlemVrYTogMD1LdXRva3V3ZXplc2hhLCAxPXdlemVzaGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdXZXplc2hhIG1vZHVsaSB6YSB0YWt3aW11IGt1dGVuZ2VuZXphIHRha3dpbXUga3VodXN1IHdhc3Rhbmkgd2Ega2l3YW5nbyBjaGEgdWZ1bWJ1emkgY2hhIG5nYXppIHlhIGt3YW56YSB5YSB0aWtldGkgeWEgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdXZXplc2hhIG1vZHVsaSB6YSB0YWt3aW11IGt1dGVuZ2VuZXphIHRha3dpbXUga3VodXN1IHdhc3Rhbmkgd2EgdWZ1bWJ1emkgd2EgdGlrZXRpIHlhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnS2FtYSBraWRva2V6byBraW1lb25nZXp3YSBuYSB3YWthbGEsIGluYXdla2EgaGFsaSB5YSB0aWtldGkga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdLYW1hIGtpZG9rZXpvIGtpbWVvbmdlendhIG5hIHdha2FsYSwgaW5hd2VrYSBoYWxpIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFoaXRhamkgcnVodXNhIGt1dHVtaWEgc2tyaW5pIHlhIG1hYW11emkga2F0aWthIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnSW5hd2Vrd2Ega2F0aWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaWlvbmdlendhIGthdGlrYSBraW9lbGVzdXJhIGNoYSB3YWthbGEgKFRpa2V0aTo6IEh1ZHVtYSBpbmFoaXRhamkga3VhbWlsaXNod2EpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGV1c3VyYSBjaGEgd2FrYWxhIChUaWtldGk6OiBIdWR1bWEgaW5haGl0YWppIGt1YW1pbGlzaHdhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmF3ZWthIG1taWxpa2kgd2EgdGlrZXRpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gaWxpeW9vbmdlendhIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSBtbWlsaWtpIHdhIHRpa3d0aSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSB0aWtldGkgaW5heW9odXNpa2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSAgd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmF3ZWthIHRpa2V0aSBpbmF5b2h1c2lrYSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnSW5hd2VrYSBhaW5hIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYSAoVGlrZXRpOjpBaW5hIGluYXlvaGl0YWppIGt1YW1pbGlzaHdhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0luYXdla2EgYWluYSB5YSB0aWtldGkga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhIChUaWtldGk6OiBBaW5hIGluYXlvaGl0YWppIGt1YW1pbGlzaHdhICkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYW9ueWVzaGEga2l1bmdvIGthdGlrYSBtZW55dSBjaGEga3ViYWRpbGlzaGEgbWFhbXV6aSB5YSB0aWtldGkga2F0aWthIG1hbmRoYXJpIHlha2UgaWxpeW9rdXp3YSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIGtpdW5nbyBrYXRpa2EgbWVueXUgY2hhIGt1cmVrZWJpc2hhIHVnYSB6YSBJVFNNIHppbGl6b29uZ2V6d2Ega2F0aWthIG1hbmRoYXJpIHlhIGlsaXlva3V6d2EgeWEgdGlrZXRpIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlIHdhbGlvaHVzaWthIGthdGlrYSB0aWtldGkgaGlpLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYW9ueWVzaGEgb3JvZGhhIHlhIG1hd2FrYWxhIHdvdGUgd2FsaW9odXNpa2Ega2F0aWthIHRpa2V0aSBoaWksIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlKCBNYXdha2FsYSB3b3RlIHdlbnllIGtpZG9rZXpvIGNoYSBydWh1c2Ega2F0aWthIGZvbGVuaS90aWtldGkpIHdhbmFvd2V6YSBrdWd1bmR1YSBuYW5pIGF0YWFyaWZpd2Uga3VodXN1IGtpZG9rZXpvIGhpa2ksIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlKCBNYXdha2FsYSB3b3RlIHdlbnllIGtpZG9rZXpvIGNoYSBydWh1c2Ega2F0aWthIGZvbGVuaS90aWtldGkpIHdhbmFvd2V6YSBrdWd1bmR1YSBuYW5pIGF0YWFyaWZpd2Uga3VodXN1IGtpZG9rZXpvIGhpa2ksIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG1pY2hhZ3VvIHllbnllIGtpcGF1bWJlbGUgeWEgdGlrZXRpIGthdGlrYSBza3JpbmkgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFveWVzaGEgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0lueWVzaGEgdWdhIHphIGtpY2h3YSBjaGEgaGFiYXJpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW55ZXNoYSB1Z2Egd2Ega2ljaHdhIGNoYSBoYWJhcmkga2F0aWthIHNrcmluaSB5YSBtYWFtemkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnRoX1RIX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfguYDguJvguKXguLXguYjguKLguJnguIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguILguK3guIfguJXguLHguYvguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+C5gOC4m+C4peC4teC5iOC4ouC4meC4n+C4tOC4peC4lOC5jElUU00g4LiC4Lit4LiH4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICfguIHguLLguKPguJrguKPguLTguIHguLLguKPguKrguJbguLLguJnguKDguLLguJ7guILguK3guIfguYDguKvguJXguLjguIHguLLguKPguJPguYwnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn4Lil4Li04LiH4LiE4LmM4LiV4Lix4LmL4LinJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICfguKfguLTguIHguKTguJUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn4Lic4Lil4LiB4Lij4Liw4LiX4LiaJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfguJXguYnguK3guIfguIHguLLguKPguIHguLLguKPguKfguLTguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn4Lic4Lil4LiC4Lit4LiH4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAn4Lit4LiZ4Li44Lih4Lix4LiV4Li04LmB4Lil4LmJ4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfguIHguLLguKPguIvguYjguK3guKHguYHguIvguKHguYDguKfguKXguLLguYDguKPguLTguYjguKHguJXguYnguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ+C4geC4suC4o+C4geC4ueC5ieC4hOC4t+C4meC5gOC4p+C4peC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn4Lin4Lix4LiZ4LiX4Li14LmI4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn4Lin4Lix4LiZ4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiUJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAn4Lib4Li04LiU4LiU4LmJ4Lin4Lii4Lin4Li04LiY4Li14LmB4LiB4LmJ4Lib4Lix4LiN4Lir4LiyJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn4LmA4Lie4Li04LmI4Lih4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAn4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU00gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguK3guJnguLjguI3guLLguJXguLTguYPguKvguYnguYDguJ7guLTguYjguKHguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTSDguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguK3guJnguLjguI3guLLguJXguLTguYPguKvguYnguYDguJ7guLTguYjguKHguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICfguYDguJvguKXguLXguYjguKLguJnguJ/guLTguKXguJTguYxJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguYjguLLguJbguYnguLLguKvguLLguIHguIjguLPguYDguJvguYfguJnguJXguYnguK3guIfguYPguIrguYnguJXguLHguYvguKfguKXguYfguK3guITguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTSDguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwgKOC4l+C4s+C4geC4suC4o+C4peC5h+C4reC4hOC4leC4seC5i+C4p+C4luC5ieC4suC4leC4seC5i+C4p+C4q+C4suC4geC4ouC4seC4h+C5hOC4oeC5iOC5hOC4lOC5ieC4peC5h+C4reC4hOC5geC4peC4sOC5gOC4i+C4leC5g+C4q+C5ieC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4m+C4seC4iOC4iOC4uOC4muC4seC4meC5gOC4m+C5h+C4meC5gOC4iOC5ieC4suC4guC4reC4h+C4reC4seC4leC5guC4meC4oeC4seC4leC4tCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4LiW4LmJ4Liy4Lir4Liy4LiB4LiI4Liz4LmA4Lib4LmH4LiZ4LiV4LmJ4Lit4LiH4LmD4LiK4LmJ4LiV4Lix4LmL4Lin4Lil4LmH4Lit4LiE4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCAo4LiX4Liz4LiB4Liy4Lij4Lil4LmH4Lit4LiE4LiV4Lix4LmL4Lin4LiW4LmJ4Liy4LiV4Lix4LmL4Lin4Lir4Liy4LiB4Lii4Lix4LiH4LmE4Lih4LmI4LmE4LiU4LmJ4Lil4LmH4Lit4LiE4LmB4Lil4Liw4LmA4LiL4LiV4LmD4Lir4LmJ4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZ4LmA4Lib4LmH4LiZ4LmA4LiI4LmJ4Liy4LiC4Lit4LiH4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4luC5ieC4suC4q+C4suC4geC4quC4luC4suC4meC4oOC4suC4nuC5gOC4q+C4leC4geC4suC4o+C4k+C5jOC4muC4o+C4tOC4geC4suC4o+C4hOC4p+C4o+C5geC4quC4lOC4h+C5g+C4meC4o+C4sOC4q+C4p+C5iOC4suC4h+C4geC4suC4o+C5gOC4peC4t+C4reC4geC4geC4suC4o+C4muC4o+C4tOC4geC4suC4o+C5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguYDguJnguLfguYnguK3guYDguKPguLfguYjguK3guIfguILguK3guIfguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C5gOC4meC4t+C5ieC4reC5gOC4o+C4t+C5iOC4reC4h+C4guC4reC4h+C5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4quC4luC4suC4meC4oOC4suC4nuC4luC4seC4lOC5hOC4m+C4guC4reC4h+C4leC4seC5i+C4p+C4q+C4peC4seC4h+C4iOC4suC4geC5gOC4nuC4tOC5iOC4oeC5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguKrguJbguLLguJnguKDguLLguJ7guJbguLHguJTguYTguJvguILguK3guIfguJXguLHguYvguKfguKvguKXguLHguIfguIjguLLguIHguYDguJ7guLTguYjguKHguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Lir4Lix4Lin4LiC4LmJ4Lit4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguKvguLHguKfguILguYnguK3guYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4peC4s+C4lOC4seC4muC4hOC4p+C4suC4oeC4quC4s+C4hOC4seC4jeC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4peC4s+C4lOC4seC4muC4hOC4p+C4suC4oeC4quC4s+C4hOC4seC4jeC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4m+C4o+C4sOC5gOC4oOC4l+C5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJvguKPguLDguYDguKDguJfguYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJvguKPguLDguKfguLHguJXguLTguIHguLLguKPguYHguKrguJTguIfguITguKfguLLguKHguYDguKvguYfguJnguKrguLPguKvguKPguLHguJrguIHguLLguKPguIHguKPguLDguJfguLPguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTSDguIvguLbguYjguIfguJfguLPguYPguKvguYnguYDguIHguLTguJTguITguKfguLLguKHguITguLjguYnguJnguYDguITguKLguYPguJnguJvguKPguLDguKfguLHguJXguLTguILguK3guIfguJXguLHguYvguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4m+C4o+C4sOC4p+C4seC4leC4tOC4geC4suC4o+C5geC4quC4lOC4h+C4hOC4p+C4suC4oeC5gOC4q+C5h+C4meC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4geC4o+C4sOC4l+C4s+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iCDguIvguLbguYjguIfguJfguLPguYPguKvguYnguYDguIHguLTguJTguITguKfguLLguKHguITguLjguYnguJnguYDguITguKLguYPguJnguJvguKPguLDguKfguLHguJXguLTguILguK3guIfguJXguLHguYvguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJvguKPguLDguYDguKDguJfguJvguKPguLDguKfguLHguJXguLTguKrguLPguKvguKPguLHguJrguIHguLLguKPguIHguKPguLDguJfguLPguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTSDguIvguLbguYjguIfguJfguLPguYPguKvguYnguYDguIHguLTguJTguITguKfguLLguKHguITguLjguYnguJnguYDguITguKLguYPguJnguJvguKPguLDguKfguLHguJXguLTguILguK3guIfguJXguLHguYvguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4m+C4o+C4sOC5gOC4oOC4l+C4m+C4o+C4sOC4p+C4seC4leC4tOC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4geC4o+C4sOC4l+C4s+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iCDguIvguLbguYjguIfguJfguLPguYPguKvguYnguYDguIHguLTguJTguITguKfguLLguKHguITguLjguYnguJnguYDguITguKLguYPguJnguJvguKPguLDguKfguLHguJXguLTguILguK3guIfguJXguLHguYvguKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiW4Lix4LiU4LmE4Lib4LiC4Lit4LiH4LiV4Lix4LmL4Lin4Lir4Lil4Lix4LiH4LiI4Liy4LiB4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguKrguJbguLLguJnguKDguLLguJ7guJbguLHguJTguYTguJvguILguK3guIfguJXguLHguYvguKfguKvguKXguLHguIfguIjguLLguIHguYDguJ7guLTguYjguKHguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ+C5hOC4lOC4meC4suC4oeC4tOC4hOC4n+C4tOC4peC4lOC5jOC5geC4quC4lOC4h+C5g+C4meC4q+C4meC5ieC4suC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMIOC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4l+C4teC5iOC5gOC4m+C5h+C4meC5hOC4m+C5hOC4lOC5ieC4hOC4t+C4rSAwID0gIOC4m+C4tOC4lOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4mSAxID0g4LmA4Lib4Li04LiU4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZIDIgPSDguYDguJvguLTguJTguYPguIrguYnguIfguLLguJnguYHguKXguLDguIjguLPguYDguJvguYfguJnguJXguYnguK3guIfguYPguIrguYknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAn4LmE4LiU4LiZ4Liy4Lih4Li04LiE4Lif4Li04Lil4LiU4LmM4LmB4Liq4LiU4LiH4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMIOC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4l+C4teC5iOC5gOC4m+C5h+C4meC5hOC4m+C5hOC4lOC5ieC4hOC4t+C4rSAwID0g4Lib4Li04LiU4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZIDEgPSDguYDguJvguLTguJTguIHguLLguKPguYPguIrguYnguIfguLLguJkgMiA9IOC5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC5geC4peC4sOC4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C5g+C4iuC5iSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfguYTguJTguJnguLLguKHguLTguITguJ/guLTguKXguJTguYzguYHguKrguJTguIfguYPguJnguKvguJnguYnguLLguIHguLLguKPguITguYnguJnguKvguLLguJXguLHguYvguKfguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwg4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LiX4Li14LmI4LmA4Lib4LmH4LiZ4LmE4Lib4LmE4LiU4LmJ4LiE4Li34LitIDAgPSDguJvguLTguJTguIHguLLguKPguYPguIrguYnguIfguLLguJkgMSA9IOC5gOC4m+C4tOC4lOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAn4LmE4LiU4LiZ4Liy4Lih4Li04LiE4Lif4Li04Lil4LiU4LmM4LmB4Liq4LiU4LiH4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiB4Liy4Lij4LiL4Li54Lih4LiV4Lix4LmL4Lin4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMIOC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4l+C4teC5iOC5gOC4m+C5h+C4meC5hOC4m+C5hOC4lOC5ieC4hOC4t+C4rSAwID0g4Lib4Li04LiU4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZIDEgPSDguYDguJvguLTguJTguIHguLLguKPguYPguIrguYnguIfguLLguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ+C5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C5guC4oeC4lOC4ueC4peC5gOC4nuC4t+C5iOC4reC4quC4o+C5ieC4suC4h+C4quC4luC4tOC4leC4tOC5gOC4geC4teC5iOC4ouC4p+C4geC4seC4muC4hOC5iOC4suC5gOC4ieC4peC4teC5iOC4ouC4geC4suC4o+C5geC4geC5ieC4m+C4seC4jeC4q+C4suC4guC4seC5ieC4meC5geC4o+C4geC4guC4reC4h+C4leC4seC5i+C4pyBJVFNNICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ+C5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C5guC4oeC4lOC4ueC4peC5gOC4nuC4t+C5iOC4reC4quC4o+C5ieC4suC4h+C4quC4luC4tOC4leC4tOC5gOC4geC4teC5iOC4ouC4p+C4geC4seC4muC4hOC5iOC4suC5gOC4ieC4peC4teC5iOC4ouC4guC4reC4h+C4geC4suC4o+C5geC4geC5ieC4m+C4seC4jeC4q+C4suC4leC4seC5i+C4pyBJVFNNICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYDguIvguJXguKrguJbguLLguJnguKDguLLguJ7guILguK3guIfguJXguLHguYvguKfguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4q+C4suC4geC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC5hOC4lOC5ieC5gOC4nuC4tOC5iOC4oeC5guC4meC5ieC4lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4q+C4suC4geC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC5hOC4lOC5ieC5gOC4nuC4tOC5iOC4oeC5guC4meC5ieC4lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C4reC4meC4jeC4suC4leC4tOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiI4Liz4LmA4Lib4LmH4LiZ4LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4Lit4LiZ4LiN4Liy4LiV4Li04LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZ4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4Lij4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwo4LiV4Lix4LmL4LinOjrguJXguYnguK3guIfguKHguLXguIHguLLguKPguYDguJvguLTguJTguYPguIrguYnguIfguLLguJnguIHguLLguKPguJrguKPguLTguIHguLLguKMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4geC4suC4o+C4muC4o+C4tOC4geC4suC4o+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCjguJXguLHguYvguKc6OuC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4geC4suC4o+C4muC4o+C4tOC4geC4suC4oyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYDguIvguJXguYDguIjguYnguLLguILguK3guIfguJXguLHguYvguKfguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LmA4LiI4LmJ4Liy4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LiE4Lin4Liy4Lih4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4Lia4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4hOC4p+C4suC4oeC4o+C4seC4muC4nOC4tOC4lOC4iuC4reC4muC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4m+C4o+C4sOC5gOC4oOC4l+C4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMKOC4leC4seC5i+C4pzo64LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4LijKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn4LmA4LiL4LiV4Lib4Lij4Liw4LmA4Lig4LiX4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMKOC4leC4seC5i+C4pzo64LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4LijKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYDguJ7guLfguYjguK3guYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIfguIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguILguK3guIfguJXguLHguYvguKfguYPguJnguKHguLjguKHguKHguK3guIfguIHguLLguKPguIvguLnguKHguILguK3guIfguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYDguJ7guLfguK3guYHguIHguYnguYTguILguJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTSDguYPguJnguKHguLjguKHguKHguK3guIfguIHguLLguKPguIvguLnguKHguILguK3guIfguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lij4Liy4Lii4LiK4Li34LmI4Lit4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LiX4Li14LmI4LmA4LiB4Li14LmI4Lii4Lin4LiC4LmJ4Lit4LiH4LiB4Lix4Lia4LiV4Lix4LmL4Lin4LiZ4Li14LmJ4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKPguLLguKLguIrguLfguYjguK3guYDguK3guYDguKLguYjguJnguJXguYzguJfguLXguYjguYDguIHguLXguYjguKLguKfguILguYnguK3guIfguIHguLHguJrguJXguLHguYvguKfguJnguLXguYnguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKPguLLguKLguIrguLfguYjguK3guYDguK3guYDguKLguYjguJnguJXguYzguJfguLHguYnguIfguKvguKHguJTguJfguLXguYjguYDguJvguYfguJnguYTguJvguYTguJTguYkgKOC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4l+C4teC5iOC5hOC4lOC5ieC4o+C4seC4muC5guC4meC5ieC4leC4reC4meC4uOC4jeC4suC4leC4tOC5g+C4meC4hOC4tOC4py/guJXguLHguYvguKcpIOC5gOC4nuC4t+C5iOC4reC4geC4s+C4q+C4meC4lOC4p+C5iOC4suC5g+C4hOC4o+C4hOC4p+C4o+C4o+C4suC4ouC4h+C4suC4meC5gOC4geC4teC5iOC4ouC4p+C4geC4seC4muC5guC4meC5ieC4leC4meC4teC5ieC5g+C4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lij4Liy4Lii4LiK4Li34LmI4Lit4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LiX4Lix4LmJ4LiH4Lir4Lih4LiU4LiX4Li14LmI4LmA4Lib4LmH4LiZ4LmE4Lib4LmE4LiU4LmJICjguYDguK3guYDguKLguYjguJnguJXguYzguJfguLHguYnguIfguKvguKHguJTguJfguLXguYjguYTguJTguYnguKPguLHguJrguYLguJnguYnguJXguK3guJnguLjguI3guLLguJXguLTguYPguJnguITguLTguKcv4LiV4Lix4LmL4LinKSDguYDguJ7guLfguYjguK3guIHguLPguKvguJnguJTguKfguYjguLLguYPguITguKPguITguKfguKPguKPguLLguKLguIfguLLguJnguYDguIHguLXguYjguKLguKfguIHguLHguJrguYLguJnguYnguJXguJnguLXguYnguYPguJnguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIjguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguJXguLHguKfguYDguKXguLfguK3guIHguILguK3guIfguKXguLPguJTguLHguJrguITguKfguLLguKHguKrguLPguITguLHguI3guILguK3guIfguJXguLHguYvguKfguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4LiV4Lix4Lin4LmA4Lil4Li34Lit4LiB4LiC4Lit4LiH4Lil4Liz4LiU4Lix4Lia4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiN4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4q+C4seC4p+C4guC5ieC4reC4n+C4tOC4peC4lOC5jOC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lir4Lix4Lin4LiC4LmJ4Lit4Lif4Li04Lil4LiU4LmM4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiU4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICflj5jmm7Tlt6XljZXlhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWKoeaVhemanOeKtuaAgSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpk77mjqXlt6XljZUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+e0p+aApeW6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHlk43luqYnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ+mcgOimgeWkjeWuoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICflhrPlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICfpgJrov4flrqHmibknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAn5o6o6L+fJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ+mihOWFiOaJueWHhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ+mps+Wbnic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ+S/ruWkjeW8gOWni+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn5oGi5aSN5byA5aeL5pe26Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICflhrPlrprml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfliLDmnJ/ml6UnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfpgJrov4fmnYPlj5jmjqrmlr3lhbPpl60nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmt7vliqDlhrPlrpohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfpop3lpJbnmoRJVFNN5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ+mineWklueahElUU03lt6XljZXlrZfmrrXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i6aKd5aSW55qESVRTTeWtl+auteeql+WPo+WFgeiuuOa3u+WKoOWkh+azqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouWGs+Wumueql+WPo+WFgeiuuOa3u+WKoOWkh+azqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5Yaz5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5piv5ZCm6ZyA6KaB5bel5Y2V6ZSB5a6a77yI5aaC5p6c5bel5Y2V6L+Y5rKh5pyJ6ZSB5a6a77yM5YiZ5bel5Y2V6KKr6ZSB5a6a5LiU5b2T5YmN5pyN5Yqh5Lq65ZGY6KKr6Ieq5Yqo6K6+572u5Li65bel5Y2V5omA5pyJ6ICF77yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNleWGs+Wumueql+WPo+aYr+WQpumcgOimgeW3peWNlemUgeWumu+8iOWmguaenOW3peWNlei/mOayoeaciemUgeWumu+8jOWImeW3peWNleiiq+mUgeWumuS4lOW9k+WJjeacjeWKoeS6uuWRmOiiq+iHquWKqOiuvue9ruS4uuW3peWNleaJgOacieiAhe+8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOmAieaLqeacjeWKoeacn+mXtOaYr+WQpuaYvuekuuacjeWKoeaVhemanOeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5aSH5rOo55qE6buY6K6k5q2j5paH5YaF5a6544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j5aSH5rOo55qE6buY6K6k5q2j5paH5YaF5a6544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+a3u+WKoOWkh+azqOWQjueahOm7mOiupOS4i+S4gOS4quW3peWNleeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j5re75Yqg5aSH5rOo5ZCO55qE6buY6K6k5LiL5LiA5Liq5bel5Y2V54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6Plt6XljZXlpIfms6jnmoTpu5jorqTkuLvpopjjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXlhrPlrprnqpflj6Plt6XljZXlpIfms6jnmoTpu5jorqTkuLvpopjjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6Ppu5jorqTnmoTlt6XljZXkvJjlhYjnuqfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j6buY6K6k55qE5bel5Y2V5LyY5YWI57qn44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+m7mOiupOeahOWkh+azqOexu+Wei+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j6buY6K6k55qE5aSH5rOo57G75Z6L44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+aTjeS9nOeahOWOhuWPsuazqOmHiu+8jOeUqOS6juW3peWNleWOhuWPsuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V5Yaz5a6a56qX5Y+j5pON5L2c55qE5Y6G5Y+y5rOo6YeK77yM55So5LqO5bel5Y2V5Y6G5Y+y44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+aTjeS9nOeahOWOhuWPsuexu+Wei++8jOeUqOS6juW3peWNleWOhuWPsuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V5Yaz5a6a56qX5Y+j5pON5L2c55qE5Y6G5Y+y57G75Z6L77yM55So5LqO5bel5Y2V5Y6G5Y+y44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6Pmt7vliqDlpIfms6jlkI7nmoTkuIvkuIDkuKrlt6XljZXnirbmgIHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXlhrPlrprnqpflj6Pmt7vliqDlpIfms6jlkI7nmoTkuIvkuIDkuKrlt6XljZXnirbmgIHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PmmL7npLrnmoTliqjmgIHlrZfmrrXjgILlj6/og73nmoTorr7nva7vvJowIC0g56aB55So77yMMSAtIOWQr+eUqO+8jDIgLSDlkK/nlKjkuJTlv4XloavjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j5pi+56S655qE5Yqo5oCB5a2X5q6144CC5Y+v6IO955qE6K6+572u77yaMCAtIOemgeeUqO+8jDEgLSDlkK/nlKjvvIwyIC0g5ZCv55So5LiU5b+F5aGr44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNleaQnOe0oueql+WPo+aYvuekuueahOWKqOaAgeWtl+auteOAguWPr+iDveeahOiuvue9ru+8mjAgLSDnpoHnlKjvvIwxIC0g5ZCv55So44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXor6bmg4Xnqpflj6PmmL7npLrnmoTliqjmgIHlrZfmrrXjgILlj6/og73nmoTorr7nva7vvJowIC0g56aB55So77yMMSAtIOWQr+eUqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAn5L2/57uf6K6h5qih5Z2X6IO95aSf55Sf5oiQSVRTTeW3peWNleS4gOe6v+W5s+Wdh+ino+WGs+eOh+eahOe7n+iuoeaVsOaNruOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ+S9v+e7n+iuoeaooeWdl+iDveWkn+eUn+aIkElUU03lt6XljZXlubPlnYfop6PlhrPnjofnmoTnu5/orqHmlbDmja7jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i6aKd5aSW55qESVRTTeWtl+auteeql+WPo++8jOWmguaenOacjeWKoeS6uuWRmOa3u+WKoOS6huS4gOS4quWkh+azqO+8jOiuvue9ruW3peWNleeahOeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdouW3peWNleWGs+Wumueql+WPo++8jOWmguaenOacjeWKoeS6uuWRmOa3u+WKoOS6huS4gOS4quWkh+azqO+8jOiuvue9ruW3peWNleeahOeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouS9v+eUqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PpnIDopoHnmoTmnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouS9v+eUqOW3peWNleWGs+Wumueql+WPo+mcgOimgeeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOacjeWKoe+8iOW3peWNlTo65pyN5Yqh6ZyA6KaB6KKr5r+A5rS777yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+iuvue9ruacjeWKoeS6uuWRmOeVjOmdouW3peWNleWGs+Wumueql+WPo+eahOacjeWKoe+8iOW3peWNlTo65pyN5Yqh6ZyA6KaB6KKr5r+A5rS777yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNleaJgOacieiAheOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V5Yaz5a6a56qX5Y+j55qE5bel5Y2V5omA5pyJ6ICF44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNlei0n+i0o+S6uuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V5Yaz5a6a56qX5Y+j55qE5bel5Y2V6LSf6LSj5Lq644CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNleexu+Wei++8iOW3peWNlTo657G75Z6L6ZyA6KaB6KKr5r+A5rS777yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICforr7nva7mnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PnmoTlt6XljZXnsbvlnovvvIjlt6XljZU6Ouexu+Wei+mcgOimgeiiq+a/gOa0u++8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlt6XljZXor6bmg4Xop4blm77vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrlj5jmm7Tlt6XljZXlhrPlrprnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlt6XljZXor6bmg4Xop4blm77vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrkv67mlLnlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6155qE6ZO+5o6l44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdouW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmtonlj4rnmoTmiYDmnInmnI3liqHkurrlkZjliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmtonlj4rnmoTmiYDmnInmnI3liqHkurrlkZjliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j77yM5pi+56S66L+Z5Liq5bel5Y2V5omA5pyJ5Y+v6IO955qE5pyN5Yqh5Lq65ZGY77yI6ZyA6KaB5YW35pyJ6L+Z5Liq6Zif5YiX5oiW5bel5Y2V55qE5aSH5rOo5p2D6ZmQ77yJ5YiX6KGo55So5LqO56Gu5a6a6LCB5bCG5pS25Yiw5YWz5LqO6L+Z5Liq5aSH5rOo55qE6YCa55+l44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmiYDmnInlj6/og73nmoTmnI3liqHkurrlkZjvvIjpnIDopoHlhbfmnInov5nkuKrpmJ/liJfmiJblt6XljZXnmoTlpIfms6jmnYPpmZDvvInliJfooajnlKjkuo7noa7lrprosIHlsIbmlLbliLDlhbPkuo7ov5nkuKrlpIfms6jnmoTpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5piv5ZCm5pi+56S65bel5Y2V5LyY5YWI57qn55qE6YCJ6aG544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PmmK/lkKbmmL7npLrlt6XljZXkvJjlhYjnuqfnmoTpgInpobnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+aYvuekuuW3peWNleagh+mimOWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdouW3peWNleWGs+Wumueql+WPo+aYvuekuuW3peWNleagh+mimOWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAn5bel5Y2V5Yaz5a6a44CCJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX1RXX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfkv67mlLnlt6Xllq7msbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWLmeaVhemanOeLgOaFiyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpj4jmjqXlt6Xllq4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn78nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ+mcgOimgeikh+WvqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICflt7LpgJrpgY7lr6nmibknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ+S/ruW+qemWi+Wni+aZgumWkyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn5oGi5b6p6ZaL5aeL5pmC6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfmsbrlrprml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfmiKrmraLml6XmnJ8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfpl5zploko6K6K6YCaKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ+a3u+WKoOaxuuWumiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0lUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5rG65a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGFydGljbGUgZm9yIHdob20gdGhpcyBzaG91bGQgYmUgYSByZXBseSwgaWYgYXZhaWxhYmxlCiAgICBteSAkUmVwbHlUb0FydGljbGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVwbHlUb0FydGljbGUnICkgfHwgIiI7CgogICAgIyBjaGVjayBpZiBSZXBseVRvQXJ0aWNsZSByZWFsbHkgYmVsb25ncyB0byB0aGUgdGlja2V0CiAgICBteSAlUmVwbHlUb0FydGljbGVDb250ZW50OwogICAgbXkgQFJlcGx5VG9BZHJlc3NlczsKICAgIGlmICgkUmVwbHlUb0FydGljbGUpIHsKICAgICAgICAlUmVwbHlUb0FydGljbGVDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5BcnRpY2xlR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRSZXBseVRvQXJ0aWNsZSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAgICAgICAgPSAkUmVwbHlUb0FydGljbGU7CiAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9ID0gXCVSZXBseVRvQXJ0aWNsZUNvbnRlbnQ7CgogICAgICAgICMgZ2V0IHNlbmRlciBvZiBvcmlnaW5hbCBub3RlICh0byBpbmZvcm0gc2VuZGVyIGFib3V0IGFuc3dlcikKICAgICAgICBpZiAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7Q3JlYXRlZEJ5fSApIHsKICAgICAgICAgICAgbXkgQFJlcGx5VG9TZW5kZXJJRCA9ICggJFJlcGx5VG9BcnRpY2xlQ29udGVudHtDcmVhdGVkQnl9ICk7CiAgICAgICAgICAgICRTZWxmLT57UmVwbHlUb1NlbmRlclVzZXJJRH0gPSBcQFJlcGx5VG9TZW5kZXJJRDsKICAgICAgICB9CgogICAgICAgICMgaWYgYXJ0aWNsZSBiZWxvbmdzIHRvIG90aGVyIHRpY2tldCwgZG9uJ3QgdXNlIGl0IGFzIHJlcGx5CiAgICAgICAgaWYgKCAkUmVwbHlUb0FydGljbGVDb250ZW50e1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gPSAiIjsKICAgICAgICB9CgogICAgICAgICMgaWYgYXJ0aWNsZSBpcyBub3Qgb2YgdHlwZSBub3RlLWludGVybmFsLCBkb24ndCB1c2UgaXQgYXMgcmVwbHkKICAgICAgICBpZiAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7QXJ0aWNsZVR5cGV9ICF+IC9ebm90ZS0oaW50ZXJuYWx8ZXh0ZXJuYWwpJC9pICkgewogICAgICAgICAgICAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSA9ICIiOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRDb25maWctPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFJlcGx5VG9BcnRpY2xlID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBzaG93IHJpZ2h0IGhlYWRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSGVhZGVyJyAuICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRMb2NrKSB7CgogICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdCBOZXdRdWV1ZUlECiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdSZXNwb25zaWJsZUlEIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQKICAgICAgICBFeHBhbmQgUmVwbHlUb0FydGljbGUgU3RhbmRhcmRUZW1wbGF0ZUlEIENyZWF0ZUFydGljbGUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW0gPSAoCiAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkR2V0UGFyYW17TmV3UXVldWVJRH0sCiAgICAgICAgT3duZXJJRCAgICAgICA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWMgZmllbGQgZm9yIHRoZSBpbXBhY3QKICAgIG15ICRJbXBhY3REeW5hbWljRmllbGRDb25maWc7CiMgLS0tCgogICAgIyBkZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0VHlwZSA9IFsnVGlja2V0J107CgogICAgIyBvbmx5IHNjcmVlbnMgdGhhdCBhZGQgbm90ZXMgY2FuIG1vZGlmeSBBcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICBpZiAoICRDb25maWctPntOb3RlfSApIHsKICAgICAgICAkT2JqZWN0VHlwZSA9IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAkT2JqZWN0VHlwZSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdQcmlvcml0eVJDJyk7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICggJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFRpY2tldHtTZXJ2aWNlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKICAgIH0KCiAgICBteSAlU2VydmljZTsKICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJENvbmZpZy0+e1Nob3dJbmNpZGVudFN0YXRlfSB8fCAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlY2FsY3VsYXRlIGltcGFjdCBpZiBpbXBhY3QgaXMgbm90IHNldCB1bnRpbCBub3cKICAgICAgICBpZiAoICEkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICYmICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gbmUgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9OwoKICAgICAgICAgICAgaWYgKCREZWZhdWx0U2VsZWN0aW9uKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBpbXBhY3QKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkRGVmYXVsdFNlbGVjdGlvbjsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICYmICRDb25maWctPntQcmlvcml0eX0gKSB7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICBlbHNlIHsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgIyBzaG93IG9ubHkgdGhlIGVtcHR5IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ID0ge307CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgfQoKICAgICMgc2V0IHRoZSBzZWxlY3RlZCBpbXBhY3QKICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwoKIyAtLS0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBubyByaWNoIHRleHQgaXMgdXNlZAogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSwKICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIElmIGlzIGFuIGFjdGlvbiBhYm91dCBhdHRhY2htZW50cwogICAgICAgIG15ICRJc1VwbG9hZCA9IDA7CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBteSBAQXR0YWNobWVudElEcyA9IG1hcCB7CiAgICAgICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICB9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkF0dGFjaG1lbnREZWxldGUkQ291bnQiICk7CiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgISREZWxldGU7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBdHRhY2htZW50VXBsb2FkJyApICkgewogICAgICAgICAgICAkSXNVcGxvYWQgICAgICAgICAgICAgICAgPSAxOwogICAgICAgICAgICAlRXJyb3IgICAgICAgICAgICAgICAgICAgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdGF0ZSBvYmplY3QKICAgICAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0aW1lIG9iamVjdAogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFRpbWVPYmplY3QtPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgICAgICA8ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57Tm90ZX0gJiYgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBvd25lcgogICAgICAgICAgICBpZiAoICRDb25maWctPntPd25lcn0gJiYgJENvbmZpZy0+e093bmVyTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J05ld093bmVySW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0aXRsZQogICAgICAgICAgICBpZiAoICRDb25maWctPntUaXRsZX0gJiYgISRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RpdGxlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0eXBlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKCAkQ29uZmlnLT57VGlja2V0VHlwZX0gKSAmJgogICAgICAgICAgICAgICAgKCAhJEdldFBhcmFte1R5cGVJRH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1R5cGVJREludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2V9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2V9CiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU0xBSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGltZSB1bml0cywgYnV0IG9ubHkgaWYgdGhlIGN1cnJlbnQgc2NyZWVuIGhhcyBhIG5vdGUKICAgICAgICAgICAgIyAgIChhY2NvdW50ZWQgdGltZSBjYW4gb25seSBiZSBzdG9yZWQgaWYgYW5kIGFydGljbGUgaXMgZ2VuZXJhdGVkKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntOb3RlfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gIHx8ICcnLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBJc1VwbG9hZCAgICAgICAgID0+ICRJc1VwbG9hZCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHRpdGxlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHR5cGUKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJENvbmZpZy0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgc2VydmljZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQ29uZmlnLT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFVubG9ja09uQXdheSA9IDE7CgogICAgICAgICMgbW92ZSB0aWNrZXQgdG8gYSBuZXcgcXVldWUsIGJ1dCBvbmx5IGlmIHRoZSBxdWV1ZSB3YXMgY2hhbmdlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e1F1ZXVlfQogICAgICAgICAgICAmJiAkR2V0UGFyYW17TmV3UXVldWVJRH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte05ld1F1ZXVlSUR9IG5lICRUaWNrZXR7UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgbW92ZSB0aWNrZXQgKHNlbmQgbm90aWZpY2F0aW9uIGlmIG5vIG5ldyBvd25lciBpcyBzZWxlY3RlZCkKICAgICAgICAgICAgbXkgJEJvZHlBc1RleHQgPSAnJzsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5QXNUZXh0ID0gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRCb2R5QXNUZXh0ID0gJEdldFBhcmFte0JvZHl9IHx8IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE1vdmUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZVNldCgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV3UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgID0+ICRCb2R5QXNUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkTW92ZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRDb25maWctPntPd25lcn0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVubG9ja09uQXdheSA9IDA7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRDb25maWctPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIG15ICRSZXR1cm5VUkw7CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2Ugc3RhdGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZSBvbiBwZW5kaW5nIHN0YXRlCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCBwYXJlbnQgd2luZG93IHRvIGxhc3Qgc2NyZWVuIG92ZXJ2aWV3IG9uIGNsb3NlZCB0aWNrZXRzCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFJldHVyblVSTCA9ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSB8fCAnQWN0aW9uPUFnZW50RGFzaGJvYXJkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17Q3JlYXRlQXJ0aWNsZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e05vdGV9CiAgICAgICAgICAgICYmICggJEdldFBhcmFte1N1YmplY3R9IHx8ICRHZXRQYXJhbXtCb2R5fSApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3ViamVjdCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e1N1YmplY3R9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkR2V0UGFyYW17U3ViamVjdH0KICAgICAgICAgICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIHN1YmplY3QnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBBcnRpY2xlVHlwZUlELCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QXJ0aWNsZVR5cGV9ID0gJENvbmZpZy0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAQXR0YWNobWVudHMgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRnJvbSA9ICJcIiRTZWxmLT57VXNlckZ1bGxuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgbXkgQE5vdGlmeVVzZXJJRHM7CgogICAgICAgICAgICAjIGdldCBsaXN0IG9mIHVzZXJzIHRoYXQgd2lsbCBiZSBpbmZvcm1lZCB3aXRob3V0IHNlbGVjdGlvbiBpbiBpbmZvcm1lZC9pbnZvbHZlZCBsaXN0CiAgICAgICAgICAgIG15IEBVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb24KICAgICAgICAgICAgICAgID0gc3BsaXQoICcsJywgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJMaXN0V2l0aG91dFNlbGVjdGlvbicgKSB8fCAiIiApOwoKICAgICAgICAgICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgICAgICAgICBteSBASW5mb3JtVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKCiAgICAgICAgICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgICAgICAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CgogICAgICAgICAgICBpZiAoICRDb25maWctPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlVc2VySURzLCBASW5mb3JtVXNlcklEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDb25maWctPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeVVzZXJJRHMsIEBJbnZvbHZlZFVzZXJJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeVVzZXJJRHMsIEBVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFxATm90aWZ5RG9uZSwKICAgICAgICAgICAgICAgIFVubG9ja09uQXdheSAgICAgICAgICAgICAgICAgICAgPT4gJFVubG9ja09uQXdheSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlncmF0aW9uCiAgICAgICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgPyAkQXJ0aWNsZUlEIDogJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgIGlmICggKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5fSApIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBmb3IgY3JpdGljYWxpdHkgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgZm9yIGNyaXRpY2FsaXR5CiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBmaW5kIG91dCB0aGUga2V5CiAgICAgICAgICAgIG15ICVSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9IHJldmVyc2UgJXsgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IHx8ICcnIH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAkUmV0dXJuVVJMIHx8PSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCI7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gJFJldHVyblVSTCwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnR2V0U2VydmljZUluY2lkZW50U3RhdGUnICkgewoKICAgICAgICAjIGdldCB0aGUgc2VsZWN0ZWQgc2VydmljZSBpZAogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnOwoKICAgICAgICAjIGJ1aWxkIGVtcHR5IHJlc3BvbnNlIGhhc2gKICAgICAgICBteSAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJycsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJyZuYnNwJywKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgaWYgc2VydmljZSBpZCBpcyBzZWxlY3RlZCBhbmQgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgc2NyZWVuCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRTZXJ2aWNle0N1ckluY2lTdGF0ZX0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmNvZGUgcmVzcG9uc2UgdG8gSlNPTgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAlVGlja2V0ICAgICAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwoKICAgICAgICBteSAkU2VydmljZUlEOwoKICAgICAgICAjIGdldCBzZXJ2aWNlIHZhbHVlIGZyb20gcGFyYW0gaWYgZmllbGQgaXMgdmlzaWJsZSBpbiB0aGUgc2NyZWVuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRDb25maWctPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgdXNlIHRpY2tldCBzZXJ2aWNlIHZhbHVlIHNpbmNlIGl0IGNhbid0IGJlIGNoYW5nZWQKICAgICAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRTZXJ2aWNlSUQgPSAkVGlja2V0e1NlcnZpY2VJRH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAkUXVldWVJRCA9ICRHZXRQYXJhbXtOZXdRdWV1ZUlEfSB8fCAkVGlja2V0e1F1ZXVlSUR9OwogICAgICAgIG15ICRTdGF0ZUlEID0gJEdldFBhcmFte05ld1N0YXRlSUR9IHx8ICRUaWNrZXR7U3RhdGVJRH07CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJE93bmVycyA9ICRTZWxmLT5fR2V0T3duZXJzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTdGF0ZUlEICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRPbGRPd25lcnMgPSAkU2VsZi0+X0dldE9sZE93bmVycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGUoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFN0YXRlSUQgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFN0YXRlSUQgICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICk7CiAgICAgICAgbXkgJFR5cGVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkTmV3UXVldWVzID0gJFNlbGYtPl9HZXRRdWV1ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VydmljZUlEIHx8ICEkU2VydmljZXMtPnskU2VydmljZUlEfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCB8fCAnJywKICAgICAgICApOwoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhbmRhcmRUZW1wbGF0ZUlEJyApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGlmIFJlcGx5VG9BcnRpY2xlIGlzIGdpdmVuLCBnZXQgdGhpcyBhcnRpY2xlIHRvIGdlbmVyYXRlCiAgICAgICAgICAgICAgICAjIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBhcnRpY2xlIHRvIHF1b3RlCiAgICAgICAgICAgICAgICAgICAgbXkgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBwcmVwYXJlIHF1b3RlZCBib2R5IGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAkQm9keSA9ICRTZWxmLT5fR2V0UXVvdGVkUmVwbHlCb2R5KAogICAgICAgICAgICAgICAgICAgICAgICAleyAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PiAkQm9keSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlVGV4dCAuICc8YnI+PGJyPicgLiAkQm9keTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVUZXh0IC4gIlxuXG4iIC4gJEJvZHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVOb3RlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZVVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gPyAwIDogMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXdRdWV1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRCb2R5ID0gJyc7CgogICAgICAgICMgaWYgUmVwbHlUb0FydGljbGUgaXMgZ2l2ZW4sIGdldCB0aGlzIGFydGljbGUgdG8gZ2VuZXJhdGUKICAgICAgICAjIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgdG8gcXVvdGUKICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgPT4gJFVwbG9hZENhY2hlT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBwcmVwYXJlIHF1b3RlZCBib2R5IGNvbnRlbnQKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+X0dldFF1b3RlZFJlcGx5Qm9keSgKICAgICAgICAgICAgICAgICV7ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSB9LAogICAgICAgICAgICAgICAgQm9keSA9PiAkQm9keSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBib2R5IGNvbnRlbnQgd2FzIHByZSBkZWZpbmVkLCBhZGQgdGhpcyBiZWZvcmUgdGhlIHF1b3RlZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEJvZHkgPSAkR2V0UGFyYW17Qm9keX0gLiAkQm9keTsKICAgICAgICB9CgogICAgICAgICMgZmlsbHVwIGNvbmZpZ3VyZWQgZGVmYXVsdCB2YXJzCiAgICAgICAgaWYgKCAkQm9keSBlcSAnJyAmJiAkQ29uZmlnLT57Qm9keX0gKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQm9keSB2YXIgdG8gY2FsY3VsYXRlZCBjb250ZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEJvZHk7CgogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRTdWJqZWN0UmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U3ViamVjdFJlJykgfHwgJ1JlJzsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldFN1YmplY3RSZSAuICc6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRDb25maWctPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgb25seSBnZXQgdmFsdWVzIGZvciBUaWNrZXQgZmllbGRzIChhbGwgc2NyZWVucyBiYXNlZCBvbiBBZ2VudFRpY2tlQWN0aW9uQ29tbW9uCiAgICAgICAgICAgICMgZ2VuZXJhdGVzIGEgbmV3IGFydGljbGUsIHRoZW4gYXJ0aWNsZSBmaWVsZHMgd2lsbCBiZSBhbHdheXMgZW1wdHkgYXQgdGhlIGJlZ2lubmluZykKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldAogICAgICAgICAgICAgICAgJFZhbHVlID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICksCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFdpZGdldCBUaWNrZXQgQWN0aW9ucwogICAgaWYgKAogICAgICAgICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57VGlja2V0VHlwZX0gKQogICAgICAgIHx8CiAgICAgICAgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICAgICAmJiAkQ29uZmlnLT57U2VydmljZX0gKSAgICAgfHwKICAgICAgICAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRDb25maWctPntSZXNwb25zaWJsZX0gKSB8fAogICAgICAgICRDb25maWctPntUaXRsZX0gfHwKICAgICAgICAkQ29uZmlnLT57UXVldWV9IHx8CiAgICAgICAgJENvbmZpZy0+e093bmVyfSB8fAogICAgICAgICRDb25maWctPntTdGF0ZX0gfHwKICAgICAgICAkQ29uZmlnLT57UHJpb3JpdHl9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXRUaWNrZXRBY3Rpb25zJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJENvbmZpZy0+e1RpdGxlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgY3JlYXRlIGEgc3RyaW5nIHdpdGggdGhlIHF1b3RlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGROYW1lcykgKSB7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JER5bmFtaWNGaWVsZE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZE5hbWVzU3RyZ30gLj0gIiwgJyIgLiAkRmllbGQgLiAiJyI7CiAgICAgICAgfQogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQ29uZmlnLT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9ICkgewoKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSAnIC4gKCAkUGFyYW17U2VydmljZUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVTTEEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSApIHsKCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtTTEFJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRDb25maWctPntRdWV1ZX0gKSB7CgogICAgICAgICMgZmV0Y2ggYWxsIHF1ZXVlcwogICAgICAgIG15ICVNb3ZlUXVldWVzID0gJFRpY2tldE9iamVjdC0+VGlja2V0TW92ZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbW92ZSBxdWV1ZXMKICAgICAgICAkUGFyYW17UXVldWVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4geyAlTW92ZVF1ZXVlcywgJycgPT4gJy0nIH0sCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdOZXdRdWV1ZUlEIE1vZGVybml6ZScsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOZXdRdWV1ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte05ld1F1ZXVlSUR9LAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIEN1cnJlbnRRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFVzZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgIGlmICggJENvbmZpZy0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkVXNlck9iamVjdC0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkUXVldWVPYmplY3QtPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ05ld093bmVyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIG15IEBPbGRPd25lcnM7CiAgICAgICAgbXkgJU9sZE93bmVyc1Nob3duOwogICAgICAgIG15ICVTZWVuT2xkT3duZXI7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIFVTRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgICAgICMgc2tpcCBpZiBvbGQgb3duZXIgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdAogICAgICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRTZWVuT2xkT3duZXJ7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFNlZW5PbGRPd25lcnsgJFVzZXItPntVc2VySUR9IH0gPSAxOwogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJFVzZXItPntVc2VySUR9OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJGdWxsbmFtZX0iOwogICAgICAgICAgICAgICAgcHVzaCBAT2xkT3duZXJzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJE9sZE93bmVyc1Nob3dueyRLZXl9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgbXkgJE9sZE93bmVyQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT2xkT3duZXInLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlT2xkT3duZXJzU2hvd24sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkT2xkT3duZXJBQ0wpIHsKICAgICAgICAgICAgJU9sZE93bmVyc1Nob3duID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntPd25lck1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17TmV3T3duZXJJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIEZpbHRlcnMgICAgICA9PiB7CiAgICAgICAgICAgICAgICBPbGRPd25lcnMgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ByZXZpb3VzIE93bmVyJyksCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzID0+IFwlT2xkT3duZXJzU2hvd24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRDb25maWctPntPd25lck1hbmRhdG9yeX0gPyAnT3duZXJNYW5kYXRvcnknIDogJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkQ29uZmlnLT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICkgewoKICAgICAgICBteSAlU3RhdGU7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSA/IDAgOiAxLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWctPntTdGF0ZVR5cGV9ICkgKSB7CgogICAgICAgICAgICBTVEFURVRZUEU6CiAgICAgICAgICAgIGZvciBteSAkU3RhdGVUeXBlICggQHsgJENvbmZpZy0+e1N0YXRlVHlwZX0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFNUQVRFVFlQRSBpZiAhJFN0YXRlVHlwZTsKICAgICAgICAgICAgICAgIG5leHQgU1RBVEVUWVBFIGlmICRTdGF0ZVR5cGUgIX4gL3BlbmRpbmcvaTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICAgICAgICAgICAgICBteSAkQ2FsZW5kYXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGVJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGxhc3QgU1RBVEVUWVBFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CgogICAgICAgIG15ICVQcmlvcml0eTsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJENvbmZpZy0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gfHw9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBFbmQgV2lkZ2V0IFRpY2tldCBBY3Rpb25zCgogICAgIyBkZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0VHlwZSA9IFsnVGlja2V0J107CgogICAgIyBvbmx5IHNjcmVlbnMgdGhhdCBhZGQgbm90ZXMgY2FuIG1vZGlmeSBBcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICBpZiAoICRDb25maWctPntOb3RlfSApIHsKICAgICAgICAkT2JqZWN0VHlwZSA9IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAkT2JqZWN0VHlwZSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBXaWRnZXQgRHluYW1pYyBGaWVsZHMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGQpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXREeW5hbWljRmllbGRzJywKICAgICAgICApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBteSBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHM7CiMgLS0tCgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CiMgLS0tCgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIGN5Y2xlIHRyb3VnaCBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCgogICAgIyBFbmQgV2lkZ2V0IER5bmFtaWMgRmllbGRzCgogICAgIyBXaWRnZXQgQXJ0aWNsZQogICAgaWYgKCAkQ29uZmlnLT57Tm90ZX0gKSB7CgogICAgICAgICRQYXJhbXtXaWRnZXRTdGF0dXN9ID0gJ0NvbGxhcHNlZCc7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICB8fCAkUGFyYW17SXNVcGxvYWR9CiAgICAgICAgICAgIHx8ICRTZWxmLT57UmVwbHlUb0FydGljbGV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtXaWRnZXRTdGF0dXN9ID0gJ0V4cGFuZGVkJzsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17U3ViamVjdFJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICRQYXJhbXtCb2R5UmVxdWlyZWR9ICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0UmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX0RlcGVuZGluZ1JlcXVpcmVkQU5EIFZhbGlkYXRlX0RlcGVuZGluZ19DcmVhdGVBcnRpY2xlJzsKICAgICAgICAgICAgJFBhcmFte0JvZHlSZXF1aXJlZH0gICAgPSAnVmFsaWRhdGVfRGVwZW5kaW5nUmVxdWlyZWRBTkQgVmFsaWRhdGVfRGVwZW5kaW5nX0NyZWF0ZUFydGljbGUnOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dpZGdldEFydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFsbCB1c2VyIGlkcyBvZiBhZ2VudHMsIHRoYXQgY2FuIGJlIHNob3duIGluIHRoaXMgZGlhbG9nCiAgICAgICAgIyBiYXNlZCBvbiBxdWV1ZSByaWdodHMKICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkUXVldWVPYmplY3QtPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZW1haWwgcGFyc2VyIG9iamVjdAogICAgICAgIG15ICRFbWFpbFBhcnNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICBNb2RlICA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhbmQgcmV0cmlldmUgaW52b2x2ZWQgYW5kIGluZm9ybWVkIGFnZW50cyBvZiBSZXBseVRvIE5vdGUKICAgICAgICBteSBAUmVwbHlUb1VzZXJzOwogICAgICAgIG15ICVSZXBseVRvVXNlcnNIYXNoOwogICAgICAgIG15ICVSZXBseVRvVXNlcklEczsKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewogICAgICAgICAgICBteSBAUmVwbHlUb1BhcnRzID0gJEVtYWlsUGFyc2VyT2JqZWN0LT5TcGxpdEFkZHJlc3NMaW5lKAogICAgICAgICAgICAgICAgTGluZSA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH0tPntUb30gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBSRVBMWVRPUEFSVDoKICAgICAgICAgICAgZm9yIG15ICRTaW5nbGVSZXBseVRvUGFydCAoQFJlcGx5VG9QYXJ0cykgewogICAgICAgICAgICAgICAgbXkgJFJlcGx5VG9BZGRyZXNzID0gJEVtYWlsUGFyc2VyT2JqZWN0LT5HZXRFbWFpbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgRW1haWwgPT4gJFNpbmdsZVJlcGx5VG9QYXJ0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFJFUExZVE9QQVJUIGlmICEkUmVwbHlUb0FkZHJlc3M7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXBseVRvVXNlcnMsICRSZXBseVRvQWRkcmVzczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFJlcGx5VG9Vc2Vyc0hhc2h7JF99KysgZm9yIEBSZXBseVRvVXNlcnM7CgogICAgICAgICAgICAjIGdldCB1c2VyIGlkcyBvZiBhdmFpbGFibGUgdXNlcnMKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRVc2VyRW1haWwgPSAkVXNlckRhdGF7VXNlckVtYWlsfTsKICAgICAgICAgICAgICAgIGlmICggJFJlcGx5VG9Vc2Vyc0hhc2h7JFVzZXJFbWFpbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcGx5VG9Vc2VySURzeyRVc2VySUR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb3JpZ2luYWwgbm90ZSBzZW5kZXIgdG8gbGlzdCBvZiB1c2VyIGlkcwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgQHsgJFNlbGYtPntSZXBseVRvU2VuZGVyVXNlcklEfSB9ICkgewoKICAgICAgICAgICAgICAgICMgaWYgc2VuZGVyIHJlcGxpZXMgdG8gaGltc2VsZiwgZG8gbm90IGluY2x1ZGUgc2VuZGVyIGluIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJFVzZXJJRCBuZSAkU2VsZi0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcGx5VG9Vc2VySURzeyRVc2VySUR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgdXNlciBpZCBvZiBhY3RpdmUgdXNlcgogICAgICAgICAgICBkZWxldGUgJFJlcGx5VG9Vc2VySURzeyAkU2VsZi0+e1VzZXJJRH0gfTsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmZpZy0+e0luZm9ybUFnZW50fSB8fCAkQ29uZmlnLT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWRkaXRpb25hbEFnZW50cycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgICAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICMgZ2V0IGFsbCBhZ2VudHMgZm9yICJpbnZvbHZlZCBhZ2VudHMiCiAgICAgICAgaWYgKCAkQ29uZmlnLT57SW52b2x2ZWRBZ2VudH0gKSB7CgogICAgICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEludm9sdmVkQWdlbnRzTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQEludm9sdmVkQWdlbnRzOwogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CgogICAgICAgICAgICAjIGdldCBpbnZvbHZlZCB1c2VyIGxpc3QKICAgICAgICAgICAgbXkgQEludm9sdmVkVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwoKICAgICAgICAgICAgVVNFUjoKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckZ1bGxuYW1lfSI7CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyLT57T3V0T2ZPZmZpY2VNZXNzYWdlfSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgLj0gIiAkVXNlci0+e091dE9mT2ZmaWNlTWVzc2FnZX0iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQEludm9sdmVkQWdlbnRzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFVzZXItPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICAgICAgICAgICMgYWRkIGludm9sdmVkIHVzZXIgYXMgc2VsZWN0ZWQgZW50cmllcywgaWYgYXZhaWxhYmxlIGluIFJlcGx5VG9BZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAmJiAkUmVwbHlUb1VzZXJJRHN7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEludm9sdmVkVXNlcklELCAkVXNlci0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRSZXBseVRvVXNlcklEc3sgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRJbnZvbHZlZEFnZW50U2l6ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6SW52b2x2ZWRBZ2VudE1heFNpemUnKSB8fCAzOwogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFxASW52b2x2ZWRBZ2VudHMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IFxASW52b2x2ZWRVc2VySUQsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAkSW52b2x2ZWRBZ2VudFNpemUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJsb2NrIGlzIGNhbGxlZCBiZWxvdyAiaW5mb3JtIGFnZW50cyIKICAgICAgICB9CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJENvbmZpZy0+e0luZm9ybUFnZW50fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybSB1c2VyIGxpc3QKICAgICAgICAgICAgbXkgQEluZm9ybVVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CgogICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGVtYWlsIGFkZHJlc3Mgb2YgYWxsIHVzZXJzIGFuZCBjb21wYXJlIHRvIHJlcGx5dG8tYWRkcmVzc2VzCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXBseVRvVXNlcklEc3skVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5mb3JtVXNlcklELCAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFJlcGx5VG9Vc2VySURzeyRVc2VySUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEluZm9ybUFnZW50U2l6ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6SW5mb3JtQWdlbnRNYXhTaXplJykKICAgICAgICAgICAgICAgIHx8IDM7CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IFxASW5mb3JtVXNlcklELAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgID0+ICRJbmZvcm1BZ2VudFNpemUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRDb25maWctPntJbnZvbHZlZEFnZW50fSApIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbGlzdCBvZiBhZ2VudHMsIHRoYXQgcmVjZWl2ZSB0aGlzIG5vdGUgKFJlcGx5VG9Ob3RlKQogICAgICAgICMgYXQgbGVhc3Qgc2VuZGVyIG9mIG9yaWdpbmFsIG5vdGUgYW5kIGFsbCByZWNlcGllbnRzIG9mIHRoZSBvcmlnaW5hbCBub3RlCiAgICAgICAgIyB0aGF0IGNvdWxkbid0IGJlIHNlbGVjdGVkIHdpdGggaW52b2x2ZWQvaW5mb3JtIGFnZW50cwogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CgogICAgICAgICAgICBteSAkVXNlcnNIYXNoU2l6ZSA9IGtleXMgJVJlcGx5VG9Vc2VySURzOwogICAgICAgICAgICBteSAkQ291bnRlciAgICAgICA9IDA7CiAgICAgICAgICAgICRQYXJhbXtVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb259ID0gam9pbiggJywnLCBrZXlzICVSZXBseVRvVXNlcklEcyApOwoKICAgICAgICAgICAgaWYgKCAkVXNlcnNIYXNoU2l6ZSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudHNXaXRob3V0U2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVSZXBseVRvVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudHNXaXRob3V0U2VsZWN0aW9uU2luZ2xlVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBhIHNlcGFyYXRvciAoSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvblNpbmdsZVVzZXJTZXBhcmF0b3IpLAogICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGxhc3QgZW50cnkKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyIDwgJFVzZXJzSGFzaFNpemUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvblNpbmdsZVVzZXJTZXBhcmF0b3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnLT57Tm90ZU1hbmRhdG9yeX0KICAgICAgICAgICAgfHwgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3ViamVjdExhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dExhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3ViamVjdExhYmVsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dExhYmVsJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBUeXBlICA9PiAnTm90ZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICAgICAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIHx8ICggJENvbmZpZy0+e1F1ZXVlfSAmJiBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMgfHwge30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlOwoKICAgICAgICAjIHNldCBhcnRpY2xlIHR5cGUgb2YgdGhpcyBub3RlIHRvIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGFydGljbGUgZm9yIHdob20gdGhpcyBpcyB0aGUgcmVwbHkKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICYmICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgaWYgKCAkQ29uZmlnLT57QXJ0aWNsZVR5cGVzfSApIHsKICAgICAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkQ29uZmlnLT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgICAgICBteSAlTm90ZVR5cGVzICAgICAgICA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVUeXBlTGlzdCggUmVzdWx0ID0+ICdIQVNIJyApOwogICAgICAgICAgICBmb3IgbXkgJEtleU5vdGVUeXBlICggc29ydCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skS2V5Tm90ZVR5cGV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JEtleU5vdGVUeXBlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBFbmQgV2lkZ2V0IEFydGljbGUKCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBhbGwgdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IG9ubHkgdXNlcnMgd2l0aCByZXNwb25zaWJsZSBvciBydyBwZW1pc3Npb25zIGluIHRoZSBxdWV1ZQogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRRdWV1ZUdyb3VwSUQoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte05ld1F1ZXVlSUR9IHx8ICRQYXJhbXtRdWV1ZUlEfQogICAgICAgICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0T3duZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBhbGwgdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IG9ubHkgdXNlcnMgd2l0aCBvd25lciBvciBydyBwZW1pc3Npb25zIGluIHRoZSBxdWV1ZQogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRRdWV1ZUdyb3VwSUQoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte05ld1F1ZXVlSUR9IHx8ICRQYXJhbXtRdWV1ZUlEfQogICAgICAgICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnTmV3T3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0T2xkT3duZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSBAT2xkVXNlckluZm8gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBteSAlVXNlckhhc2g7CiAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgbXkgJENvdW50ZXIgPSAxOwogICAgICAgIFVTRVI6CiAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CgogICAgICAgICAgICBuZXh0IFVTRVIgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKCiAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckZ1bGxuYW1lfSI7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT2xkT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVVc2VySGFzaDsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGlmIG5vbiBzZXQgY3VzdG9tZXJzIGNhbiBnZXQgZGVmYXVsdCBzZXJ2aWNlcyB0aGVuIHRoZXkgc2hvdWxkIGFsc28gYmUgYWJsZSB0byBnZXQgdGhlIFNMQXMKICAgICMgIGZvciB0aG9zZSBzZXJ2aWNlcyAodGhpcyB3b3JrcyBkdXJpbmcgdGlja2V0IGNyZWF0aW9uKS4KICAgICMgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2V0LCBUaWNrZXRTTEFMaXN0IHdpbGwgY29tcGxhaW4gZHVyaW5nIEFKQVggdXBkYXRlcyBhcyBVc2VySUQgaXMgbm90CiAgICAjICBwYXNzZWQuIFNlZSBidWcgMTExNDcuCgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIGlmICggISRDb25maWctPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICRQcmlvcml0aWVzeycnfSA9ICctJzsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlYWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzID0gcXcoCiAgICAgICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgTmV3T3duZXJJRCBOZXdSZXNwb25zaWJsZUlEIE5ld1N0YXRlSUQKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0VHlwZSA9IFsnVGlja2V0J107CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBvbmx5IHNjcmVlbnMgdGhhdCBhZGQgbm90ZXMgY2FuIG1vZGlmeSBBcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICBpZiAoICRDb25maWctPntOb3RlfSApIHsKICAgICAgICAkT2JqZWN0VHlwZSA9IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAkT2JqZWN0VHlwZSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfR2V0UXVvdGVkUmVwbHlCb2R5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkUGFyYW17Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgIG15ICRRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSB0ZXh0CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJsb2NrcXVvdGUgdHlwZT1cImNpdGVcIj4kUGFyYW17Qm9keX08L2Jsb2NrcXVvdGU+XG4iOwoKICAgICAgICAgICAgICAgICMgY2xlYW51cCBub3QgY29tcGF0LiB0YWdzCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q2xlYW51cCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQKICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtDcmVhdGVkfSwgJ0RhdGVGb3JtYXQnLCAnTm9TZWNvbmRzJyApOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0IC49ICcgLSAnIC4gJFBhcmFte0Zyb219IC4gJyAnOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0CiAgICAgICAgICAgICAgICAgICAgLj0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCd3cm90ZScpIC4gJzonOwoKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRSZXNwb25zZUZvcm1hdCAuICRQYXJhbXtCb2R5fTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJyLz4iIC4gJFBhcmFte0JvZHl9OwoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0NyZWF0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFte0NyZWF0ZWR9PGJyLz4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJF8pIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICRQYXJhbXskX308YnIvPiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRGcm9tID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgIG15ICRFbmRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIG1lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJyLz4tLS0tICRNZXNzYWdlRnJvbSAkRnJvbSAtLS08YnIvPjxici8+IiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHByZXBhcmUgYm9keSwgc3ViamVjdCwgUmVwbHlUbyAuLi4KICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkUGFyYW17Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgIG15ICRRdW90ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UXVvdGUnKTsKICAgICAgICAgICAgaWYgKCRRdW90ZSkgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvXG4vXG4kUXVvdGUgL2c7CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiXG4kUXVvdGUgIiAuICRQYXJhbXtCb2R5fTsKCiAgICAgICAgICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQKICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtDcmVhdGVkfSwgJ0RhdGVGb3JtYXQnLCAnTm9TZWNvbmRzJyApOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0IC49ICcgLSAnIC4gJFBhcmFte0Zyb219IC4gJyAnOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0CiAgICAgICAgICAgICAgICAgICAgLj0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCd3cm90ZScpIC4gIjpcbiI7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFJlc3BvbnNlRm9ybWF0IC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuIiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0NyZWF0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFte0NyZWF0ZWR9XG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJF8pIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICRQYXJhbXskX31cbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VuZCBtZXNzYWdlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuLS0tLSAkTWVzc2FnZUZyb20gJFBhcmFte0Zyb219IC0tLVxuXG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9IC49ICJcbi0tLS0gJEVuZE1lc3NhZ2UgLS0tXG4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Qm9keX07Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjcmVhdGUgdGVtcGxhdGVzCiAgICBteSAlVGVtcGxhdGVzOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCBRdWV1ZUlEIGZyb20gdGhlIHRpY2tldAogICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFF1ZXVlSUQgPSAkVGlja2V0e1F1ZXVlSUR9IHx8ICcnOwogICAgfQoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIFwlVGVtcGxhdGVzIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze05vdGV9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tOb3RlfTsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFF1ZXVlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IFF1ZXVlcy4KICAgIG15ICVRdWV1ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldE1vdmVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKICAgIHJldHVybiBcJVF1ZXVlczsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RnJlZVRleHQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDsKCiMgLS0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyggS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiApOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXREZWNpc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KCBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0QWN0aW9uQ29tbW9uICk7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEVtYWlsOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkRCT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1haWw6OkFkZHJlc3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkTWFpbk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICREZWJ1ZyAgPSAkUGFyYW17RGVidWd9IHx8IDA7CiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBEZXN0CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwogICAgJEFDTENvbXBhdEdldFBhcmFte093bmVySUR9ID0gJEdldFBhcmFte05ld1VzZXJJRH07CgogICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgIG15ICRJc1VwbG9hZCA9ICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgPyAxIDogMCApOwoKICAgICMgaGFzaCBmb3IgY2hlY2sgZHVwbGljYXRlZCBlbnRyaWVzCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgVG8tZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlcikgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uLiAkQ3VzdG9tZXJzTnVtYmVyICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CgogICAgICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIENjLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRDYykgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckNjICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXhDYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckNjKys7CgogICAgICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudENjKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhDYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRCY2MpIHsKCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtCY2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50QmNjKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIGZpZWxkIGZvciB0aGUgaW1wYWN0CiAgICBteSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnOwojIC0tLQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcpIHx8ICcnOwoKICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICB9CiAgICB9CgogICAgIyBubyBzZXJ2aWNlIHdhcyBzZWxlY3RlZAogICAgZWxzZSB7CgogICAgICAgICMgZG8gbm90IHNob3cgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9ID0gJyc7CgogICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9IHt9OwogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAnJzsKICAgIH0KCiAgICAjIHNldCB0aGUgc2VsZWN0ZWQgaW1wYWN0CiAgICAkRHluYW1pY0ZpZWxkVmFsdWVze0lUU01JbXBhY3R9ID0gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKIyAtLS0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gfHwgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgKSB7CgogICAgICAgICAgICAjIG5vdGlmeSBpbmZvCiAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdUaWNrZXQgIiVzIiBjcmVhdGVkIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIGR5bmFtaWMgZmllbGRzIGRlZmF1bHQgdmFsdWVzIG9yIHVzZWQgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZXMgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICAjIEFDTHMgaW5mbyBmb3IgYWxsIGZpZWxkcwogICAgICAgICAgICBteSAlRHluYW1pY0ZpZWxkRGVmYXVsdHM7CgogICAgICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgICAgIG15ICREZWZhdWx0VmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CgogICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERlZmF1bHRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRGVmYXVsdFZhbHVlIGVxICcnOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQKICAgICAgICAgICAgICAgICAgICBpZiByZWYgJERlZmF1bHRWYWx1ZSBlcSAnQVJSQVknICYmICFJc0FycmF5UmVmV2l0aERhdGEoJERlZmF1bHRWYWx1ZSk7CgogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZERlZmF1bHRzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICAgICAnSEFTSCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhbmQgZm9ybWF0IGRlZmF1bHQgc3ViamVjdCBhbmQgYm9keQogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERlc3QgPSAnJzsKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntRdWV1ZUlEfSAmJiAkR2V0UGFyYW17RGVzdH0gKSB7CgogICAgICAgICAgICAgICAgbXkgQFF1ZXVlUGFydHMgPSBzcGxpdCggL1x8XHwvLCAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgICAgICRTZWxmLT57UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICAgICAgICAgICREZXN0ID0gJEdldFBhcmFte0Rlc3R9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VycyA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEZyb21MaXN0ID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRnJvbVNlbGVjdGVkICAgICAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhICAgICAgPT4ge30sCiAgICAgICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgZGVsaXZlciBzaWduYXR1cmUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTaWduYXR1cmUnICkgewogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkgfHwgJyc7CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdRdWV1ZUlEJyApOwogICAgICAgIGlmICggISRRdWV1ZUlEICkgewogICAgICAgICAgICBteSAkRGVzdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgICAgICAoJFF1ZXVlSUQpID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgd2l0aCBlbXB0eSBzaWduYXR1cmUgKG5vIHF1ZXVlIHNlbGVjdGVkKSAtIGlmIHdlIGhhdmUgYSBxdWV1ZSwgZ2V0IHRoZSBzaWcuCiAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICcnOwogICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPl9HZXRTaWduYXR1cmUoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkTWltZVR5cGUgLiAnOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICROZXh0U3RhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKSB8fCAnJzsKICAgICAgICBteSAlU3RhdGVEYXRhOwogICAgICAgIGlmICgkTmV4dFN0YXRlSUQpIHsKICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSAgICAgICAgPSAkU3RhdGVEYXRhe05hbWV9OwogICAgICAgIG15ICROZXdSZXNwb25zaWJsZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1Jlc3BvbnNpYmxlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJE5ld1VzZXJJRCAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApIHx8ICcnOwogICAgICAgIG15ICREZXN0ICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CgogICAgICAgICMgc2VlIGlmIG9ubHkgYSBuYW1lIGhhcyBiZWVuIHBhc3NlZAogICAgICAgIGlmICggJERlc3QgJiYgJERlc3QgIX4gbXsgXEEgKFxkKyk/IFx8IFx8IC4rIFx6IH14bXMgKSB7CgogICAgICAgICAgICAjIHNlZSBpZiB3ZSBjYW4gZ2V0IGFuIElEIGZvciB0aGlzIHF1ZXVlIG5hbWUKICAgICAgICAgICAgbXkgJERlc3RJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkRnJvbSApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKTsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFF1ZXVle0VtYWlsfTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlcgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gMiApIHsKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJE51bWJlciIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICROdW1iZXIgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE51bWJlciA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBteSBAQXR0YWNobWVudElEcyA9IG1hcCB7CiAgICAgICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICB9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkF0dGFjaG1lbnREZWxldGUkQ291bnQiICk7CiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgISREZWxldGU7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICYmICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewoKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSAgfHwgJycsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgb2JqZWN0CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAgICAgIyBFeHBhbmQgQ3VzdG9tZXIgTmFtZQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhOwogICAgICAgIGlmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAxICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXIKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3Q7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJLZXkgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyS2V5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEN1c3RvbWVyVXNlcktleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ICAgICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtb3JlIHRoZSBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGRvbid0IGNoZWNrIGVtYWlsIHN5bnRheCBvbiBtdWx0aSBjdXN0b21lciBzZWxlY3QKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gMAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CgogICAgICAgICAgICAgICAgIyBjbGVhciB0byBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcm9tIGFuZCBjdXN0b21lciBpZCBpZiBjdXN0b21lciB1c2VyIGlzIGdpdmVuCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDIgKSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcktleSAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyS2V5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSApIHsKICAgICAgICAgICAgICAgIG15ICVFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9CiAgICAgICAgICAgICAgICAgICAgPSAiXCIkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9ICRFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGF7VXNlckxhc3RuYW1lfVwiIDwkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgISRHZXRQYXJhbXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnRXJyb3JUeXBlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFBhcmFtZXRlciAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBub3QgYSBzdWJhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMsIGNoZWNrIGZvciBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCAhJElzVXBsb2FkICYmICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aW1lIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICAgICAgICAgICAgIGlmICggISRUaW1lT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRUaW1lT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2VydmljZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NMQUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUeXBlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBteSAlQXJ0aWNsZVBhcmFtOwogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkRGVidWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIGlmICggJEVycm9ye1RvSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntDY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7QmNjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzZXQgQm9keSBhbmQgU3ViamVjdCBwYXJhbWV0ZXJzIGZvciBPdXRwdXQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRCb2R5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyAgID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZSAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgJycsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgICAgPT4gJFNlbGYtPl9HZXRUb3MoKSwKICAgICAgICAgICAgICAgIEZyb21TZWxlY3RlZCA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSApLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte0JvZHl9ICksCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgU2lnbmF0dXJlICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgICAgIEZyb21FeHRlcm5hbEN1c3RvbWVyID0+IFwlRnJvbUV4dGVybmFsQ3VzdG9tZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlnIGZvciBjcml0aWNhbGl0eSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgY3JpdGljYWxpdHkKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXZlcnNlIHRoZSBsaXN0IHRvIGZpbmQgb3V0IHRoZSBrZXkKICAgICAgICAgICAgbXkgJVJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gcmV2ZXJzZSAleyAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyB9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnTmV3JywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBvd25lciBpcyBnaXZlbiAodGhlbiBzZW5kIG5vIGFnZW50IG5vdGlmeSkKICAgICAgICBteSAkTm9BZ2VudE5vdGlmeSA9IDA7CiAgICAgICAgaWYgKCROZXdVc2VySUQpIHsKICAgICAgICAgICAgJE5vQWdlbnROb3RpZnkgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gJzxici8+PGJyLz4nIC4gJFNpZ25hdHVyZTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudHMgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIHNlbmRlcgogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgICAgIG15ICRTZW5kZXIgICAgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2VuZGVyKAogICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgID0+ICROb0FnZW50Tm90aWZ5LAogICAgICAgICAgICBBdHRhY2htZW50ICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgID0+ICRDb25maWctPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJFNlbmRlciwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgQ2MgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICAgICAgQmNjICAgICAgICAgICAgPT4gJEdldFBhcmFte0JjY30sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJENvbmZpZy0+e0hpc3RvcnlDb21tZW50fQogICAgICAgICAgICAgICAgfHwgIlwlXCUkR2V0UGFyYW17VG99LCAkR2V0UGFyYW17Q2N9LCAkR2V0UGFyYW17QmNjfSIsCiAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUtc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1Jlc3BvbnNpYmxlSUQpIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgaSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBzb3J0IGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBzb3J0IGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldEVtYWlsJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtTdWJhY3Rpb249Q3JlYXRlZDtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdHZXRTZXJ2aWNlSW5jaWRlbnRTdGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRoZSBzZWxlY3RlZCBzZXJ2aWNlIGlkCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJyc7CgogICAgICAgICMgYnVpbGQgZW1wdHkgcmVzcG9uc2UgaGFzaAogICAgICAgIG15ICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAnJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAnJm5ic3AnLAogICAgICAgICk7CgogICAgICAgICMgb25seSBpZiBzZXJ2aWNlIGlkIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRTZXJ2aWNle0N1ckluY2lTdGF0ZX0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmNvZGUgcmVzcG9uc2UgdG8gSlNPTgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBGcm9tIGJhc2VkIG9uIHNlbGVjdGVkIHF1ZXVlCiAgICAgICAgbXkgJFF1ZXVlSUQgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgICAgIG15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICBteSAkTmV3VG9zOwoKICAgICAgICBpZiAoJFRvcykgewogICAgICAgICAgICBUT3M6CiAgICAgICAgICAgIGZvciBteSAkS2V5VG8gKCBzb3J0IGtleXMgJXskVG9zfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVE9zIGlmICggJFRvcy0+eyRLZXlUb30gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAkTmV3VG9zLT57IiRLZXlUb3x8JFRvcy0+eyRLZXlUb30ifSA9ICRUb3MtPnskS2V5VG99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCB8fCAnJywKICAgICAgICApOwogICAgICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgogICAgICAgIGlmICggJEVsZW1lbnRDaGFuZ2VkIGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQEV4dGVuZGVkRGF0YTsKCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICMgdXNlIFF1ZXVlSUQgZnJvbSB3ZWIgcmVxdWVzdCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgSk9CIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICREZWJ1ZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPkRhdGEoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgIyBnZXQgQUpBWCBwYXJhbSB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJE9iamVjdC0+R2V0UGFyYW1BSkFYKCVHZXRQYXJhbSkgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY29udmVydCBTaWduYXR1cmUgdG8gQVNDSUksIGlmIFJpY2hUZXh0IGlzIG9uCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgICAgICAgICAgICAkU2lnbmF0dXJlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKCBTdHJpbmcgPT4gJFNpZ25hdHVyZSwgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5ld1RvcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZ25hdHVyZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZVVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFR5cGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBTdWJhY3Rpb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRHcm91cE1lbWJlcktleSApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRHcm91cE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skTWVtYmVyS2V5fSA9ICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRHcm91cE1lbWJlcktleSApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRHcm91cE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSByZXNwb25zaWJsZSBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skTWVtYmVyS2V5fSA9ICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVNlcnZpY2UgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CgogICAgIyBjaGVjayBpZiBubyBDdXN0b21lclVzZXJJRCBpcyBzZWxlY3RlZAogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAwIGxlYXZlIEN1c3RvbWVyVXNlcklEIGVtcHR5LCBpdCB3aWxsIG5vdCBnZXQgYW55IHNlcnZpY2VzCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDEgc2V0IEN1c3RvbWVyVXNlcklEIHRvIGdldCBkZWZhdWx0IHNlcnZpY2VzCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgIFRhYmxlID0+ICdzeXN0ZW1fYWRkcmVzcycsCiAgICAgICAgICAgICAgICBXaGF0ICA9PiAncXVldWVfaWQsIGlkJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBDbGFtcCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlVG9zICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRTdHJpbmcgPX4gc3tccytcen17fSBpZiAhJFF1ZXVlRGF0YXtDb21tZW50fTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkVG9zeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3VG9zeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGVtcHR5IHNlbGVjdGlvbgogICAgJE5ld1Rvc3snJ30gPSAnLSc7CiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCnN1YiBfR2V0U2lnbmF0dXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwcmVwYXJlIHNpZ25hdHVyZQogICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CiAgICBteSAkU2lnbmF0dXJlICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICBEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkU2lnbmF0dXJlOwp9CgpzdWIgX0dldFN0YW5kYXJkVGVtcGxhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3JlYXRlIHRlbXBsYXRlcwogICAgbXkgJVRlbXBsYXRlczsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlVGVtcGxhdGVzIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CiAgICBpZiAoICEkUGFyYW17UXVldWVJRH0gJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICMgcmV0dXJuIGVtcHR5IGhhc2ggaWYgdGhlcmUgYXJlIG5vIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRTdGFuZGFyZFRlbXBsYXRlc3tDcmVhdGV9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tDcmVhdGV9Owp9CgpzdWIgX01hc2tFbWFpbE5ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtGb3JtSUR9ID0gJFNlbGYtPntGb3JtSUR9OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBidWlsZCBjdXN0b21lciBzZWFyY2ggYXV0b2NvbXBsZXRlIGZpZWxkCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICApOwoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17VXNlcnN9LT57Jyd9ID0gJy0nOwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIERlc3RpbmF0aW9uIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17RnJvbUxpc3R9ICkgewogICAgICAgIGZvciBteSAkRnJvbUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEZyb21LZXl8fCRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX0ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e0Rlc3RpbmF0aW9uSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e0Rlc3RpbmF0aW9uSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJExheW91dE9iamVjdC0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17Q3VzdG9tZXJEYXRhfSwKICAgICAgICAgICAgTWF4ICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2VNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3JLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcktleX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yS2V5fSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZyb20gZXh0ZXJuYWwKICAgIG15ICRTaG93RXJyb3JzID0gMTsKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0KICAgICAgICAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2hvd0Vycm9ycyA9IDA7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb21FeHRlcm5hbEN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewogICAgICAgICRQYXJhbXtCY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17VG9JbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0NjSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17QmNjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEKICAgICk7CgogICAgIyBjcmVhdGUgYSBzdHJpbmcgd2l0aCB0aGUgcXVvdGVkIGR5bmFtaWMgZmllbGQgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZE5hbWVzKSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRHluYW1pY0ZpZWxkTmFtZXN9ICkgewogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkTmFtZXNTdHJnfSAuPSAiLCAnIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57U2VydmljZUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRDb25maWctPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3T3duZXJTZWxlY3Rpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKIyAtLS0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CiMgLS0tCgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIGN5Y2xlIHRyb3VnaCBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNob3duT3B0aW9uc0Jsb2NrOwoKICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQgYW5kIGphdmEgc2NyaXB0IHN1cHBvcnQgaXMgYXZhaWxhYmxlCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEJvb2t9CiAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkcmVzc0Jvb2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwogICAgaWYgKCRPcHRpb25DdXN0b21lcikgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgb3B0aW9ucyBibG9jayBzbyB0aGF0IHRoZSAiTGluayBUaWNrZXQiIG9wdGlvbiBpcyBzaG93bgogICAgIyBldmVuIGlmIHNwZWxsY2hlY2tlciwgYWRkcmVzcyBib29rIGFuZCBPcHRpb25DdXN0b21lciBpcyB0dXJuZWQgb2ZmCiAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgfQojIC0tLQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWwnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKCiAgICAjIHNldCB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0ZWFibGUgdmlhIEFKQVhVcGRhdGUKICAgIGlmICggISRQYXJhbXtPbmx5RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KAogICAgICAgICAgICBUeXBlSUQgRGVzdCBOZXh0U3RhdGVJRCBQcmlvcml0eUlEIFNlcnZpY2VJRCBTTEFJRCBTaWduS2V5SUQgQ3J5cHRLZXlJRCBUbyBDYyBCY2MKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFBob25lOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkRCT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1haWw6OkFkZHJlc3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhBcnRpY2xlSUQgTGlua1RpY2tldElEIFByaW9yaXR5SUQgTmV3VXNlcklECiAgICAgICAgRnJvbSBTdWJqZWN0IEJvZHkgTmV4dFN0YXRlSUQgVGltZVVuaXRzCiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUKICAgICAgICBOZXdSZXNwb25zaWJsZUlEIFJlc3BvbnNpYmxlQWxsIE93bmVyQWxsIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQKICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgRnJvbUNoYXRJRCBEZXN0CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwogICAgJEFDTENvbXBhdEdldFBhcmFte093bmVySUR9ID0gJEdldFBhcmFte05ld1VzZXJJRH07CgogICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgIG15ICRJc1VwbG9hZCA9ICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgPyAxIDogMCApOwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBGcm9tLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyRnJvbUN1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXIpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlciApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJFNlbGVjdGVkIGVxICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219IC49ICRDdXN0b21lckVsZW1lbnQgLiAnLCc7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50KSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmb3JtIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWMgZmllbGQgZm9yIHRoZSBpbXBhY3QKICAgIG15ICRJbXBhY3REeW5hbWljRmllbGRDb25maWc7CiMgLS0tCgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcpIHx8ICcnOwoKICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgbXkgJVNlcnZpY2U7CiAgICAjIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgfQogICAgfQoKICAgICMgbm8gc2VydmljZSB3YXMgc2VsZWN0ZWQKICAgIGVsc2UgewoKICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSA9ICcnOwoKICAgICAgICAjIHNob3cgb25seSB0aGUgZW1wdHkgc2VsZWN0aW9uCiAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSB7fTsKICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJyc7CiAgICB9CgogICAgIyBzZXQgdGhlIHNlbGVjdGVkIGltcGFjdAogICAgJER5bmFtaWNGaWVsZFZhbHVlc3tJVFNNSW1wYWN0fSA9ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH07CiMgLS0tCgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NoYXQgaXMgbm90IGFjdGl2ZS4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT2ssIHRha2UgdGhlIGNoYXQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICBDaGF0dGVyVHlwZSAgID0+ICdVc2VyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIENoYXR0ZXJBY3RpdmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2hhdFBhcnRpY2lwYW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgcGVybWlzc2lvbnMKICAgICAgICBteSAkUGVybWlzc2lvbkxldmVsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBlcm1pc3Npb25MZXZlbEdldCgKICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIG9ic2VydmVyCiAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVsIG5lICdPd25lcicgJiYgJFBlcm1pc3Npb25MZXZlbCBuZSAnUGFydGljaXBhbnQnICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uLicpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkUGVybWlzc2lvbkxldmVsLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gfHwgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgIyBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGlja2V0IGlkIQogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGlja2V0ICIlcyIgY3JlYXRlZCEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9CiAgICAgICAgICAgICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0UGhvbmUvCiAgICAgICAgICAgICYmICRTZWxmLT57UmVxdWVzdGVkVVJMfSAgICAgICAhfiAvQWN0aW9uPUFnZW50VGlja2V0UGhvbmUuKkxpbmtUaWNrZXRJRD0vCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAjIGdldCBBcnRpY2xlSUQKICAgICAgICBteSAlQXJ0aWNsZTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIG15ICRBcnRpY2xlRnJvbSA9ICcnOwogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJvIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVBcnRpY2xlID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgaXMgZnJvbSB0aGUgc2FtZSBUaWNrZXRJRCBhcyB3ZSBjaGVja2VkIHBlcm1pc3Npb25zIGZvci4KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQXJ0aWNsZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGlja2V0ICVzIScsICRTZWxmLT57VGlja2V0SUR9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzYXZlIGFydGljbGUgZnJvbSBmb3IgYWRkcmVzc2VzIGxpc3QKICAgICAgICAgICAgJEFydGljbGVGcm9tID0gJEFydGljbGV7RnJvbX07CgogICAgICAgICAgICAjIGlmIFRvIGlzIHByZXNlbnQKICAgICAgICAgICAgIyBhbmQgaXMgbm8gYSBxdWV1ZQogICAgICAgICAgICAjIGFuZCBhbHNvIGlzIG5vIGEgc3lzdGVtIGFkZHJlc3MKICAgICAgICAgICAgIyBzZXQgVG8gYXMgYXJ0aWNsZSBmcm9tCiAgICAgICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJEFydGljbGV7VG99ICkgKSB7CiAgICAgICAgICAgICAgICBteSAlUXVldWVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoKTsKCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlICggc29ydCBrZXlzICV7ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkQ29uZmlnT2JqZWN0LT57Q3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbn0tPnskUXVldWV9OwogICAgICAgICAgICAgICAgICAgICAgICAkUXVldWVzeyRRdWV1ZX0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICVRdWV1ZUxvb2t1cCA9IHJldmVyc2UgJVF1ZXVlczsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzTG9va3VwCiAgICAgICAgICAgICAgICAgICAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NMaXN0KCk7CiAgICAgICAgICAgICAgICBteSBAQXJ0aWNsZUZyb21BZGRyZXNzOwogICAgICAgICAgICAgICAgbXkgJFN5c3RlbUFkZHJlc3NFbWFpbDsKCiAgICAgICAgICAgICAgICBpZiAoJEFydGljbGVGcm9tKSB7CiAgICAgICAgICAgICAgICAgICAgQEFydGljbGVGcm9tQWRkcmVzcyA9IE1haWw6OkFkZHJlc3MtPnBhcnNlKCRBcnRpY2xlRnJvbSk7CiAgICAgICAgICAgICAgICAgICAgJFN5c3RlbUFkZHJlc3NFbWFpbCA9ICRBcnRpY2xlRnJvbUFkZHJlc3NbMF0tPmFkZHJlc3MoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRRdWV1ZUxvb2t1cHsgJEFydGljbGV7VG99IH0gJiYgZGVmaW5lZCAkU3lzdGVtQWRkcmVzc0xvb2t1cHskU3lzdGVtQWRkcmVzc0VtYWlsfSApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtUb307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJvZHkgcHJlcGFyYXRpb24gZm9yIHBsYWluIHRleHQgcHJvY2Vzc2luZwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgID0+ICRVcGxvYWRDYWNoZU9iamVjdCwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlckxpc3QgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGV7RnJvbX0gPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyTGlzdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgbXVsdGlwbGUgYWRkcmVzc2VzIGxpc3QKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBteSAkQ291bnRGcm9tID0gc2NhbGFyIEBNdWx0aXBsZUN1c3RvbWVyIHx8IDE7CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YUZyb207CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGFGcm9tID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRBcnRpY2xlRnJvbSkgKSB7CgogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDb3VudEZyb207CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRDb3VudEZyb20gZXEgJzEnID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRFbWFpbEFkZHJlc3MgICAgID0gJEVtYWlsLT5hZGRyZXNzKCk7CiAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsQWRkcmVzcyApICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRFbWFpbH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50RnJvbSAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICcnOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0KICAgICAgICAgICAgICAgICYmICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0gZXEgJEVtYWlsQWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgPSAkRW1haWxBZGRyZXNzOwogICAgICAgICAgICBpZiAoICRFbWFpbC0+cGhyYXNlKCkgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFbGVtZW50ID0gJEVtYWlsLT5waHJhc2UoKSAuICIgPCRFbWFpbEFkZHJlc3M+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRFbWFpbEFkZHJlc3N9ID0gMTsKICAgICAgICAgICAgJENvdW50RnJvbSsrOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIHRoZSBkeW5hbWljIGZpZWxkcyBkZWZhdWx0IHZhbHVlcyBvciB1c2VkIHNwZWNpZmljIGRlZmF1bHQgdmFsdWVzIHRvIGJlIHVzZWQgYXMKICAgICAgICAjIEFDTHMgaW5mbyBmb3IgYWxsIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGREZWZhdWx0czsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgbXkgJERlZmF1bHRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkRGVmYXVsdFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRGVmYXVsdFZhbHVlIGVxICcnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiByZWYgJERlZmF1bHRWYWx1ZSBlcSAnQVJSQVknICYmICFJc0FycmF5UmVmV2l0aERhdGEoJERlZmF1bHRWYWx1ZSk7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGVmYXVsdHN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJERlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICBteSAlU3BsaXRUaWNrZXRQYXJhbTsKCiAgICAgICAgIyBpbiBjYXNlIG9mIHNwbGl0IGEgVGlja2V0SUQgYW5kIEFydGljbGVJRCBhcmUgYWx3YXlzIGdpdmVuLCBzZW5kIHRoZSBUaWNrZXRJRCB0byBjYWxjdWxhdGUKICAgICAgICAjIEFDTHMgYmFzZWQgb24gcGFyZW50IGluZm9ybWF0aW9uCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgICMgZml4IHRvIGJ1ZyMgODA2OCBGaWVsZCAmIER5bmFtaWNGaWVsZCBwcmVzZWxlY3Rpb24gb24gVGlja2V0U3BsaXQKICAgICAgICAjIHdoZW4gc3BsaXR0aW5nIGEgdGlja2V0IHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGVzIG11c3QgcmVtYWluIGluIHRoZSBuZXcgdGlja2V0IHNjcmVlbgogICAgICAgICMgdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgU3BsaXRUaWNrZXRQYXJhbSBoYXNoCiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBpbmZvcm1hdGlvbiBmcm9tIG9yaWdpbmFsIHRpY2tldCAoU3BsaXRUaWNrZXQpCiAgICAgICAgICAgIG15ICVTcGxpdFRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgc2ltcGxlIElEcyB0byBwYXNzIHRoZW0gdG8gdGhlIG1hc2sKICAgICAgICAgICAgZm9yIG15ICRTcGxpdGVkUGFyYW0gKHF3KFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFteyRTcGxpdGVkUGFyYW19ID0gJFNwbGl0VGlja2V0RGF0YXskU3BsaXRlZFBhcmFtfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgU3RhdGVJRCBhcyBOZXh0U3RhdGVJRAogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1N0YXRlSUR9OwoKICAgICAgICAgICAgIyBzZXQgT3duZXIgYW5kIFJlc3BvbnNpYmxlCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1VzZXJTZWxlY3RlZH0gICAgICAgICAgICA9ICRTcGxpdFRpY2tldERhdGF7T3duZXJJRH07CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1Jlc3BvbnNpYmxlVXNlclNlbGVjdGVkfSA9ICRTcGxpdFRpY2tldERhdGF7UmVzcG9uc2libGVJRH07CgogICAgICAgICAgICAjIHNldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgT3duZXIgYW5kIFJlc3BvbnNpYmxlCiAgICAgICAgICAgIGlmICggJFNwbGl0VGlja2V0RGF0YXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9ID0gJFNwbGl0VGlja2V0RGF0YXtRdWV1ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtBbGxVc2Vyc30gPSAxOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHNlbGVjdGVkIHF1ZXVlIGluIGZvcm1hdCBJRHx8TmFtZQogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtUb1NlbGVjdGVkfSA9ICRTcGxpdFRpY2tldERhdGF7UXVldWVJRH0gLiAnfHwnIC4gJFNwbGl0VGlja2V0RGF0YXtRdWV1ZX07CgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU3BsaXRUaWNrZXREYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9EeW5hbWljRmllbGRcXyguKikvICkgewogICAgICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0R5bmFtaWNGaWVsZH17JDF9ID0gJFNwbGl0VGlja2V0RGF0YXskS2V5fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFNwbGl0VGlja2V0UGFyYW17JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgR2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAjIGZyb20gREIgdGhpcyBjYXNlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWxlY3QgVGlja2V0SUQgb3IgQXJ0aWNsZUlEIHRvIGdldCB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnCiAgICAgICAgICAgICAgICAgICAgPyAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgIDogJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIChzcGxpdCkKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyAgICAgID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICBteSAkU3ViamVjdCA9ICRBcnRpY2xle1N1YmplY3R9OwogICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAkU3ViamVjdCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJEJvZHkgPSAkQXJ0aWNsZXtCb2R5fSB8fCAnJzsKICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dCAoaWYgYm9keSBpcyBiYXNlZCBvbiBjb25maWcpCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGluIGNhc2Ugb2YgdGlja2V0IHNwbGl0IHNldCAkU2VsZi0+e1F1ZXVlSUR9IGFzIHRoZSBRdWV1ZUlEIG9mIHRoZSBvcmlnaW5hbCB0aWNrZXQsCiAgICAgICAgIyBpbiBvcmRlciB0byBzZXQgY29ycmVjdCBBQ0xzIG9uIHBhZ2UgbG9hZCAoaW5pdGlhbCkuIFNlZSBidWcgODY4Ny4KICAgICAgICBpZiAoCiAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVNwbGl0VGlja2V0UGFyYW0gKQogICAgICAgICAgICAmJiAkU3BsaXRUaWNrZXRQYXJhbXtRdWV1ZUlEfQogICAgICAgICAgICAmJiAhJFNlbGYtPntRdWV1ZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e1F1ZXVlSUR9ID0gJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH07CiAgICAgICAgfQoKICAgICAgICAjIEdldCBwcmVkZWZpbmVkIFF1ZXVlSUQgKGlmIG5vIHF1ZXVlIGZyb20gc3BsaXQgdGlja2V0IGlzIHNldCkuCiAgICAgICAgaWYgKCAhJFNlbGYtPntRdWV1ZUlEfSAmJiAkR2V0UGFyYW17RGVzdH0gKSB7CgogICAgICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICRHZXRQYXJhbXtEZXN0fSApOwogICAgICAgICAgICAkU2VsZi0+e1F1ZXVlSUR9ID0gJFF1ZXVlUGFydHNbMF07CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RvU2VsZWN0ZWR9ID0gJEdldFBhcmFte0Rlc3R9OwogICAgICAgIH0KCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgJycsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBUbyA9PiAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgRnJvbSAgICAgICAgID0+ICRBcnRpY2xle0Zyb219LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRBcnRpY2xle0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBMaW5rVGlja2V0SUQgPT4gJEdldFBhcmFte0xpbmtUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgICAgIEZyb21DaGF0SUQgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0gfHwgJycsCgogICAgICAgICAgICAjICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0IGFuZCBhcnRpY2xlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewoKICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgbXkgJVN0YXRlRGF0YTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTmV4dFN0YXRlID0gJFN0YXRlRGF0YXtOYW1lfSB8fCAnJzsKICAgICAgICBteSAkRGVzdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJERlc3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJERlc3RJRCkgewogICAgICAgICAgICAgICAgJERlc3QgPSAkRGVzdElEIC4gJ3x8JyAuICREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERlc3QgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJFRvICkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICROZXdRdWV1ZUlEOwoKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRTZWxlY3RlZEN1c3RvbWVyVXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJEV4cGFuZEN1c3RvbWVyTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFeHBhbmRDdXN0b21lck5hbWUnICkKICAgICAgICAgICAgfHwgMDsKICAgICAgICBteSAlRnJvbUV4dGVybmFsQ3VzdG9tZXI7CiAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsZWFyRnJvbScgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJFeHBhbmRDdXN0b21lck5hbWUkQ291bnQiICkgfHwgMDsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvdW50ID09IDIgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBubyByaWNoIHRleHQgaXMgdXNlZAogICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSwKICAgICAgICAgICAgICAgIFBsYWluVGV4dCAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIG15IEBBdHRhY2htZW50SURzID0gbWFwIHsKICAgICAgICAgICAgbXkgKCRJRCkgPSAkXyA9fiBteyBcQSBBdHRhY2htZW50RGVsZXRlIChcZCspIFx6IH14bXM7CiAgICAgICAgICAgICRJRCA/ICRJRCA6ICgpOwogICAgICAgIH0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJc1VwbG9hZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJElzVXBsb2FkICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgJUVycm9yICAgICAgICAgICAgICAgICAgID0gKCk7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGltZSBvYmplY3QKICAgICAgICBteSAkVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICAgICAgaWYgKCAhJEV4cGFuZEN1c3RvbWVyTmFtZSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFRpbWVPYmplY3QtPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSXNVcGxvYWQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7RGF0ZUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFRpbWVPYmplY3QtPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICA8ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkSXNVcGxvYWQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7RGF0ZUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBvbiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgJiYgISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJPbmx5ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9IDA7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSA9ICRLZXlDdXN0b21lclVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ICAgICAgICAgICAgPSAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9OwogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0LCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwoKICAgICAgICAgICAgICAgICMgY2xlYXIgZnJvbSBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0VtYWlsfQogICAgICAgICAgICAgICAgICAgID0gIlwiJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRmlyc3RuYW1lfSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJMYXN0bmFtZX1cIiA8JEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhIG5ldyBkZXN0aW5hdGlvbiBxdWV1ZSBpcyBzZWxlY3RlZAogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAzICkgewogICAgICAgICAgICAkRXJyb3J7Tm9TdWJtaXR9ID0gMTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRTZWxlY3RlZEN1c3RvbWVyVXNlcjsKICAgICAgICB9CgogICAgICAgICMgJ2p1c3QnIG5vIHN1Ym1pdAogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSA0ICkgewogICAgICAgICAgICAkRXJyb3J7Tm9TdWJtaXR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRDdXN0b21lcklEKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17RnJvbX0gKSApIHsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9ye0Vycm9yVHlwZX0gICA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEVycm9ye0Zyb21JbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkSXNVcGxvYWQgJiYgISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtGcm9tfSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRnJvbUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISROZXdRdWV1ZUlEICkgewogICAgICAgICAgICAgICAgJEVycm9yeydEZXN0aW5hdGlvbkludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2VydmljZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NMQUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICggISRHZXRQYXJhbXtUeXBlSUR9ICkgJiYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1R5cGVJREludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnUmljaFRleHRJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzZXQgQm9keSBhbmQgU3ViamVjdCBwYXJhbWV0ZXJzIGZvciBPdXRwdXQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRCb2R5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyAgID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlclNlbGVjdGVkID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOZXh0U3RhdGUgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgJycsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFRvU2VsZWN0ZWQgID0+ICREZXN0LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGlja2V0LCBkbyBkYiBpbnNlcnQKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eX0gKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgZm9yIGNyaXRpY2FsaXR5IGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ3JpdGljYWxpdHknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcG9zc2libGUgdmFsdWVzIGZvciBjcml0aWNhbGl0eQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldmVyc2UgdGhlIGxpc3QgdG8gZmluZCBvdXQgdGhlIGtleQogICAgICAgICAgICBteSAlUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSByZXZlcnNlICV7ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzIH07CgogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzeyAkU2VydmljZXtDcml0aWNhbGl0eX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQoKICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQbGFpbkJvZHkgPSAkR2V0UGFyYW17Qm9keX07CgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRQbGFpbkJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICggJEdldFBhcmFte05ld1VzZXJJRH0gKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICAgID0+ICRDb25maWctPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICA9PiAkVG8sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICBUbyAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJFBsYWluQm9keSwKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSAlQ2hhdCAgICAgICA9ICRDaGF0T2JqZWN0LT5DaGF0R2V0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlTGlzdCA9ICRDaGF0T2JqZWN0LT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ2hhdEFydGljbGVJRDsKCiAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEpTT05Cb2R5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBDaGF0TWVzc2FnZUxpc3QsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRDaGF0QXJ0aWNsZVR5cGUgPSAnY2hhdC1pbnRlcm5hbCc7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENoYXR7UmVxdWVzdGVyVHlwZX0gZXEgJ0N1c3RvbWVyJwogICAgICAgICAgICAgICAgICAgIHx8ICRDaGF0e1RhcmdldFR5cGV9IGVxICdDdXN0b21lcicKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJENoYXRBcnRpY2xlVHlwZSA9ICdjaGF0LWV4dGVybmFsJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEFydGljbGVUeXBlICAgID0+ICRDaGF0QXJ0aWNsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdDaGF0JyksCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJEpTT05Cb2R5LAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICA9PiAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaXMgY3VzdG9tZXIgYWN0aXZlbHkgcHJlc2VudAogICAgICAgICAgICAgICAgIyBpdCBtZWFucyBjdXN0b21lciBoYXMgYWNjZXB0ZWQgdGhpcyBjaGF0IGFuZCBub3QgbGVmdCBpdCEKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lclByZXNlbnQgPSAkQ2hhdE9iamVjdC0+Q3VzdG9tZXJQcmVzZW50KAogICAgICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQWN0aXZlID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzOwoKICAgICAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gY3VzdG9tZXIgcHJlc2VudCBpbiB0aGUgY2hhdAogICAgICAgICAgICAgICAgIyBqdXN0IHJlbW92ZSB0aGUgY2hhdAogICAgICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyUHJlc2VudCApIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRDaGF0T2JqZWN0LT5DaGF0RGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugc2V0IGNoYXQgc3RhdHVzIHRvIGNsb3NlZCBhbmQgaW5mb3JtIG90aGVyIGFnZW50cwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhdE9iamVjdC0+Q2hhdFVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdElEICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgICAgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0ZXJOYW1lID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdGVyTmFtZSB8fD0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAgICAgICAgICAgICBteSAkTGVhdmVNZXNzYWdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbGVmdCB0aGUgY2hhdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRDaGF0T2JqZWN0LT5DaGF0TWVzc2FnZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdElEICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdHRlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdHRlclR5cGUgICAgID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVRleHQgICAgID0+ICRMZWF2ZU1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUdlbmVyYXRlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgdGltZSBhZnRlciBjaGF0IHdpbGwgYmUgcmVtb3ZlZAogICAgICAgICAgICAgICAgICAgIG15ICRDaGF0VFRMID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDaGF0RW5naW5lOjpDaGF0VFRMJyk7CgogICAgICAgICAgICAgICAgICAgIG15ICRDaGF0Q2xvc2VkTWVzc2FnZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBjaGF0IGhhcyBiZWVuIGNsb3NlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICVzIGhvdXJzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICRDaGF0VFRMLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0SUQgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0dGVySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0dGVyVHlwZSAgICAgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVGV4dCAgICAgPT4gJENoYXRDbG9zZWRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1HZW5lcmF0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBhbGwgQUdFTlQgcGFydGljaXBhbnRzIGZyb20gY2hhdAogICAgICAgICAgICAgICAgICAgIG15IEBQYXJ0aWNpcGFudHNMaXN0ID0gJENoYXRPYmplY3QtPkNoYXRQYXJ0aWNpcGFudExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBDSEFUUEFSVElDSVBBTlQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDaGF0UGFydGljaXBhbnQgKEBQYXJ0aWNpcGFudHNMaXN0KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgaXQgdGhpcyBwYXJ0aWNpcGFudCBpcyBub3QgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDSEFUUEFSVElDSVBBTlQgaWYgJENoYXRQYXJ0aWNpcGFudC0+e0NoYXR0ZXJUeXBlfSBuZSAnVXNlcic7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0aGlzIHBhcnRpY2lwYW50cyBmcm9tIHRoZSBjaGF0CiAgICAgICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJENoYXRPYmplY3QtPkNoYXRQYXJ0aWNpcGFudFJlbW92ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXR0ZXJJRCAgID0+ICRDaGF0UGFydGljaXBhbnQtPntDaGF0dGVySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICggJEdldFBhcmFte05ld1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsc2Ugc2V0IG93bmVyIHRvIGN1cnJlbnQgYWdlbnQgYnV0IGRvIG5vdCBsb2NrIGl0CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTZW5kTm9Ob3RpZmljYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBsaW5rIHRpY2tldHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJvIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgbXkgJFRhcmdldEtleSA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufSBlcSAnU291cmNlJyApIHsKICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbGluayB0aGUgdGlja2V0cwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0gfHwgJ05vcm1hbCcsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNsb3NlZCB0aWNrZXRzIGdldCB1bmxvY2tlZAogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBzb3J0IGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBzb3J0IGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldFBob25lJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtTdWJhY3Rpb249Q3JlYXRlZDtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdHZXRTZXJ2aWNlSW5jaWRlbnRTdGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRoZSBzZWxlY3RlZCBzZXJ2aWNlIGlkCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJyc7CgogICAgICAgICMgYnVpbGQgZW1wdHkgcmVzcG9uc2UgaGFzaAogICAgICAgIG15ICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAnJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAnJm5ic3AnLAogICAgICAgICk7CgogICAgICAgICMgb25seSBpZiBzZXJ2aWNlIGlkIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRTZXJ2aWNle0N1ckluY2lTdGF0ZX0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmNvZGUgcmVzcG9uc2UgdG8gSlNPTgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwogICAgICAgIG15ICRRdWV1ZUlEICAgICAgICA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRvcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5ld1RvczsKCiAgICAgICAgaWYgKCRUb3MpIHsKICAgICAgICAgICAgVE9zOgogICAgICAgICAgICBmb3IgbXkgJEtleVRvICggc29ydCBrZXlzICV7JFRvc30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRUb3MtPnskS2V5VG99IGVxICctJyApOwogICAgICAgICAgICAgICAgJE5ld1Rvcy0+eyIkS2V5VG98fCRUb3MtPnskS2V5VG99In0gPSAkVG9zLT57JEtleVRvfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCB8fCAnJywKICAgICAgICApOwogICAgICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhbmRhcmRUZW1wbGF0ZUlEJyApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5ld1RvcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU3ViYWN0aW9uIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3VG9zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICAgICAgVGFibGUgPT4gJ3N5c3RlbV9hZGRyZXNzJywKICAgICAgICAgICAgICAgIFdoYXQgID0+ICdxdWV1ZV9pZCwgaWQnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIENsYW1wID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIFFVRVVFSUQ6CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJFN0cmluZyA9fiBze1xzK1x6fXt9IGlmICEkUXVldWVEYXRhe0NvbW1lbnR9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrUGhvbmVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgdG8gc3RyaW5nCiAgICBteSAlTmV3VG87CiAgICBpZiAoICRQYXJhbXtUb30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlUbyAoIHNvcnQga2V5cyAleyAkUGFyYW17VG99IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEtleVRvfHwkUGFyYW17VG99LT57JEtleVRvfSJ9ID0gJFBhcmFte1RvfS0+eyRLZXlUb307CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1RvU2VsZWN0ZWR9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtDdXN0b21lckRhdGF9LAogICAgICAgICAgICBNYXggID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZU1heFNpemUnKSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfSA9ICcqICcgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEtleUVycm9yfSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZyb20gZXh0ZXJuYWwKICAgIG15ICRTaG93RXJyb3JzID0gMTsKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0gJiYKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntFbWFpbH0gJiYKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntDdXN0b21lcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNob3dFcnJvcnMgPSAwOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGcm9tRXh0ZXJuYWxDdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfSwKICAgICAgICApOwogICAgfQogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17RnJvbUludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0Zyb21FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdGcm9tU2VydmVyRXJyb3JNc2cnICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57RnJvbUVycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtGcm9tSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEKICAgICk7CgogICAgIyBjcmVhdGUgYSBzdHJpbmcgd2l0aCB0aGUgcXVvdGVkIGR5bmFtaWMgZmllbGQgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZE5hbWVzKSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRHluYW1pY0ZpZWxkTmFtZXN9ICkgewogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkTmFtZXNTdHJnfSAuPSAiLCciIC4gJEZpZWxkIC4gIiciOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57U2VydmljZUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRDb25maWctPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte1ByaW9yaXR5fSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSwKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lclNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyByZXNwb25zaWJsZSBzZWxlY3Rpb24KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlT3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlclNlbGVjdGVkfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgbXkgQEluZGl2aWR1YWxEeW5hbWljRmllbGRzOwojIC0tLQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewogICAgICAgICAgICBwdXNoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQojIC0tLQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBjeWNsZSB0cm91Z2ggZHluYW1pYyBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluZGl2aWR1YWxseQogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHMgKSB7CgogICAgICAgICMgZ2V0IHRoZSBodG1sIHN0cmluZ3MgZm9ybSAkUGFyYW0KICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTaG93bk9wdGlvbnNCbG9jazsKCiAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwogICAgaWYgKCRPcHRpb25DdXN0b21lcikgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgb3B0aW9ucyBibG9jayBzbyB0aGF0IHRoZSAiTGluayBUaWNrZXQiIG9wdGlvbiBpcyBzaG93bgogICAgIyBldmVuIGlmIHNwZWxsY2hlY2tlciBhbmQgT3B0aW9uQ3VzdG9tZXIgaXMgdHVybmVkIG9mZgogICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgIH0KIyAtLS0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBQZXJtaXNzaW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBiZWZvcmUgaW4gUnVuKCkKICAgIGlmICggJFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgIENoYXRJRCA9PiAkUGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGF0QXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlcyA9PiBcQENoYXRNZXNzYWdlcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRQaG9uZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKCiAgICAjIHNldCB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0YWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzID0gcXcoIFR5cGVJRCBEZXN0IFNlcnZpY2VJRCBTTEFJRCBOZXdVc2VySUQgTmV3UmVzcG9uc2libGVJRCBOZXh0U3RhdGVJRCBQcmlvcml0eUlECiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZUlEKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgbXkgJEFydGljbGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlSUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gfHwgISRRdWV1ZUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgVGlja2V0SUQhJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRBY2Nlc3M7CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdGF0ZSAgICAgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgT2JqZWN0UGFyYW1ldGVycyA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBJZ25vcmVMaW5rZWRUaWNrZXRTdGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0eXBlIGxpc3QKICAgIG15ICVMaW5rVHlwZUxpc3QgPSAkTGlua09iamVjdC0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpbmsgZGF0YQogICAgbXkgJUxpbmtEYXRhOwogICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICVMaW5rRGF0YSA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAnU2ltcGxlUmF3JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiMgLS0tCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBzZXQgY3JpdGljYWxpdHkgYW5kIGltcGFjdAogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICctJzsKICAgICRUaWNrZXR7SW1wYWN0fSAgICAgID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCiAgICBteSBAQXJ0aWNsZUJveCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBjaGVjayBpZiBvbmx5IG9uZSBhcnRpY2xlIG5lZWQgcHJpbnRlZAogICAgaWYgKCRBcnRpY2xlSUQpIHsKCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGUtPntBcnRpY2xlSUR9ID09ICRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICBAQXJ0aWNsZUJveCA9ICgkQXJ0aWNsZSk7CiAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzaG93IHRvdGFsIGFjY291bnRlZCB0aW1lIGlmIGZlYXR1cmUgaXMgYWN0aXZlOgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlciA9PiAkVGlja2V0e093bmVyfSwKICAgICk7CgogICAgIyByZXNwb25zaWJsZSBpbmZvCiAgICBteSAlUmVzcG9uc2libGVJbmZvOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAlUmVzcG9uc2libGVJbmZvID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7UmVzcG9uc2libGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFRpY2tldHtBZ2V9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJFRpY2tldHtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJywKICAgICk7CgogICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRQREZPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgIG15ICRQcmludGVkQnkgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ3ByaW50ZWQgYnknKTsKICAgIG15ICRUaW1lICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICRUaW1lT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wKCksCiAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgKTsKCiAgICBteSAlUGFnZTsKCiAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgJFBhZ2V7TWF4UGFnZXN9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICBpZiAoICEkUGFnZXtNYXhQYWdlc30gfHwgJFBhZ2V7TWF4UGFnZXN9IDwgMSB8fCAkUGFnZXtNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgIH0KICAgIG15ICRIZWFkZXJSaWdodAogICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgbXkgJEhlYWRsaW5lTGVmdCA9ICRIZWFkZXJSaWdodDsKICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICBpZiAoICRUaWNrZXR7VGl0bGV9ICkgewogICAgICAgICRIZWFkbGluZUxlZnQgPSAkVGlja2V0e1RpdGxlfTsKICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgIH0KCiAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgJFBhZ2V7Rm9vdGVyTGVmdH0gICA9ICcnOwogICAgJFBhZ2V7UGFnZVRleHR9ICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGFnZScpOwogICAgJFBhZ2V7UGFnZUNvdW50fSAgICA9IDE7CgogICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgJFBERk9iamVjdC0+RG9jdW1lbnROZXcoCiAgICAgICAgVGl0bGUgID0+ICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICBFbmNvZGUgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICk7CgogICAgIyBjcmVhdGUgZmlyc3QgcGRmIHBhZ2UKICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgJVBhZ2UsCiAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICk7CiAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNiwKICAgICk7CgogICAgIyBvdXRwdXQgdGl0bGUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0ICJwcmludGVkIGJ5IgogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ID0+ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpJwogICAgICAgICAgICAuICcsICcgLiAkVGltZSwKICAgICAgICBGb250U2l6ZSA9PiA5LAogICAgKTsKCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNCwKICAgICk7CgogICAgIyBvdXRwdXQgdGlja2V0IGluZm9zCiAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEluZm9zKAogICAgICAgIFBhZ2VEYXRhICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgVGlja2V0RGF0YSAgICAgID0+IFwlVGlja2V0LAogICAgICAgIFVzZXJEYXRhICAgICAgICA9PiBcJVVzZXJJbmZvLAogICAgICAgIFJlc3BvbnNpYmxlRGF0YSA9PiBcJVJlc3BvbnNpYmxlSW5mbywKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNiwKICAgICk7CgogICAgIyBvdXRwdXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldER5bmFtaWNGaWVsZHMoCiAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNiwKICAgICk7CgogICAgIyBvdXRwdXQgbGlua2VkIG9iamVjdHMKICAgIGlmICglTGlua0RhdGEpIHsKICAgICAgICAkU2VsZi0+X1BERk91dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIExpbmtEYXRhICAgICA9PiBcJUxpbmtEYXRhLAogICAgICAgICAgICBMaW5rVHlwZUxpc3QgPT4gXCVMaW5rVHlwZUxpc3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEN1c3RvbWVySW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGFydGljbGVzCiAgICAkU2VsZi0+X1BERk91dHB1dEFydGljbGVzKAogICAgICAgIFBhZ2VEYXRhICAgICAgPT4gXCVQYWdlLAogICAgICAgIEFydGljbGVEYXRhICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgIEFydGljbGVOdW1iZXIgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVOdW1iZXInICksCiAgICApOwoKICAgICMgZ2V0IHRpbWUgb2JqZWN0IGFuZCB1c2UgdGhlIFVzZXJUaW1lT2JqZWN0LCBpZiB0aGUgc3lzdGVtIHVzZSBVVEMgYXMKICAgICMgc3lzdGVtIHRpbWUgYW5kIHRoZSBUaW1lWm9uZVVzZXIgZmVhdHVyZSBpcyBhY3RpdmUKICAgIGlmICgKICAgICAgICAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U2VydmVyTG9jYWxUaW1lT2Zmc2V0U2Vjb25kcygpCiAgICAgICAgJiYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaW1lWm9uZVVzZXInKQogICAgICAgICYmICRTZWxmLT57VXNlclRpbWVab25lfQogICAgICAgICkKICAgIHsKICAgICAgICAkVGltZU9iamVjdCA9ICRMYXlvdXRPYmplY3QtPntVc2VyVGltZU9iamVjdH07CiAgICB9CgogICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgbXkgJEZpbGVuYW1lID0gJ1RpY2tldF8nIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKICAgIG15ICRQREZTdHJpbmcgPSAkUERGT2JqZWN0LT5Eb2N1bWVudE91dHB1dCgpOwogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgIENvbnRlbnQgICAgID0+ICRQREZTdHJpbmcsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICApOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhIFVzZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVUaWNrZXQgICA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVVzZXJJbmZvID0gJXsgJFBhcmFte1VzZXJEYXRhfSB9OwogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjcmVhdGUgbGVmdCB0YWJsZQogICAgbXkgJFRhYmxlTGVmdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU3RhdGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e1N0YXRlfSApLAogICAgICAgIH0sCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgewojICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQcmlvcml0eScpLAojICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e1ByaW9yaXR5fSApLAojICAgICAgICB9LAojIC0tLQogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdRdWV1ZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1F1ZXVlfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMb2NrJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFRpY2tldHtMb2NrfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbWVySUQnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPd25lcicpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e093bmVyfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFVzZXJJbmZve1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgYWRkIHJlc3BvbnNpYmxlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgIG15ICRSZXNwb25zaWJsZSA9ICctJzsKICAgICAgICBpZiAoICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUgPSAkVGlja2V0e1Jlc3BvbnNpYmxlfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJMYXN0bmFtZX0gLiAnKSc7CiAgICAgICAgfQogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVzcG9uc2libGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3BvbnNpYmxlLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHR5cGUgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIGFuZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgICAgICBteSAkUm93U0xBID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NMQScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBteSAkVGFibGVMZWZ0RXh0ZW5kZWQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcml0aWNhbGl0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdJbXBhY3QnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7SW1wYWN0fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e1ByaW9yaXR5fSksCiAgICAgICAgfSwKICAgIF07CiAgICBwdXNoIEB7JFRhYmxlTGVmdH0sIEB7JFRhYmxlTGVmdEV4dGVuZGVkfTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FnZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaWNrZXR7QWdlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7Q3JlYXRlZH0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBzaG93IGNyZWF0ZWQgYnkgaWYgZGlmZmVyZW50IHRoZW4gVXNlciBJRCAxCiAgICBpZiAoICRUaWNrZXR7Q3JlYXRlQnl9ID4gMSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQgYnknKSwKICAgICAgICAgICAgVmFsdWUgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlck5hbWUoIFVzZXJJRCA9PiAkVGlja2V0e0NyZWF0ZUJ5fSApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FjY291bnRlZCB0aW1lJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBvbmx5IHNob3cgcGVuZGluZyB1bnRpbCB1bmxlc3MgaXQgaXMgcmVhbGx5IHBlbmRpbmcKICAgIGlmICggJFRpY2tldHtQZW5kaW5nVW50aWx9ICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGVuZGluZyB0aWxsJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UGVuZGluZ1VudGlsfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgZmlyc3QgcmVzcG9uc2UgdGltZSByb3cKICAgIGlmICggZGVmaW5lZCggJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICAgICAgJ05vU2Vjb25kcycsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHVwZGF0ZSB0aW1lIHJvdwogICAgaWYgKCBkZWZpbmVkKCAkVGlja2V0e1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdVcGRhdGUgVGltZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzb2x1dGlvbiB0aW1lIHJvdwogICAgaWYgKCBkZWZpbmVkKCAkVGlja2V0e1NvbHV0aW9uVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NvbHV0aW9uIFRpbWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDcwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTU2LjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSAxOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gNzA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNTYuNTsKCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA3OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0YyRjJGMic7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBnZXQgUERGIG9iamVjdAogICAgICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIExpbmtEYXRhIExpbmtUeXBlTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7ICRQYXJhbXtMaW5rRGF0YX0gfSApIHsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgIG15IEBMaW5rRGF0YSAgICAgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRMaW5rVHlwZU5hbWUpOwoKICAgICAgICAjIGRlZmluZSBoZWFkbGluZQogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMaW5rVHlwZU5hbWUgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICcnOwoKICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRQYXJhbXtMaW5rRGF0YX0tPnskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gfHw9ICcnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgewogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgZ2V0IFBERiBvYmplY3QKICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgJFBERk9iamVjdC0+SExpbmUoCiAgICAgICAgQ29sb3IgICAgID0+ICcjYWFhJywKICAgICAgICBMaW5lV2lkdGggPT4gMC41LAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTEwLAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xpbmtlZCBPYmplY3RzJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gMTAsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbCcsCiAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldER5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW50IiktPntEeW5hbWljRmllbGR9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJER5bmFtaWNGaWVsZEZpbHRlciB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdlbmVyYXRlIHRhYmxlCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkKICAgICAgICAgICAgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CgogICAgICAgICRSb3crKzsKICAgICAgICAkT3V0cHV0ID0gMTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgZ2V0IFBERiBvYmplY3QKICAgICAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICAgICAkUERGT2JqZWN0LT5ITGluZSgKICAgICAgICAgICAgQ29sb3IgICAgID0+ICcjYWFhJywKICAgICAgICAgICAgTGluZVdpZHRoID0+IDAuNSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTEwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUaWNrZXQgRHluYW1pYyBGaWVsZHMnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gMTAsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsJywKICAgICAgICAgICAgRm9udFNpemUgPT4gOCwKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEN1c3RvbWVySW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEN1c3RvbWVyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgID0gMDsKICAgIG15ICVDdXN0b21lckRhdGEgPSAleyAkUGFyYW17Q3VzdG9tZXJEYXRhfSB9OwogICAgbXkgJVBhZ2UgICAgICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CiAgICBteSAkTWFwID0gJEN1c3RvbWVyRGF0YXtDb25maWd9LT57TWFwfTsKCiAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGNvbXBhbnkgc3VwcG9ydCBpcyBlbmFibGVkCiAgICBpZiAoICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICkgewogICAgICAgIG15ICRNYXAyID0gJEN1c3RvbWVyRGF0YXtDb21wYW55Q29uZmlnfS0+e01hcH07CiAgICAgICAgaWYgKCRNYXAyKSB7CiAgICAgICAgICAgIHB1c2goIEB7JE1hcH0sIEB7JE1hcDJ9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICRGaWVsZCAoIEB7JE1hcH0gKSB7CiAgICAgICAgaWYgKCAkeyRGaWVsZH1bM10gJiYgJEN1c3RvbWVyRGF0YXsgJHskRmllbGR9WzBdIH0gKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJHskRmllbGR9WzFdICkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEN1c3RvbWVyRGF0YXsgJHskRmllbGR9WzBdIH07CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgZ2V0IFBERiBvYmplY3QKICAgICAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTEwLAogICAgICAgICk7CgogICAgICAgICRQREZPYmplY3QtPkhMaW5lKAogICAgICAgICAgICBDb2xvciAgICAgPT4gJyNhYWEnLAogICAgICAgICAgICBMaW5lV2lkdGggPT4gMC41LAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VzdG9tZXIgSW5mb3JtYXRpb24nKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gMTAsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsJywKICAgICAgICAgICAgRm9udFNpemUgPT4gOCwKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEFydGljbGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBBcnRpY2xlRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlUGFnZSA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBERk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgQEFydGljbGVEYXRhICA9IEB7ICRQYXJhbXtBcnRpY2xlRGF0YX0gfTsKICAgIG15ICRBcnRpY2xlQ291bnQgPSBzY2FsYXIgQEFydGljbGVEYXRhOwoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgbXkgJFpvb21FeHBhbmRTb3J0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpOwoKICAgICMgcmVzb3J0IGFydGljbGUgb3JkZXIKICAgIGlmICggJFpvb21FeHBhbmRTb3J0IGVxICdyZXZlcnNlJyApIHsKICAgICAgICBAQXJ0aWNsZURhdGEgPSByZXZlcnNlKEBBcnRpY2xlRGF0YSk7CiAgICB9CgogICAgbXkgJEFydGljbGVDb3VudGVyID0gMTsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVEYXRhKSB7CgogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgbXkgJEF0dGFjaG1lbnRzOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEF0dGFjaG1lbnRzIC49ICRGaWxle0ZpbGVuYW1lfSAuICcgKCcgLiAkRmlsZXtGaWxlc2l6ZX0gLiAiKVxuIjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBzaG93IHRvdGFsIGFjY291bnRlZCB0aW1lIGlmIGZlYXR1cmUgaXMgYWN0aXZlOgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkQXJ0aWNsZXsnQWNjb3VudGVkIHRpbWUnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXJ0aWNsZSBpbmZvIHRhYmxlCiAgICAgICAgbXkgJVRhYmxlUGFyYW0xOwogICAgICAgIG15ICRSb3cgPSAwOwoKICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBudW1iZXIKICAgICAgICBteSAkQXJ0aWNsZU51bWJlcjsKICAgICAgICBpZiAoICRQYXJhbXtBcnRpY2xlTnVtYmVyfSApIHsKICAgICAgICAgICAgJEFydGljbGVOdW1iZXIgPSAkUGFyYW17QXJ0aWNsZU51bWJlcn07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZU51bWJlciA9ICRab29tRXhwYW5kU29ydCBlcSAncmV2ZXJzZScgPyAkQXJ0aWNsZUNvdW50IC0gJEFydGljbGVDb3VudGVyICsgMSA6ICRBcnRpY2xlQ291bnRlcjsKICAgICAgICB9CgogICAgICAgICMgYXJ0aWNsZSBudW1iZXIgdGFnCiAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBcnRpY2xlJykgLiAnICMnIC4gJEFydGljbGVOdW1iZXIsCiAgICAgICAgICAgIEhlaWdodCAgID0+IDEwLAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbCcsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDgsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICdGcm9tJywgJ1RvJywgJ0NjJywgJ0FjY291bnRlZCB0aW1lJywgJ1N1YmplY3QnLCApIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFBhcmFtZXRlcikgLiAnOic7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xleyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAkQXJ0aWNsZXtDcmVhdGVkfSwKICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICAuPSAnICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2J5Jyk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICAuPSAnICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBcnRpY2xle1NlbmRlclR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlciA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmludCIpLT57RHluYW1pY0ZpZWxkfTsKCiAgICAgICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydBcnRpY2xlJ10sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICREeW5hbWljRmllbGRGaWx0ZXIgfHwge30sCiAgICAgICAgKTsKCiAgICAgICAgIyAgZ2V0IGR5bmFtaWNmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkKICAgICAgICAgICAgICAgIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKICAgICAgICAgICAgJFJvdysrOwogICAgICAgIH0KCiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVHlwZScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICBpZiAoJEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0F0dGFjaG1lbnQnKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgY2hvbXAoJEF0dGFjaG1lbnRzKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBdHRhY2htZW50czsKICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAkUERGT2JqZWN0LT5ITGluZSgKICAgICAgICAgICAgQ29sb3IgICAgID0+ICcjYWFhJywKICAgICAgICAgICAgTGluZVdpZHRoID0+IDAuNSwKICAgICAgICApOwoKICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgaW5mb3MpCiAgICAgICAgJFRhYmxlUGFyYW0xe1R5cGV9ICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JvcmRlcn0gICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTF7Rm9udFNpemV9ICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nfSAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdUb3B9ICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ0JvdHRvbX0gPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBpbmZvcykKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRQREZPYmplY3QtPlRhYmxlKCAlVGFibGVQYXJhbTEsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTF7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnIHx8ICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcgKQogICAgICAgIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRMaW5lczsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRBcnRpY2xle0JvZHl9ICkgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmUgKCBAeyAkQXJ0aWNsZXtCb2R5fSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRDcmVhdGVUaW1lCiAgICAgICAgICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZyggJExpbmUtPntDcmVhdGVUaW1lfSwgJ0RhdGVGb3JtYXQnICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGluZS0+e1N5c3RlbUdlbmVyYXRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5lcyAuPSAnWycgLiAkQ3JlYXRlVGltZSAuICddICcgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTGluZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICdbJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ3JlYXRlVGltZSAuICddICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExpbmUtPntDaGF0dGVyTmFtZX0gLiAnICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExpbmUtPntNZXNzYWdlVGV4dH0gLiAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRMaW5lczsKICAgICAgICB9CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGJvZHkpCiAgICAgICAgbXkgJVRhYmxlUGFyYW0yOwogICAgICAgICRUYWJsZVBhcmFtMntDZWxsRGF0YX1bMF1bMF17Q29udGVudH0gPSAkQXJ0aWNsZXtCb2R5fSB8fCAnICc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1R5cGV9ICAgICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMntCb3JkZXJ9ICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMntGb250fSAgICAgICAgICAgICAgICAgICAgPSAnTW9ub3NwYWNlZCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnRTaXplfSAgICAgICAgICAgICAgICA9IDc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JhY2tncm91bmRDb2xvcn0gICAgICAgICA9ICcjZjJmMmYyJzsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ30gICAgICAgICAgICAgICAgID0gNDsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ1RvcH0gICAgICAgICAgICAgID0gNDsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ0JvdHRvbX0gICAgICAgICAgID0gNDsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgYm9keSkKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMiA9ICRQREZPYmplY3QtPlRhYmxlKCAlVGFibGVQYXJhbTIsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTJ7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZUNvdW50ZXIrKzsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJvY2Vzcy5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UHJvY2VzczsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyAkU2VsZiwgJFR5cGU7CgogICAgIyBnbG9iYWwgY29uZmlnIGhhc2ggZm9yIGlkIGRpc3NvbHV0aW9uCiAgICAkU2VsZi0+e05hbWVUb0lEfSA9IHsKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgIFN0YXRlICAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgUHJpb3JpdHkgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFByaW9yaXR5SUQgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBMb2NrICAgICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBMb2NrSUQgICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBRdWV1ZSAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEN1c3RvbWVyICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICBDdXN0b21lcklEICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgQ3VzdG9tZXJObyAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICdDdXN0b21lclVzZXJJRCcsCiAgICAgICAgT3duZXIgICAgICAgICAgPT4gJ093bmVySUQnLAogICAgICAgIE93bmVySUQgICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBUeXBlSUQgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBTTEEgICAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNMQUlEICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgU2VydmljZSAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgU2VydmljZUlEICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgUmVzcG9uc2libGUgICAgPT4gJ1Jlc3BvbnNpYmxlSUQnLAogICAgICAgIFJlc3BvbnNpYmxlSUQgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBQZW5kaW5nVGltZSAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIEFydGljbGUgICAgICAgID0+ICdBcnRpY2xlJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJFRpY2tldElEICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nSGFzaFJlZjsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIGlmICgkVGlja2V0SUQpIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIGNvbmZpZ3VyZWQgcmVxdWlyZWQgcGVybWlzc2lvbgogICAgICAgICMgZm9yIHRoZSBBY3Rpdml0eURpYWxvZyAoaWYgdGhlcmUgaXMgb25lKQogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ1Blcm1pc3Npb24gPSAncncnOwogICAgICAgIGlmICgkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCkgewogICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dIYXNoUmVmID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2dIYXNoUmVmKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBnZXQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2dIYXNoUmVmLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uID0gJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1Blcm1pc3Npb259OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRBY3Rpdml0eURpYWxvZ1Blcm1pc3Npb24sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRBY3Rpdml0eURpYWxvZ1Blcm1pc3Npb24gKSwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgICAgICMgY2hlY2sgaWYgQUNMIHJlc3RyaWN0aW9ucyBleGlzdAogICAgICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nSGFzaFJlZikgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSBsb2NrZWQgYnkgc29tZWJvZHkgZWxzZQogICAgICAgICAgICBpZiAoICRBY3Rpdml0eURpYWxvZ0hhc2hSZWYtPntSZXF1aXJlZExvY2t9ICkgewoKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFRpY2tldElEICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICAgICAgICAgIGlmICggJExvY2sgJiYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgUmVsb2FkIHRoZSBwYXJlbnQgd2luZG93IHRvIHNob3cgdGhlIHVwZGF0ZWQgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BhcmVudFJlbG9hZH0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUgbGluawogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVuZGVyTG9ja2VkfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIG5vdGlmeSB0aGUgYWdlbnQgdGhhdCB0aGUgdGlja2V0IHdhcyBsb2NrZWQKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtOb3RpZnl9IH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICIkVGlja2V0TnVtYmVyOiAiIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaWNrZXQgbG9ja2VkLiIpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQb3NzaWJsZUFjdGl2aXR5RGlhbG9ncyA9IHsgMSA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCB9OwoKICAgICAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICA9PiAkUG9zc2libGVBY3Rpdml0eURpYWxvZ3MsCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICAgICAgID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICAgICAgICAgID0+ICctJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgJXskUG9zc2libGVBY3Rpdml0eURpYWxvZ3N9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxpc3Qgb25seSBBY3RpdmUgcHJvY2Vzc2VzIGJ5IGRlZmF1bHQKICAgIG15IEBQcm9jZXNzU3RhdGVzID0gKCdBY3RpdmUnKTsKCiAgICAjIHNldCBJc01haW5XaW5kb3csIElzQWpheFJlcXVlc3QsIElzUHJvY2Vzc0Vucm9sbCBmb3IgcHJvcGVyIGVycm9yIHJlc3BvbnNlcywgc2NyZWVuIGRpc3BsYXkKICAgICMgYW5kIHByb2Nlc3MgbGlzdAogICAgJFNlbGYtPntJc01haW5XaW5kb3d9ICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lzTWFpbldpbmRvdycgKSAgICB8fCAnJzsKICAgICRTZWxmLT57SXNBamF4UmVxdWVzdH0gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJc0FqYXhSZXF1ZXN0JyApICAgfHwgJyc7CiAgICAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXNQcm9jZXNzRW5yb2xsJyApIHx8ICcnOwoKICAgICMgZmV0Y2ggYWxzbyBGYWRlQXdheSBwcm9jZXNzZXMgdG8gY29udGludWUgd29ya2luZyB3aXRoIGV4aXN0aW5nIHRpY2tldHMsIGJ1dCBub3QgdG8gc3RhcnQgbmV3CiAgICAjICAgIG9uZXMKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgcHVzaCBAUHJvY2Vzc1N0YXRlcywgJ0ZhZGVBd2F5JzsKICAgIH0KCiAgICAjIGNyZWF0ZSBwcm9jZXNzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnID0+IHsKICAgICAgICAgICAgQWN0aXZpdHlPYmplY3QgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5JyksCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nT2JqZWN0ICAgPT4gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LAogICAgICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbicpLAogICAgICAgICAgICBUcmFuc2l0aW9uQWN0aW9uT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbicpLAogICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgICMgZ2V0IHByb2Nlc3NlcwogICAgbXkgJFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICk7CgogICAgIyBhbHNvIGdldCB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgaW5pdGlhdGVkIGJ5IGN1c3RvbWVycywgYXMgYW4gYWN0aXZpdHkgZGlhbG9nIG1pZ2h0IGJlCiAgICAjIGNvbmZpZ3VyZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UKICAgIG15ICRGb2xsb3d1cFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsgJ0FnZW50SW50ZXJmYWNlJywgJ0N1c3RvbWVySW50ZXJmYWNlJyBdLAogICAgKTsKCiAgICBteSAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2Nlc3NFbnRpdHlJRCcgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICYmICFJc0hhc2hSZWZXaXRoRGF0YSgkRm9sbG93dXBQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gUHJvY2VzcyBjb25maWd1cmVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgcHJvY2VzcyBsaXN0IGZvciBBQ0xzLCB1c2Ugb25seSBlbnRpdGllcyBpbnN0ZWFkIG9mIG5hbWVzLCBjb252ZXJ0IGZyb20KICAgICMgICBQMSA9PiBOYW1lIHRvIFAxID0+IFAxLiBBcyBBQ0xzIHNob3VsZCB3b3JrIG9ubHkgYWdhaW5zdCBlbnRpdGllcwogICAgbXkgJVByb2Nlc3NMaXN0QUNMID0gbWFwIHsgJF8gPT4gJF8gfSBzb3J0IGtleXMgJXskUHJvY2Vzc0xpc3R9OwoKICAgICMgdmFsaWRhdGUgdGhlIFByb2Nlc3NMaXN0IHdpdGggc3RvcmVkIEFDTHMKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnUHJvY2VzcycsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVByb2Nlc3NMaXN0QUNMLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgKTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgJiYgJEFDTCApIHsKCiAgICAgICAgIyBnZXQgQUNMIHJlc3VsdHMKICAgICAgICBteSAlQUNMRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgIyByZWNvdmVyIHByb2Nlc3MgbmFtZXMKICAgICAgICBteSAlUmVkdWNlZFByb2Nlc3NMaXN0ID0gbWFwIHsgJF8gPT4gJFByb2Nlc3NMaXN0LT57JF99IH0gc29ydCBrZXlzICVBQ0xEYXRhOwoKICAgICAgICAjIHJlcGxhY2Ugb3JpZ2luYWwgcHJvY2VzcyBsaXN0IHdpdGggdGhlIHJlZHVjZWQgb25lCiAgICAgICAgJFByb2Nlc3NMaXN0ID0gXCVSZWR1Y2VkUHJvY2Vzc0xpc3Q7CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIG5vIHN1YmFjdGlvbiBkaXNwbGF5IHRoZSBwcm9jZXNzIGxpc3QgdG8gc3RhcnQgYSBuZXcgb25lCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICMgdG8gZGlzcGxheSB0aGUgcHJvY2VzcyBsaXN0IGlzIG1hbmRhdG9yeSB0byBoYXZlIHByb2Nlc3NlcyB0aGF0IGFnZW50IGNhbiBzdGFydAogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBQcm9jZXNzIGNvbmZpZ3VyZWQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9jZXNzIGlkIChpZiBhbnksIGEgcHJvY2VzcyBzaG91bGQgYmUgcHJlLXNlbGVjdGVkKQogICAgICAgICRQYXJhbXtQcm9jZXNzSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVTZWxlY3RQcm9jZXNzfSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9EaXNwbGF5UHJvY2Vzc0xpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0xpc3QgICAgID0+ICRQcm9jZXNzTGlzdCwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBwcm9jZXNzIGZyb20gdGhlIGxpc3QgaXMgdmFsaWQsIHByZXZlbnQgdGFtcGVyIHdpdGggcHJvY2VzcyBzZWxlY3Rpb24KICAgICMgICAgbGlzdCAobm90IGV4aXN0aW5nLCBpbnZhbGlkIGFuIGZhZGUgYXdheSBwcm9jZXNzZXMgbXVzdCBub3QgYmUgYWJsZSB0byBzdGFydCBhIG5ldyBwcm9jZXNzCiAgICAjICAgIHRpY2tldCkKICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnCiAgICAgICAgJiYgISRQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgJFNlbGYtPntJc01haW5XaW5kb3d9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgZXJyb3IgbWVzc2FnZSAoYXMgaXQgd2lsbCBiZSBpbmplY3RlZCBpbiB0aGUgSFRNTCkKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaGUgc2VsZWN0ZWQgcHJvY2VzcyBpcyBpbnZhbGlkISIpOwoKICAgICAgICAjIHJldHVybiBhIHByZWRlZmluZWQgSFRNTCBzdHJ1Y3R1cmUgYXMgdGhlIEFKQVggY2FsbCBpcyBleHBlY3RpbmcgYW5kIEhUTUwgcmVzcG9uc2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdiBjbGFzcz0iU2VydmVyRXJyb3IiIGRhdGEtbWVzc2FnZT0iJyAuICRFcnJvck1lc3NhZ2UgLiAnIj48L2Rpdj4nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgaW52YWxpZCBwcm9jZXNzIGlzIGRldGVjdGVkIG9uIGEgQWN0aXZpdHlEaWxvZyBwb3AtdXAgc2NyZWVuIHNob3cgYW4gZXJyb3IgbWVzc2FnZQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJwogICAgICAgICYmICEkRm9sbG93dXBQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgISRTZWxmLT57SXNNYWluV2luZG93fQogICAgICAgICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Byb2Nlc3MgJXMgaXMgaW52YWxpZCEnLCAkUHJvY2Vzc0VudGl0eUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycwogICAgIyBjb2xsZWN0cyBhIG1peHR1cmUgb2YgcHJlc2VudCB2YWx1ZXMgYm90dG9tIHRvIHRvcDoKICAgICMgU3lzQ29uZmlnIERlZmF1bHRWYWx1ZXMsIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMsIFRpY2tldFZhbHVlcywgU3VibWl0dGVkVmFsdWVzCiAgICAjIGluY2x1ZGluZyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBQcm9jZXNzRW50aXR5SUQKICAgICMgaXMgdXNlZCBmb3I6CiAgICAjIC0gUGFyYW1ldGVyIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nCiAgICAjIC0gd2lsbCBiZSB1c2VkIGZvciBBQ0wgY2hlY2tpbmcgbGF0ZXIgb24KICAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5fR2V0UGFyYW0oCiAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICApOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RvcmVBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzTmFtZSAgICAgPT4gJFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewoKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0hUTUwgPSAkU2VsZi0+X091dHB1dEFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFjdGl2aXR5RGlhbG9nSFRNTCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgIHJldHVybiAkU2VsZi0+X1JlbmRlckFqYXgoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3ViYWN0aW9uIGlzIGludmFsaWQhJyksCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKc3ViIF9SZW5kZXJBamF4IHsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgRmF0YWxFcnJvciBpcyBzYWZlIGJlY2F1c2UgYSBKU09OIHN0cnVjdHVyZSBpcyBleHBlY3RpbmcsIHRoZW4gaXQgd2lsbCByZXN1bHQgaW50byBhCiAgICAjIGNvbW11bmljYXRpb25zIGVycm9yCgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckFqYXgnICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywgJ19SZW5kZXJBamF4JyApLAogICAgICAgICk7CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ05vIEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyZWQgZm9yICVzIGluIF9SZW5kZXJBamF4IScsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIG15ICVGaWVsZHNQcm9jZXNzZWQ7CiAgICBteSBASlNPTkNvbGxlY3RvcjsKCiAgICBteSAkU2VydmljZXM7CgogICAgIyBBbGwgc3VibWl0dGVkIER5bmFtaWNGaWVsZHMKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZENoZWNrUGFyYW07CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRDaGVja1BhcmFteyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQ2hlY2tQYXJhbTsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHkgZGlhbG9nJ3MgU3VibWl0IFBhcmFtJ3Mgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgU2tpcCBpZiB3ZSdyZSB3b3JraW5nIG9uIGEgZmllbGQgdGhhdCB3YXMgYWxyZWFkeSBkb25lIHdpdGggb3Igd2l0aG91dCBJRAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0KICAgICAgICAgICAgJiYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ093bmVySUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0T3duZXJzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBPd25lciB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1Jlc3BvbnNpYmxlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBSZXNwb25zaWJsZSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1F1ZXVlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UXVldWVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgUXVldWUgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTdGF0ZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFN0YXRlIHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdQcmlvcml0eUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCAkUGFyYW17R2V0UGFyYW19LT57RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17R2V0UGFyYW19LT57RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICYmICRQYXJhbXtHZXRQYXJhbX0tPntTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9CiAgICAgICAgICAgICkgewoKICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0tPntTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSBwcmlvcml0eSBmcm9tIHRoZSBDSVAgbWF0cml4CiAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJREZyb21JbXBhY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgUHJpb3JpdHkgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQcmlvcml0eUlERnJvbUltcGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CgogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQojIC0tLQoKICAgICAgICAgICAgIyBhZGQgUHJpb3JpdHkgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU2VydmljZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VydmljZXMgPSAkRGF0YTsKCiAgICAgICAgICAgICMgYWRkIFNlcnZpY2UgdG8gdGhlIEpTT05Db2xsZWN0b3IgKFVzZSBTZXJ2aWNlSUQgZnJvbSB3ZWIgcmVxdWVzdCkKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1NMQUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgIyBpZiBTTEEgaXMgcmVuZGVyIGJlZm9yZSBzZXJ2aWNlIChieSBpdCBvcmRlciBpbiB0aGUgZmllbGRzKSBpdCBuZWVkcyB0byBjcmVhdGUKICAgICAgICAgICAgIyB0aGUgc2VydmljZSBsaXN0CiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRTZXJ2aWNlcykgKSB7CiAgICAgICAgICAgICAgICAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgU2VydmljZXMgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgU0xBIHRvIHRoZSBKU09OQ29sbGVjdG9yIChVc2UgU2VsZWN0ZWRJRCBmcm9tIHdlYiByZXF1ZXN0KQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NMQUlEJyApIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnVHlwZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBBZGQgVHlwZSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlbGVjdGVkSUQgZnJvbSB3ZWIgcmVxdWVzdCkuCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVHlwZUlEJyApIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oIFtASlNPTkNvbGxlY3Rvcl0gKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgojID1jdXQKIwojIF9HZXRQYXJhbSgpCiMKIyByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgb2YgdGhlIHN1Ym1pdHRlZCBpbmZvcm1hdGlvbgojCiMgVGhpcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGEgZm9yIHRoZSBkaWZmZXJlbnQgY2FsbGVyczoKIwojICAgICBJbml0aWFsIGNhbGwgd2l0aCBzZWxlY3RlZCBQcm9jZXNzOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBEZWZhdWx0VmFsdWVzIGZvciB0aGUgY29uZmlndXJlZCBGaWVsZHMgaW4gdGhhdCBBY3Rpdml0eURpYWxvZwojICAgICAgICAgRGVmYXVsdFZhbHVlcyBmb3IgdGhlIDQgcmVxdWlyZWQgRmllbGRzIFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkKIwojICAgICBGaXJzdCBTdG9yZSBjYWxsIHN1Ym1pdHRpbmcgYW4gQWN0aXZpdHkgRGlhbG9nOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBTdWJtaXR0ZWRWYWx1ZXMgZm9yIHRoZSBjdXJyZW50IEFjdGl2aXR5RGlhbG9nCiMgICAgICAgICBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWVzIGZvciBpbnZpc2libGUgZmllbGRzIG9mIHRoYXQgQWN0aXZpdHlEaWFsb2cKIyAgICAgICAgIERlZmF1bHRWYWx1ZXMgZm9yIHRoZSA0IHJlcXVpcmVkIEZpZWxkcyBRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5CiMgICAgICAgICAgICAgaWYgbm90IGNvbmZpZ3VyZWQgaW4gdGhlIEFjdGl2aXR5RGlhbG9nCiMKIyAgICAgQWN0aXZpdHlEaWFsb2cgZmlsbG91dCByZXF1ZXN0IG9uIGV4aXN0aW5nIFRpY2tldDoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgVGlja2V0VmFsdWVzCiMKIyAgICAgQWN0aXZpdHlEaWFsb2cgc3RvcmUgcmVxdWVzdCBvciBBamF4VXBkYXRlIHJlcXVlc3Qgb24gZXhpc3RpbmcgVGlja2V0czoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgVGlja2V0VmFsdWVzIGZvciBhbGwgbm90LVN1Ym1pdHRlZCBWYWx1ZXMKIyAgICAgICAgIFN1Ym1pdHRlZCBWYWx1ZXMKIwojICAgICBteSAkR2V0UGFyYW0gPSBfR2V0UGFyYW0oCiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKIyAgICAgKTsKIwojID1jdXQKCnN1YiBfR2V0UGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjbXkgJElzQUpBWFVwZGF0ZSA9ICRQYXJhbXtBSkFYfSB8fCAnJzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX0dldFBhcmFtJyApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBteSAlR2V0UGFyYW07CiAgICBteSAlVGlja2V0OwogICAgbXkgJFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPSAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfTsKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywKICAgICk7CiAgICBteSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgIG15ICVWYWx1ZXNHb3R0ZW47CiAgICBteSAkVmFsdWU7CgogICAgIyBnZXQgYWN0aXZpdHkgZGlhbG9nIG9iamVjdAogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgfQogICAgKTsKICAgIG15ICRQcm9jZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyk7CgogICAgIyBJZiB3ZSBnb3Qgbm8gQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBhbmQgbm8gVGlja2V0SUQKICAgICMgd2UgaGF2ZSB0byBnZXQgdGhlIFByb2Nlc3NlcycgU3RhcnRwb2ludAogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgJiYgKCAhJFRpY2tldElEIHx8ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApICkgewogICAgICAgIG15ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICApOwogICAgICAgIGlmICgKICAgICAgICAgICAgISRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgIHx8ICEkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdHb3Qgbm8gU3RhcnQgQWN0aXZpdHlFbnRpdHlJRCBvciBTdGFydCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGZvciBQcm9jZXNzOiAlcyBpbiBfR2V0UGFyYW0hJywKICAgICAgICAgICAgICAgICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9OwogICAgICAgICRBY3Rpdml0eUVudGl0eUlEICAgICAgID0gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX07CiAgICB9CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NvdWxkblwndCBnZXQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBpZiB0aGVyZSBpcyBhIHRpY2tldCB0aGVuIGlzIG5vdCBhbiBBSkFYIHJlcXVlc3QKICAgIGlmICgkVGlja2V0SUQpIHsKICAgICAgICAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICVHZXRQYXJhbSA9ICVUaWNrZXQ7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlR2V0UGFyYW0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZ2V0IFRpY2tldCBmb3IgVGlja2V0SUQ6ICVzIGluIF9HZXRQYXJhbSEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQiKQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoICEkQWN0aXZpdHlFbnRpdHlJRCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZGV0ZXJtaW5lIEFjdGl2aXR5RW50aXR5SUQuIER5bmFtaWNGaWVsZCBvciBDb25maWcgaXNuXCd0IHNldCBwcm9wZXJseSEnCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQogICAgJEdldFBhcmFte0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9ID0gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQ7CiAgICAkR2V0UGFyYW17QWN0aXZpdHlFbnRpdHlJRH0gICAgICAgPSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgICRHZXRQYXJhbXtQcm9jZXNzRW50aXR5SUR9ICAgICAgICA9ICRQcm9jZXNzRW50aXR5SUQ7CgogICAgIyBHZXQgdGhlIGFjdGl2aXR5ZGlhbG9ncydzIFN1Ym1pdCBQYXJhbSdzIG9yIENvbmZpZyBQYXJhbXMKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewoKICAgICAgICAjIFNraXAgaWYgd2UncmUgd29ya2luZyBvbiBhIGZpZWxkIHRoYXQgd2FzIGFscmVhZHkgZG9uZSB3aXRoIG9yIHdpdGhvdXQgSUQKICAgICAgICBpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICYmICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHRoZSBDb25maWcgb2YgdGhlIGN1cnJlbnQgRHluYW1pY0ZpZWxkICh0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ3JlcCByZXN1bHQgYXJyYXkpCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZSA9CiAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJER5bmFtaWNGaWVsZE5hbWUsIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IER5bmFtaWNGaWVsZCBWYWx1ZXMKICAgICAgICAgICAgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eSBmcm9tIHRoZSBzZXJ2aWNlCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZE5hbWUgZXEgJ0lUU01Dcml0aWNhbGl0eScgJiYgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgICAgICAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICksCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VydmljZXtDcml0aWNhbGl0eX07CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgICAgICMgSWYgd2UgZ290IGEgc3VibWl0dGVkIHBhcmFtLCB0YWtlIGl0IGFuZCBuZXh0IG91dAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRWYWx1ZQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRWYWx1ZSBlcSAnJwogICAgICAgICAgICAgICAgICAgIHx8IElzU3RyaW5nV2l0aERhdGEoJFZhbHVlKQogICAgICAgICAgICAgICAgICAgIHx8IElzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgfHwgSXNIYXNoUmVmV2l0aERhdGEoJFZhbHVlKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBoYXZlIGEgUGFyYW0gVmFsdWUgdHJ5IHRoZSB0aWNrZXQgVmFsdWUKICAgICAgICAgICAgIyBuZXh0IG91dCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAkVGlja2V0eyRDdXJyZW50RmllbGR9IGVxICcnCiAgICAgICAgICAgICAgICAgICAgfHwgSXNTdHJpbmdXaXRoRGF0YSggJFRpY2tldHskQ3VycmVudEZpZWxkfSApCiAgICAgICAgICAgICAgICAgICAgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkVGlja2V0eyRDdXJyZW50RmllbGR9ICkKICAgICAgICAgICAgICAgICAgICB8fCBJc0hhc2hSZWZXaXRoRGF0YSggJFRpY2tldHskQ3VycmVudEZpZWxkfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRUaWNrZXR7JEN1cnJlbnRGaWVsZH07CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIGhhZCBuZWl0aGVyIHN1Ym1pdHRlZCBub3IgdGlja2V0IHBhcmFtIGdldCB0aGUgQWN0aXZpdHlEaWFsb2cncyBkZWZhdWx0IFZhbHVlCiAgICAgICAgICAgICMgbmV4dCBvdXQgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgJFZhbHVlID0gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICYmIGxlbmd0aCAkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIGhhZCBubyBzdWJtaXR0ZWQsIHRpY2tldCBvciBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICMgdXNlIHRoZSBEeW5hbWljRmllbGQncyBkZWZhdWx0IHZhbHVlIGFuZCBuZXh0IG91dAogICAgICAgICAgICAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICYmIGxlbmd0aCAkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGFsbCB0aGF0IGZhaWxlZCB0aGVuIHRoZSBmaWVsZCBzaG91bGQgbm90IGhhdmUgYSBkZWZpbmVkIHZhbHVlIG90aGVyd2lzZQogICAgICAgICAgICAjIGlmIGEgdmFsdWUgKGV2ZW4gZW1wdHkpIGlzIHNlbnQsIGZpZWxkcyBsaWtlIERhdGUgb3IgRGF0ZVRpbWUgd2lsbCBtYXJrIHRoZSBmaWVsZCBhcwogICAgICAgICAgICAjIHVzZWQgd2l0aCB0aGUgZmllbGQgZGlzcGxheSB2YWx1ZSwgdGhpcyBjb3VsZCBsZWFkIHRvIHVud2FudGVkIGZpZWxkIHNldHMsCiAgICAgICAgICAgICMgc2VlIGJ1ZyM5MTU5CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhcnRpY2xlIGZpZWxkcwogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CgogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKTsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICk7CiAgICAgICAgICAgIEB7ICRHZXRQYXJhbXtJbmZvcm1Vc2VySUR9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVmFsdWVzR290dGVue0FydGljbGV9ID0gMSBpZiAoICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkR2V0UGFyYW17Qm9keX0gKTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtUaW1lVW5pdHN9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpbWVVbml0cycgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CiAgICAgICAgICAgIG15ICRQcmVmaXggPSAnUGVuZGluZ1RpbWUnOwoKICAgICAgICAgICAgIyBPaywgd2UgbmVlZCB0byB0cnkgdG8gZmluZCB0aGUgdGFyZ2V0IHN0YXRlIG5vdwogICAgICAgICAgICBteSAlU3RhdGVEYXRhOwoKICAgICAgICAgICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICAgICAgICAgIG15ICRTdGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpOwoKICAgICAgICAgICAgIyBXYXMgc29tZXRoaW5nIHN1Ym1pdHRlZCBmcm9tIHRoZSBHVUk/CiAgICAgICAgICAgIG15ICRUYXJnZXRTdGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXRlSUQnICk7CiAgICAgICAgICAgIGlmICgkVGFyZ2V0U3RhdGVJRCkgewogICAgICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRhcmdldFN0YXRlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDE6IGRlZmF1bHQgdmFsdWUgb2YgZGlhbG9nIGZpZWxkIFN0YXRlCiAgICAgICAgICAgIGlmICggISVTdGF0ZURhdGEgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtTdGF0ZX17RGVmYXVsdFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtTdGF0ZX17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRmFsbGJhY2sgMjogZGVmYXVsdCB2YWx1ZSBvZiBkaWFsb2cgZmllbGQgU3RhdGVJRAogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGVJRH17RGVmYXVsdFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGVJRH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRmFsbGJhY2sgMzogZXhpc3RpbmcgdGlja2V0IHN0YXRlCiAgICAgICAgICAgIGlmICggISVTdGF0ZURhdGEgJiYgJVRpY2tldCApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwZW5kaW5nIHRpbWUgdmFsdWVzCiAgICAgICAgICAgICMgZGVwZW5kcyBvbiBTdGF0ZVR5cGUgY29udGFpbmluZyAnXnBlbmRpbmcnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YXRlRGF0YSApCiAgICAgICAgICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICVEYXRlUGFyYW0gPSAoIFByZWZpeCA9PiAkUHJlZml4ICk7CgogICAgICAgICAgICAgICAgIyBtYXAgdGhlIEdldFBhcmFtJ3MgRGF0ZSBWYWx1ZXMgdG8gb3VyIERhdGVQYXJhbUhhc2gKICAgICAgICAgICAgICAgICVEYXRlUGFyYW0gPSBtYXAgewogICAgICAgICAgICAgICAgICAgICggJFByZWZpeCAuICRfICkKICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gKCAkUHJlZml4IC4gJF8gKSApCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKTsKCiAgICAgICAgICAgICAgICAjIGlmIGFsbCB2YWx1ZXMgYXJlIHByZXNlbnQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdEYXknIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnSG91cicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgcmVjYWxjdWxhdGUgdGltZSBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICVEYXRlUGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlRGF0ZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcmVmb3JtYXQgZm9yIHN0b3JpbmcgKGUuZy4gdGFrZSBvdXQgUHJlZml4KQogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gbWFwIHsgJF8gPT4gJERhdGVQYXJhbXsgJFByZWZpeCAuICRfIH0gfSBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlc0dvdHRlbntQZW5kaW5nVGltZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vbiBEeW5hbWljRmllbGRzCiAgICAgICAgIyAxLiB0cnkgdG8gZ2V0IHRoZSByZXF1aXJlZCBwYXJhbQogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICk7CgogICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBJRCBmaWVsZCBtYWtlIHN1cmUgdGhlIHZhbHVlIHdpdGhvdXQgSUQgd29uJ3QgYmUgaW4gdGhlCiAgICAgICAgICAgICMgJUdldFBhcmFtIEhhc2ggYW55IG1vcmUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSA9fiBteyguKilJRCR9eG1zICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyQxfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSAgICAgPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBnb3QgdGlja2V0IHBhcmFtcywgdGhlIEdldFBhcmFtIEhhc2ggd2FzIGFscmVhZHkgZmlsbGVkIGJlZm9yZSB0aGUgbG9vcAogICAgICAgICMgYW5kIHdlIGNhbiBuZXh0IG91dAogICAgICAgIGlmICggJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gU3VibWl0dGVkIG5vcmUgVGlja2V0IFBhcmFtIGdldCBBY3Rpdml0eURpYWxvZyBDb25maWcncyBQYXJhbQogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBuZSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KICAgIH0KICAgIFJFUVVJUkVERklFTERMT09QOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKHF3KFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkpKSB7CiAgICAgICAgJFZhbHVlID0gdW5kZWY7CiAgICAgICAgaWYgKCAhJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEZWZhdWx0JEN1cnJlbnRGaWVsZCIpOwogICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkRlZmF1bHQlcyBDb25maWcgVmFsdWUgbWlzc2luZyEnLAogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRGVzdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgaWYgKCREZXN0KSB7CgogICAgICAgIG15IEBRdWV1ZVBhcnRzID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKCiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlUGFydHNbMF07CiAgICAgICAgJEdldFBhcmFte1F1ZXVlfSAgID0gJFF1ZXVlUGFydHNbMV07CgogICAgICAgICRWYWx1ZXNHb3R0ZW57UXVldWVJRH0gPSAxOwogICAgfQoKICAgICMgZ2V0IGFsc28gdGhlIElEcyBmb3IgdGhlIFJlcXVpcmVkIGZpbGVzIChpZiB0aGV5IGFyZSBub3QgcHJlc2VudCkKICAgIGlmICggJEdldFBhcmFte1F1ZXVlfSAmJiAhJEdldFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJEdldFBhcmFte1F1ZXVlfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17U3RhdGV9ICYmICEkR2V0UGFyYW17U3RhdGVJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTG9va3VwKCBTdGF0ZSA9PiAkR2V0UGFyYW17U3RhdGV9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtMb2NrfSAmJiAhJEdldFBhcmFte0xvY2tJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0xvY2tJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpLT5Mb2NrTG9va3VwKCBMb2NrID0+ICRHZXRQYXJhbXtMb2NrfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHl9ICYmICEkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICBQcmlvcml0eSA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhbmQgZmluYWxseSB3ZSdsbCBoYXZlIHRoZSBzcGVjaWFsIHBhcmFtZXRlcnM6CiAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsJyApOwogICAgJEdldFBhcmFte093bmVyQWxsfSAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbCcgKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICk7CgogICAgcmV0dXJuIFwlR2V0UGFyYW07Cn0KCnN1YiBfT3V0cHV0QWN0aXZpdHlEaWFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH07CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIENoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzOgogICAgIyBQcm9jZXNzRW50aXR5SUQgb25seQogICAgIyBUaWNrZXRJRCBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICBpZiAoICEkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSB8fCAoICEkVGlja2V0SUQgJiYgISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICkgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ0dvdCBubyBQcm9jZXNzRW50aXR5SUQgb3IgVGlja2V0SUQgYW5kIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQhJyk7CgogICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nOwogICAgbXkgJVRpY2tldDsKICAgIG15ICVFcnJvciAgICAgICAgID0gKCk7CiAgICBteSAlRXJyb3JNZXNzYWdlcyA9ICgpOwoKICAgICMgSWYgd2UgaGFkIEVycm9ycywgd2UgZ290IGFuIEVycm9yaGFzaAogICAgJUVycm9yICAgICAgICAgPSAleyAkUGFyYW17RXJyb3J9IH0gICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgKTsKICAgICVFcnJvck1lc3NhZ2VzID0gJXsgJFBhcmFte0Vycm9yTWVzc2FnZXN9IH0gaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yTWVzc2FnZXN9ICkgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEFjdGl2aXR5T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRBY3Rpdml0eU9iamVjdCwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgfQogICAgKTsKICAgIG15ICRQcm9jZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggISRUaWNrZXRJRCB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgU3RhcnRBY3Rpdml0eURpYWxvZyBhbmQgU3RhcnRBY3Rpdml0eURpYWxvZyBmb3IgdGhlIFByb2Nlc3NFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gQUpBWCB1cGRhdGUgaW4gdGhpcyBwYXJ0CiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NhblwndCBnZXQgVGlja2V0ICIlcyIhJywgJFBhcmFte1RpY2tldElEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZFByb2Nlc3NJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKTsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQWN0aXZpdHlJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEJyk7CgogICAgICAgIGlmICggISRUaWNrZXR7JER5bmFtaWNGaWVsZFByb2Nlc3NJRH0gfHwgISRUaWNrZXR7JER5bmFtaWNGaWVsZEFjdGl2aXR5SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgUHJvY2Vzc0VudGl0eUlEIG9yIEFjdGl2aXR5RW50aXR5SUQgZm9yIFRpY2tldCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9IHsKICAgICAgICAgICAgQWN0aXZpdHkgICAgICAgPT4gJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0sCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAhJVRpY2tldCAmJiAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHkgPSAkQWN0aXZpdHlPYmplY3QtPkFjdGl2aXR5R2V0KAogICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9CiAgICApOwogICAgaWYgKCAhJEFjdGl2aXR5ICkgewogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnQ2FuXCd0IGdldCBBY3Rpdml0eSBjb25maWd1cmF0aW9uIGZvciBBY3Rpdml0eUVudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICk7CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnQ2FuXCd0IGdldCBBY3Rpdml0eURpYWxvZyBjb25maWd1cmF0aW9uIGZvciBBY3Rpdml0eURpYWxvZ0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICk7CiAgICB9CgogICAgIyBncmVwIG91dCBPdmVyd3JpdGVzIGlmIGRlZmluZWQgb24gdGhlIEFjdGl2aXR5CiAgICBteSBAT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXIgPSBncmVwIHsKICAgICAgICByZWYgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfQogICAgICAgICAgICAmJiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9IGVxCiAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e092ZXJ3cml0ZX0gKQogICAgfSBrZXlzICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfSB9OwoKICAgICMgbGV0IHRoZSBPdmVyd3JpdGVzIE92ZXJ3cml0ZSB0aGUgQWN0aXZpdHlEaWFsb2cncyBIYXNoIHZhbHVlcwogICAgaWYgKCAkT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXJbMF0gKSB7CiAgICAgICAgJXskQWN0aXZpdHlEaWFsb2d9ID0gKAogICAgICAgICAgICAleyRBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXsgJE92ZXJ3cml0ZUFjdGl2aXR5RGlhbG9nTnVtYmVyWzBdIH17T3ZlcndyaXRlfSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCBQYWdlSGVhZGVyLCBOYXZiYXIsIEZvcm1oZWFkZXIgKFByb2Nlc3MvQWN0aXZpdHlEaWFsb2dIZWFkZXIpCiAgICBteSAkT3V0cHV0OwogICAgbXkgJE1haW5Cb3hDbGFzczsKCiAgICBpZiAoICEkU2VsZi0+e0lzTWFpbldpbmRvd30gJiYgISRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBUeXBlICA9PiAnU21hbGwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IGdpdmVuIG5vdGlmeSBtZXNzYWdlcyBpZiB0aGlzIGlzIG5vdCBhbiBBSkFYIHJlcXVlc3QKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte05vdGlmeX0gKSApIHsKCiAgICAgICAgICAgIGZvciBteSAkTm90aWZ5RGF0YSAoIEB7ICRQYXJhbXtOb3RpZnl9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggJXskTm90aWZ5RGF0YX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEFjdGl2aXR5RGlhbG9nLT57TmFtZX0gKQogICAgICAgICAgICAgICAgICAgIHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAoICRTZWxmLT57SXNNYWluV2luZG93fSB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKQogICAgICAgICYmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSB8fCAkUGFyYW17SXNVcGxvYWR9ICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgY29tcGxldGUgaGVhZGVyIGFuZCBuYXZpZ2F0aW9uIGJhciBpbiBBSkFYIGRpYWxvZ3Mgd2hlbiB0aGVyZSBpcyBhIHNlcnZlciBlcnJvcgogICAgICAgICMgICAgdW5sZXNzIHdlIGFyZSBpbiBhIHByb2Nlc3MgZW5yb2xsbWVudCAob25seSB3aGVuIElzTWFpbldpbmRvdyBpcyBhY3RpdmUpCiAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCc7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBvcmlnaW5hbCBoZWFkZXIgdGV4dHMgKHRoZSBwcm9jZXNzIGxpc3QgbWF5YmUgaXMgbm90IG5lY2Vzc2FyeSkKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByb2Nlc3MnIC4gJFR5cGUsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgSXNQcm9jZXNzRW5yb2xsID0+ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgTWFpbkJveCBjbGFzcyB0byBhZGQgY29ycmVjdCBib3JkZXJzIHRvIHRoZSBzY3JlZW4KICAgICAgICAkTWFpbkJveENsYXNzID0gJ01haW5Cb3gnOwogICAgfQoKICAgICMgZGlzcGxheSBwcm9jZXNzIGluZm9ybWF0aW9uCiAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKCiAgICAgICAgIyBnZXQgcHJvY2VzcyBkYXRhCiAgICAgICAgbXkgJFByb2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0dldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG1haW4gcHJvY2VzcyBpbmZvcm1hdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzSW5mb1NpZGViYXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFByb2Nlc3MgICAgICAgID0+ICRQcm9jZXNzLT57TmFtZX0gICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgQWN0aXZpdHkgICAgICAgPT4gJEFjdGl2aXR5LT57TmFtZX0gICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiAkQWN0aXZpdHlEaWFsb2ctPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBhY3Rpdml0eSBkaWFsb2cgc2hvcnQgZGVzY3JpcHRpb24gKGlmIGFueSkKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0KICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0gbmUgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzSW5mb1NpZGViYXJBY3Rpdml0eURpYWxvZ0Rlc2MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dEZXNjcmlwdGlvbiA9PiAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBsb25nIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uIGlmIGV4aXN0cwogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9CiAgICAgICAgICAgICYmIGxlbmd0aCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9uZ0Rlc2NyaXB0aW9uU2lkZWJhcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGRlc2NyaXB0aW9ucwogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydAogICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nCiAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjbG9zZSAmIGNhbmNlbCBsaW5rIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17UmVuZGVyTG9ja2VkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FuY2VsTGluaycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0FjdGl2aXR5RGlhbG9nSGVhZGVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBGb3JtTmFtZSAgICAgICAgICAgICAgID0+ICdBY3Rpdml0eURpYWxvZ0RpYWxvZycgLiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFN1YmFjdGlvbiAgICAgICAgICAgICAgPT4gJ1N0b3JlQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9IHx8ICcnLAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgICAgICAgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgICAgICAgICB8fCAkVGlja2V0ewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50UHJvY2Vzc0lEJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIElzTWFpbldpbmRvdyAgICA9PiAkU2VsZi0+e0lzTWFpbldpbmRvd30sCiAgICAgICAgICAgIElzUHJvY2Vzc0Vucm9sbCA9PiAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0sCiAgICAgICAgICAgIE1haW5Cb3hDbGFzcyAgICA9PiAkTWFpbkJveENsYXNzIHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVSZW5kZXJlZEZpZWxkcyA9ICgpOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIGZpZWxkcyB3aGVyZSB0aGUgQUpBWCBsb2FkZXIgaWNvbiBzaG91bGQgYXBwZWFyIG9uIEFKQVggdXBkYXRlcyB0cmlnZ2VyZWQKICAgICMgYnkgQWN0aXZpdHlEaWFsb2cgZmllbGRzCiAgICBteSAkQUpBWFVwZGF0YWJsZUZpZWxkcyA9ICRTZWxmLT5fR2V0QUpBWFVwZGF0YWJsZUZpZWxkcygKICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkcyA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LAogICAgKTsKCiAgICAjIExvb3AgdGhyb3VnaCBBY3Rpdml0eURpYWxvZ0ZpZWxkcyBhbmQgcmVuZGVyIHRoZWlyIG91dHB1dAogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gKSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBkYXRhIGZvciBGaWVsZCAiJXMiIG9mIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlRmllbGREYXRhID0gJXsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAjIFdlIHJlbmRlciBqdXN0IHZpc2libGUgQWN0aXZpdHlEaWFsb2dGaWVsZHMKICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICEkRmllbGREYXRhe0Rpc3BsYXl9OwoKICAgICAgICAjIHJlbmRlciBEeW5hbWljRmllbGRzCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKICAgICAgICAgICAgbXkgJFJlc3BvbnNlICAgICAgICAgPSAkU2VsZi0+X1JlbmRlckR5bmFtaWNGaWVsZCgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2VzICAgICAgID0+IFwlRXJyb3JNZXNzYWdlcyB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CgogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU3RhdGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1N0YXRlSUQnICkKICAgICAgICB7CgogICAgICAgICAgICAjIFdlIGRvbid0IHJlbmRlciBGaWVsZHMgdHdpY2UsCiAgICAgICAgICAgICMgaWYgdGhlcmUgd2FzIGFscmVhZHkgYSBDb25maWcgd2l0aG91dCBJRCwgc2tpcCB0aGlzIGZpZWxkCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclN0YXRlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgUXVldWUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1F1ZXVlSUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclF1ZXVlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgUHJpb3JpdHkKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1ByaW9yaXR5SUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclByaW9yaXR5KAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgTG9jawogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnTG9ja0lEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyTG9jaygKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFNlcnZpY2UKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1NlcnZpY2VJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNlcnZpY2UoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU0xBCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdTTEFJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNMQSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIE93bmVyCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdPd25lcklEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyT3duZXIoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciByZXNwb25zaWJsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnUmVzcG9uc2libGVJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclJlc3BvbnNpYmxlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgQ3VzdG9tZXJJRAogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckN1c3RvbWVyKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CgogICAgICAgICAgICAjIFBlbmRpbmdUaW1lIGlzIGp1c3QgdXNlZnVsIGlmIHdlIGhhdmUgU3RhdGUgb3IgU3RhdGVJRAogICAgICAgICAgICBpZiAoICFncmVwIHtte14oU3RhdGVJRHxTdGF0ZSkkfXhtc30gQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdQZW5kaW5nVGltZSBjYW4ganVzdCBiZSB1c2VkIGlmIFN0YXRlIG9yIFN0YXRlSUQgaXMgY29uZmlndXJlZCBmb3IgdGhlIHNhbWUgQWN0aXZpdHlEaWFsb2cuIEFjdGl2aXR5RGlhbG9nOiAlcyEnLAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclBlbmRpbmdUaW1lKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUaXRsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnVGl0bGUnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJUaXRsZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIEFydGljbGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBJbmZvcm1BZ2VudHMgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPntBcnRpY2xlfS0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFR5cGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1R5cGVJRCcgKSB7CgogICAgICAgICAgICAjIFdlIGRvbid0IHJlbmRlciBGaWVsZHMgdHdpY2UsCiAgICAgICAgICAgICMgaWYgdGhlcmUgd2FzIGFscmVhZHkgYSBDb25maWcgd2l0aG91dCBJRCwgc2tpcCB0aGlzIGZpZWxkCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclR5cGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGb290ZXJDU1NDbGFzcyA9ICdGb290ZXInOwoKICAgIGlmICggJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSApIHsKCiAgICAgICAgIyBEdWUgdG8gdGhlIGluaXRpYWwgbG9hZGluZyBvZgogICAgICAgICMgdGhlIGZpcnN0IEFjdGl2aXR5RGlhbG9nIGFmdGVyIFByb2Nlc3Mgc2VsZWN0aW9uCiAgICAgICAgIyB3ZSBoYXZlIHRvIGJpbmQgdGhlIEFqYXhVcGRhdGUgRnVuY3Rpb24gb24KICAgICAgICAjIHRoZSBzZWxlY3RzLCBzbyB3ZSBnZXQgdGhlIGNvbXBsZXRlIEpTT25Eb2N1bWVudENvbXBsZXRlIGNvZGUKICAgICAgICAjIGFuZCBkZWxpdmVyIGl0IGluIHRoZSBGb290ZXJKUyBibG9jay4KICAgICAgICAjIFRoaXMgSmF2YXNjcmlwdCBQYXJ0IGlzIGV4ZWN1dGVkIGluCiAgICAgICAgIyBBZ2VudFRpY2tldFByb2Nlc3MudHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9vdGVySlMnLAogICAgICAgICk7CgogICAgICAgICRGb290ZXJDU1NDbGFzcyA9ICdDZW50ZXJlZCc7CiAgICB9CgogICAgIyBzZXQgc3VibWl0IGJ1dHRvbiBkYXRhCiAgICBteSAkQnV0dG9uVGV4dCAgPSAnU3VibWl0JzsKICAgIG15ICRCdXR0b25UaXRsZSA9ICdTYXZlJzsKICAgIG15ICRCdXR0b25JRCAgICA9ICdTdWJtaXQnIC4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ307CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9ICkgewogICAgICAgICRCdXR0b25UZXh0ICA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgICAgICRCdXR0b25UaXRsZSA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0Zvb3RlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvb3RlckNTU0NsYXNzID0+ICRGb290ZXJDU1NDbGFzcywKICAgICAgICAgICAgQnV0dG9uVGV4dCAgICAgPT4gJEJ1dHRvblRleHQsCiAgICAgICAgICAgIEJ1dHRvblRpdGxlICAgID0+ICRCdXR0b25UaXRsZSwKICAgICAgICAgICAgQnV0dG9uSUQgICAgICAgPT4gJEJ1dHRvbklECgogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1Ym1pdEFkdmljZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFkdmljZVRleHQgPT4gJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbG9hZCBwYXJlbnQgd2luZG93CiAgICBpZiAoICRQYXJhbXtQYXJlbnRSZWxvYWR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQYXJlbnRSZWxvYWQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgdGhlIEZvcm1Gb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQWN0aXZpdHlEaWFsb2dGb290ZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICk7CgogICAgIyBkaXNwbGF5IHJlZ3VsYXIgZm9vdGVyIG9ubHkgaW4gbm9uLWFqYXggY2FzZQogICAgaWYgKCAhJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSApIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCcgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9SZW5kZXJQZW5kaW5nVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUGVuZGluZ1RpbWUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJQZW5kaW5nVGltZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsID0+ICgKICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQZW5kaW5nIERhdGUnKQogICAgICAgICAgICAgICAgLiAnICgnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZm9yIHBlbmRpbmcqIHN0YXRlcycpIC4gJyknCiAgICAgICAgKSwKICAgICAgICBGaWVsZElEID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBGb3JtSUQgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgKTsKCiAgICBteSAkRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lRGF5J30gKSB7CiAgICAgICAgICAgICREYXRhe1BlbmRpbmd0VGltZURheUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpOwogICAgICAgICAgICAkRXJyb3IgPSAkUGFyYW17RXJyb3J9LT57J1BlbmRpbmd0VGltZURheSd9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lSG91cid9ICkgewogICAgICAgICAgICAkRGF0YXtQZW5kaW5ndFRpbWVIb3VyRXJyb3J9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIik7CiAgICAgICAgICAgICRFcnJvciA9ICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lRGF5J307CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWxlbmRhciA9ICcnOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdXNlZCBjYWxlbmRhciBpZiB3ZSBoYXZlIHRpY2tldCBkYXRhCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICkgewogICAgICAgICRDYWxlbmRhciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgICAgICAleyAkUGFyYW17VGlja2V0fSB9LAogICAgICAgICk7CiAgICB9CgogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ID0+ICdQZW5kaW5nVGltZScsCiAgICAgICAgUGVuZGluZ1RpbWVSZXF1aXJlZCA9PgogICAgICAgICAgICAoCiAgICAgICAgICAgICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIKICAgICAgICAgICAgKSA/IDEgOiAwLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgIHx8ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgfHwgODY0MDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJEVycm9yLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQZW5kaW5nVGltZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQZW5kaW5nVGltZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlBlbmRpbmdUaW1lOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUGVuZGluZ1RpbWUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlckR5bmFtaWNGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCBGaWVsZE5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckR5bmFtaWNGaWVsZCcgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJFBhcmFte0ZpZWxkTmFtZX0gfSBAeyREeW5hbWljRmllbGR9IClbMF07CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgIG15ICRNZXNzYWdlID0gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJFBhcmFte0ZpZWxkTmFtZX0sIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgIEhUTUwgICAgPT4gJycsCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgKTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgICMgQWxsIFRpY2tldCBEeW5hbWljRmllbGRzCiAgICAgICAgIyB1c2VkIGZvciBBQ0wgY2hlY2tpbmcKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQ2hlY2tQYXJhbSA9IG1hcCB7ICRfID0+ICRQYXJhbXtHZXRQYXJhbX17JF99IH0KICAgICAgICAgICAgZ3JlcCB7bXteRHluYW1pY0ZpZWxkX314bXN9ICgga2V5cyAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkICA9PiBcJUR5bmFtaWNGaWVsZENoZWNrUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZXJ2ZXJFcnJvcjsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yfS0+eyAkUGFyYW17RmllbGROYW1lfSB9CiAgICAgICAgICAgICYmICRQYXJhbXtFcnJvcn0tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VydmVyRXJyb3IgPSAxOwogICAgICAgIH0KICAgIH0KICAgIG15ICRFcnJvck1lc3NhZ2UgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvck1lc3NhZ2VzfSApICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17RXJyb3JNZXNzYWdlc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfQogICAgICAgICAgICAmJiAkUGFyYW17RXJyb3JNZXNzYWdlc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gJFBhcmFte0Vycm9yTWVzc2FnZXN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19eyAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RmllbGROYW1lfSB9LAogICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiwKICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICAgICAgU2VydmVyRXJyb3IgICAgICAgICAgPT4gJFNlcnZlckVycm9yLAogICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRFcnJvck1lc3NhZ2UsCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIE5hbWUgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgIExhYmVsICAgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgQ29udGVudCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkR5bmFtaWNGaWVsZCcsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9CiAgICAgICAgICAgICAgICB8fCAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvRHluYW1pY0ZpZWxkJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJUaXRsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJUaXRsZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaXRsZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIFZhbHVlICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtUaXRsZX0sCiAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnVGl0bGUnfSApIHsKICAgICAgICAkRGF0YXtTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpUaXRsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9UaXRsZScgKSwKICAgIH07Cgp9CgpzdWIgX1JlbmRlckFydGljbGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQgVGlja2V0KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJBcnRpY2xlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyQXJ0aWNsZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FydGljbGUnLAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICAgICBTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAogICAgICAgIExhYmVsU3ViamVjdCAgICAgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57Q29uZmlnfS0+e0xhYmVsU3ViamVjdH0KICAgICAgICAgICAgfHwgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTdWJqZWN0IiksCiAgICAgICAgTGFiZWxCb2R5ID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0NvbmZpZ30tPntMYWJlbEJvZHl9CiAgICAgICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVGV4dCIpLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydBcnRpY2xlU3ViamVjdCd9ICkgewogICAgICAgICREYXRhe1N1YmplY3RTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnQXJ0aWNsZUJvZHknfSApIHsKICAgICAgICAkRGF0YXtCb2R5U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6QXJ0aWNsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuU3ViamVjdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQm9keScsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkFydGljbGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtJbmZvcm1BZ2VudHN9ICkgewoKICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkR0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17VGlja2V0fS0+e1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICBTaXplICAgICAgID0+IDMsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydUaW1lVW5pdHMnfSApIHsKICAgICAgICAkUGFyYW17VGltZVVuaXRzSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc2hvdyB0aW1lIHVuaXRzCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57Q29uZmlnfS0+e1RpbWVVbml0c30KICAgICAgICApCiAgICB7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0NvbmZpZ30tPntUaW1lVW5pdHN9ID09IDEgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CgogICAgICAgICMgR2V0IFRpbWVVbml0cyB2YWx1ZS4KICAgICAgICAkUGFyYW17VGltZVVuaXRzfSA9ICRQYXJhbXtHZXRQYXJhbX17VGltZVVuaXRzfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0FydGljbGUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlckN1c3RvbWVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJDdXN0b21lcicgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckN1c3RvbWVyJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAoKTsKCiAgICBteSAkU3VibWl0dGVkQ3VzdG9tZXJVc2VySUQgPSAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbEN1c3RvbWVyVXNlciA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSwKICAgICAgICBMYWJlbEN1c3RvbWVySUQgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkN1c3RvbWVySUQiKSwKICAgICAgICBGb3JtSUQgICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkICA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPntDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJVc2VySURTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPntDdXN0b21lcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lcklEU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIHNldCBzb21lIGN1c3RvbWVyIHNlYXJjaCBhdXRvY29tcGxldGUgcHJvcGVydGllcwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAkUGFyYW17VGlja2V0fS0+e0N1c3RvbWVyVXNlcklEfSApCiAgICAgICAgfHwgJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgKQogICAgewogICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgfHwgJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGZpZWxkIGFzICJGaXJzdE5hbWUgTGFzdG5hbWUiIDxNYWlsQWRkcmVzcz4KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlQ3VzdG9tZXJVc2VyRGF0YSApICkgewogICAgICAgICREYXRhe0N1c3RvbWVyVXNlcklEfSA9ICJcIiRDdXN0b21lclVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9ICIgLgogICAgICAgICAgICAiJEN1c3RvbWVyVXNlckRhdGF7VXNlckxhc3RuYW1lfVwiIDwkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9PiI7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJJRH0gICAgICAgICAgID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9IHx8ICcnOwogICAgICAgICREYXRhe1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJJRH0gICAgICAgICB8fCAnJzsKICAgIH0KCiAgICAjIFdoZW4gdGhlcmUgaXMgbm8gQ3VzdG9tZXIgaW4gdGhlIERCLCBpdCBjb3VsZCBiZSB1bmtub3duIEN1c3RvbWVyLCBzZXQgaXQgZnJvbSB0aGUgdGlja2V0LgogICAgIyBTZWUgYnVnIzEyNzk3ICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc5NyApLgogICAgZWxzZSB7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJVc2VySUR9ID0gJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9IHx8ICcnOwogICAgICAgICREYXRhe0N1c3RvbWVySUR9ICAgICA9ICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVySUR9ICAgICB8fCAnJzsKICAgIH0KCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSAgICAgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgICAgIE5vUXVvdGVzID0+IDAsCiAgICApOwogICAgJERhdGF7RmllbGRzVG9VcGRhdGV9ID0gJEpTT047CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkN1c3RvbWVyJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW5DdXN0b21lclVzZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpDdXN0b21lcjpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkN1c3RvbWVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQ3VzdG9tZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclJlc3BvbnNpYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJSZXNwb25zaWJsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFJlc3BvbnNpYmxlcyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKCAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIFJlc3BvbnNpYmxlQWxsICAgPT4gJFBhcmFte0dldFBhcmFtfXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICBteSAkUG9zc2libGVOb25lID0gMTsKCiAgICAjIGlmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgICAgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgICMgICAgZG8gbm90IGFsbG93IGVtcHR5IHNlbGVjdGlvbgogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgICAgICRQb3NzaWJsZU5vbmUgICAgICAgICAgID0gMDsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSApIHsKCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUmVzcG9uc2libGUnICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzcG9uc2libGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtSZXNwb25zaWJsZUlEfTsKICAgIGlmICggJFJlc3BvbnNpYmxlSURQYXJhbSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlcklEID0+ICRSZXNwb25zaWJsZUlEUGFyYW0gKTsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIG5vIHVzZXIgZnJvbSBHZXRQYXJhbSBvciBkZWZhdWx0IGFuZCB0aGUgZmllbGQgaXMgbWFuZGF0b3J5IGdldCBpdCBmcm9tIHRoZSB0aWNrZXQKICAgICMgICAgKGlmIGFueSkKICAgIGlmICgKICAgICAgICAhJFNlbGVjdGVkVmFsdWUKICAgICAgICAmJiAhJFBvc3NpYmxlTm9uZQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntSZXNwb25zaWJsZX07CiAgICB9CgogICAgIyB1c2UgY3VycmVudCB1c2VyIGFzIGZhbGxiYWNrLCBmb3IgYWxsIG90aGVyIGNhc2VzIHdoZXJlIHRoZXJlIGlzIHN0aWxsIG5vIHVzZXIKICAgIGVsc2lmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKTsKICAgIH0KCiAgICAjIGlmIHdlIGhhdmUgYSB1c2VyIGFscmVhZHkgYW5kIHRoZSBmaWVsZCBpcyBub3QgbWFuZGF0b3J5IGFuZCBpdCBpcyB0aGUgc2FtZSBhcyBpbiB0aWNrZXQsIHRoZW4KICAgICMgICAgc2V0IGl0IHRvIG5vbmUgKGFzIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkIGFmdGVyYWxsKQogICAgZWxzaWYgKAogICAgICAgICRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBvc3NpYmxlTm9uZQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgJiYgJFNlbGVjdGVkVmFsdWUgZXEgJFBhcmFte1RpY2tldH0tPntSZXNwb25zaWJsZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAnJzsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1Jlc3BvbnNpYmxlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIFJlc3BvbnNpYmxlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCwKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlJlc3BvbnNpYmxlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpSZXNwb25zaWJsZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlJlc3BvbnNpYmxlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUmVzcG9uc2libGUnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJPd25lciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyT3duZXInICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJPd25lcicgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRPd25lcnMgPSAkU2VsZi0+X0dldE93bmVycyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk93bmVyIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnT3duZXJJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBPd25lckFsbCAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17T3duZXJBbGx9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgbXkgJFBvc3NpYmxlTm9uZSA9IDE7CgogICAgIyBpZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjICAgIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICAjICAgIGRvIG5vdCBhbGxvdyBlbXB0eSBzZWxlY3Rpb24KICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgICAgICAkUG9zc2libGVOb25lICAgICAgICAgICA9IDA7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gKSB7CgogICAgICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ093bmVyJyApIHsKCiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3duZXJJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtPd25lcklEfTsKICAgIGlmICggJE93bmVySURQYXJhbSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlcklEID0+ICRPd25lcklEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIG5vIHVzZXIgZnJvbSBHZXRQYXJhbSBvciBkZWZhdWx0IGFuZCB0aGUgZmllbGQgaXMgbWFuZGF0b3J5IGdldCBpdCBmcm9tIHRoZSB0aWNrZXQKICAgICMgICAgKGlmIGFueSkKICAgIGlmICgKICAgICAgICAhJFNlbGVjdGVkVmFsdWUKICAgICAgICAmJiAhJFBvc3NpYmxlTm9uZQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntPd25lcn07CiAgICB9CgogICAgIyB1c2UgY3VycmVudCB1c2VyIGFzIGZhbGxiYWNrLCBmb3IgYWxsIG90aGVyIGNhc2VzIHdoZXJlIHRoZXJlIGlzIHN0aWxsIG5vIHVzZXIKICAgIGVsc2lmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKTsKICAgIH0KCiAgICAjIGlmIHdlIGhhdmUgYSB1c2VyIGFscmVhZHkgYW5kIHRoZSBmaWVsZCBpcyBub3QgbWFuZGF0b3J5IGFuZCBpdCBpcyB0aGUgc2FtZSBhcyBpbiB0aWNrZXQsIHRoZW4KICAgICMgICAgc2V0IGl0IHRvIG5vbmUgKGFzIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkIGFmdGVyYWxsKQogICAgZWxzaWYgKAogICAgICAgICRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBvc3NpYmxlTm9uZQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgJiYgJFNlbGVjdGVkVmFsdWUgZXEgJFBhcmFte1RpY2tldH0tPntPd25lcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAnJzsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J093bmVySUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIE93bmVyIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ093bmVySUQnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCB8fCAnJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3Ok93bmVyJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpPd25lcjpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3Ok93bmVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvT3duZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNMQSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU0xBJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU0xBJyApLAogICAgICAgIH07CiAgICB9CgogICAgIyBjcmVhdGUgYSBsb2NhbCBjb3B5IG9mIHRoZSBHZXRQYXJhbQogICAgbXkgJUdldFNlcnZpY2VzUGFyYW0gPSAleyAkUGFyYW17R2V0UGFyYW19IH07CgogICAgIyB1c2UgdGlja2V0IGluZm9ybWF0aW9uIGFzIGEgZmFsbCBiYWNrIGlmIGN1c3RvbWVyIHdhcyBhbHJlYWR5IHNldCwgb3RoZXJ3aXNlIHdoZW4gdGhlCiAgICAjIGFjdGl2aXR5IGRpYWxvZyBkaXNwbGF5cyB0aGUgc2VydmljZSBsaXN0IHdpbGwgYmUgaW5pdGlhbGx5IGVtcHR5LCBzZWUgYnVnIzEwMDU5CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICkgewogICAgICAgICRHZXRTZXJ2aWNlc1BhcmFte0N1c3RvbWVyVXNlcklEfSB8fD0gJFBhcmFte1RpY2tldH0tPntDdXN0b21lclVzZXJJRH0gfHw9ICcnOwogICAgfQoKICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgJUdldFNlcnZpY2VzUGFyYW0sCiAgICApOwoKICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTTEEiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IFNMQSBvYmplY3QKICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgogICAgbXkgJFNMQUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1NMQUlEfTsKICAgIGlmICgkU0xBSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKCBTTEFJRCA9PiAkU0xBSURQYXJhbSApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1NMQScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1NMQX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTTEFJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBidWlsZCBTTEEgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlNMQScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U0xBOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U0xBOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvU0xBJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJTZXJ2aWNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTZXJ2aWNlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU2VydmljZScgKSwKICAgICAgICB9OwogICAgfQoKICAgICMgY3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgR2V0UGFyYW0KICAgIG15ICVHZXRTZXJ2aWNlc1BhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgdXNlIHRpY2tldCBpbmZvcm1hdGlvbiBhcyBhIGZhbGwgYmFjayBpZiBjdXN0b21lciB3YXMgYWxyZWFkeSBzZXQsIG90aGVyd2lzZSB3aGVuIHRoZQogICAgIyBhY3Rpdml0eSBkaWFsb2cgZGlzcGxheXMgdGhlIHNlcnZpY2UgbGlzdCB3aWxsIGJlIGluaXRpYWxseSBlbXB0eSwgc2VlIGJ1ZyMxMDA1OQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSApIHsKICAgICAgICAkR2V0U2VydmljZXNQYXJhbXtDdXN0b21lclVzZXJJRH0gfHw9ICRQYXJhbXtUaWNrZXR9LT57Q3VzdG9tZXJVc2VySUR9IHx8PSAnJzsKICAgIH0KCiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICVHZXRTZXJ2aWNlc1BhcmFtLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHNlcnZpY2Ugb2JqZWN0CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgbXkgJFNlcnZpY2VJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTZXJ2aWNlSUR9OwogICAgaWYgKCRTZXJ2aWNlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTZXJ2aWNlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntTZXJ2aWNlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1NlcnZpY2VJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFRyZWVWaWV3ICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTZXJ2aWNlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTZXJ2aWNlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U2VydmljZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1NlcnZpY2UnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJMb2NrIHsKCiAgICAjIGZvciBsb2NrIHN0YXRlcyB0aGVyZSdzIG5vIEFDTCBjaGVja2luZyB5ZXQgaW1wbGVtZW50ZWQgc28gbm8gY2hlY2tpbmcuLi4KCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyTG9jaycgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckxvY2snICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkTG9ja3MgPSAkU2VsZi0+X0dldExvY2tzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkxvY2sgc3RhdGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBsb2NrIG9iamVjdAogICAgbXkgJExvY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpOwoKICAgIG15ICRMb2NrSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17TG9ja0lEfTsKICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoIExvY2tJRCA9PiAkTG9ja0lEUGFyYW0gKQogICAgICAgIGlmICgkTG9ja0lEUGFyYW0pOwoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ0xvY2snICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoCiAgICAgICAgICAgICAgICBMb2NrID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkTG9ja09iamVjdC0+TG9ja0xvb2t1cCgKICAgICAgICAgICAgTG9ja0lEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiAhJFNlbGVjdGVkVmFsdWU7CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntMb2NrfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J0xvY2tJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBidWlsZCBsb2NrIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRMb2NrcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6TG9jaycsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6TG9jazpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkxvY2s6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Mb2NrJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJQcmlvcml0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUHJpb3JpdHknICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJQcmlvcml0eScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlByaW9yaXR5IiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHByaW9yaXR5IG9iamVjdAogICAgbXkgJFByaW9yaXR5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5Jyk7CgogICAgbXkgJFByaW9yaXR5SURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UHJpb3JpdHlJRH07CiAgICBpZiAoJFByaW9yaXR5SURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdHlJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUHJpb3JpdHknICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntQcmlvcml0eX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydQcmlvcml0eUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgUHJpb3JpdGllcyBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgIyBzZXQgZmllbGRzIHRoYXQgd2lsbCBnZXQgYW4gQUpBWCBsb2FkZXIgaWNvbiB3aGVuIHRoaXMgZmllbGQgY2hhbmdlcwogICAgJERhdGF7RmllbGRzVG9VcGRhdGV9ID0gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZVN0cmcoCiAgICAgICAgVHJpZ2dlckZpZWxkICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQcmlvcml0eScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UHJpb3JpdHk6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpQcmlvcml0eTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1ByaW9yaXR5JyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJRdWV1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUXVldWUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJRdWV1ZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRRdWV1ZXMgPSAkU2VsZi0+X0dldFF1ZXVlcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUbyBxdWV1ZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHF1ZXVlIG9iamVjdAogICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgIyBpZiB3ZSBnb3QgUXVldWVJRCBhcyBQYXJhbSBmcm9tIHRoZSBHVUkKICAgIG15ICRRdWV1ZUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1F1ZXVlSUR9OwogICAgaWYgKCRRdWV1ZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1F1ZXVlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57UXVldWV9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnUXVldWVJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgIyBidWlsZCBuZXh0IHF1ZXVlcyBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUXVldWVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMCwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFRyZWVWaWV3ICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICApOwoKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UXVldWUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlF1ZXVlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6UXVldWU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9RdWV1ZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyU3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclN0YXRlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU3RhdGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkU3RhdGVzID0gJFNlbGYtPl9HZXRTdGF0ZXMoICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXh0IHRpY2tldCBzdGF0ZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHN0YXRlIG9iamVjdAogICAgbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgbXkgJFN0YXRlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U3RhdGVJRH07CiAgICBpZiAoJFN0YXRlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCggU3RhdGVJRCA9PiAkU3RhdGVJRFBhcmFtICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnU3RhdGUnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntTdGF0ZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTdGF0ZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U3RhdGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlN0YXRlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U3RhdGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TdGF0ZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclR5cGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlR5cGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCB0eXBlIG9iamVjdAogICAgbXkgJFR5cGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwoKICAgIG15ICRUeXBlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17VHlwZUlEfTsKICAgIGlmICgkVHlwZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRUeXBlT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlSUQgPT4gJFR5cGVJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnVHlwZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57VHlwZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydUeXBlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgU2VydmljZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VHlwZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VHlwZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlR5cGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9UeXBlJyApLAogICAgfTsKfQoKc3ViIF9TdG9yZUFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0dldFBhcmFtfS0+e1RpY2tldElEfTsKICAgIG15ICRQcm9jZXNzU3RhcnRwb2ludDsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAkUHJvY2Vzc0VudGl0eUlEOwogICAgbXkgJEFjdGl2aXR5RW50aXR5SUQ7CiAgICBteSAlRXJyb3I7CiAgICBteSAlRXJyb3JNZXNzYWdlczsKCiAgICBteSAlVGlja2V0UGFyYW07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX0tPntBY3Rpdml0eURpYWxvZ0VudGl0eUlEfTsKICAgIGlmICggISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBY3Rpdml0eURpYWxvZ0VudGl0eUlEIG1pc3NpbmchJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhY3Rpdml0eSBkaWFsb2cgb2JqZWN0CiAgICBteSAkQWN0aXZpdHlEaWFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2cgICAgICAgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NvdWxkblwndCBnZXQgQ29uZmlnIGZvciBBY3Rpdml0eURpYWxvZ0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICB9CgogICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgIG15ICRJc1VwbG9hZCA9IDA7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgbXkgQEF0dGFjaG1lbnRJRHMgPSBtYXAgewogICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICRJRCA/ICRJRCA6ICgpOwogICAgfSAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgIENPVU5UOgogICAgZm9yIG15ICRDb3VudCAoIHJldmVyc2Ugc29ydCBAQXR0YWNobWVudElEcyApIHsKICAgICAgICBteSAkRGVsZXRlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkF0dGFjaG1lbnREZWxldGUkQ291bnQiICk7CiAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgKTsKICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICB9CgogICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICk7CiAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIGlmICggISRJc1VwbG9hZCApIHsKCiAgICAgICAgIyBjaGVjayBlYWNoIEZpZWxkIG9mIGFuIEFjdGl2aXR5IERpYWxvZyBhbmQgZmlsbCB0aGUgZXJyb3IgaGFzaCBpZiBzb21ldGhpbmcgZ29lcyBob3JyaWJseSB3cm9uZwogICAgICAgIG15ICVDaGVja2VkRmllbGRzOwogICAgICAgIERJQUxPR0ZJRUxEOgogICAgICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICAgICAgIyBHZXQgdGhlIENvbmZpZyBvZiB0aGUgY3VycmVudCBEeW5hbWljRmllbGQgKHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBncmVwIHJlc3VsdCBhcnJheSkKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFdpbGwgYmUgZXh0ZW5kZWQgbGF0ZXIgb24gZm9yIEFDTCBDaGVja2luZzoKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgICAgICAjIGlmIHdlIGhhdmUgYW4gaW52aXNpYmxlIGZpZWxkLCB1c2UgY29uZmlnJ3MgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICAgICYmIGxlbmd0aCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgICAgICAjIG1ha2Ugc3VyZSBJVFNNQ3JpdGljYWxpdHkgaXMgc3RvcmVkLCBldmVuIGlmIHRoaXMgZmllbGQgaXMgaW52aXNpYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkTmFtZSBlcSAnSVRTTUNyaXRpY2FsaXR5JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFBhcmFte0dldFBhcmFtfS0+e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfTsKICAgICAgICAgICAgICAgICAgICB9CiMgLS0tCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvbmx5IHZhbGlkYXRlIHZpc2libGUgZmllbGRzCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIENoZWNrIER5bmFtaWNGaWVsZCBWYWx1ZXMKICAgICAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0KICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBJbiBjYXNlIG9mIER5bmFtaWNGaWVsZHMgdGhlcmUgaXMgbm8gTmFtZVRvSUQgdHJhbnNsYXRpb24KICAgICAgICAgICAgICAgICMgc28ganVzdCB0YWtlIHRoZSBEeW5hbWljRmllbGQgbmFtZQogICAgICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnCiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVySUQnfSB9OwoKICAgICAgICAgICAgICAgICMgaXMgbm90IHBvc3NpYmxlIHRvIGEgaGF2ZSBhbiBpbnZpc2libGUgZmllbGQgZm9yIHRoaXMgcGFydGljdWxhciB2YWx1ZQogICAgICAgICAgICAgICAgIyBvbiBhZ2VudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGRuXCd0IHVzZSBDdXN0b21lcklEIGFzIGFuIGludmlzaWJsZSBmaWVsZC4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBDdXN0b21lcklEIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5IGFzIGluIG90aGVyIHNjcmVlbnMKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntDdXN0b21lcklEfSB8fCAnJzsKCiAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHkgVGlja2V0Q3JlYXRlIG5lZWRzICdDdXN0b21lclVzZXInIGFzIHBhcmFtIGluc3RlYWQgb2YgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwoKICAgICAgICAgICAgICAgICMgZmFsbC1iYWNrLCBpZiBjdXN0b21lciBhdXRvLWNvbXBsZXRlIGRvZXMgbm90IHNob3duIGFueSByZXN1bHRzLCB0aGVuIHRyeSB0byB1c2UKICAgICAgICAgICAgICAgICMgdGhlIGNvbnRlbnQgb2YgdGhlIG9yaWdpbmFsIGZpZWxkIGFzIGN1c3RvbWVyIHVzZXIgaWQKICAgICAgICAgICAgICAgIGlmICggISRDdXN0b21lclVzZXJJRCApIHsKCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcklEJyApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyVXNlcklEKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyVXNlcklEICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICAgICAgbXkgJFByZWZpeCA9ICdQZW5kaW5nVGltZSc7CgogICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBWYWx1ZXMgb3RoZXJ3aXNlIHRha2UgYW4gZW1wdHkgc3RyaW5nCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtHZXRQYXJhbX0tPntQZW5kaW5nVGltZX0gKQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfS0+e1BlbmRpbmdUaW1lfS0+e1llYXJ9CiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19LT57UGVuZGluZ1RpbWV9LT57TW9udGh9CiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19LT57UGVuZGluZ1RpbWV9LT57RGF5fQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfS0+e1BlbmRpbmdUaW1lfS0+e0hvdXJ9CiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19LT57UGVuZGluZ1RpbWV9LT57TWludXRlfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkUGFyYW17R2V0UGFyYW19LT57UGVuZGluZ1RpbWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBubyBQZW5kaW5nIHN0YXR1cyB3ZSBoYXZlIG5vIHRpbWUgdG8gc2V0CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeydQZW5kaW5nVGltZSd9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBza2lwIGlmIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBJRCBvciBOYW1lCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tGaWVsZCgKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgICV7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFydGljbGVQYXJ0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17R2V0UGFyYW19LT57JEFydGljbGVQYXJ0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICdBcnRpY2xlJyAuICRBcnRpY2xlUGFydCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnCiAgICAgICAgICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57Q29uZmlnfS0+e1RpbWVVbml0c30KICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntDb25maWd9LT57VGltZVVuaXRzfSA9PSAyCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtHZXRQYXJhbX0tPntUaW1lVW5pdHN9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgZXJyb3IgZm9yIHRoZSB0aW1lLXVuaXRzIChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzJ30gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNpZiAoJFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gJFJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgfQogICAgKTsKICAgIG15ICRQcm9jZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSBATm90aWZ5OwoKICAgIG15ICROZXdUaWNrZXRJRDsKICAgIGlmICggISRUaWNrZXRJRCApIHsKCiAgICAgICAgJFByb2Nlc3NFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX0tPntQcm9jZXNzRW50aXR5SUR9OwogICAgICAgIGlmICggISRQcm9jZXNzRW50aXR5SUQgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTWlzc2luZyBQcm9jZXNzRW50aXR5SUQsIGNoZWNrIHlvdXIgQWN0aXZpdHlEaWFsb2dIZWFkZXIudHQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc1N0YXJ0cG9pbnQgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUHJvY2Vzc1N0YXJ0cG9pbnQKICAgICAgICAgICAgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzU3RhcnRwb2ludCkKICAgICAgICAgICAgfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTm8gU3RhcnRBY3Rpdml0eURpYWxvZyBvciBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciBQcm9jZXNzICIlcyIgY29uZmlndXJlZCEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHl9OwoKICAgICAgICBORUVERURMT09QOgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5KSkgewoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBpZiBhIHJlcXVpcmVkIGZpZWxkIGhhcyBubyB2YWx1ZSBjYWxsIF9DaGVja0ZpZWxkIGFzIGZpbGVkIGlzIGhpZGRlbgogICAgICAgICAgICAgICAgIyAoTm8gRGlzcGxheSBwYXJhbSA9IERpc3BsYXkgPT4gMCkgYW5kIG5vIERlZmF1bHRWYWx1ZSwgdG8gdXNlIGdsb2JhbCBkZWZhdWx0IGFzCiAgICAgICAgICAgICAgICAjIGZhbGwtYmFjay4gT25lIHJlYXNvbiBmb3IgdGhpcyB0byBoYXBwZW4gaXMgdGhhdCBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWUgdHJpZWQKICAgICAgICAgICAgICAgICMgdG8gc2V0IGJlZm9yZSwgd2FzIG5vdCB2YWxpZC4KICAgICAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X0NoZWNrRmllbGQoCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJFNlbGYtPntOYW1lVG9JRH0tPnskTmVlZGVkfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRTZWxmLT57TmFtZVRvSUR9LT57JE5lZWRlZH0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JE5lZWRlZH0gfSA9ICRSZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGFkIG5vIEVycm9ycywgd2UgY2FuIGNyZWF0ZSB0aGUgVGlja2V0IGFuZCBTZXQgQWN0aXZpdHlFbnRpdHlJRCBhcyB3ZWxsIGFzCiAgICAgICAgIyBQcm9jZXNzRW50aXR5SUQKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVFcnJvciApICkgewoKICAgICAgICAgICAgJFRpY2tldFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICAgICBpZiAoICEkVGlja2V0UGFyYW17T3duZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte093bmVySUR9ID0gJFBhcmFte0dldFBhcmFtfS0+e093bmVySUR9IHx8IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgU3RhcnRBY3Rpdml0eURpYWxvZyBkb2VzIG5vdCBwcm92aWRlIGEgdGlja2V0IHRpdGxlIHNldCBhIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFte1RpdGxlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgY3VycmVudCBzZXJ2ZXIgVGltZS1zdGFtcAogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRUaW1lU3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gIiRQYXJhbXtQcm9jZXNzTmFtZX0gLSAkQ3VycmVudFRpbWVTdGFtcCI7CgogICAgICAgICAgICAgICAgIyB1c2UgYXJ0aWNsZSBzdWJqZWN0IGZyb20gdGhlIHdlYiByZXF1ZXN0IGlmIGFueQogICAgICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyB0aWNrZXQKICAgICAgICAgICAgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKCVUaWNrZXRQYXJhbSk7CgogICAgICAgICAgICBpZiAoICEkVGlja2V0SUQgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGNyZWF0ZSB0aWNrZXQgZm9yIFByb2Nlc3Mgd2l0aCBQcm9jZXNzRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBQcm9jZXNzRW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gdW5kZWY7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBBY3Rpdml0eUVudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc3RvcmUgQWN0aXZpdHlEaWFsb2csIGludmFsaWQgVGlja2V0SUQ6ICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKAoKICAgICAgICAgICAgICAgICMgMi4gcmVtb3ZlICJEeW5hbWljRmllbGRfIiBmcm9tIHN0cmluZwogICAgICAgICAgICAgICAgbWFwIHsKICAgICAgICAgICAgICAgICAgICBteSAkRmllbGQgPSAkXzsKICAgICAgICAgICAgICAgICAgICAkRmllbGQgPX4gc3teRHluYW1pY0ZpZWxkXyguKil9eyQxfXhtczsKCiAgICAgICAgICAgICAgICAgICAgIyAzLiBncmVwIGZyb20gdGhlIER5bmFtaWNGaWVsZENvbmZpZ3MgdGhlIHJlc3VsdGluZyBEeW5hbWljRmllbGRzIHdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAjICJEeW5hbWljRmllbGRfIgogICAgICAgICAgICAgICAgICAgIGdyZXAgeyAkXy0+e05hbWV9IGVxICRGaWVsZCB9IEB7JER5bmFtaWNGaWVsZH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIDEuIGdyZXAgYWxsIER5bmFtaWNGaWVsZHMKICAgICAgICAgICAgICAgIGdyZXAge217XkR5bmFtaWNGaWVsZF8oLiopfXhtc30gQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBhbmQgbm93IGl0J3MgZWFzeSwganVzdCBzdG9yZSB0aGUgZHluYW1pYyBGaWVsZCBWYWx1ZXMgOykKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbWVtYmVyIG5ldyBjcmVhdGVkIFRpY2tldElECiAgICAgICAgICAgICROZXdUaWNrZXRJRCA9ICRUaWNrZXRJRDsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCAkVGlja2V0SUQgJiYgJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewoKICAgICAgICAjIHVzZSBFcnJvciBpbnN0ZWFkIG9mIEZhdGFsRXJyb3IgYXMgd2UgYXJlIGluIGEgUG9wLXVwIHdpbmRvdwogICAgICAgICMgR2V0IFRpY2tldCB0byBjaGVjayBUaWNrZXRJRCB3YXMgdmFsaWQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgVGlja2V0SUQ6ICVzIScsICRUaWNrZXRJRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IFByb2Nlc3NFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSB1bmRlZjsKCiAgICAgICAgJFByb2Nlc3NTdGFydHBvaW50ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFByb2Nlc3NTdGFydHBvaW50CiAgICAgICAgICAgIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc1N0YXJ0cG9pbnQpCiAgICAgICAgICAgIHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0gfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IEFjdGl2aXR5RW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXNlIFByb2Nlc3NFbnRpdHlJRCBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfTsKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBkZWFsIHdpdGggYSBUaWNrZXQgVXBkYXRlCiAgICAgICAgbXkgJFVwZGF0ZVRpY2tldElEID0gJFRpY2tldElEOwogICAgfQoKICAgICMgSWYgd2UgaGFkIGEgVGlja2V0SUQsIGdldCB0aGUgVGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgVGlja2V0IHRvIGNoZWNrIFRpY2tldElEIHdhcyB2YWxpZAogICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzdG9yZSBBY3Rpdml0eURpYWxvZywgaW52YWxpZCBUaWNrZXRJRDogJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCcpCiAgICAgICAgfTsKICAgICAgICBpZiAoICEkQWN0aXZpdHlFbnRpdHlJRCApCiAgICAgICAgewoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0RpYWxvZ0Vycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgQWN0aXZpdHlFbnRpdHlJRCBpbiBUaWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkgZGlhbG9nIHRvIHNhdmUgaXMgc3RpbGwgdGhlIGNvcnJlY3QgYWN0aXZpdHkKICAgICAgICBteSAkQWN0aXZpdHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5JyktPkFjdGl2aXR5R2V0KAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRBY3Rpdml0eUVudGl0eUlELAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICAgICApOwogICAgICAgIG15ICVBY3Rpdml0eURpYWxvZ3MgPSByZXZlcnNlICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfSAvLyB7fSB9OwogICAgICAgIGlmICggISRBY3Rpdml0eURpYWxvZ3N7JEFjdGl2aXR5RGlhbG9nRW50aXR5SUR9ICkgewoKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CgogICAgICAgICAgICAkRXJyb3J7V3JvbmdBY3Rpdml0eX0gPSAxOwogICAgICAgICAgICBwdXNoIEBOb3RpZnksIHsKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoaXMgc3RlcCBkb2VzIG5vdCBiZWxvbmcgYW55bW9yZSB0byB0aGUgY3VycmVudCBhY3Rpdml0eSBpbiBwcm9jZXNzIGZvciB0aWNrZXQgXCclcyVzJXNcJyEgQW5vdGhlciB1c2VyIGNoYW5nZWQgdGhpcyB0aWNrZXQgaW4gdGhlIG1lYW50aW1lLiBQbGVhc2UgY2xvc2UgdGhpcyB3aW5kb3cgYW5kIHJlbG9hZCB0aGUgdGlja2V0LicsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2ssCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2tEaXZpZGVyLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc0VudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKQogICAgICAgIH07CgogICAgICAgIGlmICggISRQcm9jZXNzRW50aXR5SUQgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0RpYWxvZ0Vycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgUHJvY2Vzc0VudGl0eUlEIGluIFRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB3ZSBnb3QgZXJyb3JzIGdvIGJhY2sgdG8gZGlzcGxheWluZyB0aGUgQWN0aXZpdHlEaWFsb2cKICAgIGlmICggJElzVXBsb2FkIHx8IElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQgfHwgdW5kZWYsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlcyAgICAgICAgICA9PiBcJUVycm9yTWVzc2FnZXMsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgSXNVcGxvYWQgICAgICAgICAgICAgICA9PiAkSXNVcGxvYWQsCiAgICAgICAgICAgIE5vdGlmeSAgICAgICAgICAgICAgICAgPT4gXEBOb3RpZnksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHdlIGRlYWwgd2l0aCBhIFRpY2tldCBVcGRhdGUKICAgIG15ICRVcGRhdGVUaWNrZXRJRCA9ICRQYXJhbXtHZXRQYXJhbX0tPntUaWNrZXRJRH07CgogICAgIyBXZSBzYXZlIG9ubHkgb25jZSwgbm8gbWF0dGVyIGlmIG9uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQgZm9yIHRoZSBzYW1lIHBhcmFtCiAgICBteSAlU3RvcmVkRmllbGRzOwoKICAgICMgU2F2ZSBsb29wIGZvciBzdG9yaW5nIFRpY2tldCBWYWx1ZXMgdGhhdCB3ZXJlIG5vdCByZXF1aXJlZCBvbiB0aGUgaW5pdGlhbCBUaWNrZXRDcmVhdGUKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgZGF0YSBmb3IgRmllbGQgIiVzIiBvZiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSAgID0gJDE7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc2V0IER5bmFtaWNGaWVsZCB2YWx1ZSBmb3IgJXMgb2YgVGlja2V0IHdpdGggSUQgIiVzIiBpbiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CgogICAgICAgICAgICAjIFRoaXMgVmFsdWUgaXMganVzdCBzZXQgaWYgU3RhdHVzIHdhcyBvbiBhIFBlbmRpbmcgc3RhdGUKICAgICAgICAgICAgIyBzbyBpdCBoYXMgdG8gYmUgcG9zc2libGUgdG8gc3RvcmUgdGhlIHRpY2tldCBpZiB0aGlzIG9uZSdzIGVtcHR5CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRUaWNrZXRQYXJhbXsnUGVuZGluZ1RpbWUnfSApICkgewogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICV7ICRUaWNrZXRQYXJhbXsnUGVuZGluZ1RpbWUnfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgUGVuZGluZ1RpbWUgZm9yIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyAmJiAoICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQgKSApIHsKCiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSAmJiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgbm90ZQogICAgICAgICAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJE1pbWVUeXBlICA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIENoYW5nZSBoaXN0b3J5IHR5cGUgYW5kIGNvbW1lbnQgYWNjb3JkaW5nbHkgdG8gdGhlIHByb2Nlc3MgYXJ0aWNsZS4KICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlVHlwZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPntBcnRpY2xlfS0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX07CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeVR5cGU7CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeUNvbW1lbnQgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVUeXBlIGVxICdwaG9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlID0gJ1Bob25lQ2FsbEFnZW50JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5VHlwZSAgICA9ICdBZGROb3RlJzsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUNvbW1lbnQgPSAnTm90ZSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEZyb20gPSAiXCIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgID0+ICRIaXN0b3J5VHlwZSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgID0+ICclJScgLiAkSGlzdG9yeUNvbW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSAgICAgICAgICAgICAgID0+ICRBcnRpY2xlVHlwZSwKICAgICAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPntBcnRpY2xlfS0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudHN9CiAgICAgICAgICAgICAgICAgICAgPyAkUGFyYW17R2V0UGFyYW19e0luZm9ybVVzZXJJRH0KICAgICAgICAgICAgICAgICAgICA6IFtdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBza2lwLCBkZWxldGVkIG5vdCB1c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17R2V0UGFyYW19LT57VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkUGFyYW17R2V0UGFyYW19e1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIHRvIFVwZGF0ZSBhIHRpY2tldCwgdXBkYXRlIHRoZSB0cmFuc21pdHRlZCB2YWx1ZXMKICAgICAgICBlbHNpZiAoJFVwZGF0ZVRpY2tldElEKSB7CgogICAgICAgICAgICBteSAkU3VjY2VzczsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdUaXRsZScgKSB7CgogICAgICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aXRsZSwgbm90aGluZyBpcyBuZWVkZWQgdG8gYmUgZG9uZQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfQogICAgICAgICAgICAgICAgICAgIHx8ICggZGVmaW5lZCAkVGlja2V0UGFyYW17J1RpdGxlJ30gJiYgJFRpY2tldFBhcmFteydUaXRsZSd9IGVxICcnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNldCB0aGUgdGlja2V0IHRpdGxlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkVGlja2V0UGFyYW17J1RpdGxlJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnCiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXcm9uZyBBY3Rpdml0eURpYWxvZyBGaWVsZCBjb25maWc6ICVzIGNhblwndCBiZSBEaXNwbGF5ID0+IDEgLyBTaG93IGZpZWxkIChQbGVhc2UgY2hhbmdlIGl0cyBjb25maWd1cmF0aW9uIHRvIGJlIERpc3BsYXkgPT4gMCAvIERvIG5vdCBzaG93IGZpZWxkIG9yIERpc3BsYXkgPT4gMiAvIFNob3cgZmllbGQgYXMgbWFuZGF0b3J5KSEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2tpcCBUaWNrZXRDdXN0b21lclNldCgpIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSBpbiB0aGUgY3VzdG9tZXIKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e0N1c3RvbWVySUR9IGVxICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICAgICAgICAgICAgICYmICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9IGVxICRUaWNrZXRQYXJhbXtDdXN0b21lclVzZXJ9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYW55IGFkZGl0aW9uYWwgc3RvcmVzCiAgICAgICAgICAgICAgICAgICAgIyBvbiBDdXN0b21lciwgQ3VzdG9tZXJObywgQ3VzdG9tZXJJRCBvciBDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgICAgICMgc28gbWFrZSBzdXJlIGJvdGggZmllbGRzIGFyZSBzZXQgdG8gIlN0b3JlZCIgOykKICAgICAgICAgICAgICAgICAgICAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEN1c3RvbWVyU2V0KAogICAgICAgICAgICAgICAgICAgIE5vID0+ICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfSwKCiAgICAgICAgICAgICAgICAgICAgIyBoZXJlIHRvbzogdW5mb3J0dW5hdGVseSBUaWNrZXRDcmVhdGUgdGFrZXMgUGFyYW0gJ0N1c3RvbWVyVXNlcicKICAgICAgICAgICAgICAgICAgICAjIGluc3RlYWQgb2YgQ3VzdG9tZXJVc2VySUQsIHNvIG91ciBUaWNrZXRQYXJhbSBoYXNoCiAgICAgICAgICAgICAgICAgICAgIyBoYXMgdGhlIEN1c3RvbWVyVXNlciBLZXkgaW5zdGVhZCBvZiAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICAgICAgICAgVXNlciAgICAgPT4gJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGFueSBhZGRpdGlvbmFsIHN0b3JlcwogICAgICAgICAgICAgICAgIyBvbiBDdXN0b21lciwgQ3VzdG9tZXJObywgQ3VzdG9tZXJJRCBvciBDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJJRCd9IH0gICAgID0gMTsKICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgICAgICBteSAkVGlja2V0RmllbGRTZXRTdWIgPSAkQ3VycmVudEZpZWxkOwogICAgICAgICAgICAgICAgJFRpY2tldEZpZWxkU2V0U3ViID1+IHN7SUQkfXt9eG1zOwogICAgICAgICAgICAgICAgJFRpY2tldEZpZWxkU2V0U3ViID0gJ1RpY2tldCcgLiAkVGlja2V0RmllbGRTZXRTdWIgLiAnU2V0JzsKCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXRPYmplY3QtPmNhbigkVGlja2V0RmllbGRTZXRTdWIpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkVXBkYXRlRmllbGROYW1lOwoKICAgICAgICAgICAgICAgICAgICAjIHNhZGx5IHdlIG5lZWQgYW4gZXhjZXB0aW9uIGZvciBPd25lcihJRCkgYW5kIFJlc3BvbnNpYmxlKElEKSwgYmVjYXVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAjIFRpY2tldCpTZXQgc3VicyBuZWVkIE5ld1VzZXJJRCBhcyBwYXJhbQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFyIGdyZXAgeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICRfIH0KICAgICAgICAgICAgICAgICAgICAgICAgcXcoIE93bmVySUQgUmVzcG9uc2libGVJRCApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgPSAnTmV3VXNlcklEJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgPSAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB0byBzdG9yZSBpZiB0aGUgZmllbGQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgICAgICAgICAgICAgICAgIG15ICRGaWVsZFVwZGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IFNlcnZpY2UgYW5kIFNMQSBmaWVsZHMgYWNjZXB0cyBlbXB0eSB2YWx1ZXMgaWYgdGhlIGhhc2gga2V5IGlzIG5vdAogICAgICAgICAgICAgICAgICAgICMgZGVmaW5lZCBzZXQgaXQgdG8gZW1wdHkgc28gdGhlIFRpY2tldCpTZXQgZnVuY3Rpb24gY2FsbCB3aWxsIGdldCB0aGUgZW1wdHkKICAgICAgICAgICAgICAgICAgICAjIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAoICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NlcnZpY2VJRCcgfHwgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU0xBSUQnICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkVXBkYXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIFNlcnZpY2UgYW4gU0xBIGZpZWxkcyBpZiB0aGV5IGhhdmUgYSBkZWZpbmVkIHZhbHVlIChldmVuIGVtcHR5KQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJyB8fCAkVXBkYXRlRmllbGROYW1lIGVxICdTTEFJRCcgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkVXBkYXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIGFueSBvdGhlciBmaWVsZCB0aGF0IGl0cyB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgZW1wdHkKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgbmUgJ1NlcnZpY2VJRCcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFVwZGF0ZUZpZWxkTmFtZSBuZSAnU0xBSUQnCiAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gbmUgJycKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkVXBkYXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gMTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPiRUaWNrZXRGaWVsZFNldFN1YigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgPT4gJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgbmV3IHNlcnZpY2UgYW5kIG5vIG5ldyBTTEEgaXMgdG8gYmUgc2V0LCBjaGVjayBpZiBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICMgYXNzaWduZWQgU0xBIGlzIHN0aWxsIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NlcnZpY2VJRCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZWZpbmVkICRUaWNrZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRpY2tldCBkZXRhaWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0aWNrZXQgYWxyZWFkeSBoYXZlIGFuIFNMQSBhc3NpZ25lZCBnZXQgdGhlIGxpc3QgU0xBcyBmb3IgdGhlIG5ldwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkVGlja2V0e1NMQUlEfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVTTEFMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgY3VycmVudCBTTEEgaXMgbm90IGluIHRoZSBsaXN0IG9mIFNMQSBmb3IgbmV3IHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBTTEEgZnJvbSB0aWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU0xBTGlzdHsgJFRpY2tldHtTTEFJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgJXMgZm9yIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgVHJhbnNpdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IHRpY2tldCBldmVudCBtb2R1bGUgKFRpY2tldFByb2Nlc3NUcmFuc2l0aW9ucy5wbSkuCgogICAgIyBpZiB3ZSB3ZXJlIHVwZGF0aW5nIGEgdGlja2V0LCBjbG9zZSB0aGUgcG9wLXVwIGFuZCByZXR1cm4gdG8gem9vbQogICAgIyBlbHNlIChuZXcgdGlja2V0KSBqdXN0IGdvIHRvIHpvb20gdG8gc2hvdyB0aGUgbmV3IHRpY2tldAogICAgaWYgKCRVcGRhdGVUaWNrZXRJRCkgewoKICAgICAgICAjIGxvYWQgbmV3IFVSTCBpbiBwYXJlbnQgd2luZG93IGFuZCBjbG9zZSBwb3AtdXAKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRVcGRhdGVUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICk7Cn0KCnN1YiBfRGlzcGxheVByb2Nlc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBJZiB3ZSBoYXZlIGEgUHJvY2Vzc0VudGl0eUlECiAgICAkUGFyYW17RXJyb3JzfS0+e1Byb2Nlc3NFbnRpdHlJREludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcicKICAgICAgICBpZiAoICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9ICYmICEkUGFyYW17UHJvY2Vzc0xpc3R9LT57ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9IH0gKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRQYXJhbXtQcm9jZXNzTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57UHJvY2Vzc0VudGl0eUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtQcm9jZXNzTGlzdH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQcm9jZXNzRW50aXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBBdXRvQ29tcGxldGUgPT4gJ29mZicsCiAgICApOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1ByZVNlbGVjdFByb2Nlc3N9ICYmICRQYXJhbXtQcm9jZXNzSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmVTZWxlY3RQcm9jZXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQcm9jZXNzSUQgPT4gJFBhcmFte1Byb2Nlc3NJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9jZXNzTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG9uIGluaXRpYWwgc2NyZWVuIGZyb20gbmF2YmFyIHRoZXJlIGlzIG5vIElzTWFpbldpbm93IGJ1dCBhbHNvIG5vIElzUHJvY2Vzc0Vucm9sbCwKICAgICMgdGhlbiBpdCBtdXN0IGJlIGEgTWFpbldpbmRvdwogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJFNlbGYtPntJc01haW5XaW5kb3d9ID0gMTsKICAgIH0KCiAgICBteSAkVHlwZSA9ICRTZWxmLT57SXNNYWluV2luZG93fSA/ICcnIDogJ1NtYWxsJzsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICApOwogICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByb2Nlc3MnIC4gJFR5cGUsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGwgPT4gJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgd29ya2Fyb3VuZCB3aGVuIGFjdGl2aXR5IGRpYWxvZyBpcyBsb2FkZWQgYnkgQUpBWCBhcyBmaXJzdCBhY3Rpdml0eSBkaWFsb2csIGlmIHRoZXJlIGlzCiAgICAjIGEgZGF0ZSBmaWVsZCBsaWtlIFBlbmRpbmcgVGltZSBvciBEeW5hbWljIEZpZWxkcyBEYXRlL1RpbWUgb3IgRGF0ZSwgdGhlcmUgaXMgbm8gd2F5IHRvIHNldAogICAgIyB0aGlzIG9wdGlvbnMgaW4gdGhlIGZvb3RlciBhZ2FpbgogICAgJExheW91dE9iamVjdC0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAkVHlwZSApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojID1jdXQKIwojIF9DaGVja0ZpZWxkKCkKIwojIGNoZWNrcyBhbGwgdGhlIHBvc3NpYmxlIHRpY2tldCBmaWVsZHMgYW5kIHJldHVybnMgdGhlIElEIChpZiBwb3NzaWJsZSkgdmFsdWUgb2YgdGhlIGZpZWxkLCBpZiB2YWxpZAojIGFuZCBjaGVja3MgYXJlIHN1Y2Nlc3NmdWwKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDAgb3Igbm90IGdpdmVuLCBpdCB1c2VzIEFjdGl2aXR5RGlhbG9nIGZpZWxkIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBmaWVsZHMKIyBvciBnbG9iYWwgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsLWJhY2sgb25seSBmb3IgY2VydGFpbiBmaWVsZHMKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDEgb3IgMiBpdCB1c2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0NoZWNrRmllbGQoCiMgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAojICAgICAgICAgRGlzcGxheSAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIDAgb3IgMSBvciAyCiMgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJzMgbm9ybWFsJywgICAgICAgICAgIyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIChpdCB1c2VzIGdsb2JhbAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsIGJhY2sgZm9yIG1hbmRhdG9yeSBmaWVsZHMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIChRdWV1ZSwgU2F0ZSwgTG9jayBhbmQgUHJpb3JpdHkpCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgUHJpb3JpdHlJRCBpcyBzZXQgdG8gMSBpbiB0aGUgd2ViIHJlcXVlc3QKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9DaGVja0ZpZWxkKAojICAgICAgICAgRmllbGQgICAgICAgID0+ICdQcmlvcml0eUlEJywKIyAgICAgICAgIERpc3BsYXkgICAgICA9PiAwLAojICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICczIG5vcm1hbCcsCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlIGlzICczIG5vcm1hbCcgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBmaWVsZCBpcyBoaWRkZW4KIwojID1jdXQKCnN1YiBfQ2hlY2tGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgSUQgYW5kIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgYSB0aWNrZXQKICAgIG15ICRGaWVsZFdpdGhvdXRJRCA9ICRQYXJhbXtGaWVsZH07CiAgICAkRmllbGRXaXRob3V0SUQgPX4gc3tJRCR9e314bXM7CiAgICBteSAkVGlja2V0UmVxdWlyZWRGaWVsZCA9IHNjYWxhciBncmVwIHsgJF8gZXEgJEZpZWxkV2l0aG91dElEIH0gcXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSk7CgogICAgbXkgJFZhbHVlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGlmIG5vIERpc3BsYXkgKG9yIERpc3BsYXkgPT0gMCkgaXMgY29tbWl0dGVkCiAgICBpZiAoICEkUGFyYW17RGlzcGxheX0gKSB7CgogICAgICAgICMgQ2hlY2sgaWYgYSBEZWZhdWx0VmFsdWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICRQYXJhbXtEZWZhdWx0VmFsdWV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB3ZSBnb3QgYSByZXF1aXJlZCB0aWNrZXQgZmllbGQsIGNoZWNrIGlmIHdlIGdvdCBhIHZhbGlkIERlZmF1bHRWYWx1ZSBpbiB0aGUgU3lzQ29uZmlnCiAgICAgICAgaWYgKCAhJFZhbHVlICYmICRUaWNrZXRSZXF1aXJlZEZpZWxkICkgewogICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlByb2Nlc3M6OkRlZmF1bHQkRmllbGRXaXRob3V0SUQiKTsKCiAgICAgICAgICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdEZWZhdWx0IENvbmZpZyBmb3IgUHJvY2Vzczo6RGVmYXVsdCVzIG1pc3NpbmchJywKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RlZmF1bHQgQ29uZmlnIGZvciBQcm9jZXNzOjpEZWZhdWx0JXMgaW52YWxpZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAxICkgewoKICAgICAgICAjIERpc3BsYXkgPT0gMSBpcyBsb2dpY2FsaXR5IG5vdCBwb3NzaWJsZSBmb3IgYSB0aWNrZXQgcmVxdWlyZWQgZmllbGQKICAgICAgICBpZiAoJFRpY2tldFJlcXVpcmVkRmllbGQpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdXcm9uZyBBY3Rpdml0eURpYWxvZyBGaWVsZCBjb25maWc6ICVzIGNhblwndCBiZSBEaXNwbGF5ID0+IDEgLyBTaG93IGZpZWxkIChQbGVhc2UgY2hhbmdlIGl0cyBjb25maWd1cmF0aW9uIHRvIGJlIERpc3BsYXkgPT4gMCAvIERvIG5vdCBzaG93IGZpZWxkIG9yIERpc3BsYXkgPT4gMiAvIFNob3cgZmllbGQgYXMgbWFuZGF0b3J5KSEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGaWVsZH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICBpZiAoICRQYXJhbXtGaWVsZH0gZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgJFZhbHVlID0gMTsKCiAgICAgICAgICAgIG15ICggJEJvZHksICRTdWJqZWN0LCAkQXR0YWNobWVudERlbGV0ZTEsICRUaW1lVW5pdHMgKSA9ICgKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCb2R5JyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmplY3QnICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudERlbGV0ZTEnICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGltZVVuaXRzJyApCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIGF0dGFjaG1lbnQgZXhpc3RzIGFuZCBib2R5IGFuZCBzdWJqZWN0IG5vdCwgaXQgaXMgZXJyb3IgKHNlZSBidWcjMTMwODEpLgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEF0dGFjaG1lbnREZWxldGUxICYmICggISRCb2R5ICYmICEkU3ViamVjdCApICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB0aW1lIHVuaXRzIGV4aXN0cyBhbmQgYm9keSBhbmQgc3ViamVjdCBub3QsIGl0IGlzIGVycm9yIChzZWUgYnVnIzEzMjY2KS4KICAgICAgICAgICAgaWYgKCAkVGltZVVuaXRzICYmICggISRCb2R5ICYmICEkU3ViamVjdCApICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJFBhcmFte0ZpZWxkfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtGaWVsZH0gKSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAyICkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBwYXJhbSBpcyB2YWxpZAogICAgICAgIGlmICggJFBhcmFte0ZpZWxkfSBlcSAnQXJ0aWNsZScgKSB7CgogICAgICAgICAgICBteSAoICRCb2R5LCAkU3ViamVjdCApID0gKAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgaWYgKCAkQm9keSAmJiAkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fTG9va3VwVmFsdWUoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkUGFyYW17RmllbGR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0ZpZWxkfSApIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFZhbHVlOwp9CgojID1jdXQKIwojIF9Mb29rdXBWYWx1ZSgpCiMKIyByZXR1cm5zIHRoZSBJRCAoaWYgcG9zc2libGUpIG9mIG5lYXJseSBhbGwgdGlja2V0IGZpZWxkcyBhbmQvb3IgY2hlY2tzIGlmIGl0cyB2YWxpZC4KIyBDYW4gaGFuZGxlIElEcyBvciBTdHJpbmdzLgojIEN1cnJlbnRseSB3b3JraW5nIHdpdGg6IFN0YXRlLCBRdWV1ZSwgTG9jaywgUHJpb3JpdHkgKHBvc3NpYmxlIG1vcmUpLgojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0xvb2t1cFZhbHVlKAojICAgICAgICAgUHJpb3JpdHlJRCA9PiAxLAojICAgICApOwojICAgICAkUHJpb3JpdHlJRCA9IDE7CiMKIyAgICAgbXkgJFN0YXRlSUQgPSAkQWdlbnRUaWNrZXRQcm9jZXNzT2JqZWN0LT5fTG9va3VwVmFsdWUoCiMgICAgICAgICBTdGF0ZSA9PiAnb3BlbicsCiMgICAgICk7CiMgICAgICRTdGF0ZUlEID0gMzsKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9Mb29rdXBWYWx1ZSgKIyAgICAgICAgIFByaW9yaXR5ID0+ICd1bmtub3ducHJpb3JpdHkxMjM0JywKIyAgICAgKTsKIyAgICAgJFByaW9yaXR5SUQgPSB1bmRlZjsKIwojID1jdXQKCnN1YiBfTG9va3VwVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RmllbGR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gdmFsdWUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KICAgIHJldHVybiBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAjIHJlbW92ZSB0aGUgSUQgZm9yIGZ1bmN0aW9uIG5hbWUgcHVycG9zZQogICAgbXkgJEZpZWxkV2l0aG91dElEID0gJFBhcmFte0ZpZWxkfTsKICAgICRGaWVsZFdpdGhvdXRJRCA9fiBze0lEJH17fXhtczsKCiAgICBteSAkTG9va3VwRmllbGROYW1lOwogICAgbXkgJE9iamVjdE5hbWU7CiAgICBteSAkRnVuY3Rpb25OYW1lOwoKICAgICMgb3duZXIoSUQpIGFuZCByZXNwb25zaWJsZShJRCkgbG9va3VwIG5lZWRzIFVzZXJJRCBhcyBwYXJhbWV0ZXIKICAgIGlmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVySUQgUmVzcG9uc2libGVJRCApICkgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAnVXNlcklEJzsKICAgICAgICAkT2JqZWN0TmFtZSAgICAgID0gJ1VzZXInOwogICAgICAgICRGdW5jdGlvbk5hbWUgICAgPSAnVXNlckxvb2t1cCc7CiAgICB9CgogICAgIyBvd25lciBhbmQgcmVzcG9uc2libGUgbG9va3VwIG5lZWRzIFVzZXJMb2dpbiBhcyBwYXJhbWV0ZXIKICAgIGVsc2lmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVyIFJlc3BvbnNpYmxlICkgKSB7CiAgICAgICAgJExvb2t1cEZpZWxkTmFtZSA9ICdVc2VyTG9naW4nOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAnVXNlcic7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICdVc2VyTG9va3VwJzsKICAgIH0KCiAgICAjIHNlcnZpY2UgYW5kIFNMQSBsb29rdXAgbmVlZHMgTmFtZSBhcyBwYXJhbWV0ZXIgKFdoaWxlIFNlcnZpY2VJRCBhbiBTTEFJRCB1c2VzIHN0YW5kYXJkKQogICAgZWxzaWYgKCBzY2FsYXIgZ3JlcCB7ICRQYXJhbXtGaWVsZH0gZXEgJF8gfSBxdyggU2VydmljZSBTTEEgKSApIHsKICAgICAgICAkTG9va3VwRmllbGROYW1lID0gJ05hbWUnOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgb3RoZXIgZmllbGRzIGNhbiB1c2Ugc3RhbmRhcmQgcGFyYW1ldGVyIG5hbWVzIGFzIFByaW9yaXR5IG9yIFByaW9yaXR5SUQKICAgIGVsc2UgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAkUGFyYW17RmllbGR9OwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgZ2V0IGFwcHJvcHJpYXRlIG9iamVjdCBvZiBmaWVsZAogICAgbXkgJEZpZWxkT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSwgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSApOwogICAgfQoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGNoZWNrIGlmIHRoZSBiYWNrZW5kIG1vZHVsZSBoYXMgdGhlIG5lZWRlZCAqTG9va3VwIHN1YgogICAgaWYgKCAkRmllbGRPYmplY3QgJiYgJEZpZWxkT2JqZWN0LT5jYW4oJEZ1bmN0aW9uTmFtZSkgKSB7CgogICAgICAgICMgY2FsbCB0aGUgKkxvb2t1cCBzdWIgYW5kIGdldCB0aGUgdmFsdWUKICAgICAgICAkVmFsdWUgPSAkRmllbGRPYmplY3QtPiRGdW5jdGlvbk5hbWUoCiAgICAgICAgICAgICRMb29rdXBGaWVsZE5hbWUgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgd2UgZGlkbid0IGhhdmUgYW4gb2JqZWN0IGFuZCB0aGUgdmFsdWUgaGFzIG5vIHJlZiBhIHN0cmluZyBlLmcuIFRpdGxlIGFuZCBzbyBvbgogICAgIyByZXR1cm4gdHJ1ZQogICAgZWxzaWYgKCAkUGFyYW17RmllbGR9IGVxICRGaWVsZFdpdGhvdXRJRCAmJiAhcmVmICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciB3aGlsZSBjaGVja2luZyB3aXRoICIgLiAkRmllbGRXaXRob3V0SUQgLiAiT2JqZWN0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgKCAhJFZhbHVlICk7CgogICAgIyByZXR1cm4gdGhlIGdpdmVuIElEIHZhbHVlIGlmIHRoZSAqTG9va3VwIHJlc3VsdCB3YXMgYSBzdHJpbmcKICAgIGlmICggJFBhcmFte0ZpZWxkfSBuZSAkRmllbGRXaXRob3V0SUQgKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CgogICAgIyByZXR1cm4gdGhlICpMb29rdXAgc3RyaW5nIHJldHVybiB2YWx1ZQogICAgcmV0dXJuICRWYWx1ZTsKfQoKc3ViIF9HZXRSZXNwb25zaWJsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW06OlBlcm1pc3Npb24nKTsKICAgIG15ICRQZXJtaXNzaW9uR3JvdXBUeXBlID0gKCBncmVwIHsgJF8gZXEgJ3Jlc3BvbnNpYmxlJyB9IEB7JENvbmZpZ1Blcm1pc3Npb25zfSApID8gJ3Jlc3BvbnNpYmxlJyA6ICdydyc7CgogICAgIyBpZiB3ZSBhcmUgdXBkYXRpbmcgYSB0aWNrZXQgc2hvdyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHJlc3BvbnNpYmxlcwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgICA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdFF1ZXVlIik7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1Jlc3BvbnNpYmxlQWxsfSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgICAgICBmb3IgbXkgJEtleUdyb3VwTWVtYmVyICggc29ydCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJEtleUdyb3VwTWVtYmVyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYWxsIHN5c3RlbSB1c2VycwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzdWJzY3JpYmVkIHVzZXJzIHdobyBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGluIHRoZSBxdWV1ZSBncm91cAogICAgICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRPd25lcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW06OlBlcm1pc3Npb24nKTsKICAgIG15ICRQZXJtaXNzaW9uR3JvdXBUeXBlID0gKCBncmVwIHsgJF8gZXEgJ293bmVyJyB9IEB7JENvbmZpZ1Blcm1pc3Npb25zfSApID8gJ293bmVyJyA6ICdydyc7CgogICAgIyBpZiB3ZSBhcmUgdXBkYXRpbmcgYSB0aWNrZXQgc2hvdyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIG93bmVycwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgICA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdFF1ZXVlIik7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte093bmVyQWxsfSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgICAgICBmb3IgbXkgJEtleUdyb3VwTWVtYmVyICggc29ydCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJEtleUdyb3VwTWVtYmVyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYWxsIHN5c3RlbSB1c2VycwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzdWJzY3JpYmVkIHVzZXJzIHdobyBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGluIHRoZSBxdWV1ZSBncm91cAogICAgICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPd25lcicsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldExvY2tzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUxvY2tzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvY2snKS0+TG9ja0xpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFwlTG9ja3M7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVQcmlvcml0aWVzOwoKICAgICMgSW5pdGlhbGx5IHdlIGhhdmUganVzdCB0aGUgZGVmYXVsdCBRdWV1ZSBQYXJhbWV0ZXIKICAgICMgc28gbWFrZSBzdXJlIHRvIGdldCB0aGUgSUQgaW4gdGhhdCBjYXNlCiAgICBteSAkUXVldWVJRDsKICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSAmJiAkUGFyYW17UXVldWV9ICkgewogICAgICAgICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUGFyYW17UXVldWV9ICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUXVldWVJRCB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0UXVldWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGljaCB0eXBlIG9mIHBlcm1pc3Npb24gaXMgbmVlZGVkOiBpZiB0aGUgcHJvY2VzcyB0aWNrZXQKICAgICMgYWxyZWFkeSBleGlzdHMgKD0gVGlja2V0SUQgaXMgcHJlc2VudCksIHdlIG5lZWQgdGhlICdtb3ZlX2ludG8nCiAgICAjIHBlcm1pc3Npb24gb3RoZXJ3aXNlIHRoZSAnY3JlYXRlJyBwZXJtaXNzaW9uCiAgICBteSAkUGVybWlzc2lvblR5cGUgPSAnY3JlYXRlJzsKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkUGVybWlzc2lvblR5cGUgPSAnbW92ZV9pbnRvJzsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdRdWV1ZXM7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3UXVldWVzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVF1ZXVlczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVF1ZXVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRQZXJtaXNzaW9uVHlwZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlUXVldWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgIFRhYmxlID0+ICdzeXN0ZW1fYWRkcmVzcycsCiAgICAgICAgICAgICAgICBXaGF0ICA9PiAncXVldWVfaWQsIGlkJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBDbGFtcCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQZXJtaXNzaW9uVHlwZSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlUXVldWVzICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRTdHJpbmcgPX4gc3tccytcen17fSBpZiAhJFF1ZXVlRGF0YXtDb21tZW50fTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkUXVldWVzeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3UXVldWVzeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJU5ld1F1ZXVlczsKfQoKc3ViIF9HZXRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAoKICAgICAgICAjIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IHByb2Nlc3MgdGlja2V0CiAgICAgICAgUXVldWVJRCAgPT4gJFBhcmFte1F1ZXVlSUR9ICB8fCAxLAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gfHwgJycsCgogICAgICAgICMgcmVtb3ZlIHR5cGUsIHNpbmNlIGlmIFRpY2tldDo6VHlwZSBpcyBhY3RpdmUgaW4gc3lzY29uZmlnLCB0aGUgVHlwZSBwYXJhbWV0ZXIgd2lsbAogICAgICAgICMgYmUgc2VudCBhbmQgdGhlIFRpY2tldFN0YXRlTGlzdCB3aWxsIHNlbmQgdGhlIHBhcmFtZXRlciBhcyBTdGF0ZSBUeXBlCiAgICAgICAgVHlwZSA9PiB1bmRlZiwKCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gXCVTdGF0ZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0QUpBWFVwZGF0YWJsZUZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEZWZhdWx0VXBkYXRhYmxlRmllbGRzID0gKAogICAgICAgIFByaW9yaXR5SUQgICAgPT4gMSwKICAgICAgICBRdWV1ZUlEICAgICAgID0+IDEsCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAxLAogICAgICAgIFNlcnZpY2VJRCAgICAgPT4gMSwKICAgICAgICBTTEFJRCAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVJRCAgICAgICA9PiAxLAogICAgICAgIE93bmVySUQgICAgICAgPT4gMSwKICAgICAgICBMb2NrSUQgICAgICAgID0+IDEsCiAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgKTsKCiAgICAjIGNyZWF0ZSBhIER5bmFtaWNGaWVsZExvb2t1cFRhYmxlCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZH07CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZHN9IH0gKSB7CgogICAgICAgIG15ICRGaWVsZERhdGEgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZHN9LT57JEZpZWxkfTsKCiAgICAgICAgIyBza2lwIGhpZGRlbiBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGREYXRhLT57RGlzcGxheX07CgogICAgICAgICMgZm9yIER5bmFtaWMgRmllbGRzIGNoZWNrIGlmIGlzIEFKQVhVcGRhdGFibGUKICAgICAgICBpZiAoICRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZH07CgogICAgICAgICAgICAjIHNraXAgYW55IGZpZWxkIHdpdGggd3JvbmcgY29uZmlnCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBza2lwIGZpZWxkIGlmIGlzIG5vdCBJc0FDTFJlZHVjaWJsZSAodXBkYXRhYmxlKQogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAkRmllbGQ7CiAgICAgICAgfQoKICAgICAgICAjIGZvciBhbGwgb3RoZXJzIHVzZSAlRGVmYXVsdFVwZGF0YWJsZUZpZWxkcyB0YWJsZQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzdGFuZGFyaXplIHRoZSBmaWVsZCBuYW1lIChlLmcuIHVzZSBTdGF0ZUlEIGZvciBTdGF0ZSBmaWVsZCkKICAgICAgICAgICAgbXkgJEZpZWxkTmFtZSA9ICRTZWxmLT57TmFtZVRvSUR9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICMgc2tpcCBpZiBmaWVsZCBuYW1lIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgKHRoaXMgbWVhbnMgdGhhdCBmaWVsZCBpcyB1bmtub3duKQogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGROYW1lOwoKICAgICAgICAgICAgIyBza2lwIGlmIHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIHZpYSBhamF4CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISREZWZhdWx0VXBkYXRhYmxlRmllbGRzeyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAkRmllbGROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGVTdHJnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEZpZWxkc1RvVXBkYXRlID0gJyc7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9ICkgKSB7CiAgICAgICAgbXkgJEZpcnN0SXRlbSA9IDE7CiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSB9ICkgewogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAkUGFyYW17VHJpZ2dlckZpZWxkfTsKICAgICAgICAgICAgaWYgKCRGaXJzdEl0ZW0pIHsKICAgICAgICAgICAgICAgICRGaXJzdEl0ZW0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICcsICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICInIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJEZpZWxkc1RvVXBkYXRlOwp9CgpzdWIgX1Nob3dEaWFsb2dFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkVycm9yKCVQYXJhbSk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Wm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnVzZSBQT1NJWCBxdy9jZWlsLzsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFVzZXJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1pvb21FeHBhbmQnICk7CiAgICAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kU29ydCcgKTsKICAgICRTZWxmLT57Wm9vbVRpbWVsaW5lfSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1pvb21UaW1lbGluZScgKTsKCiAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2F2ZSBsYXN0IHVzZWQgdmlldyB0eXBlIGluIHByZWZlcmVuY2VzCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSAmJiAhZGVmaW5lZCAkU2VsZi0+e1pvb21UaW1lbGluZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmQnKTsKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2Vze1VzZXJMYXN0VXNlZFpvb21WaWV3VHlwZX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfSBlcSAnRXhwYW5kJyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFVzZXJQcmVmZXJlbmNlc3tVc2VyTGFzdFVzZWRab29tVmlld1R5cGV9IGVxICdDb2xsYXBzZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfSBlcSAnVGltZWxpbmUnICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Wm9vbVRpbWVsaW5lfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2lmICggZGVmaW5lZCAkU2VsZi0+e1pvb21FeHBhbmR9IHx8IGRlZmluZWQgJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAgICAgbXkgJExhc3RVc2VkWm9vbVZpZXdUeXBlID0gJyc7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICRTZWxmLT57Wm9vbUV4cGFuZH0gPT0gMSApIHsKICAgICAgICAgICAgICAgICRMYXN0VXNlZFpvb21WaWV3VHlwZSA9ICdFeHBhbmQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZGVmaW5lZCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICRTZWxmLT57Wm9vbUV4cGFuZH0gPT0gMCApIHsKICAgICAgICAgICAgICAgICRMYXN0VXNlZFpvb21WaWV3VHlwZSA9ICdDb2xsYXBzZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRTZWxmLT57Wm9vbVRpbWVsaW5lfSAmJiAkU2VsZi0+e1pvb21UaW1lbGluZX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICRMYXN0VXNlZFpvb21WaWV3VHlwZSA9ICdUaW1lbGluZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTGFzdFVzZWRab29tVmlld1R5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgUGxlYXNlIG5vdGU6IFpvb21UaW1lbGluZSBpcyBhbiBPVFJTQnVzaW5lc3MgZmVhdHVyZQogICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lbGluZVZpZXdFbmFibGVkJykgKSB7CiAgICAgICAgJFNlbGYtPntab29tVGltZWxpbmV9ID0gMDsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckFnZW50RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kU29ydH0gKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmRTb3J0Jyk7CiAgICB9CgogICAgJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGlja2V0QXJ0aWNsZUZpbHRlcicpOwoKICAgICMgZGVmaW5lIGlmIHJpY2ggdGV4dCBzaG91bGQgYmUgdXNlZAogICAgJFNlbGYtPntSaWNoVGV4dH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21SaWNoVGV4dEZvcmNlJykKICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgIHx8IDA7CgogICAgIyBzdHJpcCBodG1sIGFuZCBhc2NpaSBhdHRhY2htZW50cyBvZiBjb250ZW50CiAgICAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSA9IDE7CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgaXMgZW5hYmxlZCwgaWYgbm90IG9ubHkgc3RyaXAgYXNjaWkgYXR0YWNobWVudHMKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9ID0gMjsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgdGlja2V0IGlkIGxvb2t1cAogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gJiYgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKSApIHsKICAgICAgICAkU2VsZi0+e1RpY2tldElEfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHpvb20gc2V0dGluZ3MgZGVwZW5kaW5nIG9uIHRpY2tldCB0eXBlCiAgICAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpOwoKICAgICMgdGhpcyBpcyBhIG1hcHBpbmcgb2YgaGlzdG9yeSB0eXBlcyB3aGljaCBpcyBiZWluZyB1c2VkCiAgICAjIGZvciB0aGUgdGltZWxpbmUgdmlldyBhbmQgaXRzIGV2ZW50IHR5cGUgZmlsdGVyCiAgICAkU2VsZi0+e0hpc3RvcnlUeXBlTWFwcGluZ30gPSB7CiAgICAgICAgVGlja2V0TGlua0RlbGV0ZSAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0xpbmsgRGVsZXRlZCcpLAogICAgICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUaWNrZXQgTG9ja2VkJyksCiAgICAgICAgU2V0UGVuZGluZ1RpbWUgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1BlbmRpbmcgVGltZSBTZXQnKSwKICAgICAgICBUaWNrZXREeW5hbWljRmllbGRVcGRhdGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnRHluYW1pYyBGaWVsZCBVcGRhdGVkJyksCiAgICAgICAgRW1haWxBZ2VudEludGVybmFsICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ091dGdvaW5nIEVtYWlsIChpbnRlcm5hbCknKSwKICAgICAgICBOZXdUaWNrZXQgICAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnVGlja2V0IENyZWF0ZWQnKSwKICAgICAgICBUeXBlVXBkYXRlICAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnVHlwZSBVcGRhdGVkJyksCiAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVTdGFydCAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VzY2FsYXRpb24gVXBkYXRlIFRpbWUgSW4gRWZmZWN0JyksCiAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVTdG9wICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VzY2FsYXRpb24gVXBkYXRlIFRpbWUgU3RvcHBlZCcpLAogICAgICAgIEVzY2FsYXRpb25GaXJzdFJlc3BvbnNlVGltZVN0b3AgPT4gVHJhbnNsYXRhYmxlKCdFc2NhbGF0aW9uIEZpcnN0IFJlc3BvbnNlIFRpbWUgU3RvcHBlZCcpLAogICAgICAgIEN1c3RvbWVyVXBkYXRlICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciBVcGRhdGVkJyksCiAgICAgICAgQ2hhdEludGVybmFsICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0ludGVybmFsIENoYXQnKSwKICAgICAgICBTZW5kQXV0b0ZvbGxvd1VwICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQXV0b21hdGljIEZvbGxvdy1VcCBTZW50JyksCiAgICAgICAgQWRkTm90ZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05vdGUgQWRkZWQnKSwKICAgICAgICBBZGROb3RlQ3VzdG9tZXIgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTm90ZSBBZGRlZCAoQ3VzdG9tZXIpJyksCiAgICAgICAgU3RhdGVVcGRhdGUgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1N0YXRlIFVwZGF0ZWQnKSwKICAgICAgICBTZW5kQW5zd2VyICAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnT3V0Z29pbmcgQW5zd2VyJyksCiAgICAgICAgU2VydmljZVVwZGF0ZSAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1NlcnZpY2UgVXBkYXRlZCcpLAogICAgICAgIFRpY2tldExpbmtBZGQgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdMaW5rIEFkZGVkJyksCiAgICAgICAgRW1haWxDdXN0b21lciAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0luY29taW5nIEN1c3RvbWVyIEVtYWlsJyksCiAgICAgICAgV2ViUmVxdWVzdEN1c3RvbWVyICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0luY29taW5nIFdlYiBSZXF1ZXN0JyksCiAgICAgICAgUHJpb3JpdHlVcGRhdGUgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1ByaW9yaXR5IFVwZGF0ZWQnKSwKICAgICAgICBVbmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnVGlja2V0IFVubG9ja2VkJyksCiAgICAgICAgRW1haWxBZ2VudCAgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ091dGdvaW5nIEVtYWlsJyksCiAgICAgICAgVGl0bGVVcGRhdGUgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1RpdGxlIFVwZGF0ZWQnKSwKICAgICAgICBPd25lclVwZGF0ZSAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTmV3IE93bmVyJyksCiAgICAgICAgTWVyZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1RpY2tldCBNZXJnZWQnKSwKICAgICAgICBQaG9uZUNhbGxBZ2VudCAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnT3V0Z29pbmcgUGhvbmUgQ2FsbCcpLAogICAgICAgIEZvcndhcmQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdGb3J3YXJkZWQgTWVzc2FnZScpLAogICAgICAgIFVuc3Vic2NyaWJlICAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZW1vdmVkIFVzZXIgU3Vic2NyaXB0aW9uJyksCiAgICAgICAgVGltZUFjY291bnRpbmcgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1RpbWUgQWNjb3VudGVkJyksCiAgICAgICAgUGhvbmVDYWxsQ3VzdG9tZXIgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0luY29taW5nIFBob25lIENhbGwnKSwKICAgICAgICBTeXN0ZW1SZXF1ZXN0ICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIFJlcXVlc3QuJyksCiAgICAgICAgRm9sbG93VXAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0luY29taW5nIEZvbGxvdy1VcCcpLAogICAgICAgIFNlbmRBdXRvUmVwbHkgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBdXRvbWF0aWMgUmVwbHkgU2VudCcpLAogICAgICAgIFNlbmRBdXRvUmVqZWN0ICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBdXRvbWF0aWMgUmVqZWN0IFNlbnQnKSwKICAgICAgICBSZXNwb25zaWJsZVVwZGF0ZSAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTmV3IFJlc3BvbnNpYmxlJyksCiAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0YXJ0ICAgICA9PiBUcmFuc2xhdGFibGUoJ0VzY2FsYXRpb24gU29sdXRpb24gVGltZSBJbiBFZmZlY3QnKSwKICAgICAgICBFc2NhbGF0aW9uU29sdXRpb25UaW1lU3RvcCAgICAgID0+IFRyYW5zbGF0YWJsZSgnRXNjYWxhdGlvbiBTb2x1dGlvbiBUaW1lIFN0b3BwZWQnKSwKICAgICAgICBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lU3RhcnQgICAgID0+IFRyYW5zbGF0YWJsZSgnRXNjYWxhdGlvbiBSZXNwb25zZSBUaW1lIEluIEVmZmVjdCcpLAogICAgICAgIEVzY2FsYXRpb25SZXNwb25zZVRpbWVTdG9wICAgICAgPT4gVHJhbnNsYXRhYmxlKCdFc2NhbGF0aW9uIFJlc3BvbnNlIFRpbWUgU3RvcHBlZCcpLAogICAgICAgIFNMQVVwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdTTEEgVXBkYXRlZCcpLAogICAgICAgIE1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdRdWV1ZSBVcGRhdGVkJyksCiAgICAgICAgQ2hhdEV4dGVybmFsICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0V4dGVybmFsIENoYXQnKSwKICAgICAgICBNb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUXVldWUgQ2hhbmdlZCcpLAogICAgICAgIFNlbmRBZ2VudE5vdGlmaWNhdGlvbiAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gV2FzIFNlbnQnKSwKICAgIH07CgogICAgIyBBZGQgY3VzdG9tIGZpbGVzIHRvIHRoZSB6b29tJ3MgZnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBvbiB0aGUgZmx5CiAgICAjICAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1vZHVsZXMuCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpbWVsaW5lVmlld0VuYWJsZWQnKQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGltZWxpbmVWaWV3RW5hYmxlZCcpID09IDEKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFpvb21Gcm9udGVuZENvbmZpZ3VyYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Wm9vbX07CiAgICAgICAgbXkgQEN1c3RvbUpTRmlsZXMgICAgICAgICAgICAgPSAoCiAgICAgICAgICAgICdDb3JlLkFnZW50LlRpY2tldFpvb20uVGltZWxpbmVWaWV3LmpzJywKICAgICAgICApOwogICAgICAgIHB1c2goIEB7ICRab29tRnJvbnRlbmRDb25maWd1cmF0aW9uLT57TG9hZGVyfS0+e0phdmFTY3JpcHR9IHx8IFtdIH0sIEBDdXN0b21KU0ZpbGVzICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAnV2UgYXJlIHNvcnJ5LCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbnMgYW55bW9yZSB0byBhY2Nlc3MgdGhpcyB0aWNrZXQgaW4gaXRzIGN1cnJlbnQgc3RhdGUuJwogICAgICAgICksCiAgICAgICAgV2l0aEhlYWRlciA9PiAkU2VsZi0+e1N1YmFjdGlvbn0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcnRpY2xlVXBkYXRlJyA/ICdubycgOiAneWVzJywKICAgICkgaWYgISRBY2Nlc3M7CgogICAgIyBnZXQgdGlja2V0IGF0dHJpYnV0ZXMKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgYWxsIHJlZ2lzdGVyZWQgQWN0aW9ucwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlQWN0aW9ucyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXRzIHdpdGggQWdlbnQKICAgICAgICAlUG9zc2libGVBY3Rpb25zID0gbWFwIHsgKyskQ291bnRlciA9PiAkXyB9CiAgICAgICAgICAgIGdyZXAgeyBzdWJzdHIoICRfLCAwLCBsZW5ndGggJ0FnZW50JyApIGVxICdBZ2VudCcgfQogICAgICAgICAgICBzb3J0IGtleXMgJUFjdGlvbnM7CiAgICB9CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CiAgICB9CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgbWFyayBzaG93biB0aWNrZXQgYXMgc2VlbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RpY2tldE1hcmtBc1NlZW4nICkgewogICAgICAgIG15ICRTdWNjZXNzID0gMTsKCiAgICAgICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgICAgICBpZiAoICRUaWNrZXR7QXJjaGl2ZUZsYWd9IG5lICd5JyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+X1RpY2tldEl0ZW1TZWVuKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTWFya0FzSW1wb3J0YW50JyApIHsKCiAgICAgICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e1VzZXJJRH0gPT0gJFRpY2tldHtPd25lcklEfQogICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7UmVzcG9uc2libGVJRH0KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBBbHdheXMgdXNlIHVzZXIgaWQgMSBiZWNhdXNlIG90aGVyIHVzZXJzIGFsc28gaGF2ZSB0byBzZWUgdGhlIGltcG9ydGFudCBmbGFnCiAgICAgICAgICAgIG15ICVBcnRpY2xlRmxhZyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEFydGljbGVJc0ltcG9ydGFudCA9ICRBcnRpY2xlRmxhZ3tJbXBvcnRhbnR9OwogICAgICAgICAgICBpZiAoJEFydGljbGVJc0ltcG9ydGFudCkgewoKICAgICAgICAgICAgICAgICMgQWx3YXlzIHVzZSB1c2VyIGlkIDEgYmVjYXVzZSBvdGhlciB1c2VycyBhbHNvIGhhdmUgdG8gc2VlIHRoZSBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+QXJ0aWNsZUZsYWdEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0ltcG9ydGFudCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgQWx3YXlzIHVzZSB1c2VyIGlkIDEgYmVjYXVzZSBvdGhlciB1c2VycyBhbHNvIGhhdmUgdG8gc2VlIHRoZSBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+QXJ0aWNsZUZsYWdTZXQoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0ltcG9ydGFudCcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRTZWxmLT57VGlja2V0SUR9O0FydGljbGVJRD0kU2VsZi0+e0FydGljbGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBtYXJrIHNob3duIGFydGljbGUgYXMgc2VlbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ01hcmtBc1NlZW4nICkgewogICAgICAgIG15ICRTdWNjZXNzID0gMTsKCiAgICAgICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgICAgICBpZiAoICRUaWNrZXR7QXJjaGl2ZUZsYWd9IG5lICd5JyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+X0FydGljbGVJdGVtU2VlbiggQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgdXBkYXRlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXJ0aWNsZVVwZGF0ZScgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ291bnQnICk7CiAgICAgICAgbXkgJUFydGljbGUgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Q291bnR9ID0gJENvdW50OwoKICAgICAgICAjIGdldCBhdHRhY2htZW50IGluZGV4ICh3aXRob3V0IGF0dGFjaG1lbnRzKQogICAgICAgIG15ICVBdG1JbmRleCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gJFNlbGYtPntTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudH0sCiAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgICAgICAgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7QXRtc30gPSBcJUF0bUluZGV4OwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICAgICAgICAgVmFsaWQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5fQXJ0aWNsZUl0ZW0oCiAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICBBcnRpY2xlICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgIEFjbEFjdGlvbiAgICAgICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlcyA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSwKICAgICAgICAgICAgU3RhbmRhcmRGb3J3YXJkcyAgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0ZvcndhcmR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnT25Mb2FkJywKICAgICAgICApOwogICAgICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVUaWNrZXQsICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQ29udGVudCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDYW5cJ3QgZ2V0IGZvciBBcnRpY2xlSUQgJXMhJywgJFNlbGYtPntBcnRpY2xlSUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRVc2VyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgIyB3cml0ZSBhcnRpY2xlIGZpbHRlciBzZXR0aW5ncyB0byBzZXNzaW9uCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXJ0aWNsZUZpbHRlclNldCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICAgICAgbXkgJFNhdmVEZWZhdWx0cyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTYXZlRGVmYXVsdHMnICk7CiAgICAgICAgbXkgQEFydGljbGVUeXBlRmlsdGVySURzICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0FydGljbGVUeXBlRmlsdGVyJyApOwogICAgICAgIG15IEBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcklEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcicgKTsKCiAgICAgICAgIyBidWlsZCBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRTZXNzaW9uU3RyaW5nID0gJyc7CiAgICAgICAgaWYgKEBBcnRpY2xlVHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnQXJ0aWNsZVR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBBcnRpY2xlVHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KICAgICAgICBpZiAoQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcjwnOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSBqb2luICcsJywgQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnPic7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIHRoZSBzZXNzaW9uCgogICAgICAgICMgc2F2ZSBkZWZhdWx0IGZpbHRlciBzZXR0aW5ncyB0byB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCRTYXZlRGVmYXVsdHMpIHsKICAgICAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnQXJ0aWNsZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXJ0aWNsZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0dXJuIG9mZiBmaWx0ZXIgZXhwbGljaXRseSBmb3IgdGhpcyB0aWNrZXQKICAgICAgICBpZiAoICRTZXNzaW9uU3RyaW5nIGVxICcnICkgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyA9ICdvZmYnOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHNlc3Npb24KICAgICAgICBteSAkVXBkYXRlID0gJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICJBcnRpY2xlRmlsdGVyJFRpY2tldElEIiwKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICcnOwogICAgICAgIGlmICgkVXBkYXRlKSB7CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBcnRpY2xlIGZpbHRlciBzZXR0aW5ncyB3ZXJlIHNhdmVkLicpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgd3JpdGUgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgdG8gc2Vzc2lvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V2ZW5UeXBlRmlsdGVyU2V0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKICAgICAgICBteSAkU2F2ZURlZmF1bHRzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVEZWZhdWx0cycgKTsKICAgICAgICBteSBARXZlbnRUeXBlRmlsdGVySURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0V2ZW50VHlwZUZpbHRlcicgKTsKCiAgICAgICAgIyBidWlsZCBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRTZXNzaW9uU3RyaW5nID0gJyc7CiAgICAgICAgaWYgKEBFdmVudFR5cGVGaWx0ZXJJRHMpIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJ0V2ZW50VHlwZUZpbHRlcjwnOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSBqb2luICcsJywgQEV2ZW50VHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSB0aGUgc2Vzc2lvbgoKICAgICAgICAjIHNhdmUgZGVmYXVsdCBmaWx0ZXIgc2V0dGluZ3MgdG8gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICgkU2F2ZURlZmF1bHRzKSB7CiAgICAgICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ0V2ZW50VHlwZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnRXZlbnRUeXBlRmlsdGVyRGVmYXVsdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGZpbHRlciBleHBsaWNpdGx5IGZvciB0aGlzIHRpY2tldAogICAgICAgIGlmICggJFNlc3Npb25TdHJpbmcgZXEgJycgKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nID0gJ29mZic7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc2Vzc2lvbgogICAgICAgIG15ICRVcGRhdGUgPSAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gIkV2ZW50VHlwZUZpbHRlciRUaWNrZXRJRCIsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT04gPSAnJzsKICAgICAgICBpZiAoJFVwZGF0ZSkgewogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRXZlbnQgdHlwZSBmaWx0ZXIgc2V0dGluZ3Mgd2VyZSBzYXZlZC4nKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgZnJvbSBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57ICdBcnRpY2xlRmlsdGVyJyAuICRTZWxmLT57VGlja2V0SUR9IH07CgogICAgICAgICMgc2V0IGFydGljbGUgZmlsdGVyIGZvciB0aGlzIHRpY2tldCBmcm9tIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICEkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57QXJ0aWNsZUZpbHRlckRlZmF1bHR9OwogICAgICAgIH0KCiAgICAgICAgIyBkbyBub3QgdXNlIGRlZmF1bHRzIGZvciB0aGlzIHRpY2tldCBpZiBmaWx0ZXIgd2FzIGV4cGxpY2l0bHkgdHVybmVkIG9mZgogICAgICAgIGVsc2lmICggJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nIGVxICdvZmYnICkgewogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0gPSBcQElEczsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlU2VuZGVyVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVNlbmRlclR5cGVJRH0gPSBcQElEczsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGV2ZW50IHR5cGUgZmlsdGVyIHNldHRpbmdzIGZyb20gc2Vzc2lvbiBzdHJpbmcKICAgICAgICBteSAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57ICdFdmVudFR5cGVGaWx0ZXInIC4gJFNlbGYtPntUaWNrZXRJRH0gfTsKCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmaWx0ZXIgZm9yIHRoaXMgdGlja2V0IGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRFdmVudFR5cGVGaWx0ZXJTZXNzaW9uU3RyaW5nICkgewogICAgICAgICAgICAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGVmYXVsdHMgZm9yIHRoaXMgdGlja2V0IGlmIGZpbHRlciB3YXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmCiAgICAgICAgZWxzaWYgKCAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyBlcSAnb2ZmJyApIHsKICAgICAgICAgICAgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcKICAgICAgICAgICAgJiYgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcgPX4gbXsgRXZlbnRUeXBlRmlsdGVyIDwgKCBbXjw+XSsgKSA+IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC8sLywgJDE7CiAgICAgICAgICAgICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfS0+e0V2ZW50VHlwZUlEfSA9IFxASURzOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBpZiBIVE1MIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIEFydGljbGVJRAogICAgICAgIGlmICggISRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZCBBcnRpY2xlSUQhJykgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFydGljbGUgZGF0YQogICAgICAgIG15ICVBcnRpY2xlID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgZGF0YSBleGlzdHMKICAgICAgICBpZiAoICElQXJ0aWNsZSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBBcnRpY2xlSUQhJykgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgaXQgaXMgYSBodG1sIGVtYWlsLCByZXR1cm4gaGVyZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpCiAgICAgICAgICAgICAgICAuICItJEFydGljbGV7VGlja2V0TnVtYmVyfS0kQXJ0aWNsZXtUaWNrZXRJRH0tJEFydGljbGV7QXJ0aWNsZUlEfSIsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiJEFydGljbGV7TWltZVR5cGV9OyBjaGFyc2V0PSRBcnRpY2xle0NoYXJzZXR9IiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5NYXNrQWdlbnRab29tKAogICAgICAgIFRpY2tldCAgICA9PiBcJVRpY2tldCwKICAgICAgICBBY2xBY3Rpb24gPT4gXCVBY2xBY3Rpb24KICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBNYXNrQWdlbnRab29tIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlQWNsQWN0aW9uID0gJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZWxzZSBzaG93IG5vcm1hbCB0aWNrZXQgem9vbSB2aWV3CiAgICAjIGZldGNoIGFsbCBtb3ZlIHF1ZXVlcwogICAgbXkgJU1vdmVRdWV1ZXMgPSAkVGlja2V0T2JqZWN0LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIG93bmVyIGluZm8KICAgIG15ICVPd25lckluZm8gPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRUaWNrZXR7T3duZXJJRH0sCiAgICApOwoKICAgICMgcmVzcG9uc2libGUgaW5mbwogICAgbXkgJVJlc3BvbnNpYmxlSW5mbyA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSB8fCAxLAogICAgKTsKCiAgICAjIGdldCBjb2ZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2VuZXJhdGUgc2hvd24gYXJ0aWNsZXMKICAgIG15ICRMaW1pdCA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWF4QXJ0aWNsZXNQZXJQYWdlJyk7CgogICAgbXkgJE9yZGVyID0gJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnID8gJ0RFU0MnIDogJ0FTQyc7CiAgICBteSAkUGFnZTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBhcnRpY2xlIHBhZ2UKICAgIG15ICRBcnRpY2xlUGFnZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlUGFnZScgKTsKCiAgICAjIEdldCBhbGwgYXJ0aWNsZXMuCiAgICBteSBAQXJ0aWNsZUNvbnRlbnRBcmdzQWxsID0gKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+ICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBPcmRlciAgICAgICAgICAgICAgICAgICAgICA9PiAkT3JkZXIsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAjIGZldGNoIGxhdGVyIG9ubHkgZm9yIHRoZSBhcnRpY2xlKHMpIHRvIGRpc3BsYXkKICAgICk7CiAgICBteSBAQXJ0aWNsZUJveEFsbCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDb250ZW50SW5kZXgoQEFydGljbGVDb250ZW50QXJnc0FsbCk7CgogICAgbXkgJUFydGljbGVGbGFncyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGbGFnc09mVGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAkQXJ0aWNsZUlEOwoKICAgIGlmICggJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICRQYWdlID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZVBhZ2UoCiAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJvd3NQZXJQYWdlID0+ICRMaW1pdCwKICAgICAgICAgICAgT3JkZXIgICAgICAgPT4gJE9yZGVyLAogICAgICAgICAgICAleyAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkQXJ0aWNsZVBhZ2UpIHsKICAgICAgICAkUGFnZSA9ICRBcnRpY2xlUGFnZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEZpbmQgbGF0ZXN0IG5vdCBzZWVuIGFydGljbGUuCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94QWxsKSB7CgogICAgICAgICAgICAjIElnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlLT57U2VuZGVyVHlwZX0gZXEgJ3N5c3RlbScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBUlRJQ0xFOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEFSVElDTEUgaWYgJEFydGljbGVGbGFnc3sgJEFydGljbGUtPntBcnRpY2xlSUR9IH0tPntTZWVufTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgICAgICRQYWdlID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZVBhZ2UoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBSb3dzUGVyUGFnZSA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICBPcmRlciAgICAgICA9PiAkT3JkZXIsCiAgICAgICAgICAgICAgICAleyAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9IC8vIHt9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGxhc3QgQVJUSUNMRTsKICAgICAgICB9CgogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICRQYWdlID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBXZSBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgcGFnaW5hdGlvbiBpcyBhY3R1YWxseSBuZWNlc3NhcnkuCiAgICAjIFRoZSBlYXNpZXN0IHdheSB3b3VsZCBiZSBjb3VudCB0aGUgYXJ0aWNsZXMsIGJ1dCB0aGF0IHdvdWxkIHNsb3cKICAgICMgZG93biB0aGUgbW9zdCBjb21tb24gY2FzZSAoZmV3ZXIgYXJ0aWNsZXMgdGhhbiAkTGltaXQgaW4gdGhlIHRpY2tldCkuCiAgICAjIFNvIGluc3RlYWQgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2s6CiAgICAjIDEpIGlmIHRoZSAkUGFnZSA+IDEsIHdlIG5lZWQgcGFnaW5hdGlvbgogICAgIyAyKSBpZiBub3QsIHJlcXVlc3QgJExpbWl0ICsgMSBhcnRpY2xlcy4gSWYgJExpbWl0ICsgMSBhcmUgYWN0dWFsbHkKICAgICMgICAgcmV0dXJuZWQsIHBhZ2luYXRpb24gaXMgbmVjZXNzYXJ5CiAgICBteSAkRXh0cmEgPSAkUGFnZSA+IDEgPyAwIDogMTsKICAgIG15ICROZWVkUGFnaW5hdGlvbjsKICAgIG15ICRBcnRpY2xlQ291bnQ7CgogICAgbXkgQEFydGljbGVDb250ZW50QXJncyA9ICgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgPT4gJExpbWl0ICsgJEV4dHJhLAogICAgICAgIE9yZGVyICAgICAgICAgICAgICAgICAgICAgID0+ICRPcmRlciwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsICAgICMgZmV0Y2ggbGF0ZXIgb25seSBmb3IgdGhlIGFydGljbGUocykgdG8gZGlzcGxheQogICAgICAgICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gLy8ge30gfSwgICAgIyBsaW1pdCBieSBBcnRpY2xlU2VuZGVyVHlwZUlEL0FydGljbGVUeXBlSUQKCiAgICApOwoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15IEBBcnRpY2xlQm94ID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNvbnRlbnRJbmRleCgKICAgICAgICBAQXJ0aWNsZUNvbnRlbnRBcmdzLAogICAgICAgIFBhZ2UgPT4gJFBhZ2UsCiAgICApOwoKICAgIGlmICggIUBBcnRpY2xlQm94ICYmICRQYWdlID4gMSApIHsKCiAgICAgICAgIyBpZiB0aGUgcGFnZSBhcmd1bWVudCBpcyBwYXN0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBhZ2VzLAogICAgICAgICMgYXNzdW1lIHBhZ2UgMSBpbnN0ZWFkLgogICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBuZXcgYXJ0aWNsZSBmaWx0ZXIgd2FzIGFkZGVkLgogICAgICAgICRQYWdlICAgICAgID0gMTsKICAgICAgICBAQXJ0aWNsZUJveCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgICAgIEBBcnRpY2xlQ29udGVudEFyZ3MsCiAgICAgICAgICAgIFBhZ2UgPT4gJFBhZ2UsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZUNvdW50ID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNvdW50KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICAgICAgJE5lZWRQYWdpbmF0aW9uID0gJEFydGljbGVDb3VudCA+ICRMaW1pdDsKICAgIH0KICAgIGVsc2lmICggQEFydGljbGVCb3ggPiAkTGltaXQgKSB7CiAgICAgICAgcG9wIEBBcnRpY2xlQm94OwogICAgICAgICROZWVkUGFnaW5hdGlvbiA9IDE7CiAgICAgICAgJEFydGljbGVDb3VudCAgID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNvdW50KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYWdlID09IDEgKSB7CiAgICAgICAgJEFydGljbGVDb3VudCAgID0gQEFydGljbGVCb3g7CiAgICAgICAgJE5lZWRQYWdpbmF0aW9uID0gMDsKICAgIH0KICAgIGVsc2UgewogICAgICAgICROZWVkUGFnaW5hdGlvbiA9IDE7CiAgICAgICAgJEFydGljbGVDb3VudCAgID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNvdW50KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICB9CgogICAgJFBhZ2UgfHw9IDE7CgogICAgbXkgJFBhZ2VzOwogICAgaWYgKCROZWVkUGFnaW5hdGlvbikgewogICAgICAgICRQYWdlcyA9IGNlaWwoICRBcnRpY2xlQ291bnQgLyAkTGltaXQgKTsKICAgIH0KCiAgICBteSAkQ291bnQ7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgJENvdW50ID0gc2NhbGFyIEBBcnRpY2xlQm94ICsgMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDb3VudCA9IDA7CiAgICB9CgogICAgaWYgKCBzY2FsYXIgQEFydGljbGVCb3ggIT0gc2NhbGFyIEBBcnRpY2xlQm94QWxsICkgewoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgICAgICRDb3VudCA9IHNjYWxhciBAQXJ0aWNsZUJveEFsbCArIDE7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94QWxsKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpIGVxICdyZXZlcnNlJyApIHsKICAgICAgICAgICAgICAgICRDb3VudC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFydGljbGUtPntDb3VudH0gPSAkQ291bnQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlSURGb3VuZCA9IDA7CiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewoKICAgICAgICBpZiAoIHNjYWxhciBAQXJ0aWNsZUJveCAhPSBzY2FsYXIgQEFydGljbGVCb3hBbGwgKSB7CiAgICAgICAgICAgIG15IEBBcnRpY2xlT25QYWdlID0gZ3JlcCB7ICRfLT57QXJ0aWNsZUlEfSA9fiAkQXJ0aWNsZS0+e0FydGljbGVJRH0gfSBAQXJ0aWNsZUJveEFsbDsKICAgICAgICAgICAgJEFydGljbGUtPntDb3VudH0gPSAkQXJ0aWNsZU9uUGFnZVswXS0+e0NvdW50fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpIGVxICdyZXZlcnNlJyApIHsKICAgICAgICAgICAgICAgICRDb3VudC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFydGljbGUtPntDb3VudH0gPSAkQ291bnQ7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRTZWxmLT57QXJ0aWNsZUlEfTsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgJFNlbGYtPntBcnRpY2xlSUR9IG5lICRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgJEFydGljbGVJREZvdW5kID0gMTsKICAgIH0KCiAgICAjIGdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIGlmICgkQXJ0aWNsZUlERm91bmQpIHsKICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntBcnRpY2xlSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZmlyc3QgbGlzdGVkIGFydGljbGUgYXMgZmFsbGJhY2sKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJveFswXS0+e0FydGljbGVJRH07CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlIGFzIHNlbGVjdGVkIGFydGljbGUgcmVwbGFjaW5nIGxhc3Qgc2V0CiAgICAgICAgICAgICAgICBBUlRJQ0xFVE1QOgogICAgICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVUbXAtPntTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGVUbXAtPntBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVUTVAgaWYgJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4cGFuZCB2aWV3IGlzIHVzYWJsZSAob25seSBmb3IgbGVzcyB0aGVuIDQwMCBhcnRpY2xlKQogICAgIyBpZiB5b3UgaGF2ZSBtb3JlIGFydGljbGVzIGlzIGdvaW5nIHRvIGJlIHNsb3cgYW5kIG5vdCB1c2FibGUKICAgIG15ICRBcnRpY2xlTWF4TGltaXQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1heEFydGljbGVzWm9vbUV4cGFuZCcpCiAgICAgICAgLy8gNDAwOwogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICQjQXJ0aWNsZUJveCA+ICRBcnRpY2xlTWF4TGltaXQgKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9IDA7CiAgICB9CgogICAgIyBnZXQgc2hvd24gYXJ0aWNsZShzKQogICAgbXkgQEFydGljbGVCb3hTaG93bjsKICAgIGlmICggISRTZWxmLT57Wm9vbUV4cGFuZH0gKSB7CiAgICAgICAgQVJUSUNMRUJPWDoKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGVJRCBlcSAkQXJ0aWNsZVRtcC0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcnRpY2xlQm94U2hvd24sICRBcnRpY2xlVG1wOwogICAgICAgICAgICAgICAgbGFzdCBBUlRJQ0xFQk9YOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgQEFydGljbGVCb3hTaG93biA9IEBBcnRpY2xlQm94OwogICAgfQoKICAgICMgc2V0IGRpc3BsYXkgb3B0aW9ucwogICAgJFBhcmFte1dpZGdldFRpdGxlfSA9ICdUaWNrZXQgSW5mb3JtYXRpb24nOwogICAgJFBhcmFte0hvb2t9ICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgICMgY2hlY2sgaWYgdGlja2V0IGlzIG5vcm1hbCBvciBwcm9jZXNzIHRpY2tldAogICAgbXkgJElzUHJvY2Vzc1RpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENoZWNrRm9yUHJvY2Vzc1R5cGUoCiAgICAgICAgJ1RpY2tldElEJyA9PiAkU2VsZi0+e1RpY2tldElEfQogICAgKTsKCiAgICAjIG92ZXJ3cml0ZSBkaXNwbGF5IG9wdGlvbnMgZm9yIHByb2Nlc3MgdGlja2V0CiAgICBpZiAoJElzUHJvY2Vzc1RpY2tldCkgewogICAgICAgICRQYXJhbXtXaWRnZXRUaXRsZX0gPSAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzRGlzcGxheX0tPntXaWRnZXRUaXRsZX07CiAgICB9CgogICAgIyBvbmx5IHNob3cgYXJ0aWNsZSB0cmVlIGlmIGFydGljbGVzIGFyZSBwcmVzZW50LAogICAgIyBvciBpZiBhIGZpbHRlciBpcyBzZXQgKHNvIHRoYXQgdGhlIHVzZXIgaGFzIHRoZSBvcHRpb24gdG8KICAgICMgZGlzYWJsZSB0aGUgZmlsdGVyKQogICAgaWYgKCBAQXJ0aWNsZUJveCB8fCAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICkgewoKICAgICAgICBteSAkUGFnaW5hdGlvbjsKCiAgICAgICAgaWYgKCROZWVkUGFnaW5hdGlvbikgewogICAgICAgICAgICAkUGFnaW5hdGlvbiA9IHsKICAgICAgICAgICAgICAgIFBhZ2VzICAgICAgID0+ICRQYWdlcywKICAgICAgICAgICAgICAgIEN1cnJlbnRQYWdlID0+ICRQYWdlLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSB0cmVlCiAgICAgICAgJFBhcmFte0FydGljbGVUcmVlfSA9ICRTZWxmLT5fQXJ0aWNsZVRyZWUoCiAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICBBcnRpY2xlRmxhZ3MgICAgICA9PiBcJUFydGljbGVGbGFncywKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgQXJ0aWNsZU1heExpbWl0ICAgPT4gJEFydGljbGVNYXhMaW1pdCwKICAgICAgICAgICAgQXJ0aWNsZUJveCAgICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICBQYWdpbmF0aW9uICAgICAgICA9PiAkUGFnaW5hdGlvbiwKICAgICAgICAgICAgUGFnZSAgICAgICAgICAgICAgPT4gJFBhZ2UsCiAgICAgICAgICAgIEFydGljbGVDb3VudCAgICAgID0+IHNjYWxhciBAQXJ0aWNsZUJveCwKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9LAogICAgICAgICAgICBTdGFuZGFyZEZvcndhcmRzICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7Rm9yd2FyZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2hvdyBhcnRpY2xlcyBpdGVtcwogICAgaWYgKCAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAkUGFyYW17QXJ0aWNsZUl0ZW1zfSA9ICcnOwogICAgICAgIEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveFNob3duKSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAgICAgJFNlbGYtPl9BcnRpY2xlSXRlbSgKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlcyA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSwKICAgICAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tGb3J3YXJkfSwKICAgICAgICAgICAgICAgIEFjdHVhbEFydGljbGVJRCAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnU3RhdGljJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVJdGVtc30gLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZH0gJiYgJFRpY2tldHtBcmNoaXZlRmxhZ30gbmUgJ3knICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRJdGVtTWFya0FzU2VlbicsCiAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZ2UgZGVzaWduCiAgICAkVGlja2V0e0FnZX0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0FnZX0sCiAgICAgICAgU3BhY2UgPT4gJyAnCiAgICApOwoKICAgICMgbnVtYmVyIG9mIGFydGljbGVzCiAgICAkUGFyYW17QXJ0aWNsZUNvdW50fSA9IHNjYWxhciBAQXJ0aWNsZUJveDsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpVc2VBcnRpY2xlQ29sb3JzJykgKSB7CiAgICAgICAgJFBhcmFte1VzZUFydGljbGVDb2xvcnN9ID0gMTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBydW4gdGlja2V0IG1lbnUgbW9kdWxlcwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZScpIH07CiAgICAgICAgbXkgJU1lbnVDbHVzdGVyczsKICAgICAgICBteSAlWm9vbU1lbnVJdGVtczsKCiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICJBc1BvcHVwIFBvcHVwVHlwZV8kTWVudXN7JE1lbnV9LT57UG9wdXBUeXBlfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRNZW51c3skTWVudX0tPntDbHVzdGVyTmFtZX0gKSB7CgogICAgICAgICAgICAgICAgJFpvb21NZW51SXRlbXN7JE1lbnV9ID0gJEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgY29uZmlndXJlZCBwcmlvcml0eSBmb3IgdGhpcyBpdGVtLiBUaGUgbG93ZXN0IENsdXN0ZXJQcmlvcml0eQogICAgICAgICAgICAgICAgIyB3aXRoaW4gdGhlIHNhbWUgY2x1c3RlciB3aW5zLgogICAgICAgICAgICAgICAgbXkgJFByaW9yaXR5ID0gJE1lbnVDbHVzdGVyc3sgJE1lbnVzeyRNZW51fS0+e0NsdXN0ZXJOYW1lfSB9LT57UHJpb3JpdHl9IHx8IDA7CiAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57Q2x1c3RlclByaW9yaXR5fSB8fD0gMDsKICAgICAgICAgICAgICAgIGlmICggISRQcmlvcml0eSB8fCAkUHJpb3JpdHkgIX4gL15cZHszfSQvIHx8ICRQcmlvcml0eSA+ICRNZW51c3skTWVudX0tPntDbHVzdGVyUHJpb3JpdHl9ICkgewogICAgICAgICAgICAgICAgICAgICRQcmlvcml0eSA9ICRNZW51c3skTWVudX0tPntDbHVzdGVyUHJpb3JpdHl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJE1lbnVDbHVzdGVyc3sgJE1lbnVzeyRNZW51fS0+e0NsdXN0ZXJOYW1lfSB9LT57UHJpb3JpdHl9ID0gJFByaW9yaXR5OwogICAgICAgICAgICAgICAgJE1lbnVDbHVzdGVyc3sgJE1lbnVzeyRNZW51fS0+e0NsdXN0ZXJOYW1lfSB9LT57SXRlbXN9LT57JE1lbnV9ID0gJEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciBteSAkQ2x1c3RlciAoIHNvcnQga2V5cyAlTWVudUNsdXN0ZXJzICkgewogICAgICAgICAgICAkWm9vbU1lbnVJdGVtc3sgJE1lbnVDbHVzdGVyc3skQ2x1c3Rlcn0tPntQcmlvcml0eX0gLiAkQ2x1c3RlciB9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJENsdXN0ZXIsCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnQ2x1c3RlcicsCiAgICAgICAgICAgICAgICBMaW5rICA9PiAnIycsCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnQ2x1c3RlckxpbmsnLAogICAgICAgICAgICAgICAgSXRlbXMgPT4gJE1lbnVDbHVzdGVyc3skQ2x1c3Rlcn0tPntJdGVtc30sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgYWxsIGl0ZW1zCiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVab29tTWVudUl0ZW1zICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRNZW51JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJFpvb21NZW51SXRlbXN7JEl0ZW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkWm9vbU1lbnVJdGVtc3skSXRlbX0tPntUeXBlfSBlcSAnQ2x1c3RlcicgKSB7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0TWVudVN1YkNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFpvb21NZW51SXRlbXN7JEl0ZW19LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRTdWJJdGVtICggc29ydCBrZXlzICV7ICRab29tTWVudUl0ZW1zeyRJdGVtfS0+e0l0ZW1zfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRNZW51U3ViQ29udGFpbmVySXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFpvb21NZW51SXRlbXN7JEl0ZW19LT57SXRlbXN9LT57JFN1Ykl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgTW92ZVF1ZXVlc1N0cmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNb3ZlVHlwZScpID1+IC9eZm9ybSQvaSApIHsKICAgICAgICAkTW92ZVF1ZXVlc3swfSAgICAgICAgID0gJy0gJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTW92ZScpIC4gJyAtJzsKICAgICAgICAkUGFyYW17TW92ZVF1ZXVlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0UXVldWVJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTW92ZVF1ZXVlcywKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgIEN1cnJlbnRRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldE1vdmV9CiAgICAgICAgJiYgKCAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1RpY2tldElEfSA9ICRUaWNrZXR7VGlja2V0SUR9OwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNb3ZlVHlwZScpID1+IC9eZm9ybSQvaSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmVMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTW92ZUZvcm0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGNyZWF0ZWQgYnkgaWYgZGlmZmVyZW50IHRoZW4gVXNlciBJRCAxCiAgICBpZiAoICRUaWNrZXR7Q3JlYXRlQnl9ID4gMSApIHsKICAgICAgICAkVGlja2V0e0NyZWF0ZWRCeVVzZXJ9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKCBVc2VySUQgPT4gJFRpY2tldHtDcmVhdGVCeX0gKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3JlYXRlZEJ5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVRpY2tldH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRUaWNrZXR7QXJjaGl2ZUZsYWd9IGVxICd5JyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJjaGl2ZUZsYWcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewoKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVHZXQoCiAgICAgICAgICAgIElEID0+ICRUaWNrZXR7VHlwZUlEfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsaWQgPT4gJFR5cGV7VmFsaWRJRH0sCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJUFjbEFjdGlvbgogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgc2VydmljZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRUaWNrZXR7U2VydmljZX0gKSB7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKIyAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiMgICAgICAgICk7CgogICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAxLAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRUaWNrZXR7U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICAgICAgfSwKICAgICAgICApOwojIC0tLQogICAgICAgIGlmICggJFRpY2tldHtTTEF9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZmlyc3QgcmVzcG9uc2UgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICAgICAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHVwZGF0ZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRUaWNrZXR7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7VXBkYXRlVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHNvbHV0aW9uIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJFRpY2tldHtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJFRpY2tldHtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRvdGFsIGFjY291bnRlZCB0aW1lIGlmIGZlYXR1cmUgaXMgYWN0aXZlOgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudGVkVGltZUdldCglVGlja2V0KTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG90YWxBY2NvdW50ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBwZW5kaW5nIHVudGlsLCBpZiBzZXQ6CiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSA8IC0xICkgewogICAgICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbENsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpbWUgb2JqZWN0CiAgICAgICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICAgICAkVGlja2V0e1VudGlsVGltZUh1bWFufSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICRUaWNrZXR7VW50aWxUaW1lfSArICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lKCkgKSwKICAgICAgICApOwogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQZW5kaW5nVW50aWwnLAogICAgICAgICAgICBEYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiBhZ2VudCBoYXMgcGVybWlzc2lvbiB0byBzdGFydCBjaGF0cyB3aXRoIGFnZW50cy4KICAgIG15ICRFbmFibGVDaGF0ICAgICAgICAgICAgICAgPSAxOwogICAgbXkgJENoYXRTdGFydGluZ0FnZW50c0dyb3VwICA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6UGVybWlzc2lvbkdyb3VwOjpDaGF0U3RhcnRpbmdBZ2VudHMnKSB8fCAndXNlcnMnOwogICAgbXkgJENoYXRSZWNlaXZpbmdBZ2VudHNHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6UGVybWlzc2lvbkdyb3VwOjpDaGF0UmVjZWl2aW5nQWdlbnRzJykgfHwgJ3VzZXJzJzsKCiAgICBpZiAoCiAgICAgICAgISRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykKICAgICAgICB8fCAhZGVmaW5lZCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRDaGF0U3RhcnRpbmdBZ2VudHNHcm91cF0ifQogICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJENoYXRTdGFydGluZ0FnZW50c0dyb3VwXSJ9IG5lICdZZXMnCiAgICAgICAgKQogICAgewogICAgICAgICRFbmFibGVDaGF0ID0gMDsKICAgIH0KICAgIGlmICgKICAgICAgICAkRW5hYmxlQ2hhdAogICAgICAgICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkNoYXREaXJlY3Rpb246OkFnZW50VG9BZ2VudCcpCiAgICAgICAgKQogICAgewogICAgICAgICRFbmFibGVDaGF0ID0gMDsKICAgIH0KCiAgICBteSAlT25saW5lRGF0YTsKICAgIGlmICgkRW5hYmxlQ2hhdCkgewogICAgICAgIG15ICRWaWRlb0NoYXRFbmFibGVkICAgICA9IDA7CiAgICAgICAgbXkgJFZpZGVvQ2hhdEFnZW50c0dyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpQZXJtaXNzaW9uR3JvdXA6OlZpZGVvQ2hhdEFnZW50cycpIHx8ICd1c2Vycyc7CgogICAgICAgICMgRW5hYmxlIHRoZSB2aWRlbyBjaGF0IGZlYXR1cmUgaWYgc3lzdGVtIGlzIGVudGl0bGVkIGFuZCBhZ2VudCBpcyBhIG1lbWJlciBvZiBjb25maWd1cmVkIGdyb3VwLgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKQogICAgICAgICAgICAmJiBkZWZpbmVkICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJFZpZGVvQ2hhdEFnZW50c0dyb3VwXSJ9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJFZpZGVvQ2hhdEFnZW50c0dyb3VwXSJ9IGVxICdZZXMnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgJFZpZGVvQ2hhdEVuYWJsZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlkZW9DaGF0JyktPklzRW5hYmxlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPd25lcklEIFJlc3BvbnNpYmxlSUQpKSB7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRUaWNrZXR7JEZpZWxkfTsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ1Jlc3BvbnNpYmxlSUQnICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKTsKCiAgICAgICAgICAgIG15ICRVc2VySUQgPSAkVGlja2V0eyRGaWVsZH07CgogICAgICAgICAgICAkT25saW5lRGF0YXskRmllbGR9LT57RW5hYmxlQ2hhdH0gICAgICAgICA9ICRFbmFibGVDaGF0OwogICAgICAgICAgICAkT25saW5lRGF0YXskRmllbGR9LT57QWdlbnRFbmFibGVDaGF0fSAgICA9IDA7CiAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntDaGF0QWNjZXNzfSAgICAgICAgID0gMDsKICAgICAgICAgICAgJE9ubGluZURhdGF7JEZpZWxkfS0+e1ZpZGVvQ2hhdEF2YWlsYWJsZX0gPSAwOwogICAgICAgICAgICAkT25saW5lRGF0YXskRmllbGR9LT57VmlkZW9DaGF0U3VwcG9ydH0gICA9IDA7CiAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntWaWRlb0NoYXRFbmFibGVkfSAgID0gJFZpZGVvQ2hhdEVuYWJsZWQ7CgogICAgICAgICAgICAjIERlZmF1bHQgc3RhdHVzIGlzIG9mZmxpbmUuCiAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGV9ID0gVHJhbnNsYXRhYmxlKCdPZmZsaW5lJyk7CiAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGVEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdVc2VyIGlzIGN1cnJlbnRseSBvZmZsaW5lLicpOwoKICAgICAgICAgICAgIyBXZSBhbHNvIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHJlY2VpdmluZyBhZ2VudCBoYXMgY2hhdCBwZXJtaXNzaW9ucy4KICAgICAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJVVzZXJHcm91cHNSZXZlcnNlID0gcmV2ZXJzZSAlVXNlckdyb3VwczsKICAgICAgICAgICAgJE9ubGluZURhdGF7JEZpZWxkfS0+e0NoYXRBY2Nlc3N9ID0gJFVzZXJHcm91cHNSZXZlcnNleyRDaGF0UmVjZWl2aW5nQWdlbnRzR3JvdXB9ID8gMSA6IDA7CgogICAgICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntWaWRlb0NoYXRTdXBwb3J0fSA9ICRVc2Vye1ZpZGVvQ2hhdEhhc1dlYlJUQ307CgogICAgICAgICAgICAjIENoZWNrIGFnZW50J3MgYXZhaWxhYmlsaXR5LgogICAgICAgICAgICBpZiAoICRPbmxpbmVEYXRheyRGaWVsZH0tPntDaGF0QWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntBZ2VudENoYXRBdmFpbGFiaWxpdHl9CiAgICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5BZ2VudEF2YWlsYWJpbGl0eUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsID0+IDAsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRPbmxpbmVEYXRheyRGaWVsZH0tPntBZ2VudENoYXRBdmFpbGFiaWxpdHl9ID09IDMgKSB7CiAgICAgICAgICAgICAgICAgICAgJE9ubGluZURhdGF7JEZpZWxkfS0+e1VzZXJTdGF0ZX0gICAgICAgPSBUcmFuc2xhdGFibGUoJ0FjdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntBZ2VudEVuYWJsZUNoYXR9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkT25saW5lRGF0YXskRmllbGR9LT57VXNlclN0YXRlRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdVc2VyIGlzIGN1cnJlbnRseSBhY3RpdmUuJyk7CiAgICAgICAgICAgICAgICAgICAgJE9ubGluZURhdGF7JEZpZWxkfS0+e1ZpZGVvQ2hhdEF2YWlsYWJsZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkT25saW5lRGF0YXskRmllbGR9LT57QWdlbnRDaGF0QXZhaWxhYmlsaXR5fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGV9ICAgICAgID0gVHJhbnNsYXRhYmxlKCdBd2F5Jyk7CiAgICAgICAgICAgICAgICAgICAgJE9ubGluZURhdGF7JEZpZWxkfS0+e0FnZW50RW5hYmxlQ2hhdH0gPSAxOwogICAgICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGVEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1VzZXIgd2FzIGluYWN0aXZlIGZvciBhIHdoaWxlLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkT25saW5lRGF0YXskRmllbGR9LT57QWdlbnRDaGF0QXZhaWxhYmlsaXR5fSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGV9ID0gVHJhbnNsYXRhYmxlKCdVbmF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICRPbmxpbmVEYXRheyRGaWVsZH0tPntVc2VyU3RhdGVEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1VzZXIgc2V0IHRoZWlyIHN0YXR1cyB0byB1bmF2YWlsYWJsZS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgb3duZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJU93bmVySW5mbywgJUFjbEFjdGlvbiwgJXsgJE9ubGluZURhdGF7T3duZXJJRH0gLy8ge30gfSB9LAogICAgKTsKCiAgICAjIHNob3cgcmVzcG9uc2libGUKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVSZXNwb25zaWJsZUluZm8sICVBY2xBY3Rpb24sICV7ICRPbmxpbmVEYXRhe1Jlc3BvbnNpYmxlSUR9IC8vIHt9IH0gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBubyBhcnRpY2xlcyBibG9jayBpZiB0aWNrZXQgZG9lcyBub3QgY29udGFpbiBhcnRpY2xlcwogICAgaWYgKCAhQEFydGljbGVCb3ggJiYgISRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGludE5vQXJ0aWNsZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHByb2Nlc3Mgd2lkZ2V0ICBhbmQgYWN0aXZpdHkgZGlhbG9ncyBvbiBwcm9jZXNzIHRpY2tldHMKICAgIGlmICgkSXNQcm9jZXNzVGlja2V0KSB7CgogICAgICAgICMgZ2V0IHRoZSBERiB3aGVyZSB0aGUgUHJvY2Vzc0VudGl0eUlEIGlzIHN0b3JlZAogICAgICAgIG15ICRQcm9jZXNzRW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQiKTsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBBdGl2aXR5RW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJEFjdGl2aXR5RW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIik7CgogICAgICAgIG15ICRQcm9jZXNzRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpLT5Qcm9jZXNzR2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFRpY2tldHskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICk7CiAgICAgICAgbXkgJEFjdGl2aXR5RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKS0+QWN0aXZpdHlHZXQoCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkVGlja2V0eyRBY3Rpdml0eUVudGl0eUlERmllbGR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHByb2Nlc3MgaW5mb3JtYXRpb24gaW4gdGhlIHNpZGViYXIKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFByb2Nlc3MgID0+ICRQcm9jZXNzRGF0YS0+e05hbWV9ICB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGl2aXR5ID0+ICRBY3Rpdml0eURhdGEtPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aGUgcHJvY2VzcyB3aWRnZXQgdGhlIHRoZSBtYWluIHNjcmVlbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBXaWRnZXRUaXRsZSA9PiAkUGFyYW17V2lkZ2V0VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG5leHQgYWN0aXZpdHkgZGlhbG9ncwogICAgICAgIG15ICROZXh0QWN0aXZpdHlEaWFsb2dzOwogICAgICAgIGlmICggJFRpY2tldHskQWN0aXZpdHlFbnRpdHlJREZpZWxkfSApIHsKICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSAke0FjdGl2aXR5RGF0YX0tPntBY3Rpdml0eURpYWxvZ30gfHwge307CiAgICAgICAgfQogICAgICAgIG15ICRBY3Rpdml0eU5hbWUgPSAkQWN0aXZpdHlEYXRhLT57TmFtZX07CgogICAgICAgIGlmICgkTmV4dEFjdGl2aXR5RGlhbG9ncykgewoKICAgICAgICAgICAgIyBnZXQgQWN0aXZpdHlEaWFsb2cgb2JqZWN0CiAgICAgICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKCiAgICAgICAgICAgICMgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyB0aGUgbmVlZGVkIHBlcm1pc3Npb25zIHRvIHZpZXcgdGhlCiAgICAgICAgICAgICMgZGlmZmVyZW50IGFjdGl2aXR5IGRpYWxvZ3MsIHNvIHdlIGxvb3Agb3ZlciBldmVyeSBhY3Rpdml0eSBkaWFsb2cgYW5kIGNoZWNrIGlmIHRoZXJlCiAgICAgICAgICAgICMgaXMgYSBwZXJtaXNzaW9uIGNvbmZpZ3VyZWQuIElmIHRoZXJlIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkIHdlIGNoZWNrIHRoaXMKICAgICAgICAgICAgIyBhbmQgZGlzcGxheS9oaWRlIHRoZSBhY3Rpdml0eSBkaWFsb2cgbGluawogICAgICAgICAgICBteSAlUGVybWlzc2lvblJpZ2h0czsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3Q7CiAgICAgICAgICAgIEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTjoKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JE5leHRBY3Rpdml0eURpYWxvZ3N9ICkgewogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskSW5kZXh9OwogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRBY3Rpdml0eURpYWxvZyAgICAgICAgID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgYW4gaW50ZXJmYWNlIGxvb2t1cC1saXN0CiAgICAgICAgICAgICAgICBteSAlSW50ZXJmYWNlTG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntJbnRlcmZhY2V9IH07CgogICAgICAgICAgICAgICAgbmV4dCBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT04gaWYgISRJbnRlcmZhY2VMb29rdXB7QWdlbnRJbnRlcmZhY2V9OwoKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHBlcmZvcm1hbmNlLWJvb3N0L2NhY2hlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGVybWlzc2lvblJpZ2h0c3sgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggISRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0eyRJbmRleH0gPSAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkdWNlIG5leHQgYWN0aXZpdHkgZGlhbG9ncyB0byB0aGUgb25lcyB0aGF0IGhhdmUgcGVybWlzc2lvbnMKICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3Q7CgogICAgICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICV7JE5leHRBY3Rpdml0eURpYWxvZ3N9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05leHRBY3Rpdml0eURpYWxvZ3MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0FjdGl2aXR5TmFtZScgPT4gJEFjdGl2aXR5TmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCROZXh0QWN0aXZpdHlEaWFsb2dzKSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTmV4dEFjdGl2aXR5RGlhbG9nS2V5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nRGF0YSA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFRpY2tldHskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0FjdGl2aXR5RGlhbG9ncycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlciA9IHsKICAgICAgICAleyAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpLT57RHluYW1pY0ZpZWxkfSB8fCB7fSB9LAogICAgICAgICV7CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIikKICAgICAgICAgICAgICAgIC0+e1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGR9CiAgICAgICAgICAgICAgICB8fCB7fQogICAgICAgIH0sCiAgICB9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJER5bmFtaWNGaWVsZEZpbHRlciB8fCB7fSwKICAgICk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgbXkgQEluZGl2aWR1YWxEeW5hbWljRmllbGRzOwoKICAgICMgbG9va3VwIGhhc2ggZm9yIGFsbCBJVFNNIGR5bmFtaWMgZmllbGRzCiAgICBteSAlSVRTTUR5bmFtaWNGaWVsZHMgPSAoCiAgICAgICAgSVRTTUNyaXRpY2FsaXR5ICAgICAgID0+IDEsCiAgICAgICAgSVRTTUltcGFjdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkICAgID0+IDEsCiAgICAgICAgSVRTTURlY2lzaW9uUmVzdWx0ICAgID0+IDEsCiAgICAgICAgSVRTTVJlcGFpclN0YXJ0VGltZSAgID0+IDEsCiAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgSVRTTURlY2lzaW9uRGF0ZSAgICAgID0+IDEsCiAgICAgICAgSVRTTUR1ZURhdGUgICAgICAgICAgID0+IDEsCiAgICApOwojIC0tLQoKICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBwcm9jZXNzIHdpZGdldCBhbmQgaW4gdGhlIHNpZGViYXIKICAgIG15ICggQEZpZWxkc1dpZGdldCwgQEZpZWxkc1NpZGViYXIgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9IGVxICcnOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICAgICAgaWYgKCAkSVRTTUR5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICBwdXNoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQojIC0tLQoKICAgICAgICAjIENoZWNrIGlmIHRoaXMgZmllbGQgaXMgc3VwcG9zZWQgdG8gYmUgaGlkZGVuIGZyb20gdGhlIHRpY2tldCBpbmZvcm1hdGlvbiBib3guCiAgICAgICAgIyAgIEZvciBleGFtcGxlLCBpdCdzIGRpc3BsYXllZCBieSBhIGRpZmZlcmVudCBtZWNoYW5pc20gKGkuZS4gYXN5bmMgd2lkZ2V0KS4KICAgICAgICBpZiAoCiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0hpZGRlbkluVGlja2V0SW5mb3JtYXRpb24nLAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyB1c2UgdHJhbnNsYXRpb24gaGVyZSB0byBiZSBhYmxlIHRvIHJlZHVjZSB0aGUgY2hhcmFjdGVyIGxlbmd0aCBpbiB0aGUgdGVtcGxhdGUKICAgICAgICBteSAkTGFiZWwgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkSXNQcm9jZXNzVGlja2V0ICYmCiAgICAgICAgICAgICRTZWxmLT57RGlzcGxheVNldHRpbmdzfS0+e1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKCiAgICAgICAgICAgICAgICAjIG5vIFZhbHVlTWF4Q2hhcnMgaGVyZSwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZQogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBARmllbGRzV2lkZ2V0LCB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVmFsdWVLZXkgICAgICAgICAgICAgICAgICAgID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICBMaW5rUHJldmlldyAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmtQcmV2aWV3fSwKCiAgICAgICAgICAgICAgICAjIEluY2x1ZGUgdW5pcXVlIHBhcmFtZXRlciB3aXRoIGR5bmFtaWMgZmllbGQgbmFtZSBpbiBjYXNlIG9mIGNvbGxpc2lvbiB3aXRoIG90aGVycy4KICAgICAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMzM2MiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IiA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gJENvbmZpZ09iamVjdC0+CiAgICAgICAgICAgICAgICBHZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkR5bmFtaWNGaWVsZHNab29tTWF4U2l6ZVNpZGViYXInKQogICAgICAgICAgICAgICAgfHwgMTgsICAgICMgbGltaXQgZm9yIHNpZGViYXIgZGlzcGxheQogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBwdXNoIEBGaWVsZHNTaWRlYmFyLCB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICBMaW5rUHJldmlldyAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmtQcmV2aWV3fSwKCiAgICAgICAgICAgICAgICAjIEluY2x1ZGUgdW5pcXVlIHBhcmFtZXRlciB3aXRoIGR5bmFtaWMgZmllbGQgbmFtZSBpbiBjYXNlIG9mIGNvbGxpc2lvbiB3aXRoIG90aGVycy4KICAgICAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMzM2MiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IiA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfUGxhaW4nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKCiAgICAgICAgIyBvdXRwdXQgZHluYW1pYyBmaWVsZHMgcmVnaXN0ZXJlZCBmb3IgYSBncm91cCBpbiB0aGUgcHJvY2VzcyB3aWRnZXQKICAgICAgICBteSBARmllbGRzSW5BR3JvdXA7CiAgICAgICAgZm9yIG15ICRHcm91cE5hbWUgKAogICAgICAgICAgICBzb3J0IGtleXMgJXsgJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9LT57UHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3Vwc30gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRHcm91cEZpZWxkc1N0cmluZyA9ICRTZWxmLT57RGlzcGxheVNldHRpbmdzfS0+e1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cHN9LT57JEdyb3VwTmFtZX07CgogICAgICAgICAgICAkR3JvdXBGaWVsZHNTdHJpbmcgPX4gc3tcc317fXhtc2c7CiAgICAgICAgICAgIG15IEBHcm91cEZpZWxkcyA9IHNwbGl0KCAnLCcsICRHcm91cEZpZWxkc1N0cmluZyApOwoKICAgICAgICAgICAgaWYgKCAkI0dyb3VwRmllbGRzICsgMSApIHsKCiAgICAgICAgICAgICAgICBteSAkU2hvd0dyb3VwVGl0bGUgPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoQEZpZWxkc1dpZGdldCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkRmllbGQtPntOYW1lfSB9IEBHcm91cEZpZWxkcyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTaG93R3JvdXBUaXRsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZExpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRmllbGQtPntOYW1lfSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsaWFzIGZvciB0aWNrZXQgdGl0bGUsIFRpdGxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkRmllbGQtPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1ByZXZpZXcgPT4gJEZpZWxkLT57TGlua1ByZXZpZXd9LAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbmNsdWRlIHVuaXF1ZSBwYXJhbWV0ZXIgd2l0aCBkeW5hbWljIGZpZWxkIG5hbWUgaW4gY2FzZSBvZiBjb2xsaXNpb24gd2l0aCBvdGhlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMzM2MiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZF8kRmllbGQtPntOYW1lfSIgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARmllbGRzSW5BR3JvdXAsICRGaWVsZC0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFNob3dHcm91cFRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cFNlcGFyYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGR5bmFtaWMgZmllbGRzIG5vdCByZWdpc3RlcmVkIGluIGEgZ3JvdXAgaW4gdGhlIHByb2Nlc3Mgd2lkZ2V0CiAgICAgICAgbXkgQFJlbWFpbmluZ0ZpZWxkc1dpZGdldDsKICAgICAgICBmb3IgbXkgJEZpZWxkIChARmllbGRzV2lkZ2V0KSB7CgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEZpZWxkLT57TmFtZX0gfSBARmllbGRzSW5BR3JvdXAgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZW1haW5pbmdGaWVsZHNXaWRnZXQsICRGaWVsZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cHMnLAogICAgICAgICk7CgogICAgICAgIGlmICggJCNSZW1haW5pbmdGaWVsZHNXaWRnZXQgKyAxICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBTZXBhcmF0b3InLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZpZWxkcyB3aXRoIG5vIGdyb3VwJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEZpZWxkIChAUmVtYWluaW5nRmllbGRzV2lkZ2V0KSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJEZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICRGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFZhbHVlT3ZlcmxheVRyaWdnZXInLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkRmllbGQtPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkLT57TmFtZX0gPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAlVGlja2V0LAoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRpdGxlID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICA9PiAkRmllbGQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJEZpZWxkLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtQcmV2aWV3ID0+ICRGaWVsZC0+e0xpbmtQcmV2aWV3fSwKCiAgICAgICAgICAgICAgICAgICAgICAgICMgSW5jbHVkZSB1bmlxdWUgcGFyYW1ldGVyIHdpdGggZHluYW1pYyBmaWVsZCBuYW1lIGluIGNhc2Ugb2YgY29sbGlzaW9uIHdpdGggb3RoZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAjICAgUGxlYXNlIHNlZSBidWcjMTMzNjIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRfJEZpZWxkLT57TmFtZX0iID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIGN5Y2xlIHRyb3VnaCBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDI1LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIG91dHB1dCBkeW5hbWljIGZpZWxkcyBpbiB0aGUgc2lkZWJhcgogICAgZm9yIG15ICRGaWVsZCAoQEZpZWxkc1NpZGViYXIpIHsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJEZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJEZpZWxkLT57TGlua30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAkRmllbGQtPntOYW1lfSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJEZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkRmllbGQtPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICBMaW5rUHJldmlldyA9PiAkRmllbGQtPntMaW5rUHJldmlld30sCgogICAgICAgICAgICAgICAgICAgICMgSW5jbHVkZSB1bmlxdWUgcGFyYW1ldGVyIHdpdGggZHluYW1pYyBmaWVsZCBuYW1lIGluIGNhc2Ugb2YgY29sbGlzaW9uIHdpdGggb3RoZXJzLgogICAgICAgICAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMzM2MiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAgICAiRHluYW1pY0ZpZWxkXyRGaWVsZC0+e05hbWV9IiA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb20nKSApIHsKCiAgICAgICAgIyBjdXN0b21lciBpbmZvCiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1c3RvbWVyRGF0YXtVc2VyVGl0bGV9ICkgewogICAgICAgICAgICAkQ3VzdG9tZXJEYXRhe1VzZXJUaXRsZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRDdXN0b21lckRhdGF7VXNlclRpdGxlfSApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJExheW91dE9iamVjdC0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIE1heCAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb21NYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnVGlja2V0JywKICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0YXRlICAgICAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBPYmplY3RQYXJhbWV0ZXJzID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIElnbm9yZUxpbmtlZFRpY2tldFN0YXRlVHlwZXMgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHRhYmxlIHZpZXcgbW9kZQogICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJENvbmZpZ09iamVjdC0+R2V0KCdMaW5rT2JqZWN0OjpWaWV3TW9kZScpOwoKICAgICMgY3JlYXRlIHRoZSBsaW5rIHRhYmxlCiAgICBteSAkTGlua1RhYmxlU3RyZyA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIHNpbXBsZSBsaW5rIHRhYmxlCiAgICBpZiAoICRMaW5rVGFibGVTdHJnICYmICRMaW5rVGFibGVWaWV3TW9kZSBlcSAnU2ltcGxlJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlU2ltcGxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdGhlIGNvbXBsZXggbGluayB0YWJsZQogICAgaWYgKCAkTGlua1RhYmxlU3RyZyAmJiAkTGlua1RhYmxlVmlld01vZGUgZXEgJ0NvbXBsZXgnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGVDb21wbGV4JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgIGlmICggJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAgICAgIyBidWlsZCBldmVudCB0eXBlIGxpc3QgZm9yIGZpbHRlciBkaWFsb2cKICAgICAgICAgICAgJFBhcmFte0V2ZW50VHlwZUZpbHRlclN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRTZWxmLT57SGlzdG9yeVR5cGVNYXBwaW5nfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfS0+e0V2ZW50VHlwZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdFdmVudFR5cGVGaWx0ZXInLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V2ZW50VHlwZUZpbHRlckRpYWxvZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgdHlwZXMKICAgICAgICAgICAgbXkgJUFydGljbGVUeXBlcyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVUeXBlTGlzdCgKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGFydGljbGUgdHlwZSBsaXN0IGZvciBmaWx0ZXIgZGlhbG9nCiAgICAgICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZUZpbHRlclN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlQXJ0aWNsZVR5cGVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e0FydGljbGVUeXBlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FydGljbGVUeXBlRmlsdGVyJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc2VuZGVyIHR5cGVzCiAgICAgICAgICAgIG15ICVBcnRpY2xlU2VuZGVyVHlwZXMgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlU2VuZGVyVHlwZUxpc3QoCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBhcnRpY2xlIHNlbmRlciB0eXBlIGxpc3QgZm9yIGZpbHRlciBkaWFsb2cKICAgICAgICAgICAgJFBhcmFte0FydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVBcnRpY2xlU2VuZGVyVHlwZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVNlbmRlclR5cGVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRpY2tldCBJRAogICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGaWx0ZXJEaWFsb2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgY2hlY2sgaWYgdGlja2V0IG5lZWQgdG8gYmUgbWFya2VkIGFzIHNlZW4KICAgIG15ICRBcnRpY2xlQWxsU2VlbiA9IDE7CiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewoKICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICBuZXh0IEFSVElDTEUKICAgICAgICAgICAgaWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAmJiAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nOwoKICAgICAgICAjIGxhc3QgQVJUSUNMRSBpZiBhcnRpY2xlIHdhcyBub3Qgc2hvd24KICAgICAgICBpZiAoICEkQXJ0aWNsZUZsYWdzeyAkQXJ0aWNsZS0+e0FydGljbGVJRH0gfS0+e1NlZW59ICkgewogICAgICAgICAgICAkQXJ0aWNsZUFsbFNlZW4gPSAwOwogICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgfQogICAgfQoKICAgICMgbWFyayB0aWNrZXQgYXMgc2VlbiBpZiBhbGwgYXJ0aWNsZSBhcmUgc2hvd24KICAgIGlmICgkQXJ0aWNsZUFsbFNlZW4pIHsKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRGbGFnU2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ICAgICAgPT4gJ1NlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQganMKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RpY2tldFpvb21Jbml0JywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgKTsKfQoKc3ViIF9BcnRpY2xlVHJlZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUaWNrZXQgICAgICAgICAgPSAleyAkUGFyYW17VGlja2V0fSB9OwogICAgbXkgJUFydGljbGVGbGFncyAgICA9ICV7ICRQYXJhbXtBcnRpY2xlRmxhZ3N9IH07CiAgICBteSBAQXJ0aWNsZUJveCAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CiAgICBteSAkQXJ0aWNsZU1heExpbWl0ID0gJFBhcmFte0FydGljbGVNYXhMaW1pdH07CiAgICBteSAkQXJ0aWNsZUlEICAgICAgID0gJFBhcmFte0FydGljbGVJRH07CiAgICBteSAkVGFibGVDbGFzc2VzOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBidWlsZCB0aHJlYWQgc3RyaW5nCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUcmVlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUYWJsZUNsYXNzZXMgPT4gJFRhYmxlQ2xhc3NlcywKICAgICAgICAgICAgWm9vbVRpbWVsaW5lID0+ICRTZWxmLT57Wm9vbVRpbWVsaW5lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtQYWdpbmF0aW9ufSAmJiAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUGFnZXMnLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtQYWdpbmF0aW9ufSwKICAgICAgICApOwogICAgfQoKICAgICMgQ2hlY2sgd2hpY2ggdmlldyBpcyB1c2FibGUuCiAgICAjIElmIGV4cGFuZC9jb2xsYXBzZSB2aWV3IGlzIHVzYWJsZSwgY2hlY2sgbnVtYmVyIG9mIGFydGljbGVzIChub3QgYXZhaWxhYmxlIGZvciB0b28gbWFueSBhcnRpY2xlcykuCiAgICBpZiAoICRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKCiAgICAgICAgIyBTaG93IHRyaWdnZXIgZm9yIHRpbWVsaW5lIHZpZXcuCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVsaW5lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgIFBhZ2UgICAgICAgICAgID0+ICRQYXJhbXtQYWdlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkI0FydGljbGVCb3ggPCAkQXJ0aWNsZU1heExpbWl0ICkgewogICAgICAgIG15ICRCbG9ja05hbWUgPSAkU2VsZi0+e1pvb21FeHBhbmR9ID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZCAgICAgPT4gJFNlbGYtPntab29tRXhwYW5kfSwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgUGFnZSAgICAgICAgICAgPT4gJFBhcmFte1BhZ2V9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgICMgZGVmaW5lIGhpZ2hsaWdodCBzdHlsZSBmb3IgbGlua3MgaWYgZmlsdGVyIGlzIGFjdGl2ZQogICAgICAgIG15ICRIaWdobGlnaHRTdHlsZSA9ICdtZW51JzsKICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gKSB7CiAgICAgICAgICAgICRIaWdobGlnaHRTdHlsZSA9ICdQcmlvcml0eUlELTUnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBhcnRpY2xlIGZpbHRlciBsaW5rcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nTGluaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgSGlnaGxpZ2h0U3R5bGUgPT4gJEhpZ2hsaWdodFN0eWxlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYXJ0aWNsZSBmaWx0ZXIgcmVzZXQgbGluayBvbmx5IGlmIGZpbHRlciBpcyBzZXQKICAgICAgICBpZiAoCiAgICAgICAgICAgICggISRTZWxmLT57Wm9vbVRpbWVsaW5lfSAmJiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICkKICAgICAgICAgICAgfHwgKCAkU2VsZi0+e1pvb21UaW1lbGluZX0gJiYgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyUmVzZXRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzaG93IGFydGljbGUgdHJlZQogICAgaWYgKCAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRhYmxlQ2xhc3NlcyA9PiAkVGFibGVDbGFzc2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZyBhbmQgdGhlcmUgYXJlIGFydGljbGVzCiAgICAgICAgICAgICMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlcgogICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgYXJ0aWNsZSBpbiB0cmVlIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2hvd25BcnRpY2xlSURzfS0+eyAkQXJ0aWNsZXtBcnRpY2xlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBhcnRpY2xlIGZsYWdzCiAgICAgICAgICAgIG15ICRDbGFzcyAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDbGFzc1JvdyAgID0gJyc7CiAgICAgICAgICAgIG15ICROZXdBcnRpY2xlID0gMDsKCiAgICAgICAgICAgICMgaWdub3JlIHN5c3RlbSBzZW5kZXIgdHlwZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRBcnRpY2xlRmxhZ3N7ICRBcnRpY2xle0FydGljbGVJRH0gfS0+e1NlZW59CiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6TmV3QXJ0aWNsZUlnbm9yZVN5c3RlbVNlbmRlcicpCiAgICAgICAgICAgICAgICAgICAgJiYgJEFydGljbGV7U2VuZGVyVHlwZX0gbmUgJ3N5c3RlbScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJE5ld0FydGljbGUgPSAxOwoKICAgICAgICAgICAgICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKCiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzaG93IGFyY2hpdmVkIHRpY2tldHMgYXMgc2VlbgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzICAgIC49ICcgVW5yZWFkQXJ0aWNsZXMnOwogICAgICAgICAgICAgICAgICAgICRDbGFzc1JvdyAuPSAnIFVucmVhZEFydGljbGVzJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGp1c3Qgc2hvdyB0aWNrZXQgZmxhZ3MgaWYgYWdlbnQgYmVsb25ncyB0byB0aGUgdGlja2V0CiAgICAgICAgICAgICAgICBteSAkU2hvd01ldGE7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVc2VySUR9ID09ICRBcnRpY2xle093bmVySUR9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntVc2VySUR9ID09ICRBcnRpY2xle1Jlc3BvbnNpYmxlSUR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTaG93TWV0YSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkU2hvd01ldGEgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OldhdGNoZXInKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlV2F0Y2ggPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRXYXRjaEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkV2F0Y2h7ICRTZWxmLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2hvd01ldGEgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICAgICAgICAgICAgICBpZiAoJFNob3dNZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzIC49ICcgUmVtYXJrYWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2xhc3MgLj0gJyBPcmRpbmFyeSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gc2V0IGNsYXNzIHRvIGFjdGl2ZQogICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSAmJiAhJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICAgICAgICAgICRDbGFzc1JvdyAuPSAnIEFjdGl2ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRUbXBTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyBhbHNvIGV4cGFuZC9jb2xsYXBzZSBpY29uCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIENsYXNzUm93ICAgICAgID0+ICRDbGFzc1JvdywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkVG1wU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgZmxhZ3MKICAgICAgICAgICAgIyBBbHdheXMgdXNlIHVzZXIgaWQgMSBiZWNhdXNlIG90aGVyIHVzZXJzIGFsc28gaGF2ZSB0byBzZWUgdGhlIGltcG9ydGFudCBmbGFnCiAgICAgICAgICAgIG15ICVBcnRpY2xlSW1wb3J0YW50RmxhZ3MgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgaW1wb3J0YW50IGZsYWcKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUltcG9ydGFudEZsYWdze0ltcG9ydGFudH0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUltcG9ydGFudEFydGljbGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFsd2F5cyBzaG93IGFyY2hpdmVkIHRpY2tldHMgYXMgc2VlbgogICAgICAgICAgICBpZiAoICROZXdBcnRpY2xlICYmICRUaWNrZXR7QXJjaGl2ZUZsYWd9IG5lICd5JyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtTmV3QXJ0aWNsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgICAgICMgd2UgYWRkIGFuIGVtcHR5IGVsZW1lbnQgaGVyZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtTm9OZXdBcnRpY2xlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZXRlcm1pbmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gLy1pbnRlcm5hbCQvc214ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1RyZWVJdGVtRGlyZWN0aW9uSW50ZXJuYWwnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1RyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmcnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZycgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGF0dGFjaG1lbnQgaW5mbwogICAgICAgICAgICAjIEJ1Z2ZpeCBmb3IgSUU3OiBhIHRhYmxlIGNlbGwgc2hvdWxkIG5vdCBiZSBlbXB0eQogICAgICAgICAgICAjIChiZWNhdXNlIG90aGVyd2lzZSB0aGUgY2VsbCBib3JkZXJzIGFyZSBub3Qgc2hvd24pOgogICAgICAgICAgICAjIHdlIGFkZCBhbiBlbXB0eSBlbGVtZW50IGhlcmUKICAgICAgICAgICAgaWYgKCAhJEFydGljbGV7QXRtc30gfHwgISV7ICRBcnRpY2xle0F0bXN9IH0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbU5vQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBBUlRJQ0xFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50cyA9ICRTZWxmLT5fQ29sbGVjdEFydGljbGVBdHRhY2htZW50cygKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1BdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gJEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdGltZWxpbmUgdmlldwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgQEhpc3RvcnlMaW5lcyA9ICRUaWNrZXRPYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZXMgZm9yIGxhdGVyIHVzZQogICAgICAgIG15IEBUaW1lbGluZUFydGljbGVCb3ggPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAyLAogICAgICAgICk7CgogICAgICAgIG15ICRBcnRpY2xlc0J5QXJ0aWNsZUlEID0ge307CiAgICAgICAgZm9yIG15ICRBcnRpY2xlICggc29ydCBAVGltZWxpbmVBcnRpY2xlQm94ICkgewoKICAgICAgICAgICAgIyBnZXQgYXR0YWNobWVudCBpbmRleCAod2l0aG91dCBhdHRhY2htZW50cykKICAgICAgICAgICAgbXkgJUF0bUluZGV4ID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGUtPntBdG1zfSA9IFwlQXRtSW5kZXg7CiAgICAgICAgICAgICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSB9ID0gJEFydGljbGU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCBkaXNwbGF5IHRoZXNlIHR5cGVzCiAgICAgICAgbXkgQFR5cGVzRG9kZ2UgPSBxdygKICAgICAgICAgICAgTWlzYwogICAgICAgICAgICBBcmNoaXZlRmxhZ1VwZGF0ZQogICAgICAgICAgICBMb29wUHJvdGVjdGlvbgogICAgICAgICAgICBSZW1vdmUKICAgICAgICAgICAgU3Vic2NyaWJlCiAgICAgICAgICAgIFVuc3Vic2NyaWJlCiAgICAgICAgICAgIFN5c3RlbVJlcXVlc3QKICAgICAgICAgICAgU2VuZEFnZW50Tm90aWZpY2F0aW9uCiAgICAgICAgICAgIFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbgogICAgICAgICAgICBTZW5kQXV0b1JlamVjdAogICAgICAgICk7CgogICAgICAgICMgc29ydCBvdXQgbm9uLWZpbHRlcmVkIGV2ZW50IHR5cGVzIChpZiBhcHBsaWNhYmxlKQogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9CiAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIG15ICRFdmVudFR5cGUgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50VHlwZSBuZSAnTmV3VGlja2V0JyAmJiAhZ3JlcCB7ICRfIGVxICRFdmVudFR5cGUgfQogICAgICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfS0+e0V2ZW50VHlwZUlEfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFR5cGVzRG9kZ2UsICRFdmVudFR5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHlwZXMgd2hpY2ggY2FuIGJlIGRlc2NyaWJlZCBhcyAnYWN0aW9uIG9uIGEgdGlja2V0JwogICAgICAgIG15IEBUeXBlc1RpY2tldEFjdGlvbiA9IHF3KAogICAgICAgICAgICBTZXJ2aWNlVXBkYXRlCiAgICAgICAgICAgIFNMQVVwZGF0ZQogICAgICAgICAgICBTdGF0ZVVwZGF0ZQogICAgICAgICAgICBTZXRQZW5kaW5nVGltZQogICAgICAgICAgICBVbmxvY2sKICAgICAgICAgICAgTG9jawogICAgICAgICAgICBSZXNwb25zaWJsZVVwZGF0ZQogICAgICAgICAgICBPd25lclVwZGF0ZQogICAgICAgICAgICBDdXN0b21lclVwZGF0ZQogICAgICAgICAgICBOZXdUaWNrZXQKICAgICAgICAgICAgVGlja2V0TGlua0FkZAogICAgICAgICAgICBUaWNrZXRMaW5rRGVsZXRlCiAgICAgICAgICAgIFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZQogICAgICAgICAgICBNb3ZlCiAgICAgICAgICAgIE1lcmdlZAogICAgICAgICAgICBQcmlvcml0eVVwZGF0ZQogICAgICAgICAgICBUaXRsZVVwZGF0ZQogICAgICAgICAgICBUeXBlVXBkYXRlCiAgICAgICAgICAgIEVzY2FsYXRpb25SZXNwb25zZVRpbWVOb3RpZnlCZWZvcmUKICAgICAgICAgICAgRXNjYWxhdGlvblJlc3BvbnNlVGltZVN0YXJ0CiAgICAgICAgICAgIEVzY2FsYXRpb25SZXNwb25zZVRpbWVTdG9wCiAgICAgICAgICAgIEVzY2FsYXRpb25Tb2x1dGlvblRpbWVOb3RpZnlCZWZvcmUKICAgICAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0YXJ0CiAgICAgICAgICAgIEVzY2FsYXRpb25Tb2x1dGlvblRpbWVTdG9wCiAgICAgICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lTm90aWZ5QmVmb3JlCiAgICAgICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lU3RhcnQKICAgICAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVTdG9wCiAgICAgICAgICAgIFRpbWVBY2NvdW50aW5nCiAgICAgICAgKTsKCiAgICAgICAgIyB0eXBlcyB3aGljaCBhcmUgdXN1YWxseSBiZWluZyBjb25uZWN0ZWQgdG8gc29tZSBraW5kIG9mCiAgICAgICAgIyBhdXRvbWF0aWMgcHJvY2VzcyAoZS5nLiB0cmlnZ2VyZWQgYnkgYW5vdGhlciBhY3Rpb24pCiAgICAgICAgbXkgQFR5cGVzVGlja2V0QXV0b0FjdGlvbiA9IHF3KAogICAgICAgICAgICBTZW5kQXV0b0ZvbGxvd1VwCiAgICAgICAgICAgIFNlbmRBdXRvUmVqZWN0CiAgICAgICAgICAgIFNlbmRBdXRvUmVwbHkKICAgICAgICApOwoKICAgICAgICAjIHR5cGVzIHdoaWNoIGNhbiBiZSBjb25zaWRlcmVkIGFzIGludGVybmFsCiAgICAgICAgbXkgQFR5cGVzSW50ZXJuYWwgPSBxdygKICAgICAgICAgICAgQWRkTm90ZQogICAgICAgICAgICBDaGF0SW50ZXJuYWwKICAgICAgICAgICAgRW1haWxBZ2VudEludGVybmFsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRnb2luZyB0eXBlcwogICAgICAgIG15IEBUeXBlc091dGdvaW5nID0gcXcoCiAgICAgICAgICAgIEZvcndhcmQKICAgICAgICAgICAgRW1haWxBZ2VudAogICAgICAgICAgICBQaG9uZUNhbGxBZ2VudAogICAgICAgICAgICBCb3VuY2UKICAgICAgICAgICAgU2VuZEFuc3dlcgogICAgICAgICk7CgogICAgICAgICMgaW5jb21pbmcgdHlwZXMKICAgICAgICBteSBAVHlwZXNJbmNvbWluZyA9IHF3KAogICAgICAgICAgICBFbWFpbEN1c3RvbWVyCiAgICAgICAgICAgIEFkZE5vdGVDdXN0b21lcgogICAgICAgICAgICBQaG9uZUNhbGxDdXN0b21lcgogICAgICAgICAgICBGb2xsb3dVcAogICAgICAgICAgICBXZWJSZXF1ZXN0Q3VzdG9tZXIKICAgICAgICAgICAgQ2hhdEV4dGVybmFsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFR5cGVzTGVmdCA9ICgKICAgICAgICAgICAgQFR5cGVzT3V0Z29pbmcsCiAgICAgICAgICAgIEBUeXBlc0ludGVybmFsLAogICAgICAgICAgICBAVHlwZXNUaWNrZXRBdXRvQWN0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBUeXBlc1JpZ2h0ID0gKAogICAgICAgICAgICBAVHlwZXNJbmNvbWluZywKICAgICAgICAgICAgQFR5cGVzVGlja2V0QWN0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBUeXBlc1dpdGhBcnRpY2xlcyA9ICgKICAgICAgICAgICAgQFR5cGVzT3V0Z29pbmcsCiAgICAgICAgICAgIEBUeXBlc0ludGVybmFsLAogICAgICAgICAgICBAVHlwZXNJbmNvbWluZywKICAgICAgICAgICAgJ1Bob25lQ2FsbEN1c3RvbWVyJywKICAgICAgICApOwoKICAgICAgICBteSAlSGlzdG9yeUl0ZW1zOwogICAgICAgIG15ICRJdGVtQ291bnRlciA9IDA7CiAgICAgICAgbXkgJExhc3RDcmVhdGVUaW1lOwogICAgICAgIG15ICRMYXN0Q3JlYXRlU3lzdGVtVGltZTsKCiAgICAgICAgIyBHZXQgbWFwcGluZyBvZiBoaXN0b3J5IHR5cGVzIHRvIHJlYWRhYmxlIHN0cmluZ3MKICAgICAgICBteSAlSGlzdG9yeVR5cGVzOwogICAgICAgIG15ICVIaXN0b3J5VHlwZUNvbmZpZyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6SGlzdG9yeVR5cGVzJykgLy8ge30gfTsKICAgICAgICBmb3IgbXkgJEVudHJ5ICggc29ydCBrZXlzICVIaXN0b3J5VHlwZUNvbmZpZyApIHsKICAgICAgICAgICAgJUhpc3RvcnlUeXBlcyA9ICgKICAgICAgICAgICAgICAgICVIaXN0b3J5VHlwZXMsCiAgICAgICAgICAgICAgICAleyAkSGlzdG9yeVR5cGVDb25maWd7JEVudHJ5fSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgSElTVE9SWUlURU06CiAgICAgICAgZm9yIG15ICRJdGVtICggcmV2ZXJzZSBASGlzdG9yeUxpbmVzICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNEb2RnZSApIHsKICAgICAgICAgICAgICAgIG5leHQgSElTVE9SWUlURU07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRJdGVtLT57Q291bnRlcn0gPSAkSXRlbUNvdW50ZXIrKzsKCiAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggY29sb3IgdGhlIGl0ZW0gc2hvdWxkIGhhdmUKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0hpc3RvcnlUeXBlfSBlcSAnTmV3VGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZSAnTmV3VGlja2V0JyBpdGVtIGhhcyBhbiBhcnRpY2xlLCBkaXNwbGF5IHRoaXMgImNyZWF0aW9uIGFydGljbGUiIGV2ZW50IHNlcGFyYXRlbHkKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0l0ZW1zfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgICAgICAgICAgID0+ICRJdGVtLT57Q291bnRlcn0rKywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVSZWFkYWJsZSA9PiBUcmFuc2xhdGFibGUoJ1RpY2tldCBDcmVhdGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIE9yaWVudGF0aW9uICAgICAgICAgPT4gJ1JpZ2h0JywKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnTmV3VGlja2V0JzsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e05hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjZXJ0YWluIHR5cGVzLCBlLmcuIGV4dGVybmFsIG5vdGVzIGZyb20gY3VzdG9tZXJzCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ0FkZE5vdGUnCiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57Q2xhc3N9ID0gJ1R5cGVJbmNvbWluZyc7CgogICAgICAgICAgICAgICAgIyBXZSBmYWtlIGEgY3VzdG9tIGhpc3RvcnkgdHlwZSBiZWNhdXNlIGV4dGVybmFsIG5vdGVzIGZyb20gY3VzdG9tZXJzIHN0aWxsCiAgICAgICAgICAgICAgICAjIGhhdmUgdGhlIGhpc3RvcnkgdHlwZSAnQWRkTm90ZScgd2hpY2ggZG9lcyBub3QgYWxsb3cgZm9yIGRpc3Rpbmd1aXNoaW5nLgogICAgICAgICAgICAgICAgJEl0ZW0tPntIaXN0b3J5VHlwZX0gPSAnQWRkTm90ZUN1c3RvbWVyJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgaW50ZXJuYWwgZW1haWxzCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ0VtYWlsQWdlbnQnCiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntBcnRpY2xlVHlwZX0gZXEgJ2VtYWlsLWludGVybmFsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSAgICAgICA9ICdUeXBlTm90ZUludGVybmFsJzsKICAgICAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGV9ID0gJ0VtYWlsQWdlbnRJbnRlcm5hbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNlcnRhaW4gdHlwZXMsIGUuZy4gZXh0ZXJuYWwgbm90ZXMgZnJvbSBjdXN0b21lcnMKICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlSUR9CiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGV9ID0gJ0NoYXRFeHRlcm5hbCc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSAgICAgICA9ICdUeXBlSW5jb21pbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9ICkKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9LT57QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSA9ICdDaGF0SW50ZXJuYWwnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gICAgICAgPSAnVHlwZUludGVybmFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSBlcSAnRm9yd2FyZCcKICAgICAgICAgICAgICAgICYmICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9ICkKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9LT57QXJ0aWNsZVR5cGV9IGVxICdlbWFpbC1pbnRlcm5hbCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICRJdGVtLT57Q2xhc3N9ID0gJ1R5cGVOb3RlSW50ZXJuYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzVGlja2V0QWN0aW9uICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZVRpY2tldEFjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNUaWNrZXRBdXRvQWN0aW9uICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZVRpY2tldEF1dG9BY3Rpb24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzSW50ZXJuYWwgKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlTm90ZUludGVybmFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc0luY29taW5nICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZUluY29taW5nJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc091dGdvaW5nICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZU91dGdvaW5nJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgYXJ0aWNsZSBpbmZvcm1hdGlvbiBmcm9tIHR5cGVzIHdoaWNoIHNob3VsZCBub3QgZGlzcGxheSBhcnRpY2xlcwogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhcnRpY2xlIChpZiBwcmVzZW50KQogICAgICAgICAgICBpZiAoICRJdGVtLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZURhdGF9ID0gJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH07CgogICAgICAgICAgICAgICAgbXkgJUFydGljbGVGbGFnc0FsbCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICVBcnRpY2xlRmxhZ3NNZSA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntBcnRpY2xlSXNJbXBvcnRhbnR9ID0gJEFydGljbGVGbGFnc0FsbHtJbXBvcnRhbnR9OwogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntBcnRpY2xlSXNTZWVufSAgICAgID0gJEFydGljbGVGbGFnc01le1NlZW59OwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcKICAgICAgICAgICAgICAgICAgICB8fCAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntJc0NoYXRBcnRpY2xlfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBvbmx5IHRoZSBmaXJzdCB0aHJlZSAoc2hvcnRlbmVkKSBsaW5lcyBvZiBhIGNoYXJ0IGFydGljbGUKICAgICAgICAgICAgICAgICAgICBteSAkQ2hhdE1lc3NhZ2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLT57QXJ0aWNsZURhdGF9LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDaGF0TWVzc2FnZSAoIEB7ICRDaGF0TWVzc2FnZXMgLy8gW10gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYXRNZXNzYWdlLT57Q3JlYXRlVGltZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdFRpbWVTdHJpbmcoICRDaGF0TWVzc2FnZS0+e0NyZWF0ZVRpbWV9LCAnRGF0ZUZvcm1hdCcgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntDaGF0TWVzc2FnZXN9ID0gJENoYXRNZXNzYWdlczsKCiAgICAgICAgICAgICAgICAgICAgbXkgJEl0ZW1Db3VudGVyID0gMDsKCiAgICAgICAgICAgICAgICAgICAgQ0hBVElURU06CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlRGF0YSAoIHNvcnQgeyAkYS0+e0lEfSA8PT4gJGItPntJRH0gfSBAeyRDaGF0TWVzc2FnZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRNZXNzYWdlRGF0YS0+e1N5c3RlbUdlbmVyYXRlZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0JvZHlDaGF0fSAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNoYXRNZXNzYWdlIFN5c3RlbUdlbmVyYXRlZCI+PHNwYW4+W1slIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV1dPC9zcGFuPiAtIFslIERhdGEuTWVzc2FnZVRleHQgfCBodG1sICVdPC9kaXY+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRNZXNzYWdlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntCb2R5Q2hhdH0gLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDaGF0TWVzc2FnZSI+PHNwYW4+W1slIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV1dPC9zcGFuPiAtIFslIERhdGEuQ2hhdHRlck5hbWUgfCBodG1sICVdOiBbJSBEYXRhLk1lc3NhZ2VUZXh0IHwgaHRtbCAlXTwvZGl2PicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTWVzc2FnZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IENIQVRJVEVNIGlmICRJdGVtQ291bnRlciA9PSA3OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBlbXB0eSBsaW5lcwogICAgICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZURhdGF9LT57Qm9keX0gPX4gc3teW1xuXHJdK317fXhtc2c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e05hbWV9ICYmICRJdGVtLT57TmFtZX0gPX4gbS9eJSUveCApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXiUlLy94ZzsKICAgICAgICAgICAgICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQoIC8lJS94LCAkSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntOYW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlc3sgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQFZhbHVlcywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TmFtZX0gPX4gcy9cJXMvL3hnOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBJRHMKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChcZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cKS8veGc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbWFrZSB0aGUgaGlzdG9yeSB0eXBlIG1vcmUgcmVhZGFibGUgKGlmIGFwcGxpY2FibGUpCiAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGVSZWFkYWJsZX0gPSAkU2VsZi0+e0hpc3RvcnlUeXBlTWFwcGluZ30tPnsgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfQogICAgICAgICAgICAgICAgfHwgJEl0ZW0tPntIaXN0b3J5VHlwZX07CgogICAgICAgICAgICAjIGdyb3VwIGl0ZW1zIHdoaWNoIGhhcHBlbmVkIChuZWFybHkpIGNvaW5jaWRlbnRseSB0b2dldGhlcgogICAgICAgICAgICAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEl0ZW0tPntDcmVhdGVUaW1lfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIHR3byBldmVudHMgdGhhdCBoYXBwZW5lZCAnbmVhcmx5JyB0aGUgc2FtZSB0aW1lLCB0cmVhdAogICAgICAgICAgICAjIHRoZW0gYXMgaWYgdGhleSBoYXBwZW5lZCBleGFjdGx5IG9uIHRoZSBzYW1lIHRpbWUgKHRyZXNob2xkIDUgc2Vjb25kcykKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lCiAgICAgICAgICAgICAgICAmJiAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9IDw9ICRMYXN0Q3JlYXRlU3lzdGVtVGltZQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfSA+PSAoICRMYXN0Q3JlYXRlU3lzdGVtVGltZSAtIDUgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7JExhc3RDcmVhdGVUaW1lfSB9LCAkSXRlbTsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3JlYXRlVGltZX0gPSAkTGFzdENyZWF0ZVRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7ICRJdGVtLT57Q3JlYXRlVGltZX0gfSB9LCAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExhc3RDcmVhdGVUaW1lICAgICAgID0gJEl0ZW0tPntDcmVhdGVUaW1lfTsKICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lID0gJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfTsKICAgICAgICB9CgogICAgICAgIG15ICRTb3J0QnlBcnRpY2xlID0gc3ViIHsKCiAgICAgICAgICAgIG15ICRJc0EgPSBncmVwIHsgJF8gZXEgJGEtPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgIG15ICRJc0IgPSBncmVwIHsgJF8gZXEgJGItPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgICRJc0IgY21wICRJc0E7CiAgICAgICAgfTsKCiAgICAgICAgIyBzb3J0IGhpc3RvcnkgaXRlbXMgYmFzZWQgb24gaXRlbXMgd2l0aCBhcnRpY2xlcwogICAgICAgICMgdGhlc2UgaXRlbXMgc2hvdWxkIGFsd2F5cyBiZSBvbiB0b3Agb2YgYSBsaXN0IG9mIGNvbm5lY3RlZCBpdGVtcwogICAgICAgICRJdGVtQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRJdGVtICggcmV2ZXJzZSBzb3J0IGtleXMgJUhpc3RvcnlJdGVtcyApIHsKCiAgICAgICAgICAgIGZvciBteSAkU3ViSXRlbSAoIHNvcnQgJFNvcnRCeUFydGljbGUgQHsgJEhpc3RvcnlJdGVtc3skSXRlbX0gfSApIHsKICAgICAgICAgICAgICAgICRTdWJJdGVtLT57Q291bnRlcn0gPSAkSXRlbUNvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkU3ViSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc1JpZ2h0ICkgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ1JpZ2h0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ0xlZnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SXRlbXN9IH0sICRTdWJJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCBOb1RpbWVsaW5lVmlld0F1dG9BcnRpY2xlIGNvbmZpZyB2YWx1ZSBmb3IgdXNhZ2UgaW4gSlMuCiAgICAgICAgJFBhcmFte05vVGltZWxpbmVWaWV3QXV0b0FydGljbGV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdOb1RpbWVsaW5lVmlld0F1dG9BcnRpY2xlJykgfHwgJzAnOwoKICAgICAgICAjIHNldCBUaWNrZXRJRCBmb3IgdXNhZ2UgaW4gSlMKICAgICAgICAkUGFyYW17VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICMgTW9kaWZ5IGJvZHkgdGV4dCB0byBhdm9pZCAnPC9zY3JpcHQ+JyB0YWcgaXNzdWUgKHNlZSBidWcjMTQwMjMpLgogICAgICAgIElURU1TOgogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtJdGVtc30gfSApIHsKICAgICAgICAgICAgbmV4dCBJVEVNUyBpZiAhJEl0ZW0tPntBcnRpY2xlSUR9OwoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lzQ2hhdEFydGljbGV9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntCb2R5Q2hhdH0gPX4gc3s8L3NjcmlwdD59ezwjIyMvc2NyaXB0Pn1nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntCb2R5fSA9fiBzezwvc2NyaXB0Pn17PCMjIy9zY3JpcHQ+fWc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lbGluZVZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBqdW1wIHRvIHNlbGVjdGVkIGFydGljbGUKICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTaG93U2VsZWN0ZWRBcnRpY2xlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgYWN0aW9uIG1lbnUgZm9yIGFsbCBhcnRpY2xlcwogICAgICAgIGZvciBteSAkQXJ0aWNsZUlEICggc29ydCBrZXlzICV7JEFydGljbGVzQnlBcnRpY2xlSUR9ICkgewoKICAgICAgICAgICAgbXkgQE1lbnVJdGVtcyA9ICRTZWxmLT5fQXJ0aWNsZU1lbnUoCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0fSwKICAgICAgICAgICAgICAgIEFjbEFjdGlvbiAgICAgICAgID0+ICRQYXJhbXtBY2xBY3Rpb259LAogICAgICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gJEFydGljbGVzQnlBcnRpY2xlSUQtPnskQXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30sCiAgICAgICAgICAgICAgICBTdGFuZGFyZEZvcndhcmRzICA9PiAkUGFyYW17U3RhbmRhcmRGb3J3YXJkc30sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnU3RhdGljJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZWxpbmVWaWV3VGlja2V0QWN0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW1zID0+IFxATWVudUl0ZW1zLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzIGJveAogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyRBcnRpY2xlSUR9LT57QXRtc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUF0dGFjaG1lbnRzID0gJFNlbGYtPl9Db2xsZWN0QXJ0aWNsZUF0dGFjaG1lbnRzKAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgPT4gJEFydGljbGVzQnlBcnRpY2xlSUQtPnskQXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZWxpbmVWaWV3QXJ0aWNsZUF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gJEFydGljbGVBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICApOwp9CgpzdWIgX1RpY2tldEl0ZW1TZWVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQEFydGljbGVJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVJbmRleCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICBmb3IgbXkgJEFydGljbGVJRCAoQEFydGljbGVJRHMpIHsKICAgICAgICAkU2VsZi0+X0FydGljbGVJdGVtU2VlbigKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcnRpY2xlSXRlbVNlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1hcmsgc2hvd24gYXJ0aWNsZSBhcyBzZWVuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVGbGFnU2V0KAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ1NlZW4nLAogICAgICAgIFZhbHVlICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FydGljbGVJdGVtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlQXJ0aWNsZSAgID0gJXsgJFBhcmFte0FydGljbGV9IH07CiAgICBteSAlQWNsQWN0aW9uID0gJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgY2xlYW51cCBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgU2l6ZSAgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgc2hvdyBhcnRpY2xlIGFjdGlvbnMKICAgIG15IEBNZW51SXRlbXMgPSAkU2VsZi0+X0FydGljbGVNZW51KAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNvbGxlY3QgYXJ0aWNsZSBtZXRhCiAgICBteSBAQXJ0aWNsZU1ldGFEYXRhID0gJFNlbGYtPl9BcnRpY2xlQ29sbGVjdE1ldGEoCiAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICBNZW51SXRlbXMgICAgICAgPT4gXEBNZW51SXRlbXMsCiAgICAgICAgICAgIEFydGljbGVNZXRhRGF0YSA9PiBcQEFydGljbGVNZXRhRGF0YQogICAgICAgIH0sCiAgICApOwoKICAgICMgc2hvdyBjcmVhdGVkIGJ5IGlmIGRpZmZlcmVudCBmcm9tIFVzZXIgSUQgMQogICAgaWYgKCAkQXJ0aWNsZXtDcmVhdGVkQnl9ID4gMSApIHsKICAgICAgICAkQXJ0aWNsZXtDcmVhdGVkQnlVc2VyfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJOYW1lKCBVc2VySUQgPT4gJEFydGljbGV7Q3JlYXRlZEJ5fSApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQ3JlYXRlZEJ5JywKICAgICAgICAgICAgRGF0YSA9PiB7JUFydGljbGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgIGlmICggJFRpY2tldHtBcmNoaXZlRmxhZ30gbmUgJ3knICkgewoKICAgICAgICAjIG1hcmsgc2hvd24gYXJ0aWNsZSBhcyBzZWVuCiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gZXEgJ09uTG9hZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT5fQXJ0aWNsZUl0ZW1TZWVuKCBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxmLT57Wm9vbUV4cGFuZH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0FjdHVhbEFydGljbGVJRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3R1YWxBcnRpY2xlSUR9ID09ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUl0ZW1NYXJrQXNTZWVuJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb2ZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgbXkgJFJlY2lwaWVudERpc3BsYXlUeXBlID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UmVjaXBpZW50RGlzcGxheVR5cGUnKSB8fCAnUmVhbG5hbWUnOwogICAgbXkgJFNlbmRlckRpc3BsYXlUeXBlICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0U2VuZGVyRGlzcGxheVR5cGUnKSAgICB8fCAnUmVhbG5hbWUnOwogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xleyRLZXl9OwoKICAgICAgICBteSAkRGlzcGxheVR5cGUgPSAkS2V5IGVxICdGcm9tJyAgICAgICAgICAgICA/ICRTZW5kZXJEaXNwbGF5VHlwZSA6ICRSZWNpcGllbnREaXNwbGF5VHlwZTsKICAgICAgICBteSAkSGlkZGVuVHlwZSAgPSAkRGlzcGxheVR5cGUgZXEgJ1JlYWxuYW1lJyA/ICdWYWx1ZScgICAgICAgICAgICA6ICdSZWFsbmFtZSc7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd1JlY2lwaWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRBcnRpY2xleyRLZXl9LAogICAgICAgICAgICAgICAgUmVhbG5hbWUgICAgICAgICAgICAgPT4gJEFydGljbGV7ICRLZXkgLiAnUmVhbG5hbWUnIH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgJEhpZGRlblR5cGUgLiBIaWRkZW4gPT4gJ0hpZGRlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIGFydGljbGUgdGltZQogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQXJ0aWNsZVRpbWUgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICApOwogICAgICAgIGlmICgkQXJ0aWNsZVRpbWUpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQWNjb3VudGVkVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnVGltZScsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGVUaW1lLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlciA9IHsKICAgICAgICAleyAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpLT57RHluYW1pY0ZpZWxkfSB8fCB7fSB9LAogICAgICAgICV7CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIikKICAgICAgICAgICAgICAgIC0+e1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGR9CiAgICAgICAgICAgICAgICB8fCB7fQogICAgICAgIH0sCiAgICB9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgYXJ0aWNsZSBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkRHluYW1pY0ZpZWxkRmlsdGVyIHx8IHt9LAogICAgKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICcnOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+ICRDb25maWdPYmplY3QtPgogICAgICAgICAgICAgICAgR2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEeW5hbWljRmllbGRzWm9vbU1heFNpemVBcnRpY2xlJykKICAgICAgICAgICAgICAgIHx8IDE2MCwgICAgIyBsaW1pdCBmb3IgYXJ0aWNsZSBkaXNwbGF5CiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGVsZW1lbnQKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlVGlja2V0LAoKICAgICAgICAgICAgICAgICAgICAjIGFsaWFzIGZvciB0aWNrZXQgdGl0bGUsIFRpdGxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaXRsZSAgICAgICAgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICBMaW5rUHJldmlldyAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmtQcmV2aWV3fSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dHB1dCBub24gbGluayBlbGVtZW50CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZWxlbWVudAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgICAgICAgICAgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgTGlua1ByZXZpZXcgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rUHJldmlld30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgbm9uIGxpbmsgZWxlbWVudAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ1BsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBydW4gYXJ0aWNsZSB2aWV3IG1vZHVsZXMKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVWaWV3TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7JENvbmZpZ307CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjaygKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgJVRpY2tldCwgQ29uZmlnID0+ICRKb2JzeyRKb2J9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkRGF0YVJlZiAoQERhdGEpIHsKICAgICAgICAgICAgICAgIGlmICggISREYXRhUmVmLT57U3VjY2Vzc2Z1bH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPntSZXN1bHR9ID0gJ0Vycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdOb3RpY2UnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkV2FybmluZyAoIEB7ICREYXRhUmVmLT57V2FybmluZ3N9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRXYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmlsdGVyIG9wdGlvbgogICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICVUaWNrZXQsIENvbmZpZyA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAlQXJ0aWNsZSA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICk7CgogICAgIyBnZXQgYXR0YWNobWVudCBpbmRleCAod2l0aG91dCBhdHRhY2htZW50cykKICAgIG15ICVBdG1JbmRleCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSwKICAgICAgICBBcnRpY2xlICAgICAgICAgICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRBcnRpY2xle0F0bXN9ID0gXCVBdG1JbmRleDsKCiAgICAjIGFkZCBibG9jayBmb3IgYXR0YWNobWVudHMKICAgIGlmICggJEFydGljbGV7QXRtc30gJiYgJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICBteSAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUF0dGFjaG1lbnRNb2R1bGUnKTsKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlRmlsZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIGFydGljbGUgYXR0YWNobWVudCBtb2R1bGVzCiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiByZWYgJENvbmZpZyBuZSAnSEFTSCc7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXskQ29uZmlnfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgIEZpbGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIGZpbGVzaXplCiAgICAgICAgICAgICAgICBpZiAoICRKb2IgZXEgJzItSFRNTC1WaWV3ZXInICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0RhdGFGaWxlU2l6ZX0gPSAiLCAiIC4gJEZpbGV7RmlsZXNpemV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRGF0YXtCbG9ja30gfHwgJ0FydGljbGVBdHRhY2htZW50Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFNwZWNpYWwgdHJlYXRtZW50IGZvciBjaGF0IGFydGljbGVzCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgfHwgJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJyApIHsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHlDaGF0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGF0TWVzc2FnZXMgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgc2hvdyBib2R5IGFzIGh0bWwgb3IgcGxhaW4gdGV4dAogICAgbXkgJFZpZXdNb2RlID0gJ0JvZHlIVE1MJzsKCiAgICAjIGluIGNhc2Ugc2hvdyBwbGFpbiBhcnRpY2xlIGJvZHkgKGlmIG5vIGh0bWwgYm9keSBhcyBhdHRhY2htZW50IGV4aXN0cyBvZiBpZiByaWNoCiAgICAjIHRleHQgaXMgbm90IGVuYWJsZWQpCiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSB8fCAhJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgJFZpZXdNb2RlID0gJ0JvZHlQbGFpbic7CgogICAgICAgICMgcmVtZW1iZXIgcGxhaW4gYm9keSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IEFydGljbGVWaWV3TW9kdWxlcwogICAgICAgICRBcnRpY2xle0JvZHlQbGFpbn0gPSAkQXJ0aWNsZXtCb2R5fTsKCiAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGJvZHkKICAgICMgQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIGFub255bW91cyBjb3B5IG9mICVBcnRpY2xlIGFuZCBwYXNzIGl0IHRvCiAgICAjIHRoZSBMYXlvdXRPYmplY3QsIGJlY2F1c2UgJUFydGljbGUgbWF5IGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRWaWV3TW9kZSwKICAgICAgICBEYXRhID0+IHslQXJ0aWNsZX0sCiAgICApOwoKICAgICMgc2hvdyBtZXNzYWdlIGFib3V0IGxpbmtzIGluIGlmcmFtZXMsIGlmIHVzZXIgZGlkbid0IGNsb3NlIGl0IGFscmVhZHkKICAgIGlmICggJFZpZXdNb2RlIGVxICdCb2R5SFRNTCcgJiYgISRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnJvd3NlckxpbmtNZXNzYWdlJywKICAgICAgICApOwogICAgfQoKICAgICMgcmVzdG9yZSBwbGFpbiBib2R5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgQXJ0aWNsZVZpZXdNb2R1bGVzCiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSB8fCAhJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkQXJ0aWNsZXtCb2R5UGxhaW59OwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FydGljbGVNZW51IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUaWNrZXQgICAgPSAleyAkUGFyYW17VGlja2V0fSB9OwogICAgbXkgJUFydGljbGUgICA9ICV7ICRQYXJhbXtBcnRpY2xlfSB9OwogICAgbXkgJUFjbEFjdGlvbiA9ICV7ICRQYXJhbXtBY2xBY3Rpb259IH07CgogICAgbXkgQE1lbnVJdGVtczsKCiAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc2VsZWN0IHRoZSBvdXRwdXQgdGVtcGxhdGUKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICF+IC9eKG5vdGV8ZW1haWwtbm90aXxjaGF0KS9pICkgewoKICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAmJiAoICRBY2xBY3Rpb25Mb29rdXB7QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgU3RhbmRhcmRSZXNwb25zZXNTdHJnCiAgICAgICAgICAgICAgICBteSAlU3RhbmRhcmRSZXNwb25zZUhhc2ggPSAleyAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXN9IHx8IHt9IH07CgogICAgICAgICAgICAgICAgIyBnZXQgcmV2ZXJzIFN0YW5kYXJkUmVzcG9uc2VIYXNoIGJlY2F1c2Ugd2UgbmVlZCB0byBzb3J0IGJ5IFZhbHVlcwogICAgICAgICAgICAgICAgIyBmcm9tICVSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2ggd2UgZ2V0IHZhbHVlIG9mIEtleSBieSAlU3RhbmRhcmRSZXNwb25zZUhhc2ggVmFsdWUKICAgICAgICAgICAgICAgICMgYW5kIEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkgaXMgY3JlYXRlZCBhcyBhcnJheSBvZiBoYXNoZXMgd2l0aCBlbGVtZW50cyBLZXkgYW5kIFZhbHVlCgogICAgICAgICAgICAgICAgbXkgJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCA9IHJldmVyc2UgJVN0YW5kYXJkUmVzcG9uc2VIYXNoOwogICAgICAgICAgICAgICAgbXkgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSAgICAgICA9IG1hcCB7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoeyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZFJlc3BvbnNlSGFzaDsKCiAgICAgICAgICAgICAgICAjIHVzZSB0aGlzIGFycmF5IHR3aWNlIChhbHNvIGZvciBSZXBseSBBbGwpLCBzbyBjb3B5IGl0IGZpcnN0CiAgICAgICAgICAgICAgICBteSBAU3RhbmRhcmRSZXNwb25zZUFycmF5UmVwbHlBbGwgPSBAU3RhbmRhcmRSZXNwb25zZUFycmF5OwoKICAgICAgICAgICAgICAgIHVuc2hpZnQoCiAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1JlcGx5JykgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBidWlsZCBodG1sIHN0cmluZwogICAgICAgICAgICAgICAgbXkgJFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICBJRCAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1JlcGx5JyksCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5JyAuICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VFbGVtZW50SUQgICAgID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHJlcGx5IGFsbCBpcyBuZWVkZWQKICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoRnJvbSBUbyBDYykpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEFydGljbGV7JEtleX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICcsICc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICRBcnRpY2xleyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJFJlY2lwaWVudENvdW50ID0gMDsKICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbFBhcnNlciA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBAQWRkcmVzc2VzID0gJEVtYWlsUGFyc2VyLT5TcGxpdEFkZHJlc3NMaW5lKCBMaW5lID0+ICRSZWNpcGllbnRzICk7CiAgICAgICAgICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFkZHJlc3MgKEBBZGRyZXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVtYWlsID0gJEVtYWlsUGFyc2VyLT5HZXRFbWFpbEFkZHJlc3MoIEVtYWlsID0+ICRBZGRyZXNzICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQUREUkVTUyBpZiAhJEVtYWlsOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgJElzTG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFJlY2lwaWVudENvdW50ID4gMSApIHsKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRSZXNwb25zZUFycmF5UmVwbHlBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICctICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVwbHkgQWxsJykgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplIFNtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBNZW51SXRlbXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgICAgICAgICAgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPT4gJFN0YW5kYXJkUmVzcG9uc2VzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVwbHkgQWxsJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5QWxsJyAuICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcGx5QWxsICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUVsZW1lbnRJRCAgICAgPT4gJ1Jlc3BvbnNlSURBbGwnIC4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGZvcndhcmQgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAjIChvbmx5IHNob3cgZm9yd2FyZCBvbiBlbWFpbC1leHRlcm5hbCwgZW1haWwtaW50ZXJuYWwsIHBob25lLCB3ZWJyZXF1ZXN0IGFuZCBmYXgKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRGb3J3YXJkfQogICAgICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0Rm9yd2FyZH0KICAgICAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9eKGVtYWlsLWV4dGVybmFsfGVtYWlsLWludGVybmFsfHBob25lfHdlYnJlcXVlc3R8ZmF4KSQvaQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGb3J3YXJkJyk7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbXkgJE9LID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9ICkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtTdGFuZGFyZEZvcndhcmRzfSApICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZEZvcndhcmRzU3RyZwogICAgICAgICAgICAgICAgICAgIG15ICVTdGFuZGFyZEZvcndhcmRIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkRm9yd2FyZHN9IH07CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHJldmVycyBAU3RhbmRhcmRGb3J3YXJkSGFzaCBiZWNhdXNlIHdlIG5lZWQgdG8gc29ydCBieSBWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyRm9yd2FyZCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZEZvcndhcmRIYXNoIFZhbHVlCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgQFN0YW5kYXJkRm9yd2FyZEFycmF5IGlzIGNyZWF0ZWQgYXMgYXJyYXkgb2YgaGFzaGVzIHdpdGggZWxlbWVudHMgS2V5IGFuZCBWYWx1ZQogICAgICAgICAgICAgICAgICAgIG15ICVSZXZlcnNlU3RhbmRhckZvcndhcmQgPSByZXZlcnNlICVTdGFuZGFyZEZvcndhcmRIYXNoOwogICAgICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZEZvcndhcmRBcnJheSAgPSBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJGb3J3YXJkeyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZEZvcndhcmRIYXNoOwoKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRGb3J3YXJkQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICctICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRm9yd2FyZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYnVpbGQgaHRtbCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICBteSAkU3RhbmRhcmRGb3J3YXJkc1N0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgID0+IFxAU3RhbmRhcmRGb3J3YXJkQXJyYXksCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRGb3J3YXJkc1N0cmcgPT4gJFN0YW5kYXJkRm9yd2FyZHNTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0ZvcndhcmQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldEZvcndhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICA9PiAnRm9yd2FyZCcgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGb3J3YXJkRWxlbWVudElEICAgICA9PiAnRm9yd2FyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gVHJhbnNsYXRhYmxlKCdGb3J3YXJkIGFydGljbGUgdmlhIG1haWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdGb3J3YXJkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0Rm9yd2FyZDtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfSIKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGJvdW5jZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICMgKG9ubHkgc2hvdyBmb3J3YXJkIG9uIGVtYWlsLWV4dGVybmFsIGFuZCBlbWFpbC1pbnRlcm5hbAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEJvdW5jZX0KICAgICAgICAgICAgJiYgJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldEJvdW5jZX0KICAgICAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9eKGVtYWlsLWV4dGVybmFsfGVtYWlsLWludGVybmFsKSQvaQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRCb3VuY2UnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0gKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnQm91bmNlIEFydGljbGUgdG8gYSBkaWZmZXJlbnQgbWFpbCBhZGRyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdCb3VuY2UnKSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249QWdlbnRUaWNrZXRCb3VuY2U7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0iCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgc3BsaXQgbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UGhvbmV9CiAgICAgICAgJiYgJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldFBob25lfQogICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSAhfiAvXihjaGF0LWV4dGVybmFsfGNoYXQtaW50ZXJuYWwpJC9pCiAgICAgICAgKQogICAgewoKICAgICAgICBwdXNoIEBNZW51SXRlbXMsIHsKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiBUcmFuc2xhdGFibGUoJ1NwbGl0IHRoaXMgYXJ0aWNsZScpLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1NwbGl0JyksCiAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249QWdlbnRUaWNrZXRQaG9uZTtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfTtMaW5rVGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH0iCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHByaW50IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFByaW50fQogICAgICAgICYmICRBY2xBY3Rpb25Mb29rdXB7QWdlbnRUaWNrZXRQcmludH0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJE9LID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkT0spIHsKCiAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gVHJhbnNsYXRhYmxlKCdQcmludCB0aGlzIGFydGljbGUnKSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUHJpbnQnKSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICJBY3Rpb249QWdlbnRUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfTtBcnRpY2xlTnVtYmVyPSRBcnRpY2xle0NvdW50fSIKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBwbGFpbiBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQbGFpbn0KICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBsYWluVmlldycpCiAgICAgICAgJiYgJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldFBsYWlufQogICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvZW1haWwvaQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkT0sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRPSykgewoKICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiBUcmFuc2xhdGFibGUoJ1ZpZXcgdGhlIHNvdXJjZSBmb3IgdGhpcyBBcnRpY2xlJyksCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1BsYWluIEZvcm1hdCcpLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudFRpY2tldFBsYWluO1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7T3duZXJJRH0KICAgICAgICB8fCAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgICAgICYmICRTZWxmLT57VXNlcklEfSA9PSAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBBbHdheXMgdXNlIHVzZXIgaWQgMSBiZWNhdXNlIG90aGVyIHVzZXJzIGFsc28gaGF2ZSB0byBzZWUgdGhlIGltcG9ydGFudCBmbGFnCiAgICAgICAgbXkgJUFydGljbGVGbGFncyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVJc0ltcG9ydGFudCA9ICRBcnRpY2xlRmxhZ3N7SW1wb3J0YW50fTsKCiAgICAgICAgbXkgJExpbmsKICAgICAgICAgICAgPSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtTdWJhY3Rpb249TWFya0FzSW1wb3J0YW50O1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9IjsKICAgICAgICBteSAkRGVzY3JpcHRpb24gPSBUcmFuc2xhdGFibGUoJ01hcmsnKTsKICAgICAgICBpZiAoJEFydGljbGVJc0ltcG9ydGFudCkgewogICAgICAgICAgICAkRGVzY3JpcHRpb24gPSBUcmFuc2xhdGFibGUoJ1VubWFyaycpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW1wb3J0YW50IG1lbnUgaXRlbQogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgaW50ZXJuYWwgcmVwbHkgbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Tm90ZX0KICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0Tm90ZX0KICAgICAgICAmJiAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gL15ub3RlLShpbnRlcm5hbHxleHRlcm5hbCkkL2kKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRMaW5rICAgICAgICA9ICJBY3Rpb249QWdlbnRUaWNrZXROb3RlO1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O1JlcGx5VG9BcnRpY2xlPSRBcnRpY2xle0FydGljbGVJRH0iOwogICAgICAgIG15ICREZXNjcmlwdGlvbiA9IFRyYW5zbGF0YWJsZSgnUmVwbHkgdG8gbm90ZScpOwoKICAgICAgICAjIHNldCBpbXBvcnRhbnQgbWVudSBpdGVtCiAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBATWVudUl0ZW1zOwp9CgpzdWIgX0FydGljbGVDb2xsZWN0TWV0YSB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQXJ0aWNsZSA9ICV7ICRQYXJhbXtBcnRpY2xlfSB9OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIHdoZXRoZXIgYXV0byBhcnRpY2xlIGxpbmtzIHNob3VsZCBiZSB1c2VkCiAgICByZXR1cm4gaWYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUNvbGxlY3RNZXRhJyk7CiAgICByZXR1cm4gaWYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUNvbGxlY3RNZXRhRmlsdGVycycpOwoKICAgIG15IEBEYXRhOwoKICAgICMgZmluZCB3b3JkcyB0byByZXBsYWNlCiAgICBteSAlQ29uZmlnID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tQ29sbGVjdE1ldGFGaWx0ZXJzJykgfTsKCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlciAoIHZhbHVlcyAlQ29uZmlnICkgewoKICAgICAgICBteSAlRmlsdGVyRGF0YTsKCiAgICAgICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJEZpbHRlci0+e1JlZ0V4cH07CiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRGaWx0ZXItPntNZXRhfTsKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJEZpbHRlci0+e01ldGF9LT57TmFtZX07CiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRGaWx0ZXItPntNZXRhfS0+e1VSTH07CgogICAgICAgICMgaXRlcmFnZSB0aHJvdWdoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIGNyZWF0ZSBhIGhhc2ggd2l0aCBmb3VuZCBtYXRjaGVzCiAgICAgICAgbXkgQE1hdGNoZXM7CiAgICAgICAgZm9yIG15ICRSZWdFeHAgKCBAeyAkRmlsdGVyLT57UmVnRXhwfSB9ICkgewoKICAgICAgICAgICAgbXkgQENvdW50ICAgID0gJFJlZ0V4cCA9fiBte1wofWd4OwogICAgICAgICAgICBteSAkRWxlbWVudHMgPSBzY2FsYXIgQENvdW50OwoKICAgICAgICAgICAgaWYgKCBteSBATWF0Y2hEYXRhID0gJEFydGljbGV7Qm9keX0gPX4gbXsoW1xzOl0kUmVnRXhwKX1neGkgKSB7CiAgICAgICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CgogICAgICAgICAgICAgICAgTUFUQ0g6CiAgICAgICAgICAgICAgICB3aGlsZSAoICRNYXRjaERhdGFbJENvdW50ZXJdICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkV2hvbGVNYXRjaFN0cmluZyA9ICRNYXRjaERhdGFbJENvdW50ZXJdOwogICAgICAgICAgICAgICAgICAgICRXaG9sZU1hdGNoU3RyaW5nID1+IHMvXlxzK3xccyskLy9nOwogICAgICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJFdob2xlTWF0Y2hTdHJpbmcgfSBATWF0Y2hlcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIgKz0gJEVsZW1lbnRzICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBNQVRDSDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICVQYXJ0czsKICAgICAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcnRzeyRffSA9ICRNYXRjaERhdGFbICRDb3VudGVyICsgJF8gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIgKz0gJEVsZW1lbnRzICsgMTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWF0Y2hlcywgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkV2hvbGVNYXRjaFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFydHMgPT4gXCVQYXJ0cywKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIHNjYWxhciBATWF0Y2hlcyApIHsKCiAgICAgICAgICAgICRGaWx0ZXJEYXRhe05hbWV9ID0gJEZpbHRlci0+e01ldGF9LT57TmFtZX07CgogICAgICAgICAgICAjIGl0ZXJhdGUgdHJvdWdoIG1hdGNoZXMgYW5kIGJ1aWxkIFVSTHMgZnJvbSBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGZvciBteSAkTWF0Y2ggKEBNYXRjaGVzKSB7CgogICAgICAgICAgICAgICAgbXkgJE1hdGNoUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRNYXRjaC0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICBteSAkVVJMICAgICAgICA9ICRGaWx0ZXItPntNZXRhfS0+e1VSTH07CiAgICAgICAgICAgICAgICBteSAkVVJMUHJldmlldyA9ICRGaWx0ZXItPntNZXRhfS0+e1VSTFByZXZpZXd9OwoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSB0aGUgd2hvbGUga2V5d29yZAogICAgICAgICAgICAgICAgbXkgJE1hdGNoTGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRNYXRjaC0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAkVVJMICAgICAgICA9fiBzLzxNQVRDSD4vJE1hdGNoTGlua0VuY29kZS9nOwogICAgICAgICAgICAgICAgJFVSTFByZXZpZXcgPX4gcy88TUFUQ0g+LyRNYXRjaExpbmtFbmNvZGUvZzsKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdGhlIGtleXdvcmQgY29tcG9uZW50cwogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJ0ICggc29ydCBrZXlzICV7ICRNYXRjaC0+e1BhcnRzfSB8fCB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRNYXRjaExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkTWF0Y2gtPntQYXJ0c30tPnskUGFydH0gKTsKICAgICAgICAgICAgICAgICAgICAkVVJMICAgICAgICA9fiBzLzxNQVRDSCRQYXJ0Pi8kTWF0Y2hMaW5rRW5jb2RlL2c7CiAgICAgICAgICAgICAgICAgICAgJFVSTFByZXZpZXcgPX4gcy88TUFUQ0gkUGFydD4vJE1hdGNoTGlua0VuY29kZS9nOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJEZpbHRlckRhdGF7TWF0Y2hlc30gfSwgewogICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgPT4gJE1hdGNoLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVVJMICAgICAgICA9PiAkVVJMLAogICAgICAgICAgICAgICAgICAgIFVSTFByZXZpZXcgPT4gJFVSTFByZXZpZXcsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ICAgICA9PiAkRmlsdGVyLT57TWV0YX0tPntUYXJnZXR9IHx8ICdfYmxhbmsnLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBEYXRhLCBcJUZpbHRlckRhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBARGF0YTsKfQoKc3ViIF9Db2xsZWN0QXJ0aWNsZUF0dGFjaG1lbnRzIHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBcnRpY2xlID0gJXsgJFBhcmFte0FydGljbGV9IH07CgogICAgbXkgJUF0dGFjaG1lbnRzOwoKICAgICMgZ2V0IGNvZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBkb3dubG9hZCB0eXBlCiAgICBteSAkVHlwZSA9ICRDb25maWdPYmplY3QtPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKCiAgICAkQXJ0aWNsZXtBdG1Db3VudH0gPSBzY2FsYXIga2V5cyAleyAkQXJ0aWNsZXtBdG1zfSAvLyB7fSB9OwoKICAgICMgaWYgYXR0YWNobWVudCB3aWxsIGJlIGZvcmNlZCB0byBkb3dubG9hZCwgZG9uJ3Qgb3BlbiBhIG5ldyBkb3dubG9hZCB3aW5kb3chCiAgICBteSAkVGFyZ2V0ID0gJ3RhcmdldD0iQXR0YWNobWVudFdpbmRvdyIgJzsKICAgIGlmICggJFR5cGUgPX4gL2lubGluZS9pICkgewogICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgfQoKICAgICRBdHRhY2htZW50c3tab29tQXR0YWNobWVudERpc3BsYXlDb3VudH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6Wm9vbUF0dGFjaG1lbnREaXNwbGF5Q291bnQnKTsKCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICBwdXNoIEB7ICRBdHRhY2htZW50c3tGaWxlc30gfSwgewogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgJXsgJEFydGljbGV7QXRtc30tPnskRmlsZUlEfSB9LAogICAgICAgICAgICBGaWxlSUQgPT4gJEZpbGVJRCwKICAgICAgICAgICAgVGFyZ2V0ID0+ICRUYXJnZXQsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gXCVBdHRhY2htZW50czsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQ7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIFRpY2tldElEIScpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAkUXVldWVJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIFRpY2tldElEIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBjb250ZW50CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKIyAtLS0KICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAjIHNldCBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJy0nOwogICAgJFRpY2tldHtJbXBhY3R9ICAgICAgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAgICAgIHx8ICctJzsKIyAtLS0KICAgIG15IEBDdXN0b21lckFydGljbGVUeXBlcyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVUeXBlTGlzdCggVHlwZSA9PiAnQ3VzdG9tZXInICk7CiAgICBteSBAQXJ0aWNsZUJveCAgICAgICAgICAgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgID0+IFxAQ3VzdG9tZXJBcnRpY2xlVHlwZXMsCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFRpY2tldHtDdXN0b21lcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFRpY2tldHtBZ2V9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJFRpY2tldHtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJwogICAgKTsKICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9ICkgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJy0nOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CiAgICBteSAkUERGT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICBteSAkUHJpbnRlZEJ5ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5Jyk7CiAgICBteSAkVGltZSAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAkVGltZU9iamVjdC0+Q3VycmVudFRpbWVzdGFtcCgpLAogICAgICAgICdEYXRlRm9ybWF0JywKICAgICk7CiAgICBteSAlUGFnZTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAkUGFnZXtNYXhQYWdlc30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgfQogICAgbXkgJEhlYWRlclJpZ2h0CiAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgbXkgJFRpdGxlICAgICAgICA9ICRIZWFkZXJSaWdodDsKICAgIGlmICggJFRpY2tldHtUaXRsZX0gKSB7CiAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICRUaXRsZSAuPSAnIC8gJyAuICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkSGVhZGVyUmlnaHQ7CiAgICAkUGFnZXtIZWFkbGluZUxlZnR9ID0gJEhlYWRsaW5lTGVmdDsKICAgICRQYWdle0Zvb3RlckxlZnR9ICAgPSAnJzsKICAgICRQYWdle1BhZ2VUZXh0fSAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BhZ2UnKTsKICAgICRQYWdle1BhZ2VDb3VudH0gICAgPSAxOwoKICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICRQREZPYmplY3QtPkRvY3VtZW50TmV3KAogICAgICAgIFRpdGxlICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkVGl0bGUsCiAgICAgICAgRW5jb2RlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICApOwoKICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICVQYWdlLAogICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICApOwogICAgJFBhZ2V7UGFnZUNvdW50fSsrOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0IHRpdGxlCiAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgIEZvbnRTaXplID0+IDEzLAogICAgKTsKCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC02LAogICAgKTsKCiAgICAjIG91dHB1dCAicHJpbnRlZCBieSIKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCA9PiAkUHJpbnRlZEJ5IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKScKICAgICAgICAgICAgLiAnLCAnIC4gJFRpbWUsCiAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTQsCiAgICApOwoKICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRJbmZvcygKICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgKTsKCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC02LAogICAgKTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcygKICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgKTsKCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC02LAogICAgKTsKCiAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgaWYgKCVDdXN0b21lckRhdGEpIHsKCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRDdXN0b21lckluZm9zKAogICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBhcnRpY2xlcwogICAgJFNlbGYtPl9QREZPdXRwdXRBcnRpY2xlcygKICAgICAgICBQYWdlRGF0YSAgICA9PiBcJVBhZ2UsCiAgICAgICAgQXJ0aWNsZURhdGEgPT4gXEBBcnRpY2xlQm94LAogICAgKTsKCiAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICBteSAkRmlsZW5hbWUgPSAnVGlja2V0XycgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkVGltZU9iamVjdC0+U3lzdGVtVGltZSgpLAogICAgKTsKICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwogICAgbXkgJFBERlN0cmluZyA9ICRQREZPYmplY3QtPkRvY3VtZW50T3V0cHV0KCk7CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLnBkZiIsCiAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICk7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0SW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gW107CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJENvbmZpZyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRab29tIik7CgogICAgIyBhZGQgdGlja2V0IGRhdGEsIHJlc3BlY3RpbmcgQXR0cmlidXRlc1ZpZXcgY29uZmlndXJhdGlvbgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN0YXRlIFByaW9yaXR5IFF1ZXVlIE93bmVyKSkgewogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN0YXRlIFF1ZXVlIE93bmVyKSkgewojIC0tLQogICAgICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRBdHRyaWJ1dGUpIC4gJzonLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0eyRBdHRyaWJ1dGV9ICkKICAgICAgICAgICAgICAgICAgICB8fCAkVGlja2V0eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRpY2tldCByZXNwb25zaWJsZQogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UmVzcG9uc2libGV9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVzcG9uc2libGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtSZXNwb25zaWJsZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntUeXBlfSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTZXJ2aWNlfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgIH0KCiAgICAjIGFkZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57U0xBfSApCiAgICB7CiAgICAgICAgbXkgJFJvd1NMQSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTTEEnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtTTEF9IHx8ICctJywKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3dTTEEgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgbXkgJFRhYmxlTGVmdEV4dGVuZGVkID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7Q3JpdGljYWxpdHl9KSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW1wYWN0JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQcmlvcml0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtQcmlvcml0eX0pLAogICAgICAgIH0sCiAgICBdOwogICAgcHVzaCBAeyRUYWJsZUxlZnR9LCBAeyRUYWJsZUxlZnRFeHRlbmRlZH07CiMgLS0tCgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lcklEJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFRpY2tldHtBZ2V9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJFRpY2tldHtDcmVhdGVkfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI2YyZjJmMic7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ID0gMDsKICAgIG15ICVUaWNrZXQgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVQYWdlICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRGaWx0ZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRQcmludCIpLT57RHluYW1pY0ZpZWxkfTsKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICREeW5hbWljRmllbGRGaWx0ZXIgfHwge30sCiAgICApOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkIGlmIGlzIG5vdCBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgJFJvdysrOwogICAgICAgICRPdXRwdXQgPSAxOwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAgICAgJFBERk9iamVjdC0+SExpbmUoCiAgICAgICAgICAgIENvbG9yICAgICA9PiAnI2FhYScsCiAgICAgICAgICAgIExpbmVXaWR0aCA9PiAwLjUsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGlja2V0IER5bmFtaWMgRmllbGRzJyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDEwLAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbCcsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDgsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRQREZPYmplY3QtPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBDdXN0b21lckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICAgICAkUERGT2JqZWN0LT5ITGluZSgKICAgICAgICAgICAgQ29sb3IgICAgID0+ICcjYWFhJywKICAgICAgICAgICAgTGluZVdpZHRoID0+IDAuNSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lciBJbmZvcm1hdGlvbicpLAogICAgICAgICAgICBIZWlnaHQgICA9PiAxMCwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWwnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA4LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEFydGljbGVEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRBcnRpY2xlQ291bnRlciA9IDE7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUERGT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgZm9yIG15ICRBcnRpY2xlVG1wICggQHsgJFBhcmFte0FydGljbGVEYXRhfSB9ICkgewoKICAgICAgICBteSAlQXJ0aWNsZSA9ICV7JEFydGljbGVUbXB9OwoKICAgICAgICAjIGdldCBhdHRhY2htZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgIG15ICRBdHRhY2htZW50czsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRBdHRhY2htZW50cyAuPSAkRmlsZXtGaWxlbmFtZX0gLiAnICgnIC4gJEZpbGV7RmlsZXNpemV9IC4gIilcbiI7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGFydGljbGUgaW5mbyB0YWJsZQogICAgICAgIG15ICVUYWJsZVBhcmFtMTsKICAgICAgICBteSAkUm93ID0gMDsKCiAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgYXJ0aWNsZSBudW1iZXIgdGFnCiAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBcnRpY2xlJykgLiAnICMnIC4gJEFydGljbGVDb3VudGVyLAogICAgICAgICAgICBIZWlnaHQgICA9PiAxMCwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWwnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA4LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IDIsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFBhcmFtZXRlcikgLiAnOic7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xleyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAkQXJ0aWNsZXtDcmVhdGVkfSwKICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICApLAogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYnknKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEFydGljbGV7U2VuZGVyVHlwZX0gKTsKICAgICAgICAkUm93Kys7CgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRGaWx0ZXIKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0UHJpbnQiKS0+e0R5bmFtaWNGaWVsZH07CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydBcnRpY2xlJ10sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICREeW5hbWljRmllbGRGaWx0ZXIgfHwge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGUgZHluYW1pYyBmaWVsZCBpZiBpcyBub3QgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICRWYWx1ZSBlcSAiIjsKCiAgICAgICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAgICAgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVmFsdWVTdHJnLT57VmFsdWV9OwogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgfQoKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUeXBlJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gKTsKICAgICAgICAkUm93Kys7CgogICAgICAgIGlmICgkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXR0YWNobWVudCcpIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICBjaG9tcCgkQXR0YWNobWVudHMpOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEF0dGFjaG1lbnRzOwogICAgICAgIH0KICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICRQREZPYmplY3QtPkhMaW5lKAogICAgICAgICAgICBDb2xvciAgICAgPT4gJyNhYWEnLAogICAgICAgICAgICBMaW5lV2lkdGggPT4gMC41LAogICAgICAgICk7CgogICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBpbmZvcykKICAgICAgICAkVGFibGVQYXJhbTF7VHlwZX0gICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTF7Qm9yZGVyfSAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMXtGb250U2l6ZX0gICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmd9ICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ1RvcH0gICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nQm90dG9tfSA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGluZm9zKQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0xID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgfHwgJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJyApCiAgICAgICAgewogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gJEFydGljbGV7Qm9keX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJExpbmVzOwogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEFydGljbGV7Qm9keX0gKSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRBcnRpY2xle0JvZHl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENyZWF0ZVRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkTGluZS0+e0NyZWF0ZVRpbWV9LCAnRGF0ZUZvcm1hdCcgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMaW5lLT57U3lzdGVtR2VuZXJhdGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmVzIC49ICdbJyAuICRDcmVhdGVUaW1lIC4gJ10gJyAuICRMaW5lLT57TWVzc2FnZVRleHR9IC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJ1snCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDcmVhdGVUaW1lIC4gJ10gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e0NoYXR0ZXJOYW1lfSAuICcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJExpbmVzOwogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNmMmYyZjInOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA0OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0yID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtMiwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMntTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRBcnRpY2xlQ291bnRlcisrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJvY2Vzcy5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzczsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyAkU2VsZiwgJFR5cGU7CgogICAgIyBnbG9iYWwgY29uZmlnIGhhc2ggZm9yIGlkIGRpc3NvbHV0aW9uCiAgICAkU2VsZi0+e05hbWVUb0lEfSA9IHsKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgIFN0YXRlICAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgTG9jayAgICAgICAgICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgTG9ja0lEICAgICAgICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgUHJpb3JpdHkgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFByaW9yaXR5SUQgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBRdWV1ZSAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEN1c3RvbWVyICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICBDdXN0b21lcklEICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgQ3VzdG9tZXJObyAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICdDdXN0b21lclVzZXJJRCcsCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgVHlwZUlEICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgU0xBICAgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBTTEFJRCAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNlcnZpY2UgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIEFydGljbGUgICAgICAgID0+ICdBcnRpY2xlJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJFRpY2tldElEICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nSGFzaFJlZjsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwoKICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15ICRTa2lwRmllbGRzID0gWyAnT3duZXInLCAnUmVzcG9uc2libGUnLCAnTG9jaycsICdQZW5kaW5nVGltZScsICdDdXN0b21lcklEJyBdOwoKICAgIGlmICgkVGlja2V0SUQpIHsKCiAgICAgICAgIyBpbmNsdWRlIGV4dHJhIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgIGZvciBteSAkSXRlbSAocXcoU2VydmljZSBTTEEgUXVldWUpKSB7CiAgICAgICAgICAgIHB1c2ggQHskU2tpcEZpZWxkc30sICRJdGVtOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIGNvbmZpZ3VyZWQgcmVxdWlyZWQgcGVybWlzc2lvbgogICAgICAgICMgZm9yIHRoZSBBY3Rpdml0eURpYWxvZyAoaWYgdGhlcmUgaXMgb25lKQogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ1Blcm1pc3Npb24gPSAncncnOwogICAgICAgIGlmICgkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCkgewogICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dIYXNoUmVmID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2dIYXNoUmVmKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkblwndCBnZXQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2dIYXNoUmVmLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uID0gJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1Blcm1pc3Npb259OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJEFjdGl2aXR5RGlhbG9nUGVybWlzc2lvbiwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICk7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uICksCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnQWN0aW9uJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgICAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nSGFzaFJlZikgKSB7CgogICAgICAgICAgICBteSAkUG9zc2libGVBY3Rpdml0eURpYWxvZ3MgPSB7IDEgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfTsKCiAgICAgICAgICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgPT4gJFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzLAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgICAgICAgICA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgICAgICAgICA9PiAnLScsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBBQ0wgcmVzY3RpY3Rpb25zIGV4aXN0CiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZUFjdGl2aXR5RGlhbG9ncykgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxpc3Qgb25seSBBY3RpdmUgcHJvY2Vzc2VzIGJ5IGRlZmF1bHQKICAgIG15IEBQcm9jZXNzU3RhdGVzID0gKCdBY3RpdmUnKTsKCiAgICAjIHNldCBJc01haW5XaW5kb3cgYW5kIElzQWpheFJlcXVlc3QgZm9yIHByb3BlciBlcnJvciByZXNwb25zZXMsIHNjcmVlbiBkaXNwbGF5IGFuZCBwcm9jZXNzIGxpc3QKICAgICRTZWxmLT57SXNNYWluV2luZG93fSAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXNNYWluV2luZG93JyApICB8fCAnJzsKICAgICRTZWxmLT57SXNBamF4UmVxdWVzdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXNBamF4UmVxdWVzdCcgKSB8fCAnJzsKCiAgICAjIGZldGNoIGFsc28gRmFkZUF3YXkgcHJvY2Vzc2VzIHRvIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCBleGlzdGluZyB0aWNrZXRzLCBidXQgbm90IHRvIHN0YXJ0IG5ldwogICAgIyAgICBvbmVzCiAgICBpZiAoICEkU2VsZi0+e0lzTWFpbldpbmRvd30gJiYgJFNlbGYtPntTdWJhY3Rpb259ICkgewogICAgICAgIHB1c2ggQFByb2Nlc3NTdGF0ZXMsICdGYWRlQXdheSc7CiAgICB9CgogICAgIyBnZXQgcHJvY2VzcyBvYmplY3QKICAgIG15ICRQcm9jZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIHRoYXQgY3VzdG9tZXIgY2FuIHN0YXJ0CiAgICBteSAkUHJvY2Vzc0xpc3QgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0xpc3QoCiAgICAgICAgUHJvY2Vzc1N0YXRlID0+IFxAUHJvY2Vzc1N0YXRlcywKICAgICAgICBJbnRlcmZhY2UgICAgPT4gWydDdXN0b21lckludGVyZmFjZSddLAogICAgKTsKCiAgICAjIGFsc28gZ2V0IHRoZSBsaXN0IG9mIHByb2Nlc3NlcyBpbml0aWF0ZWQgYnkgYWdlbnRzLCBhcyBhbiBhY3Rpdml0eSBkaWFsb2cgbWlnaHQgYmUgY29uZmlndXJlZAogICAgIyBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgJEZvbGxvd3VwUHJvY2Vzc0xpc3QgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0xpc3QoCiAgICAgICAgUHJvY2Vzc1N0YXRlID0+IFxAUHJvY2Vzc1N0YXRlcywKICAgICAgICBJbnRlcmZhY2UgICAgPT4gWyAnQWdlbnRJbnRlcmZhY2UnLCAnQ3VzdG9tZXJJbnRlcmZhY2UnIF0sCiAgICApOwoKICAgIG15ICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJvY2Vzc0VudGl0eUlEJyApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgJiYgIUlzSGFzaFJlZldpdGhEYXRhKCRGb2xsb3d1cFByb2Nlc3NMaXN0KSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFByb2Nlc3MgY29uZmlndXJlZCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIHByb2Nlc3MgbGlzdCBmb3IgQUNMcywgdXNlIG9ubHkgZW50aXRpZXMgaW5zdGVhZCBvZiBuYW1lcywgY29udmVydCBmcm9tCiAgICAjICAgUDEgPT4gTmFtZSB0byBQMSA9PiBQMS4gQXMgQUNMcyBzaG91bGQgd29yayBvbmx5IGFnYWluc3QgZW50aXRpZXMKICAgIG15ICVQcm9jZXNzTGlzdEFDTCA9IG1hcCB7ICRfID0+ICRfIH0gc29ydCBrZXlzICV7JFByb2Nlc3NMaXN0fTsKCiAgICAjIHZhbGlkYXRlIHRoZSBQcm9jZXNzTGlzdCB3aXRoIHN0b3JlZCBBQ0xzCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIFJldHVyblR5cGUgICAgID0+ICdQcm9jZXNzJywKICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVQcm9jZXNzTGlzdEFDTCwKICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgJiYgJEFDTCApIHsKCiAgICAgICAgIyBnZXQgQUNMIHJlc3VsdHMKICAgICAgICBteSAlQUNMRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgIyByZWNvdmVyIHByb2Nlc3MgbmFtZXMKICAgICAgICBteSAlUmVkdWNlZFByb2Nlc3NMaXN0ID0gbWFwIHsgJF8gPT4gJFByb2Nlc3NMaXN0LT57JF99IH0gc29ydCBrZXlzICVBQ0xEYXRhOwoKICAgICAgICAjIHJlcGxhY2Ugb3JpZ2luYWwgcHJvY2VzcyBsaXN0IHdpdGggdGhlIHJlZHVjZWQgb25lCiAgICAgICAgJFByb2Nlc3NMaXN0ID0gXCVSZWR1Y2VkUHJvY2Vzc0xpc3Q7CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIG5vIHN1YmFjdGlvbiBkaXNwbGF5IHRoZSBwcm9jZXNzIGxpc3QgdG8gc3RhcnQgYSBuZXcgb25lCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICMgdG8gZGlzcGxheSB0aGUgcHJvY2VzcyBsaXN0IGlzIG1hbmRhdG9yeSB0byBoYXZlIHByb2Nlc3NlcyB0aGF0IGN1c3RvbWVyIGNhbiBzdGFydAogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFByb2Nlc3MgY29uZmlndXJlZCEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByb2Nlc3MgaWQgKGlmIGFueSwgYSBwcm9jZXNzIHNob3VsZCBiZSBwcmUtc2VsZWN0ZWQpCiAgICAgICAgJFBhcmFte1Byb2Nlc3NJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CiAgICAgICAgaWYgKCAkUGFyYW17UHJvY2Vzc0lEfSApIHsKICAgICAgICAgICAgJFBhcmFte1ByZVNlbGVjdFByb2Nlc3N9ID0gMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+X0Rpc3BsYXlQcm9jZXNzTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzTGlzdCAgICAgPT4gJFByb2Nlc3NMaXN0LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB0aGUgc2VsZWN0ZWQgcHJvY2VzcyBmcm9tIHRoZSBsaXN0IGlzIHZhbGlkLCBwcmV2ZW50IHRhbXBlciB3aXRoIHByb2Nlc3Mgc2VsZWN0aW9uCiAgICAjICAgIGxpc3QgKG5vdCBleGlzdGluZywgaW52YWxpZCBhbiBmYWRlIGF3YXkgcHJvY2Vzc2VzIG11c3Qgbm90IGJlIGFibGUgdG8gc3RhcnQgYSBuZXcgcHJvY2VzcwogICAgIyAgICB0aWNrZXQpCiAgICBlbHNpZiAoCiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259IGVxICdEaXNwbGF5QWN0aXZpdHlEaWFsb2dBSkFYJwogICAgICAgICYmICEkUHJvY2Vzc0xpc3QtPnskUHJvY2Vzc0VudGl0eUlEfQogICAgICAgICYmICRTZWxmLT57SXNNYWluV2luZG93fQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyB0cmFuc2xhdGUgdGhlIGVycm9yIG1lc3NhZ2UgKGFzIGl0IHdpbGwgYmUgaW5qZWN0ZWQgaW4gdGhlIEhUTUwpCiAgICAgICAgbXkgJEVycm9yTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVGhlIHNlbGVjdGVkIHByb2Nlc3MgaXMgaW52YWxpZCEiKTsKCiAgICAgICAgIyByZXR1cm4gYSBwcmVkZWZpbmVkIEhUTUwgc2N0cnVjdHVyZSBhcyB0aGUgQUpBWCBjYWxsIGlzIGV4cGVjdGluZyBhbmQgSFRNTCByZXNwb25zZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICc8ZGl2IGNsYXNzPSJTZXJ2ZXJFcnJvciIgZGF0YS1tZXNzYWdlPSInIC4gJEVycm9yTWVzc2FnZSAuICciPjwvZGl2PicsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiBpbnZhbGlkIHByb2Nlc3MgaXMgZGV0ZWN0ZWQgb24gYSBBY3Rpdml0eURpbG9nIHBvcHVwIHNjcmVlbiBzaG93IGFuIGVycm9yIG1lc3NhZ2UKICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZycKICAgICAgICAmJiAhJEZvbGxvd3VwUHJvY2Vzc0xpc3QtPnskUHJvY2Vzc0VudGl0eUlEfQogICAgICAgICYmICEkU2VsZi0+e0lzTWFpbldpbmRvd30KICAgICAgICApCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Byb2Nlc3MgJXMgaXMgaW52YWxpZCEnLCAkUHJvY2Vzc0VudGl0eUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycwogICAgIyBjb2xsZWN0cyBhIG1peHR1cmUgb2YgcHJlc2VudCB2YWx1ZXMgYm90dG9tIHRvIHRvcDoKICAgICMgU3lzQ29uZmlnIERlZmF1bHRWYWx1ZXMsIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMsIFRpY2tldFZhbHVlcywgU3VibWl0dGVkVmFsdWVzCiAgICAjIGluY2x1ZGluZyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBQcm9jZXNzRW50aXR5SUQKICAgICMgaXMgdXNlZCBmb3I6CiAgICAjIC0gUGFyYW1ldGVyIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nCiAgICAjIC0gd2lsbCBiZSB1c2VkIGZvciBBQ0wgY2hlY2tpbmcgbGF0ZXIgb24KICAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5fR2V0UGFyYW0oCiAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICApOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9TdG9yZUFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NOYW1lICAgICA9PiAkUHJvY2Vzc0xpc3QtPnskUHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEaXNwbGF5QWN0aXZpdHlEaWFsb2cnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgIHJldHVybiAkU2VsZi0+X091dHB1dEFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nQUpBWCcgJiYgJFByb2Nlc3NFbnRpdHlJRCApIHsKCiAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nSFRNTCA9ICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQWN0aXZpdHlEaWFsb2dIVE1MLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwoKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fUmVuZGVyQWpheCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1N1YmFjdGlvbiBpcyBpbnZhbGlkIScpLAogICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICk7Cn0KCnN1YiBfUmVuZGVyQWpheCB7CgogICAgIyBGYXRhbEVycm9yIGlzIHNhZmUgYmVjYXVzZSBhIEpTT04gc3RydWN0dXJlIGlzIGV4cGVjdGluZywgdGhlbiBpdCB3aWxsIHJlc3VsdCBpbnRvIGEKICAgICMgY29tbXVuaWNhdGlvbnMgZXJyb3IKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KFByb2Nlc3NFbnRpdHlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJBamF4JyApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFte0dldFBhcmFtfXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfTsKICAgIGlmICggISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywgJ19SZW5kZXJBamF4JyApLAogICAgICAgICk7CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ05vIEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyZWQgZm9yICVzIGluIF9SZW5kZXJBamF4IScsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAlRmllbGRzUHJvY2Vzc2VkOwogICAgbXkgQEpTT05Db2xsZWN0b3I7CiAgICBteSAkU2VydmljZXM7CgogICAgIyBBbGwgc3VibWl0dGVkIER5bmFtaWNGaWVsZHMKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgZ2V0IGJhY2tlbmQgb2JqZWN0CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgKTsKCiAgICAjIHJlZHVjZSB0aGUgZHluYW1pYyBmaWVsZHMgdG8gb25seSB0aGUgb25lcyB0aGF0IGFyZSBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSBAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBwdXNoIEBDdXN0b21lckR5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CiAgICAkRHluYW1pY0ZpZWxkID0gXEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZENoZWNrUGFyYW07CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQ2hlY2tQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRDaGVja1BhcmFtOwoKICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15ICRTa2lwRmllbGRzID0gWyAnT3duZXInLCAnUmVzcG9uc2libGUnLCAnTG9jaycsICdQZW5kaW5nVGltZScsICdDdXN0b21lcklEJyBdOwoKICAgICMgR2V0IHRoZSBhY3Rpdml0eSBkaWFsb2cncyBTdWJtaXQgUGFyYW0ncyBvciBDb25maWcgUGFyYW1zCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgKCBncmVwIHsgJF8gZXEgJEN1cnJlbnRGaWVsZCB9IEB7JFNraXBGaWVsZHN9ICk7CgogICAgICAgICMgU2tpcCBpZiB3ZSdyZSB3b3JraW5nIG9uIGEgZmllbGQgdGhhdCB3YXMgYWxyZWFkeSBkb25lIHdpdGggb3Igd2l0aG91dCBJRAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0KICAgICAgICAgICAgJiYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnUXVldWVJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRRdWV1ZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBRdWV1ZSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1N0YXRlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U3RhdGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgU3RhdGUgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17R2V0UGFyYW19eyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1ByaW9yaXR5SUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoICRQYXJhbXtHZXRQYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtHZXRQYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0dldFBhcmFtfS0+e1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGRfSVRTTUltcGFjdH0KICAgICAgICAgICAgKSB7CgogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHByaW9yaXR5IGZyb20gdGhlIENJUCBtYXRyaXgKICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlERnJvbUltcGFjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBQcmlvcml0eSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFByaW9yaXR5SURGcm9tSW1wYWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICAgICAjIGFkZCBQcmlvcml0eSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTZXJ2aWNlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZXJ2aWNlcyA9ICREYXRhOwoKICAgICAgICAgICAgIyBhZGQgU2VydmljZSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlcnZpY2VJRCBmcm9tIHdlYiByZXF1ZXN0KQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU0xBSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAjIGlmIFNMQSBpcyByZW5kZXIgYmVmb3JlIHNlcnZpY2UgKGJ5IGl0IG9yZGVyIGluIHRoZSBmaWVsZHMpIGl0IG5lZWRzIHRvIGNyZWF0ZQogICAgICAgICAgICAjIHRoZSBzZXJ2aWNlIGxpc3QKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFNlcnZpY2VzKSApIHsKICAgICAgICAgICAgICAgICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBTTEEgdG8gdGhlIEpTT05Db2xsZWN0b3IgKFVzZSBTZWxlY3RlZElEIGZyb20gd2ViIHJlcXVlc3QpCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU0xBSUQnICkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdUeXBlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFkZCBUeXBlIHRvIHRoZSBKU09OQ29sbGVjdG9yIChVc2UgU2VsZWN0ZWRJRCBmcm9tIHdlYiByZXF1ZXN0KS4KICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUeXBlSUQnICkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTiggW0BKU09OQ29sbGVjdG9yXSApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCiMgPWl0ZW0gX0dldFBhcmFtKCkKIwojIHJldHVybnMgdGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBvZiB0aGUgc3VibWl0dGVkIGluZm9ybWF0aW9uCiMKIyBUaGlzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgdGhlIGRpZmZlcmVudCBjYWxsZXJzOgojCiMgICAgIEluaXRpYWwgY2FsbCB3aXRoIHNlbGVjdGVkIFByb2Nlc3M6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIERlZmF1bHRWYWx1ZXMgZm9yIHRoZSBjb25maWd1cmVkIEZpZWxkcyBpbiB0aGF0IEFjdGl2aXR5RGlhbG9nCiMgICAgICAgICBEZWZhdWx0VmFsdWVzIGZvciB0aGUgNCByZXF1aXJlZCBGaWVsZHMgUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eQojCiMgICAgIEZpcnN0IFN0b3JlIGNhbGwgc3VibWl0dGluZyBhbiBBY3Rpdml0eSBEaWFsb2c6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIFN1Ym1pdHRlZFZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgQWN0aXZpdHlEaWFsb2cKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMgZm9yIGludmlzaWJsZSBmaWVsZHMgb2YgdGhhdCBBY3Rpdml0eURpYWxvZwojICAgICAgICAgRGVmYXVsdFZhbHVlcyBmb3IgdGhlIDQgcmVxdWlyZWQgRmllbGRzIFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkKIyAgICAgICAgICAgICBpZiBub3QgY29uZmlndXJlZCBpbiB0aGUgQWN0aXZpdHlEaWFsb2cKIwojICAgICBBY3Rpdml0eURpYWxvZyBmaWxsb3V0IHJlcXVlc3Qgb24gZXhpc3RpbmcgVGlja2V0OgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBUaWNrZXRWYWx1ZXMKIwojICAgICBBY3Rpdml0eURpYWxvZyBzdG9yZSByZXF1ZXN0IG9yIEFqYXhVcGRhdGUgcmVxdWVzdCBvbiBleGlzdGluZyBUaWNrZXRzOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBUaWNrZXRWYWx1ZXMgZm9yIGFsbCBub3QtU3VibWl0dGVkIFZhbHVlcwojICAgICAgICAgU3VibWl0dGVkIFZhbHVlcwojCiMgICAgIG15ICRHZXRQYXJhbSA9IF9HZXRQYXJhbSgKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAojICAgICApOwojCiMgPWN1dAoKc3ViIF9HZXRQYXJhbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICNteSAkSXNBSkFYVXBkYXRlID0gJFBhcmFte0FKQVh9IHx8ICcnOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUHJvY2Vzc0VudGl0eUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX0dldFBhcmFtJyApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIG15ICVHZXRQYXJhbTsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAkUHJvY2Vzc0VudGl0eUlEICAgICAgICA9ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9OwogICAgbXkgJFRpY2tldElEICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnLAogICAgKTsKICAgIG15ICRBY3Rpdml0eUVudGl0eUlEOwogICAgbXkgJVZhbHVlc0dvdHRlbjsKICAgIG15ICRWYWx1ZTsKCiAgICAjIElmIHdlIGdvdCBubyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBubyBUaWNrZXRJRAogICAgIyB3ZSBoYXZlIHRvIGdldCB0aGUgUHJvY2Vzc2VzJyBTdGFydHBvaW50CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAmJiAhJFRpY2tldElEICkgewogICAgICAgIG15ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nCiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyktPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICB8fCAhJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnR290IG5vIFN0YXJ0IEFjdGl2aXR5RW50aXR5SUQgb3IgU3RhcnQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBmb3IgUHJvY2VzczogJXMgaW4gX0dldFBhcmFtIScsCiAgICAgICAgICAgICAgICAkUHJvY2Vzc0VudGl0eUlECiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfTsKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCAgICAgICA9ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9OwogICAgfQoKICAgIG15ICRBY3Rpdml0eURpYWxvZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKS0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDb3VsZG5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLCAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGlmIHRoZXJlIGlzIGEgdGlja2V0IHRoZW4gaXMgbm90IGFuIEFKQVggcmVxdWVzdAogICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAlR2V0UGFyYW0gPSAlVGlja2V0OwogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUdldFBhcmFtICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGRuXCd0IGdldCBUaWNrZXQgZm9yIFRpY2tldElEOiAlcyBpbiBfR2V0UGFyYW0hJywgJFRpY2tldElEICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoIlByb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCIpCiAgICAgICAgfTsKICAgICAgICBpZiAoICEkQWN0aXZpdHlFbnRpdHlJRCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnQ291bGRuXCd0IGRldGVybWluZSBBY3Rpdml0eUVudGl0eUlELiBEeW5hbWljRmllbGQgb3IgQ29uZmlnIGlzblwndCBzZXQgcHJvcGVybHkhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KICAgICRHZXRQYXJhbXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSA9ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEOwogICAgJEdldFBhcmFte0FjdGl2aXR5RW50aXR5SUR9ICAgICAgID0gJEFjdGl2aXR5RW50aXR5SUQ7CiAgICAkR2V0UGFyYW17UHJvY2Vzc0VudGl0eUlEfSAgICAgICAgPSAkUHJvY2Vzc0VudGl0eUlEOwoKICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15ICRTa2lwRmllbGRzID0gWyAnT3duZXInLCAnUmVzcG9uc2libGUnLCAnTG9jaycsICdQZW5kaW5nVGltZScsICdDdXN0b21lcklEJyBdOwoKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICApOwoKICAgICMgZ2V0IGJhY2tlbmQgb2JqZWN0CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIHJlZHVjZSB0aGUgZHluYW1pYyBmaWVsZHMgdG8gb25seSB0aGUgb25lcyB0aGF0IGFyZSBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSBAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBwdXNoIEBDdXN0b21lckR5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CiAgICAkRHluYW1pY0ZpZWxkID0gXEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CgogICAgIyBHZXQgdGhlIGFjdGl2aXR5ZGlhbG9ncydzIFN1Ym1pdCBQYXJhbSdzIG9yIENvbmZpZyBQYXJhbXMKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewoKICAgICAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAoIGdyZXAgeyAkXyBlcSAkQ3VycmVudEZpZWxkIH0gQHskU2tpcEZpZWxkc30gKTsKCiAgICAgICAgIyBTa2lwIGlmIHdlJ3JlIHdvcmtpbmcgb24gYSBmaWVsZCB0aGF0IHdhcyBhbHJlYWR5IGRvbmUgd2l0aCBvciB3aXRob3V0IElECiAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSAmJiAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwoKICAgICAgICAgICAgIyBHZXQgdGhlIENvbmZpZyBvZiB0aGUgY3VycmVudCBEeW5hbWljRmllbGQgKHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBncmVwIHJlc3VsdCBhcnJheSkKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJER5bmFtaWNGaWVsZE5hbWUgfSBAeyREeW5hbWljRmllbGR9IClbMF07CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKCiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJFBhcmFte0ZpZWxkTmFtZX0sIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IER5bmFtaWNGaWVsZCBWYWx1ZXMKICAgICAgICAgICAgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5IGZyb20gdGhlIHNlcnZpY2UKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkTmFtZSBlcSAnSVRTTUNyaXRpY2FsaXR5JyAmJiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZXJ2aWNle0NyaXRpY2FsaXR5fTsKICAgICAgICAgICAgfQojIC0tLQoKICAgICAgICAgICAgIyBJZiB3ZSBnb3QgYSBzdWJtaXR0ZWQgcGFyYW0sIHRha2UgaXQgYW5kIG5leHQgb3V0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFZhbHVlCiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgJFZhbHVlIGVxICcnCiAgICAgICAgICAgICAgICAgICAgfHwgSXNTdHJpbmdXaXRoRGF0YSgkVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgfHwgSXNBcnJheVJlZldpdGhEYXRhKCRWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB8fCBJc0hhc2hSZWZXaXRoRGF0YSgkVmFsdWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IGhhdmUgYSBQYXJhbSBWYWx1ZSB0cnkgdGhlIHRpY2tldCBWYWx1ZQogICAgICAgICAgICAjIG5leHQgb3V0IGlmIGl0IHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldHskQ3VycmVudEZpZWxkfQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gZXEgJycKICAgICAgICAgICAgICAgICAgICB8fCBJc1N0cmluZ1dpdGhEYXRhKCAkVGlja2V0eyRDdXJyZW50RmllbGR9ICkKICAgICAgICAgICAgICAgICAgICB8fCBJc0FycmF5UmVmV2l0aERhdGEoICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gKQogICAgICAgICAgICAgICAgICAgIHx8IElzSGFzaFJlZldpdGhEYXRhKCAkVGlja2V0eyRDdXJyZW50RmllbGR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFRpY2tldHskQ3VycmVudEZpZWxkfTsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgd2UgaGFkIG5laWdodGVyIHN1Ym1pdHRlZCBub3IgdGlja2V0IHBhcmFtIGdldCB0aGUgQWN0aXZpdHlEaWFsb2cncyBkZWZhdWx0IFZhbHVlCiAgICAgICAgICAgICMgbmV4dCBvdXQgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgJFZhbHVlID0gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIGhhZCBubyBzdWJtaXR0ZWQsIHRpY2tldCBvciBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICMgdXNlIHRoZSBEeW5hbWljRmllbGQncyBkZWZhdWx0IHZhbHVlIGFuZCBuZXh0IG91dAogICAgICAgICAgICAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGFsbCB0aGF0IGZhaWxlZCB0aGVuIHRoZSBmaWVsZCBzaG91bGQgbm90IGhhdmUgYSBkZWZpbmVkIHZhbHVlIG90aGVyd2lzZQogICAgICAgICAgICAjIGlmIGEgdmFsdWUgKGV2ZW4gZW1wdHkpIGlzIHNlbnQsIGZpZWxkcyBsaWtlIERhdGUgb3IgRGF0ZVRpbWUgd2lsbCBtYXJrIHRoZSBmaWVsZCBhcwogICAgICAgICAgICAjIHVzZWQgd2l0aCB0aGUgZmllbGQgZGlzcGxheSB2YWx1ZSwgdGhpcyBjb3VsZCBsZWFkIHRvIHVud2FudGVkIGZpZWxkIHNldHMsCiAgICAgICAgICAgICMgc2VlIGJ1ZyM5MTU5CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhcnRpY2xlIGZpZWxkcwogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CgogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKTsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICk7CiAgICAgICAgICAgIEB7ICRHZXRQYXJhbXtJbmZvcm1Vc2VySUR9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVmFsdWVzR290dGVue0FydGljbGV9ID0gMSBpZiAoICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkR2V0UGFyYW17Qm9keX0gKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBOb24gRHluYW1pY0ZpZWxkcwogICAgICAgICMgMS4gdHJ5IHRvIGdldCB0aGUgcmVxdWlyZWQgcGFyYW0KICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSApOwoKICAgICAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgYW4gSUQgZmllbGQgbWFrZSBzdXJlIHRoZSB2YWx1ZSB3aXRob3V0IElEIHdvbid0IGJlIGluIHRoZQogICAgICAgICAgICAjICVHZXRQYXJhbSBIYXNoIGFueSBtb3JlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gPX4gbXsoLiopSUQkfXhtcyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskMX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gICAgID0gJFZhbHVlOwogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgSWYgd2UgZ290IHRpY2tldCBwYXJhbXMsIHRoZSBHZXRQYXJhbSBIYXNoIHdhcyBhbHJlYWR5IGZpbGxlZCBiZWZvcmUgdGhlIGxvb3AKICAgICAgICAjIGFuZCB3ZSBjYW4gbmV4dCBvdXQKICAgICAgICBpZiAoICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApIHsKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIFN1Ym1pdHRlZCBub3JlIFRpY2tldCBQYXJhbSBnZXQgQWN0aXZpdHlEaWFsb2cgQ29uZmlnJ3MgUGFyYW0KICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgbmUgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICAkVmFsdWUgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgfQogICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CiAgICB9CiAgICBSRVFVSVJFREZJRUxETE9PUDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkIChxdyhRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5KSkgewogICAgICAgICRWYWx1ZSA9IHVuZGVmOwogICAgICAgIGlmICggISRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdCRDdXJyZW50RmllbGQiKTsKICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUHJvY2Vzczo6RGVmYXVsdCVzIENvbmZpZyBWYWx1ZSBtaXNzaW5nIScsICRDdXJyZW50RmllbGQgKTsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFsc28gdGhlIElEcyBmb3IgdGhlIFJlcXVpcmVkIGZpbGVzIChpZiB0aGV5IGFyZSBub3QgcHJlc2VudCkKICAgIGlmICggJEdldFBhcmFte1F1ZXVlfSAmJiAhJEdldFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJEdldFBhcmFte1F1ZXVlfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17U3RhdGV9ICYmICEkR2V0UGFyYW17U3RhdGVJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTG9va3VwKCBTdGF0ZSA9PiAkR2V0UGFyYW17U3RhdGV9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtMb2NrfSAmJiAhJEdldFBhcmFte0xvY2tJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0xvY2tJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpLT5Mb2NrTG9va3VwKCBMb2NrID0+ICRHZXRQYXJhbXtMb2NrfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHl9ICYmICEkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICBQcmlvcml0eSA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhbmQgZmluYWxseSB3ZSdsbCBoYXZlIHRoZSBzcGVjaWFsIHBhcmFtZXRlcnM6CiAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsJyApOwogICAgJEdldFBhcmFte093bmVyQWxsfSAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbCcgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKTsKIyAtLS0KCiAgICByZXR1cm4gXCVHZXRQYXJhbTsKfQoKc3ViIF9PdXRwdXRBY3Rpdml0eURpYWxvZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFRpY2tldElEICAgICAgICAgICAgICAgPSAkUGFyYW17R2V0UGFyYW19e1RpY2tldElEfTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFte0dldFBhcmFtfXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgQ2hlY2sgbmVlZGVkIHBhcmFtZXRlcnM6CiAgICAjIFByb2Nlc3NFbnRpdHlJRCBvbmx5CiAgICAjIFRpY2tldElEIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgIGlmICggISRQYXJhbXtQcm9jZXNzRW50aXR5SUR9IHx8ICggISRUaWNrZXRJRCAmJiAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSApIHsKICAgICAgICBteSAkTWVzc2FnZSA9IFRyYW5zbGF0YWJsZSgnR290IG5vIFByb2Nlc3NFbnRpdHlJRCBvciBUaWNrZXRJRCBhbmQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCEnKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nOwogICAgbXkgJVRpY2tldDsKICAgIG15ICVFcnJvciAgICAgICAgPSAoKTsKICAgIG15ICVFcnJvck1lc3NhZ2UgPSAoKTsKCiAgICAjIElmIHdlIGhhZCBFcnJvcnMsIHdlIGdvdCBhbiBFcnJvciBoYXNoCiAgICAlRXJyb3IgICAgICAgID0gJXsgJFBhcmFte0Vycm9yfSB9ICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgKTsKICAgICVFcnJvck1lc3NhZ2UgPSAleyAkUGFyYW17RXJyb3JNZXNzYWdlfSB9IGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvck1lc3NhZ2V9ICkgKTsKCiAgICAjIGdldCBwcm9jZXNzIG9iamVjdAogICAgbXkgJFByb2Nlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICEkVGlja2V0SUQgKSB7CiAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgU3RhcnRBY3Rpdml0eURpYWxvZyBhbmQgU3RhcnRBY3Rpdml0eURpYWxvZyBmb3IgdGhlIFByb2Nlc3NFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gQUpBWCB1cGRhdGUgaW4gdGhpcyBwYXJ0CiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NhblwndCBnZXQgVGlja2V0ICIlcyIhJywgJFBhcmFte1RpY2tldElEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZFByb2Nlc3NJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKTsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQWN0aXZpdHlJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEJyk7CgogICAgICAgIGlmICggISRUaWNrZXR7JER5bmFtaWNGaWVsZFByb2Nlc3NJRH0gfHwgISRUaWNrZXR7JER5bmFtaWNGaWVsZEFjdGl2aXR5SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ2FuXCd0IGdldCBQcm9jZXNzRW50aXR5SUQgb3IgQWN0aXZpdHlFbnRpdHlJRCBmb3IgVGlja2V0ICIlcyIhJywgJFBhcmFte1RpY2tldElEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cgPSB7CiAgICAgICAgICAgIEFjdGl2aXR5ICAgICAgID0+ICRUaWNrZXR7JER5bmFtaWNGaWVsZEFjdGl2aXR5SUR9LAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRBY3Rpdml0eSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKS0+QWN0aXZpdHlHZXQoCiAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0KICAgICk7CiAgICBpZiAoICEkQWN0aXZpdHkgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5IGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fQogICAgICAgICk7CgogICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICk7CgogICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdyZXAgb3V0IE92ZXJ3cml0ZXMgaWYgZGVmaW5lZCBvbiB0aGUgQWN0aXZpdHkKICAgIG15IEBPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlciA9IGdyZXAgewogICAgICAgIHJlZiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99IGVxICdIQVNIJwogICAgICAgICAgICAmJiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9CiAgICAgICAgICAgICYmICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gZXEKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317T3ZlcndyaXRlfSApCiAgICB9IGtleXMgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9IH07CgogICAgIyBsZXQgdGhlIE92ZXJ3cml0ZXMgT3ZlcndyaXRlIHRoZSBBY3Rpdml0eURpYWxvZydzIEhhc2ggdmFsdWVzCiAgICBpZiAoICRPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlclswXSApIHsKICAgICAgICAleyRBY3Rpdml0eURpYWxvZ30gPSAoCiAgICAgICAgICAgICV7JEFjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyAkT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXJbMF0gfXtPdmVyd3JpdGV9IH0KICAgICAgICApOwogICAgfQoKICAgICMgQWRkIFBhZ2VIZWFkZXIsIE5hdmJhciwgRm9ybWhlYWRlciAoUHJvY2Vzcy9BY3Rpdml0eURpYWxvZ0hlYWRlcikKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkTWFpbkJveENsYXNzOwoKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgZ2l2ZW4gbm90aWZ5IG1lc3NhZ2VzIGlmIHRoaXMgaXMgbm90IGFuIEFKQVggcmVxdWVzdAogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZ5fSApICkgewoKICAgICAgICAgICAgZm9yIG15ICROb3RpZnlEYXRhICggQHsgJFBhcmFte05vdGlmeX0gfSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCAleyROb3RpZnlEYXRhfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQWN0aXZpdHlEaWFsb2ctPntOYW1lfSApCiAgICAgICAgICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGRlc2NyaXB0aW9ucwogICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0CiAgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZwogICAgICAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkgKSB7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgY29tcGxldGUgaGVhZGVyIGFuZCBuYXYgYmFyIGluIGFqYXggZGlhbG9ncyB3aGVuIHRoZXJlIGlzIGEgc2VydmVyIGVycm9yCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBkaXNwbGF5IG9yaWdpbmFsIGhlYWRlciB0ZXh0cyAodGhlIHByb2Nlc3MgbGlzdCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5KQogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0UHJvY2VzcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgTWFpbkJveCBjbGFzcyB0byBhZGQgY29ycmVjdCBib3JkZXJzIHRvIHRoZSBzY3JlZW4KICAgICAgICAkTWFpbkJveENsYXNzID0gJ01haW5Cb3gnOwogICAgfQoKICAgICMgU2hvdyBkZXNjcmlwdGlvbnMgaWYgYWN0aXZpdHkgaXMgYSBmaXJzdCBzY3JlZW4uIFNlZSBidWcjMTI2NDkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uU2hvcnRBbHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydAogICAgICAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uTG9uZ0FsdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcKICAgICAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGNsb3NlICYgY2FuY2VsIGxpbmsgaWYgbmVjZXNzYXJ5CiAgICBpZiAoICEkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17UmVuZGVyTG9ja2VkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FuY2VsTGluaycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQ3VzdG9tZXJBY3Rpdml0eURpYWxvZ0hlYWRlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRm9ybU5hbWUgICAgICAgICAgICAgICA9PiAnQWN0aXZpdHlEaWFsb2dEaWFsb2cnIC4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgID0+ICdTdG9yZUFjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0e1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICAgICAgICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfQogICAgICAgICAgICAgICAgfHwgJFRpY2tldHsKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBJc01haW5XaW5kb3cgPT4gJFNlbGYtPntJc01haW5XaW5kb3d9LAogICAgICAgICAgICBNYWluQm94Q2xhc3MgPT4gJE1haW5Cb3hDbGFzcyB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAlUmVuZGVyZWRGaWVsZHMgPSAoKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBmaWVsZHMgd2hlcmUgdGhlIEFKQVggbG9hZGVyIGljb24gc2hvdWxkIGFwcGVhciBvbiBBSkFYIHVwZGF0ZXMgdHJpZ2dlcmVkCiAgICAjIGJ5IEFjdGl2aXR5RGlhbG9nIGZpZWxkcwogICAgbXkgJEFKQVhVcGRhdGFibGVGaWVsZHMgPSAkU2VsZi0+X0dldEFKQVhVcGRhdGFibGVGaWVsZHMoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZHMgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfSwKICAgICk7CgogICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgJFNraXBGaWVsZHMgPSBbICdPd25lcicsICdSZXNwb25zaWJsZScsICdMb2NrJywgJ1BlbmRpbmdUaW1lJywgJ0N1c3RvbWVySUQnIF07CgogICAgIyBMb29wIHRocm91Z2ggQWN0aXZpdHlEaWFsb2dGaWVsZHMgYW5kIHJlbmRlciB0aGVpciBvdXRwdXQKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewoKICAgICAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAoIGdyZXAgeyAkXyBlcSAkQ3VycmVudEZpZWxkIH0gQHskU2tpcEZpZWxkc30gKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gKSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBkYXRhIGZvciBGaWVsZCAiJXMiIG9mIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVGaWVsZERhdGEgPSAleyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICMgV2UgcmVuZGVyIGp1c3QgdmlzaWJsZSBBY3Rpdml0eURpYWxvZ0ZpZWxkcwogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgISRGaWVsZERhdGF7RGlzcGxheX07CgogICAgICAgICMgcmVuZGVyIER5bmFtaWNGaWVsZHMKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwogICAgICAgICAgICBteSAkUmVzcG9uc2UgICAgICAgICA9ICRTZWxmLT5fUmVuZGVyRHluYW1pY0ZpZWxkKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgPT4gXCVFcnJvck1lc3NhZ2UgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKCiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBTdGF0ZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnU3RhdGVJRCcgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgV2UgZG9uJ3QgcmVuZGVyIEZpZWxkcyB0d2ljZSwKICAgICAgICAgICAgIyBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhIENvbmZpZyB3aXRob3V0IElELCBza2lwIHRoaXMgZmllbGQKICAgICAgICAgICAgIyBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTdGF0ZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBRdWV1ZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnUXVldWVJRCcgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyUXVldWUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgUHJpb3JpdHkKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1ByaW9yaXR5SUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclByaW9yaXR5KAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFNlcnZpY2UKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyU2VydmljZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU0xBCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdTTEFJRCcgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyU0xBKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFRpdGxlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdUaXRsZScgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclRpdGxlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIEFydGljbGUKICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0FydGljbGUnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckFydGljbGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEluZm9ybUFnZW50cyAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+e0FydGljbGV9LT57Q29uZmlnfS0+e0luZm9ybUFnZW50c30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFR5cGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1R5cGVJRCcgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgV2UgZG9uJ3QgcmVuZGVyIEZpZWxkcyB0d2ljZSwKICAgICAgICAgICAgIyBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhIENvbmZpZyB3aXRob3V0IElELCBza2lwIHRoaXMgZmllbGQKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyVHlwZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGb290ZXJDU1NDbGFzcyA9ICdGb290ZXInOwoKICAgIGlmICggJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSApIHsKCiAgICAgICAgIyBEdWUgdG8gdGhlIGluaXRpYWwgbG9hZGluZyBvZgogICAgICAgICMgdGhlIGZpcnN0IEFjdGl2aXR5RGlhbG9nIGFmdGVyIFByb2Nlc3Mgc2VsZWN0aW9uCiAgICAgICAgIyB3ZSBoYXZlIHRvIGJpbmQgdGhlIEFqYXhVcGRhdGUgRnVuY3Rpb24gb24KICAgICAgICAjIHRoZSBzZWxlY3RzLCBzbyB3ZSBnZXQgdGhlIGNvbXBsZXRlIEpTT25Eb2N1bWVudENvbXBsZXRlIGNvZGUKICAgICAgICAjIGFuZCBkZWxpdmVyIGl0IGluIHRoZSBGb290ZXJKUyBibG9jay4KICAgICAgICAjIFRoaXMgSmF2YXNjcmlwdCBQYXJ0IGlzIGV4ZWN1dGVkIGluCiAgICAgICAgIyBDdXN0b21lclRpY2tldFByb2Nlc3MudHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9vdGVySlMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgICRGb290ZXJDU1NDbGFzcyA9ICdDZW50ZXJlZCc7CiAgICB9CgogICAgIyBzZXQgc3VibWl0IGJ1dHRvbiBkYXRhCiAgICBteSAkQnV0dG9uVGV4dCAgPSAnU3VibWl0JzsKICAgIG15ICRCdXR0b25UaXRsZSA9ICdTYXZlJzsKICAgIG15ICRCdXR0b25JRCAgICA9ICdTdWJtaXQnIC4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ307CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9ICkgewogICAgICAgICRCdXR0b25UZXh0ICA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgICAgICRCdXR0b25UaXRsZSA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0Zvb3RlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvb3RlckNTU0NsYXNzID0+ICRGb290ZXJDU1NDbGFzcywKICAgICAgICAgICAgQnV0dG9uVGV4dCAgICAgPT4gJEJ1dHRvblRleHQsCiAgICAgICAgICAgIEJ1dHRvblRpdGxlICAgID0+ICRCdXR0b25UaXRsZSwKICAgICAgICAgICAgQnV0dG9uSUQgICAgICAgPT4gJEJ1dHRvbklECiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRBZHZpY2VUZXh0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VibWl0QWR2aWNlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWR2aWNlVGV4dCA9PiAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRBZHZpY2VUZXh0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVsb2FkIHBhcmVudCB3aW5kb3cKICAgIGlmICggJFBhcmFte1BhcmVudFJlbG9hZH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcmVudFJlbG9hZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCB0aGUgRm9ybUZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9DdXN0b21lckFjdGl2aXR5RGlhbG9nRm9vdGVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICApOwoKICAgICMgZGlzcGxheSByZWd1bGFyIGZvb3RlciBvbmx5IGluIG5vbi1hamF4IGNhc2UKICAgIGlmICggISRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlciggVHlwZSA9PiAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCcgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9SZW5kZXJEeW5hbWljRmllbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIEZpZWxkTmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyRHluYW1pY0ZpZWxkJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIG9iamVjdAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICRQYXJhbXtGaWVsZE5hbWV9IH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICBteSAkTWVzc2FnZSA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICBIVE1MICAgID0+ICcnLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICk7CgogICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgIyBBbGwgVGlja2V0IER5bmFtaWNGaWVsZHMKICAgICAgICAjIHVzZWQgZm9yIEFDTCBjaGVja2luZwogICAgICAgIG15ICVEeW5hbWljRmllbGRDaGVja1BhcmFtID0gbWFwIHsgJF8gPT4gJFBhcmFte0dldFBhcmFtfXskX30gfQogICAgICAgICAgICBncmVwIHtte15EeW5hbWljRmllbGRffXhtc30gKCBrZXlzICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgICAgIG15ICRBQ0wgICAgICAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGQgICA9PiBcJUR5bmFtaWNGaWVsZENoZWNrUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFNlcnZlckVycm9yOwogICAgbXkgJEVycm9yTWVzc2FnZTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yfS0+eyAkUGFyYW17RmllbGROYW1lfSB9CiAgICAgICAgICAgICYmICRQYXJhbXtFcnJvcn0tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VydmVyRXJyb3IgPSAxOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtGaWVsZE5hbWV9IH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyLAogICAgICAgIFVwZGF0YWJsZUZpZWxkcyAgICAgID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkU2VydmVyRXJyb3IsCiAgICAgICAgRXJyb3JNZXNzYWdlICAgICAgICAgPT4gJEVycm9yTWVzc2FnZSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTmFtZSAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgTGFiZWwgICA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICBDb250ZW50ID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6RHluYW1pY0ZpZWxkJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30KICAgICAgICAgICAgICAgIHx8ICdydzpEeW5hbWljRmllbGQ6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0R5bmFtaWNGaWVsZCcgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVGl0bGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclRpdGxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVGl0bGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBWYWx1ZSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17VGl0bGV9LAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1RpdGxlJ30gKSB7CiAgICAgICAgJERhdGF7U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvVGl0bGUnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJBcnRpY2xlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIFRpY2tldCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQXJ0aWNsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckFydGljbGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdBcnRpY2xlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICAgICAgU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtCb2R5fSwKICAgICAgICBMYWJlbFN1YmplY3QgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0NvbmZpZ30tPntMYWJlbFN1YmplY3R9CiAgICAgICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU3ViamVjdCIpLAogICAgICAgIExhYmVsQm9keSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntDb25maWd9LT57TGFiZWxCb2R5fQogICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRleHQiKSwKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnQXJ0aWNsZVN1YmplY3QnfSApIHsKICAgICAgICAkRGF0YXtTdWJqZWN0U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J0FydGljbGVCb2R5J30gKSB7CiAgICAgICAgJERhdGF7Qm9keVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkFydGljbGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhblN1YmplY3QnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbkJvZHknLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkFydGljbGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17SW5mb3JtQWdlbnRzfSApIHsKCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJEdJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1RpY2tldH0tPntRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAzLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkFydGljbGU6SW5mb3JtQWdlbnQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQXJ0aWNsZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyQ3VzdG9tZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyQ3VzdG9tZXInICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwoKICAgIG15ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9OwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsQ3VzdG9tZXJVc2VyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpLAogICAgICAgIExhYmVsQ3VzdG9tZXJJRCAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lclVzZXJJRFNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVySUR9ICkgewogICAgICAgICREYXRhe0N1c3RvbWVySURTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICgKICAgICAgICAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICRQYXJhbXtUaWNrZXR9LT57Q3VzdG9tZXJVc2VySUR9ICkKICAgICAgICB8fCAkU3VibWl0dGVkQ3VzdG9tZXJVc2VySUQKICAgICAgICApCiAgICB7CiAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICB8fCAkUGFyYW17VGlja2V0fXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY3VzdG9tZXIgZmllbGQgYXMgIkZpcnN0TmFtZSBMYXN0bmFtZSIgPE1haWxBZGRyZXNzPgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVDdXN0b21lclVzZXJEYXRhICkgKSB7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJVc2VySUR9ID0gIlwiJEN1c3RvbWVyVXNlckRhdGF7VXNlckZpcnN0bmFtZX0gIiAuCiAgICAgICAgICAgICIkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTGFzdG5hbWV9XCIgPCRDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH0+IjsKICAgICAgICAkRGF0YXtDdXN0b21lcklEfSAgICAgICAgICAgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gfHwgJyc7CiAgICAgICAgJERhdGF7U2VsZWN0ZWRDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlcklEfSAgICAgICAgIHx8ICcnOwogICAgfQoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhICAgICA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICAgICAgTm9RdW90ZXMgPT4gMCwKICAgICk7CiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkSlNPTjsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6Q3VzdG9tZXInLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkN1c3RvbWVyOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6Q3VzdG9tZXI6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9DdXN0b21lcicgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyU0xBIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTTEEnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTTEEnICksCiAgICAgICAgfTsKICAgIH0KICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU0xBIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBTTEEgb2JqZWN0CiAgICBteSAkU0xBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwoKICAgIG15ICRTTEFJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTTEFJRH07CiAgICBpZiAoJFNMQUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCggU0xBSUQgPT4gJFNMQUlEUGFyYW0gKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTTEEnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTTEEgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTTEEgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntTTEF9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnU0xBSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgU0xBIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTTEFzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTTEEnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlNMQTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlNMQTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1NMQScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyU2VydmljZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU2VydmljZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclNlcnZpY2UnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlNlcnZpY2UiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgIG15ICRTZXJ2aWNlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U2VydmljZUlEfTsKICAgIGlmICgkU2VydmljZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnU2VydmljZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57U2VydmljZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTZXJ2aWNlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgU2VydmljZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBUcmVlVmlldyAgICAgID0+ICRUcmVlVmlldywKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U2VydmljZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U2VydmljZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlNlcnZpY2U6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TZXJ2aWNlJyApLAogICAgfTsKCn0KCnN1YiBfUmVuZGVyUHJpb3JpdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclByaW9yaXR5JyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyUHJpb3JpdHknICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJQcmlvcml0eSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBwcmlvcml0eSBvYmplY3QKICAgIG15ICRQcmlvcml0eU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpOwoKICAgIG15ICRQcmlvcml0eUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1ByaW9yaXR5SUR9OwogICAgaWYgKCRQcmlvcml0eUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXR5SURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1ByaW9yaXR5JyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57UHJpb3JpdHl9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnUHJpb3JpdHlJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBidWlsZCBuZXh0IFByaW9yaXRpZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UHJpb3JpdHknLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlByaW9yaXR5OkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6UHJpb3JpdHk6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Qcmlvcml0eScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUXVldWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclF1ZXVlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyUXVldWUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUXVldWVzID0gJFNlbGYtPl9HZXRRdWV1ZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVG8gcXVldWUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBxdWV1ZSBvYmplY3QKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgaWYgd2UgZ290IFF1ZXVlSUQgYXMgUGFyYW0gZnJvbSB0aGUgR1VJCiAgICBteSAkUXVldWVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtRdWV1ZUlEfTsKICAgIGlmICgkUXVldWVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdRdWV1ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1F1ZXVlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1F1ZXVlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgbmV4dCBxdWV1ZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFF1ZXVlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBUcmVlVmlldyAgICAgID0+ICRUcmVlVmlldywKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgKTsKCiAgICAkRGF0YXtGaWVsZHNUb1VwZGF0ZX0gPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlU3RyZygKICAgICAgICBUcmlnZ2VyRmllbGQgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlF1ZXVlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpRdWV1ZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlF1ZXVlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUXVldWUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclN0YXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTdGF0ZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclN0YXRlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFN0YXRlcyA9ICRTZWxmLT5fR2V0U3RhdGVzKCAleyAkUGFyYW17VGlja2V0fSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICBteSAkU3RhdGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTdGF0ZUlEfTsKICAgIGlmICgkU3RhdGVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKCBTdGF0ZUlEID0+ICRTdGF0ZUlEUGFyYW0gKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTdGF0ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgU3RhdGUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1N0YXRlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1N0YXRlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFN0YXRlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgIyBzZXQgZmllbGRzIHRoYXQgd2lsbCBnZXQgYW4gQUpBWCBsb2FkZXIgaWNvbiB3aGVuIHRoaXMgZmllbGQgY2hhbmdlcwogICAgJERhdGF7RmllbGRzVG9VcGRhdGV9ID0gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZVN0cmcoCiAgICAgICAgVHJpZ2dlckZpZWxkICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTdGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U3RhdGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTdGF0ZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1N0YXRlJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJUeXBlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVHlwZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHR5cGUgb2JqZWN0CiAgICBteSAkVHlwZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CgogICAgbXkgJFR5cGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtUeXBlSUR9OwogICAgaWYgKCRUeXBlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGVJRCA9PiAkVHlwZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdUeXBlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRUeXBlT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntUeXBlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1R5cGVJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRUeXBlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICMgc2V0IGZpZWxkcyB0aGF0IHdpbGwgZ2V0IGFuIEFKQVggbG9hZGVyIGljb24gd2hlbiB0aGlzIGZpZWxkIGNoYW5nZXMKICAgICREYXRhe0ZpZWxkc1RvVXBkYXRlfSA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGVTdHJnKAogICAgICAgIFRyaWdnZXJGaWVsZCAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6VHlwZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1R5cGUnICksCiAgICB9Owp9CgpzdWIgX1N0b3JlQWN0aXZpdHlEaWFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9OwogICAgbXkgJFByb2Nlc3NTdGFydHBvaW50OwogICAgbXkgJVRpY2tldDsKICAgIG15ICRQcm9jZXNzRW50aXR5SUQ7CiAgICBteSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgIG15ICVFcnJvcjsKICAgIG15ICVFcnJvck1lc3NhZ2U7CgogICAgbXkgJVRpY2tldFBhcmFtOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19LT57QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBY3Rpdml0eURpYWxvZ0VudGl0eUlEIG1pc3NpbmchJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkblwndCBnZXQgQ29uZmlnIGZvciBBY3Rpdml0eURpYWxvZ0VudGl0eUlEICIlcyIhJywgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSwKICAgICAgICApOwogICAgfQoKICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICBteSAkSXNVcGxvYWQgPSAwOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgIG15IEBBdHRhY2htZW50SURzID0gbWFwIHsKICAgICAgICBteSAoJElEKSA9ICRfID1+IG17IFxBIEF0dGFjaG1lbnREZWxldGUgKFxkKykgXHogfXhtczsKICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgIH0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICBDT1VOVDoKICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgbXkgJERlbGV0ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgIG5leHQgQ09VTlQgaWYgISREZWxldGU7CiAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgKTsKICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgfQoKICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgJElzVXBsb2FkICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAlRXJyb3IgICAgICAgICAgICAgICAgICAgPSAoKTsKICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIG9iamVjdAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgJFNraXBGaWVsZHMgPSBbICdPd25lcicsICdSZXNwb25zaWJsZScsICdMb2NrJywgJ1BlbmRpbmdUaW1lJywgJ0N1c3RvbWVySUQnIF07CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgIGlmICggISRJc1VwbG9hZCApIHsKCiAgICAgICAgIyBjaGVjayBlYWNoIEZpZWxkIG9mIGFuIEFjdGl2aXR5IERpYWxvZyBhbmQgZmlsbCB0aGUgZXJyb3IgaGFzaCBpZiBzb21ldGhpbmcgZ29lcyBob3JyaWJseSB3cm9uZwogICAgICAgIG15ICVDaGVja2VkRmllbGRzOwogICAgICAgIERJQUxPR0ZJRUxEOgogICAgICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAoIGdyZXAgeyAkXyBlcSAkQ3VycmVudEZpZWxkIH0gQHskU2tpcEZpZWxkc30gKTsKCiAgICAgICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwoKICAgICAgICAgICAgICAgICMgR2V0IHRoZSBDb25maWcgb2YgdGhlIGN1cnJlbnQgRHluYW1pY0ZpZWxkICh0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ3JlcCByZXN1bHQgYXJyYXkpCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gKCBncmVwIHsgJF8tPntOYW1lfSBlcSAkRHluYW1pY0ZpZWxkTmFtZSB9IEB7JER5bmFtaWNGaWVsZH0gKVswXTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgPSAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkUGFyYW17RmllbGROYW1lfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBXaWxsIGJlIGV4dGVuZGVkIGxhdGVyIG9uIGZvciBBQ0wgQ2hlY2tpbmc6CiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGFuIGludmlzaWJsZSBmaWVsZCwgdXNlIGNvbmZpZ3VyYXRpb24gZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH17RGlzcGxheX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcnOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgSVRTTUNyaXRpY2FsaXR5IGlzIHN0b3JlZCwgZXZlbiBpZiB0aGlzIGZpZWxkIGlzIGludmlzaWJsZQogICAgICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZE5hbWUgZXEgJ0lUU01Dcml0aWNhbGl0eScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH07CiAgICAgICAgICAgICAgICAgICAgfQojIC0tLQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb25seSB2YWxpZGF0ZSB2aXNpYmxlIGZpZWxkcwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBEeW5hbWljRmllbGQgVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfS0+e0Rpc3BsYXl9ID09IDIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdleyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgSW4gY2FzZSBvZiBEeW5hbWljRmllbGRzIHRoZXJlIGlzIG5vIE5hbWVUb0lEIHRyYW5zbGF0aW9uCiAgICAgICAgICAgICAgICAjIHNvIGp1c3QgdGFrZSB0aGUgRHluYW1pY0ZpZWxkIG5hbWUKICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lcklEJwogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfTsKCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRQYXJhbXtHZXRQYXJhbX0tPntDdXN0b21lcklEfSB8fCAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIGlmICggISRDdXN0b21lcklEICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJJRCd9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfSA9ICRDdXN0b21lcklEOwoKICAgICAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSBUaWNrZXRDcmVhdGUgbmVlZHMgJ0N1c3RvbWVyVXNlcicgYXMgcGFyYW0gaW5zdGVhZCBvZiAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJVc2VySUQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkVXNlcklEJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyVXNlcklEICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2tpcCBpZiB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgSUQgb3IgTmFtZQogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X0NoZWNrRmllbGQoCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAleyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIEFydGljbGUgKFN1YmplY3QgJiBCb2R5KQogICAgICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXJ0aWNsZVBhcnQgKHF3KFN1YmplY3QgQm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtHZXRQYXJhbX0tPnskQXJ0aWNsZVBhcnR9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBmb3IgZWFjaCBwYXJ0IChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAnQXJ0aWNsZScgLiAkQXJ0aWNsZVBhcnQgfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWxsIG90aGVyIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gJFJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQE5vdGlmeTsKCiAgICBteSAkTmV3VGlja2V0SUQ7CiAgICBpZiAoICEkVGlja2V0SUQgKSB7CgogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19LT57UHJvY2Vzc0VudGl0eUlEfTsKICAgICAgICBpZiAoICEkUHJvY2Vzc0VudGl0eUlEICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTWlzc2luZyBQcm9jZXNzRW50aXR5SUQsIGNoZWNrIHlvdXIgQWN0aXZpdHlEaWFsb2dIZWFkZXIudHQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc1N0YXJ0cG9pbnQgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUHJvY2Vzc1N0YXJ0cG9pbnQKICAgICAgICAgICAgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzU3RhcnRwb2ludCkKICAgICAgICAgICAgfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fTsKCiAgICAgICAgTkVFREVETE9PUDoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSkpIHsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskTmVlZGVkfSB9ICkgewoKICAgICAgICAgICAgICAgICMgaWYgYSByZXF1aXJlZCBmaWVsZCBoYXMgbm8gdmFsdWUgY2FsbCBfQ2hlY2tGaWVsZCBhcyBmaWxlZCBpcyBoaWRkZW4KICAgICAgICAgICAgICAgICMgKE5vIERpc3BsYXkgcGFyYW0gPSBEaXNwbGF5ID0+IDApIGFuZCBubyBEZWZhdWx0VmFsdWUsIHRvIHVzZSBnbG9iYWwgZGVmYXVsdCBhcwogICAgICAgICAgICAgICAgIyBmYWxsLWJhY2suIE9uZSByZWFzb24gZm9yIHRoaXMgdG8gaGFwcGVuIGlzIHRoYXQgQWN0aXZpdHlEaWFsb2cgRGVmYXVsdFZhbHVlIHRyaWVkCiAgICAgICAgICAgICAgICAjIHRvIHNldCBiZWZvcmUsIHdhcyBub3QgdmFsaWQuCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9DaGVja0ZpZWxkKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRTZWxmLT57TmFtZVRvSUR9LT57JE5lZWRlZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAkUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhZCBubyBFcnJvcnMsIHdlIGNhbiBjcmVhdGUgdGhlIFRpY2tldCBhbmQgU2V0IEFjdGl2aXR5RW50aXR5SUQgYXMgd2VsbCBhcwogICAgICAgICMgUHJvY2Vzc0VudGl0eUlECiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9ICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0gPSAkU2VsZi0+e1VzZXJMb2dpbn07CiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtPd25lcklEfSAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7CiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7CgogICAgICAgICAgICBpZiAoICEkVGlja2V0UGFyYW17T3duZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte093bmVySUR9ID0gJFBhcmFte0dldFBhcmFtfS0+e093bmVySUR9IHx8IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgU3RhcnRBY3Rpdml0eURpYWxvZyBkb2VzIG5vdCBwcm92aWRlIGEgdGlja2V0IHRpdGxlIHNldCBhIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFte1RpdGxlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgY3VycmVudCBzZXJ2ZXIgVGltZXN0YW1wCiAgICAgICAgICAgICAgICBteSAkQ3VycmVudFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtUaXRsZX0gPSAiJFBhcmFte1Byb2Nlc3NOYW1lfSAtICRDdXJyZW50VGltZVN0YW1wIjsKCiAgICAgICAgICAgICAgICAjIHVzZSBhcnRpY2xlIHN1YmplY3QgZnJvbSB0aGUgd2ViIHJlcXVlc3QgaWYgYW55CiAgICAgICAgICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSApICkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtUaXRsZX0gPSAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IHRpY2tldAogICAgICAgICAgICAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoJVRpY2tldFBhcmFtKTsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBjcmVhdGUgdGlja2V0IGZvciBQcm9jZXNzIHdpdGggUHJvY2Vzc0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0KICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBzZXQgUHJvY2Vzc0VudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwgJFRpY2tldElECiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gdW5kZWY7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBzZXQgQWN0aXZpdHlFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sICRUaWNrZXRJRAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBzdG9yZSBBY3Rpdml0eURpYWxvZywgaW52YWxpZCBUaWNrZXRJRDogJXMhJywgJFRpY2tldElEICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoCgogICAgICAgICAgICAgICAgIyAyLiByZW1vdmUgIkR5bmFtaWNGaWVsZF8iIGZyb20gc3RyaW5nCiAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgIG15ICRGaWVsZCA9ICRfOwogICAgICAgICAgICAgICAgICAgICRGaWVsZCA9fiBze15EeW5hbWljRmllbGRfKC4qKX17JDF9eG1zOwoKICAgICAgICAgICAgICAgICAgICAjIDMuIGdyZXAgZnJvbSB0aGUgRHluYW1pY0ZpZWxkQ29uZmlncyB0aGUgcmVzdWx0aW5nIER5bmFtaWNGaWVsZHMgd2l0aG91dAogICAgICAgICAgICAgICAgICAgICMgIkR5bmFtaWNGaWVsZF8iCiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7ICRfLT57TmFtZX0gZXEgJEZpZWxkIH0gQHskRHluYW1pY0ZpZWxkfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgMS4gZ3JlcCBhbGwgRHluYW1pY0ZpZWxkcwogICAgICAgICAgICAgICAgZ3JlcCB7bXteRHluYW1pY0ZpZWxkXyguKil9eG1zfSBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGFuZCBub3cgaXQncyBlYXN5LCBqdXN0IHN0b3JlIHRoZSBkeW5hbWljIEZpZWxkIFZhbHVlcyA7KQogICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXRQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBuZXcgY3JlYXRlZCBUaWNrZXRJRAogICAgICAgICAgICAkTmV3VGlja2V0SUQgPSAkVGlja2V0SUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgSWYgd2UgaGFkIGEgVGlja2V0SUQsIGdldCB0aGUgVGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgVGlja2V0IHRvIGNoZWNrIFRpY2tldElEIHdhcyB2YWxpZAogICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHN0b3JlIEFjdGl2aXR5RGlhbG9nLCBpbnZhbGlkIFRpY2tldElEOiAlcyEnLCAkVGlja2V0SUQgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEJykKICAgICAgICB9OwogICAgICAgIGlmICggISRBY3Rpdml0eUVudGl0eUlEICkKICAgICAgICB7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93RGlhbG9nRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTWlzc2luZyBBY3Rpdml0eUVudGl0eUlEIGluIFRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBhY3Rpdml0eSBkaWFsb2cgdG8gc2F2ZSBpcyBzdGlsbCB0aGUgY29ycmVjdCBhY3Rpdml0eQogICAgICAgIG15ICRBY3Rpdml0eSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKS0+QWN0aXZpdHlHZXQoCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJEFjdGl2aXR5RW50aXR5SUQsCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gWydDdXN0b21lckludGVyZmFjZSddLAogICAgICAgICk7CiAgICAgICAgbXkgJUFjdGl2aXR5RGlhbG9ncyA9IHJldmVyc2UgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9IC8vIHt9IH07CiAgICAgICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nc3skQWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRIb29rICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyk7CiAgICAgICAgICAgIG15ICRUaWNrZXRIb29rRGl2aWRlciA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpOwoKICAgICAgICAgICAgJEVycm9ye1dyb25nQWN0aXZpdHl9ID0gMTsKICAgICAgICAgICAgcHVzaCBATm90aWZ5LCB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaGlzIHN0ZXAgZG9lcyBub3QgYmVsb25nIGFueW1vcmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkgaW4gcHJvY2VzcyBmb3IgdGlja2V0IFwnJXMlcyVzXCchIEFub3RoZXIgdXNlciBjaGFuZ2VkIHRoaXMgdGlja2V0IGluIHRoZSBtZWFudGltZS4gUGxlYXNlIGNsb3NlIHRoaXMgd2luZG93IGFuZCByZWxvYWQgdGhlIHRpY2tldC4nLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRIb29rLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRIb29rRGl2aWRlciwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3NFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50UHJvY2Vzc0lEJykKICAgICAgICB9OwoKICAgICAgICBpZiAoICEkUHJvY2Vzc0VudGl0eUlEICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dEaWFsb2dFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdNaXNzaW5nIFByb2Nlc3NFbnRpdHlJRCBpbiBUaWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgd2UgZ290IGVycm9ycyBnbyBiYWNrIHRvIGRpc3BsYXlpbmcgdGhlIEFjdGl2aXR5RGlhbG9nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQgfHwgdW5kZWYsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlICAgICAgICAgICA9PiBcJUVycm9yTWVzc2FnZSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICBOb3RpZnkgICAgICAgICAgICAgICAgID0+IFxATm90aWZ5LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB3ZSBkZWFsIHdpdGggYSBUaWNrZXQgVXBkYXRlCiAgICBteSAkVXBkYXRlVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9OwoKICAgICMgV2Ugc2F2ZSBvbmx5IG9uY2UsIG5vIG1hdHRlciBpZiBvbmUgb3IgbW9yZSBjb25maWd1cmF0aW9ucyBhcmUgc2V0IGZvciB0aGUgc2FtZSBwYXJhbQogICAgbXkgJVN0b3JlZEZpZWxkczsKCiAgICAjIFNhdmUgbG9vcCBmb3Igc3RvcmluZyBUaWNrZXQgVmFsdWVzIHRoYXQgd2VyZSBub3QgcmVxdWlyZWQgb24gdGhlIGluaXRpYWwgVGlja2V0Q3JlYXRlCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgKCBncmVwIHsgJF8gZXEgJEN1cnJlbnRGaWVsZCB9IEB7JFNraXBGaWVsZHN9ICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgZGF0YSBmb3IgRmllbGQgIiVzIiBvZiBBY3Rpdml0eURpYWxvZyAiJXMiIScsICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSAgID0gJDE7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCBEeW5hbWljRmllbGQgdmFsdWUgZm9yICVzIG9mIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLCAkVGlja2V0SUQsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyAmJiAoICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQgKSApIHsKCiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSAmJiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgbm90ZQogICAgICAgICAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJE1pbWVUeXBlICA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIENoYW5nZSBoaXN0b3J5IHR5cGUgYW5kIGNvbW1lbnQgYWNjb3JkaW5nbHkgdG8gdGhlIHByb2Nlc3MgYXJ0aWNsZS4KICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlVHlwZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPntBcnRpY2xlfS0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX07CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeVR5cGU7CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeUNvbW1lbnQgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVUeXBlIGVxICdwaG9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlID0gJ1Bob25lQ2FsbEN1c3RvbWVyJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGVUeXBlIGVxICd3ZWJyZXF1ZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeVR5cGUgPSAnV2ViUmVxdWVzdEN1c3RvbWVyJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5VHlwZSAgICA9ICdBZGROb3RlJzsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUNvbW1lbnQgPSAnTm90ZSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICA9PiAnY3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICA9PiAkSGlzdG9yeVR5cGUsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICA9PiAnJSUnIC4gJEhpc3RvcnlDb21tZW50LAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgPT4gJEFydGljbGVUeXBlLAogICAgICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+e0FydGljbGV9LT57Q29uZmlnfS0+e0luZm9ybUFnZW50c30KICAgICAgICAgICAgICAgICAgICA/ICRQYXJhbXtHZXRQYXJhbX17SW5mb3JtVXNlcklEfQogICAgICAgICAgICAgICAgICAgIDogW10sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIHRvIFVwZGF0ZSBhIHRpY2tldCwgdXBkYXRlIHRoZSB0cmFuc21pdHRlZCB2YWx1ZXMKICAgICAgICBlbHNpZiAoJFVwZGF0ZVRpY2tldElEKSB7CgogICAgICAgICAgICBteSAkU3VjY2VzczsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnVGl0bGUnICkgewoKICAgICAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGl0bGUsIG5vdGhpZyBpcyBuZWVkZWQgdG8gYmUgZG9uZQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfQogICAgICAgICAgICAgICAgICAgIHx8ICggZGVmaW5lZCAkVGlja2V0UGFyYW17J1RpdGxlJ30gJiYgJFRpY2tldFBhcmFteydUaXRsZSd9IGVxICcnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNldCB0aGUgdGlja2V0IHRpdGxlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkVGlja2V0UGFyYW17J1RpdGxlJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJJRCcKICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9e0Rpc3BsYXl9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXcm9uZyBBY3Rpdml0eURpYWxvZyBGaWVsZCBjb25maWc6ICVzIGNhblwndCBiZSBEaXNwbGF5ID0+IDEgLyBTaG93IGZpZWxkIChQbGVhc2UgY2hhbmdlIGl0cyBjb25maWd1cmF0aW9uIHRvIGJlIERpc3BsYXkgPT4gMCAvIERvIG5vdCBzaG93IGZpZWxkIG9yIERpc3BsYXkgPT4gMiAvIFNob3cgZmllbGQgYXMgbWFuZGF0b3J5KSEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBza2lwIFRpY2tldEN1c3RvbWVyU2V0KCkgaWYgdGhlcmUgaXMgbm8gY2hhbmdlIGluIHRoZSBjdXN0b21lcgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7Q3VzdG9tZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgYWRkaXRpb25hbCBzdG9yZXMKICAgICAgICAgICAgICAgICAgICAjIG9uIEN1c3RvbWVyLCBDdXN0b21lck5vLCBDdXN0b21lcklEIG9yIEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgTm8gPT4gJFRpY2tldFBhcmFte0N1c3RvbWVySUR9LAoKICAgICAgICAgICAgICAgICAgICAjIGhlcmUgdG9vOiB1bmZvcnR1bmF0ZWx5IFRpY2tldENyZWF0ZSB0YWtlcyBQYXJhbSAnQ3VzdG9tZXJVc2VyJwogICAgICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBDdXN0b21lclVzZXJJRCwgc28gb3VyIFRpY2tldFBhcmFtIGhhc2gKICAgICAgICAgICAgICAgICAgICAjIGhhcyB0aGUgQ3VzdG9tZXJVc2VyIEtleSBpbnN0ZWFkIG9mICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICAgICBVc2VyICAgICA9PiAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgYWRkaXRpb25hbCBzdG9yZXMKICAgICAgICAgICAgICAgICMgb24gQ3VzdG9tZXIsIEN1c3RvbWVyTm8sIEN1c3RvbWVySUQgb3IgQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgICAgICMgc28gbWFrZSBzdXJlIGJvdGggZmllbGRzIGFyZSBzZXQgdG8gIlN0b3JlZCIgOykKICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICAgICAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lclVzZXJJRCd9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIG15ICRUaWNrZXRGaWVsZFNldFN1YiA9ICRDdXJyZW50RmllbGQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RmllbGRTZXRTdWIgPX4gc3tJRCR9e314bXM7CiAgICAgICAgICAgICAgICAkVGlja2V0RmllbGRTZXRTdWIgPSAnVGlja2V0JyAuICRUaWNrZXRGaWVsZFNldFN1YiAuICdTZXQnOwoKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldE9iamVjdC0+Y2FuKCRUaWNrZXRGaWVsZFNldFN1YikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRVcGRhdGVGaWVsZE5hbWU7CgogICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgPSAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9OwoKICAgICAgICAgICAgICAgICAgICAjIHRvIHN0b3JlIGlmIHRoZSBmaWVsZCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkVXBkYXRlOwoKICAgICAgICAgICAgICAgICAgICAjIG9ubHkgU2VydmljZSBhbmQgU0xBIGZpZWxkcyBhY2NlcHRzIGVtcHR5IHZhbHVlcyBpZiB0aGUgaGFzaCBrZXkgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmVkIHNldCBpdCB0byBlbXB0eSBzbyB0aGUgVGlja2V0KlNldCBmdW5jdGlvbiBjYWxsIHdpbGwgZ2V0IHRoZSBlbXB0eQogICAgICAgICAgICAgICAgICAgICMgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICggJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJyB8fCAkVXBkYXRlRmllbGROYW1lIGVxICdTTEFJRCcgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgU2VydmljZSBhbiBTTEEgZmllbGRzIGlmIHRoZXkgaGF2ZSBhIGRlZmluZWQgdmFsdWUgKGV2ZW4gZW1wdHkpCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVXBkYXRlRmllbGROYW1lIGVxICdTZXJ2aWNlSUQnIHx8ICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NMQUlEJyApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgYW55IG90aGVyIGZpZWxkIHRoYXQgaXRzIHZhbHVlIGlzIGRlZmluZWQgYW5kIG5vdCBlbXB0eQogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSBuZSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVXBkYXRlRmllbGROYW1lIG5lICdTTEFJRCcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSBuZSAnJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAgICAgICAgICAgICAgICBpZiAoJEZpZWxkVXBkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+JFRpY2tldEZpZWxkU2V0U3ViKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9PiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc2V0ICVzIGZvciBUaWNrZXQgd2l0aCBJRCAiJXMiIGluIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZCwgJFRpY2tldElELCAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgVHJhbnNpdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IHRpY2tldCBldmVudCBtb2R1bGUgKFRpY2tldFByb2Nlc3NUcmFuc2l0aW9ucy5wbSkuCgogICAgIyBpZiB3ZSB3ZXJlIHVwZGF0aW5nIGEgdGlja2V0LCBjbG9zZSB0aGUgcG9wdXAgYW5kIHJldHVybiB0byB6b29tCiAgICAjIGVsc2UgKG5ldyB0aWNrZXQpIGp1c3QgZ28gdG8gem9vbSB0byBzaG93IHRoZSBuZXcgdGlja2V0CiAgICBpZiAoJFVwZGF0ZVRpY2tldElEKSB7CgogICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUN1c3RvbWVyVGlja2V0Wm9vbTtUaWNrZXRJRD0kVXBkYXRlVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgIE9QID0+ICJBY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIsCiAgICApOwp9CgpzdWIgX0Rpc3BsYXlQcm9jZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgSWYgd2UgaGF2ZSBhIFByb2Nlc3NFbnRpdHlJRAogICAgJFBhcmFte0Vycm9yc30tPntQcm9jZXNzRW50aXR5SURJbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InCiAgICAgICAgaWYgKCAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSAmJiAhJFBhcmFte1Byb2Nlc3NMaXN0fS0+eyAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSB9ICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkUGFyYW17UHJvY2Vzc0xpc3R9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1Byb2Nlc3NFbnRpdHlJREludmFsaWR9IHx8ICcgJyApLAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17UHJvY2Vzc0xpc3R9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvY2Vzc0VudGl0eUlEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgQXV0b0NvbXBsZXRlID0+ICdvZmYnLAogICAgKTsKCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtQcmVTZWxlY3RQcm9jZXNzfSAmJiAkUGFyYW17UHJvY2Vzc0lEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlU2VsZWN0UHJvY2VzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUHJvY2Vzc0lEID0+ICRQYXJhbXtQcm9jZXNzSUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0xpc3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lclRpY2tldFByb2Nlc3MnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHdvcmthcm91bmQgd2hlbiBhY3Rpdml0eSBkaWFsb2cgaXMgbG9hZGVkIGJ5IEFKQVggYXMgZmlyc3QgYWN0aXZpdHkgZGlhbG9nLCBpZiB0aGVyZSBpcwogICAgIyBhIGRhdGUgZmllbGQgbGlrZSBQZW5kaW5nIFRpbWUgb3IgRHluYW1pYyBGaWVsZHMgRGF0ZS9UaW1lIG9yIERhdGUsIHRoZXJlIGlzIG5vIHdheSB0byBzZXQKICAgICMgdGhpcyBvcHRpb25zIGluIHRoZSBmb290ZXIgYWdhaW4KICAgICRMYXlvdXRPYmplY3QtPntIYXNEYXRlcGlja2VyfSA9IDE7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojID1pdGVtIF9DaGVja0ZpZWxkKCkKIwojIGNoZWNrcyBhbGwgdGhlIHBvc3NpYmxlIHRpY2tldCBmaWVsZHMgYW5kIHJldHVybnMgdGhlIElEIChpZiBwb3NzaWJsZSkgdmFsdWUgb2YgdGhlIGZpZWxkLCBpZiB2YWxpZAojIGFuZCBjaGVja3MgYXJlIHN1Y2Nlc3NmdWxsCiMKIyBpZiBEaXNwbGF5IHBhcmFtIGlzIHNldCB0byAwIG9yIG5vdCBnaXZlbiwgaXQgdXNlcyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZmllbGRzCiMgb3IgZ2xvYmFsIGRlZmF1bHQgdmFsdWUgYXMgZmFsbGJhY2sgb25seSBmb3IgY2VydGFpbiBmaWVsZHMKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDEgb3IgMiBpdCB1c2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEN1c3RvbWVyVGlja2V0UHJvY2Vzc09iamVjdC0+X0NoZWNrRmllbGQoCiMgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAojICAgICAgICAgRGlzcGxheSAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIDAgb3IgMSBvciAyCiMgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJzMgbm9ybWFsJywgICAgICAgICAgIyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIChpdCB1c2VzIGdsb2JhbAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsIGJhY2sgZm9yIG1hbmRhdG9yeSBmaWVsZHMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIChRdWV1ZSwgU2F0ZSwgTG9jayBhbmQgUHJpb3JpdHkpCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgUHJpb3JpdHlJRCBpcyBzZXQgdG8gMSBpbiB0aGUgd2ViIHJlcXVlc3QKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRDdXN0b21lclRpY2tldFByb2Nlc3NPYmplY3QtPl9DaGVja0ZpZWxkKAojICAgICAgICAgRmllbGQgICAgICAgID0+ICdQcmlvcml0eUlEJywKIyAgICAgICAgIERpc3BsYXkgICAgICA9PiAwLAojICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICczIG5vcm1hbCcsCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlIGlzICczIG5vcm1hbCcgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBmaWVsZCBpcyBoaWRkZW4KIwojID1jdXQKCnN1YiBfQ2hlY2tGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgSUQgYW5kIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgYSB0aWNrZXQKICAgIG15ICRGaWVsZFdpdGhvdXRJRCA9ICRQYXJhbXtGaWVsZH07CiAgICAkRmllbGRXaXRob3V0SUQgPX4gc3tJRCR9e314bXM7CiAgICBteSAkVGlja2V0UmVxdWlyZWRGaWVsZCA9IHNjYWxhciBncmVwIHsgJF8gZXEgJEZpZWxkV2l0aG91dElEIH0gcXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSk7CgogICAgbXkgJFZhbHVlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGlmIG5vIERpc3BsYXkgKG9yIERpc3BsYXkgPT0gMCkgaXMgY29tbWl0ZWQKICAgIGlmICggISRQYXJhbXtEaXNwbGF5fSApIHsKCiAgICAgICAgIyBDaGVjayBpZiBhIERlZmF1bHRWYWx1ZSBpcyBnaXZlbgogICAgICAgIGlmICggJFBhcmFte0RlZmF1bHRWYWx1ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBwYXJhbSBpcyB2YWxpZAogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHdlIGdvdCBhIHJlcXVpcmVkIHRpY2tldCBmaWVsZCwgY2hlY2sgaWYgd2UgZ290IGEgdmFsaWQgRGVmYXVsdFZhbHVlIGluIHRoZSBTeXNDb25maWcKICAgICAgICBpZiAoICEkVmFsdWUgJiYgJFRpY2tldFJlcXVpcmVkRmllbGQgKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiUHJvY2Vzczo6RGVmYXVsdCRGaWVsZFdpdGhvdXRJRCIpOwoKICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0RlZmF1bHQgQ29uZmlnIGZvciBQcm9jZXNzOjpEZWZhdWx0JXMgbWlzc2luZyEnLCAkRmllbGRXaXRob3V0SUQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fTG9va3VwVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnRGVmYXVsdCBDb25maWcgZm9yIFByb2Nlc3M6OkRlZmF1bHQlcyBpbnZhbGlkIScsICRGaWVsZFdpdGhvdXRJRCApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAxICkgewoKICAgICAgICAjIERpc3BsYXkgPT0gMSBpcyBsb2dpY2FsaXkgbm90IHBvc3NpYmxlIGZvciBhIHRpY2tldCByZXF1aXJlZCBmaWVsZAogICAgICAgIGlmICgkVGlja2V0UmVxdWlyZWRGaWVsZCkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnV3JvbmcgQWN0aXZpdHlEaWFsb2cgRmllbGQgY29uZmlnOiAlcyBjYW5cJ3QgYmUgRGlzcGxheSA9PiAxIC8gU2hvdyBmaWVsZCAoUGxlYXNlIGNoYW5nZSBpdHMgY29uZmlndXJhdGlvbiB0byBiZSBEaXNwbGF5ID0+IDAgLyBEbyBub3Qgc2hvdyBmaWVsZCBvciBEaXNwbGF5ID0+IDIgLyBTaG93IGZpZWxkIGFzIG1hbmRhdG9yeSkhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmllbGR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICBpZiAoICRQYXJhbXtGaWVsZH0gZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGFydGljbGUgZmllbGRzIHdlIG5lZWQgdG8gZmFrZSBhIHZhbHVlCiAgICAgICAgICAgICRWYWx1ZSA9IDE7CgogICAgICAgICAgICBteSAoICRCb2R5LCAkU3ViamVjdCwgJEF0dGFjaG1lbnREZWxldGUxICkgPSAoCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQm9keScgKSwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJqZWN0JyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnREZWxldGUxJyApCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIGF0dGFjaG1lbnQgZXhpc3RzIGFuZCBib2R5IGFuZCBzdWJqZWN0IG5vdCwgaXQgaXMgZXJyb3IgKHNlZSBidWcjMTMwODEpLgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEF0dGFjaG1lbnREZWxldGUxICYmICggISRCb2R5ICYmICEkU3ViamVjdCApICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fTG9va3VwVmFsdWUoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkUGFyYW17RmllbGR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0ZpZWxkfSApIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0Rpc3BsYXl9ID09IDIgKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGR9IGVxICdBcnRpY2xlJyApIHsKCiAgICAgICAgICAgIG15ICggJEJvZHksICRTdWJqZWN0ICkgPSAoCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQm9keScgKSwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJqZWN0JyApCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVmFsdWUgPSAwOwogICAgICAgICAgICBpZiAoICRCb2R5ICYmICRTdWJqZWN0ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRQYXJhbXtGaWVsZH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17RmllbGR9ICkgfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkVmFsdWU7Cn0KCiMgPWl0ZW0gX0xvb2t1cFZhbHVlKCkKIwojIHJldHVybnMgdGhlIElEIChpZiBwb3NzaWJsZSkgb2YgbmVhcmx5IGFsbCB0aWNrZXQgZmllbGRzIGFuZC9vciBjaGVja3MgaWYgaXRzIHZhbGlkLgojIENhbiBoYW5kbGUgSURzIG9yIFN0cmluZ3MuCiMgQ3VycmVudGx5IHdvcmtpbmcgd2l0aDogU3RhdGUsIFF1ZXVlLCBMb2NrLCBQcmlvcml0eSAocG9zc2libGUgbW9yZSkuCiMKIyAgICAgbXkgJFByaW9yaXR5SUQgPSAkQ3VzdG9tZXJUaWNrZXRQcm9jZXNzT2JqZWN0LT5fTG9va3VwVmFsdWUoCiMgICAgICAgICBQcmlvcml0eUlEID0+IDEsCiMgICAgICk7CiMgICAgICRQcmlvcml0eUlEID0gMTsKIwojICAgICBteSAkU3RhdGVJRCA9ICRDdXN0b21lclRpY2tldFByb2Nlc3NPYmplY3QtPl9Mb29rdXBWYWx1ZSgKIyAgICAgICAgIFN0YXRlID0+ICdvcGVuJywKIyAgICAgKTsKIyAgICAgJFN0YXRlSUQgPSAzOwojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEN1c3RvbWVyVGlja2V0UHJvY2Vzc09iamVjdC0+X0xvb2t1cFZhbHVlKAojICAgICAgICAgUHJpb3JpdHkgPT4gJ3Vua25vd25wcmlvcml0eTEyMzQnLAojICAgICApOwojICAgICAkUHJpb3JpdHlJRCA9IHVuZGVmOwojCiMgPWN1dAoKc3ViIF9Mb29rdXBWYWx1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhGaWVsZCBWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtGaWVsZH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRmllbGQgc2hvdWxkIG5vdCBiZSBlbXB0eSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBubyB2YWx1ZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbwogICAgcmV0dXJuIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICMgcmVtb3ZlIHRoZSBJRCBmb3IgZnVuY3Rpb24gbmFtZSBwdXJwb3NlCiAgICBteSAkRmllbGRXaXRob3V0SUQgPSAkUGFyYW17RmllbGR9OwogICAgJEZpZWxkV2l0aG91dElEID1+IHN7SUQkfXt9eG1zOwoKICAgIG15ICRMb29rdXBGaWVsZE5hbWU7CiAgICBteSAkT2JqZWN0TmFtZTsKICAgIG15ICRGdW5jdGlvbk5hbWU7CgogICAgIyBzZXJ2aWNlIGFuZCBTTEEgbG9va3VwIG5lZWRzIE5hbWUgYXMgcGFyYW1ldGVyIChXaGlsZSBTZXJ2aWNlSUQgYW4gU0xBSUQgdXNlcyBzdGFuZGFyZCkKICAgIGlmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIFNlcnZpY2UgU0xBICkgKSB7CiAgICAgICAgJExvb2t1cEZpZWxkTmFtZSA9ICdOYW1lJzsKICAgICAgICAkT2JqZWN0TmFtZSAgICAgID0gJEZpZWxkV2l0aG91dElEOwogICAgICAgICRGdW5jdGlvbk5hbWUgICAgPSAkRmllbGRXaXRob3V0SUQgLiAnTG9va3VwJzsKICAgIH0KCiAgICAjIG90aGVyIGZpZWxkcyBjYW4gdXNlIHN0YW5kYXJkIHBhcmFtZXRlciBuYW1lcyBhcyBQcmlvcml0eSBvciBQcmlvcml0eUlECiAgICBlbHNlIHsKICAgICAgICAkTG9va3VwRmllbGROYW1lID0gJFBhcmFte0ZpZWxkfTsKICAgICAgICAkT2JqZWN0TmFtZSAgICAgID0gJEZpZWxkV2l0aG91dElEOwogICAgICAgICRGdW5jdGlvbk5hbWUgICAgPSAkRmllbGRXaXRob3V0SUQgLiAnTG9va3VwJzsKICAgIH0KCiAgICBteSAkVmFsdWU7CgogICAgbXkgJEZpZWxkT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSwgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdGhlIGJhY2tlbmQgbW9kdWxlIGhhcyB0aGUgbmVlZGVkICpMb29rdXAgc3ViCiAgICBpZiAoICRGaWVsZE9iamVjdCAmJiAkRmllbGRPYmplY3QtPmNhbigkRnVuY3Rpb25OYW1lKSApIHsKCiAgICAgICAgIyBjYWxsIHRoZSAqTG9va3VwIHN1YiBhbmQgZ2V0IHRoZSB2YWx1ZQogICAgICAgICRWYWx1ZSA9ICRGaWVsZE9iamVjdC0+JEZ1bmN0aW9uTmFtZSgKICAgICAgICAgICAgJExvb2t1cEZpZWxkTmFtZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBvYmplY3QgYW5kIHRoZSB2YWx1ZSBoYXMgbm8gcmVmIGEgc3RyaW5nIGUuZy4gVGl0bGUgYW5kIHNvIG9uCiAgICAjIHJldHVybiB0cnVlCiAgICBlbHNpZiAoICRQYXJhbXtGaWVsZH0gZXEgJEZpZWxkV2l0aG91dElEICYmICFyZWYgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVycm9yIHdoaWxlIGNoZWNraW5nIHdpdGggIiAuICRGaWVsZFdpdGhvdXRJRCAuICJPYmplY3QhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAoICEkVmFsdWUgKTsKCiAgICAjIHJldHVybiB0aGUgZ2l2ZW4gSUQgdmFsdWUgaWYgdGhlICpMb29rdXAgcmVzdWx0IHdhcyBhIHN0cmluZwogICAgaWYgKCAkUGFyYW17RmllbGR9IG5lICRGaWVsZFdpdGhvdXRJRCApIHsKICAgICAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgKkxvb2t1cCBzdHJpbmcgcmV0dXJuIHZhbHVlCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHByZXNlbnQsIGNvbnNpZGVyIHRoZSBsb2dnZWQgaW4gY3VzdG9tZXIKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgIH0KCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtTZXJ2aWNlc30gJiYgJXsgJFBhcmFte1NlcnZpY2VzfSB9ICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfS0+eyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHByZXNlbnQsIGNvbnNpZGVyIHRoZSBsb2dnZWQgaW4gY3VzdG9tZXIKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHN0aWxsIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVByaW9yaXRpZXM7CgogICAgIyBJbml0aWFsbHkgd2UgaGF2ZSBqdXN0IHRoZSBkZWZhdWx0IFF1ZXVlIFBhcmFtZXRlcgogICAgIyBzbyBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBJRCBpbiB0aGF0IGNhc2UKICAgIG15ICRRdWV1ZUlEOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtRdWV1ZX0gKSB7CiAgICAgICAgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRQYXJhbXtRdWV1ZX0gKTsKICAgIH0KICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRRdWV1ZUlEIHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0UXVldWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3UXVldWVzOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1F1ZXVlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVRdWV1ZXM7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVRdWV1ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVF1ZXVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVF1ZXVlcyApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjaywgY2FuIHdlIGNyZWF0ZSBuZXcgdGlja2V0cyBpbiBxdWV1ZQogICAgICAgICAgICBuZXh0IFFVRVVFSUQgaWYgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH07CgogICAgICAgICAgICBteSAkU3RyaW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e30gaWYgISRRdWV1ZURhdGF7Q29tbWVudH07CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFF1ZXVlc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1F1ZXVlc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVOZXdRdWV1ZXM7Cn0KCnN1YiBfR2V0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKCiAgICAgICAgIyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBwcm9jZXNzIHRpY2tldAogICAgICAgIFF1ZXVlSUQgID0+ICRQYXJhbXtRdWV1ZUlEfSAgfHwgMSwKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9IHx8ICcnLAoKICAgICAgICAjIHJlbW92ZSB0eXBlLCBzaW5jZSBpZiBUaWNrZXQ6OlR5cGUgaXMgYWN0aXZlIGluIHN5c2NvbmZpZywgdGhlIFR5cGUgcGFyYW1ldGVyIHdpbGwKICAgICAgICAjIGJlIHNlbnQgYW5kIHRoZSBUaWNrZXRTdGF0ZUxpc3Qgd2lsbCBzZW5kIHRoZSBwYXJhbWV0ZXIgYXMgU3RhdGUgVHlwZQogICAgICAgIFR5cGUgPT4gdW5kZWYsCgogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBcJVN0YXRlczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0QUpBWFVwZGF0YWJsZUZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEZWZhdWx0VXBkYXRhYmxlRmllbGRzID0gKAogICAgICAgIFByaW9yaXR5SUQgICAgPT4gMSwKICAgICAgICBRdWV1ZUlEICAgICAgID0+IDEsCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAxLAogICAgICAgIFNlcnZpY2VJRCAgICAgPT4gMSwKICAgICAgICBTTEFJRCAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVJRCAgICAgICA9PiAxLAogICAgICAgIE93bmVySUQgICAgICAgPT4gMSwKICAgICAgICBMb2NrSUQgICAgICAgID0+IDEsCiAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBiYWNrZW5kIG9iamVjdAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgICMgY3JlYXRlIGEgRHluYW1pY0ZpZWxkTG9va3VwVGFibGUKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkfTsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICV7ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkc30gfSApIHsKCiAgICAgICAgbXkgJEZpZWxkRGF0YSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkc30tPnskRmllbGR9OwoKICAgICAgICAjIHNraXAgaGlkZGVuIGZpZWxkcwogICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZERhdGEtPntEaXNwbGF5fTsKCiAgICAgICAgIyBmb3IgRHluYW1pYyBGaWVsZHMgY2hlY2sgaWYgaXMgQUpBWFVwZGF0YWJsZQogICAgICAgIGlmICggJEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRMb29rdXB7JEZpZWxkfTsKCiAgICAgICAgICAgICMgc2tpcCBhbnkgZmllbGQgd2l0aCB3cm9uZyBjb25maWcKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIHNraXAgZmllbGQgaWYgaXMgbm90IElzQUNMUmVkdWNpYmxlICh1cGRhdGFibGUpCgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICRGaWVsZDsKICAgICAgICB9CgogICAgICAgICMgZm9yIGFsbCBvdGhlcnMgdXNlICVEZWZhdWx0VXBkYXRhYmxlRmllbGRzIHRhYmxlCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHN0YW5kYXJpemUgdGhlIGZpZWxkIG5hbWUgKGUuZy4gdXNlIFN0YXRlSUQgZm9yIFN0YXRlIGZpZWxkKQogICAgICAgICAgICBteSAkRmllbGROYW1lID0gJFNlbGYtPntOYW1lVG9JRH0tPnskRmllbGR9OwoKICAgICAgICAgICAgIyBza2lwIGlmIGZpZWxkIG5hbWUgY291bGQgbm90IGJlIGNvbnZlcnRlZCAodGhpcyBtZWFucyB0aGF0IGZpZWxkIGlzIHVua25vd24pCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZE5hbWU7CgogICAgICAgICAgICAjIHNraXAgaWYgdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgdmlhIGFqYXgKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJERlZmF1bHRVcGRhdGFibGVGaWVsZHN7JEZpZWxkTmFtZX07CgogICAgICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICRGaWVsZE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZVN0cmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGRzVG9VcGRhdGUgPSAnJzsKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30gKSApIHsKICAgICAgICBteSAkRmlyc3RJdGVtID0gMTsKICAgICAgICBGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICRQYXJhbXtUcmlnZ2VyRmllbGR9OwogICAgICAgICAgICBpZiAoJEZpcnN0SXRlbSkgewogICAgICAgICAgICAgICAgJEZpcnN0SXRlbSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRmllbGRzVG9VcGRhdGUgLj0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRmllbGRzVG9VcGRhdGUgLj0gIiciIC4gJEZpZWxkIC4gIiciOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkRmllbGRzVG9VcGRhdGU7Cn0KCnN1YiBfU2hvd0RpYWxvZ0Vycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKCVQYXJhbSk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRBY3Rpb25Db21tb24udHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlByb3BlcnRpZXMiKSAlXQoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiIGlkPSJDb21wb3NlIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVwbHlUb0FydGljbGUiIHZhbHVlPSJbJSBEYXRhLlJlcGx5VG9BcnRpY2xlIHwgaHRtbCAlXSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiBpZD0iRXhwYW5kIiB2YWx1ZT0iIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkltcGFjdFJDIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJQcmlvcml0eVJDIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldEZyZWVUZXh0IikgJV0KWyUgVHJhbnNsYXRlKCJDaGFuZ2UgRnJlZSBUZXh0IG9mICVzJXMlcyIsIENvbmZpZygnVGlja2V0OjpIb29rJyksIENvbmZpZygnVGlja2V0OjpIb29rRGl2aWRlcicpLCBEYXRhLlRpY2tldE51bWJlcikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldEZyZWVUZXh0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRPd25lciIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIE93bmVyIG9mICVzJXMlcyIsIENvbmZpZygnVGlja2V0OjpIb29rJyksIENvbmZpZygnVGlja2V0OjpIb29rRGl2aWRlcicpLCBEYXRhLlRpY2tldE51bWJlcikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldE93bmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRDbG9zZSIpICVdClslIFRyYW5zbGF0ZSgiQ2xvc2UgJXMlcyVzIiwgQ29uZmlnKCdUaWNrZXQ6Okhvb2snKSwgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyksIERhdGEuVGlja2V0TnVtYmVyKSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0Q2xvc2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldE5vdGUiKSAlXQpbJSBUcmFuc2xhdGUoIkFkZCBOb3RlIHRvICVzJXMlcyIsIENvbmZpZygnVGlja2V0OjpIb29rJyksIENvbmZpZygnVGlja2V0OjpIb29rRGl2aWRlcicpLCBEYXRhLlRpY2tldE51bWJlcikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldE5vdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFBlbmRpbmciKSAlXQpbJSBUcmFuc2xhdGUoIlNldCBQZW5kaW5nIFRpbWUgZm9yICVzJXMlcyIsIENvbmZpZygnVGlja2V0OjpIb29rJyksIENvbmZpZygnVGlja2V0OjpIb29rRGl2aWRlcicpLCBEYXRhLlRpY2tldE51bWJlcikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldFBlbmRpbmciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFByaW9yaXR5IikgJV0KWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUHJpb3JpdHkgb2YgJXMlcyVzIiwgQ29uZmlnKCdUaWNrZXQ6Okhvb2snKSwgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyksIERhdGEuVGlja2V0TnVtYmVyKSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0UHJpb3JpdHkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFJlc3BvbnNpYmxlIikgJV0KWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUmVzcG9uc2libGUgb2YgJXMlcyVzIiwgQ29uZmlnKCdUaWNrZXQ6Okhvb2snKSwgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyksIERhdGEuVGlja2V0TnVtYmVyKSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0UmVzcG9uc2libGUiKSAlXQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFnZW50VGlja2V0RGVjaXNpb24iKSAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0IikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldERlY2lzaW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIpICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQiKSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQiKSAlXQojIC0tLQogICAgICAgICAgICAgICAgICZtZGFzaDsgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9oMT4KICAgICAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRCYWNrIikgJV0KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QmFjayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb3BlcnRpZXNMb2NrIikgJV0KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoZSB0aWNrZXQgaGFzIGJlZW4gbG9ja2VkIikgfCBodG1sICVdLgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlVuZG9DbG9zZVBvcHVwIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRMb2NrO1N1YmFjdGlvbj1VbmxvY2s7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXVslIElGIERhdGEuUHJldmlvdXNPd25lciAlXTtQcmV2aW91c093bmVyPVslIERhdGEuUHJldmlvdXNPd25lciAlXVslIEVORCAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVW5kbyAmIGNsb3NlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb3BlcnRpZXNMb2NrIikgJV0KCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXRUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiVGlja2V0IFNldHRpbmdzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpdGxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGl0bGUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlRpdGxlIiBuYW1lPSJUaXRsZSIgdmFsdWU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5UaXRsZUludmFsaWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaXRsZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1R5cGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWyAnU2VydmljZUlEJywgJ1NMQUlEJywgJ05ld1F1ZXVlSUQnLCAnTmV3T3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlR5cGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUXVldWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdRdWV1ZUlEIj5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV3UXVldWVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdRdWV1ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05ld1F1ZXVlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdOZXdRdWV1ZUlEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJRdWV1ZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWyAnVHlwZUlEJywgJ1NMQUlEJywgJ05ld1F1ZXVlSUQnLCAnTmV3T3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICB9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgVGlja2V0SUQ6IFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU2VydmljZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbICdUeXBlSUQnLCAnU0xBSUQnLCAnTmV3UXVldWVJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBUaWNrZXRJRDogWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIGNsYXNzPSJWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tClslIFJlbmRlckJsb2NrRW5kKCJTZXJ2aWNlTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNMQUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbICdUeXBlSUQnLCAnU2VydmljZUlEJywgJ05ld1F1ZXVlSUQnLCAnTmV3T3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU0xBSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3UXVldWVJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPd25lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld093bmVySUQiPlslIFRyYW5zbGF0ZSgiTmV3IE93bmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3duZXJTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdPd25lcklEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdPd25lcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3T3duZXJJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3UXVldWVJRCcsICdTTEFJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPd25lck1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5ld093bmVySUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJOZXcgT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Pd25lclN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5ld093bmVySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCBhIG5ldyBvd25lciEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdPd25lcklEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdPd25lcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3T3duZXJJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3UXVldWVJRCcsICdTTEFJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPd25lck1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPlslIFRyYW5zbGF0ZSgiTmV3IFJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzcG9uc2libGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV3UmVzcG9uc2libGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCBbICdUeXBlSUQnLCAnU2VydmljZUlEJywgJ05ld1F1ZXVlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV3U3RhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ05ld1N0YXRlSUQnLCBbJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3UXVldWVJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGF0ZVBlbmRpbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQZW5kaW5nIGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRGF0ZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJGb3IgYWxsIHBlbmRpbmcqIHN0YXRlcy4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdGF0ZVBlbmRpbmciKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhdGUiKSAlXQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCgojIHNob3cgdGhlIGltcGFjdApbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQojIC0tLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05ld1ByaW9yaXR5SUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdOZXdQcmlvcml0eUlEJywgWydUeXBlSUQnLCAnU2VydmljZUlEJywgJ05ld1F1ZXVlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJXaWRnZXRUaWNrZXRBY3Rpb25zIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIldpZGdldER5bmFtaWNGaWVsZHMiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJEeW5hbWljIEZpZWxkcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJXaWRnZXREeW5hbWljRmllbGRzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIldpZGdldEFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFslIERhdGEuV2lkZ2V0U3RhdHVzIHwgaHRtbCAlXSIgaWQ9IldpZGdldEFydGljbGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBBcnRpY2xlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgpbJSBJRiBEYXRhLldpZGdldFN0YXR1cyA9PSAnRXhwYW5kZWQnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQ3JlYXRlQXJ0aWNsZSIgbmFtZT0iQ3JlYXRlQXJ0aWNsZSIgdmFsdWU9IjEiIC8+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNyZWF0ZUFydGljbGUiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIGFuIEFydGljbGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJDcmVhdGVBcnRpY2xlIiBuYW1lPSJDcmVhdGVBcnRpY2xlIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5mb3JtQWRkaXRpb25hbEFnZW50cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvcm1BZ2VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJbmZvcm1Vc2VySUQiPlslIFRyYW5zbGF0ZSgiSW5mb3JtIGFnZW50cyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52b2x2ZWRBZ2VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJbnZvbHZlZFVzZXJJRCI+WyUgVHJhbnNsYXRlKCJJbmZvcm0gaW52b2x2ZWQgYWdlbnRzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkludm9sdmVkQWdlbnRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkludm9sdmVkQWdlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJIZXJlIHlvdSBjYW4gc2VsZWN0IGFkZGl0aW9uYWwgYWdlbnRzIHdoaWNoIHNob3VsZCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIHJlZ2FyZGluZyB0aGUgbmV3IGFydGljbGUuIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFkZGl0aW9uYWxBZ2VudHMiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvcm1BZ2VudHNXaXRob3V0U2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUZXh0IHdpbGwgYWxzbyBiZSByZWNlaXZlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJMaXN0V2l0aG91dFNlbGVjdGlvbiIgdmFsdWU9IlslIERhdGEuVXNlckxpc3RXaXRob3V0U2VsZWN0aW9uICB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Vc2VyRW1haWwgJV0iPlslIERhdGEuVXNlckZ1bGxuYW1lICVdPC9zcGFuPlslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yIikgJV0sWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvbiIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViamVjdExhYmVsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3ViamVjdExhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3ViamVjdExhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlN1YmplY3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJTdWJqZWN0TGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iU3ViamVjdCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZSBbJSBEYXRhLlN1YmplY3RJbnZhbGlkICVdIFslIERhdGEuU3ViamVjdFJlcXVpcmVkICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE9wdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3B0aW9ucyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNwZWxsQ2hlY2siKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bIFslIFRyYW5zbGF0ZSgiU3BlbGwgY2hlY2siKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNwZWxsQ2hlY2siKSAlXQoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNFbmQgLS0+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRPcHRpb25zIikgJV0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19Ob1RpY2tldE9wdGlvbnNGYWxsYmFjayAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhbmRhcmRUZW1wbGF0ZUlEIj5bJSBUcmFuc2xhdGUoIlRleHQgVGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiU2V0dGluZyBhIHRlbXBsYXRlIHdpbGwgb3ZlcndyaXRlIGFueSB0ZXh0IG9yIGF0dGFjaG1lbnQuIikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTdGFuZGFyZFRlbXBsYXRlSUQnLCBbJ1JpY2hUZXh0RmllbGQnXSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dExhYmVsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0TGFiZWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dExhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmljaFRleHRMYWJlbE1hbmRhdG9yeSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRGaWVsZCIgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlIFslIERhdGEuQm9keUludmFsaWQgJV0gWyUgRGF0YS5Cb2R5UmVxdWlyZWQgJV0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBTcGFjaW5nTGVmdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgLz4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgJCgnI0F0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS50cmlnZ2VyKCdzdWJtaXQnKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudFVwbG9hZCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNGaWxlVXBsb2FkJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0ZpbGVVcGxvYWQnKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS5maW5kKCcjQXR0YWNobWVudFVwbG9hZCcpLnZhbCgnMScpLmVuZCgpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlVHlwZUlEIj5bJSBUcmFuc2xhdGUoIk5vdGUgdHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5BcnRpY2xlVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVR5cGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGltZVVuaXRzIj5bJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaW1lVW5pdHMiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiBpZD0iVGltZVVuaXRzIiB2YWx1ZT0iWyUgRGF0YS5UaW1lVW5pdHMgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfVGltZVVuaXRzIFslIERhdGEuVGltZVVuaXRzUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuVGltZVVuaXRzSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldpZGdldEFydGljbGUiKSAlXQoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb3BlcnRpZXMiKSAlXQoKI0xheWVycwpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Db25maWcuU2V0KCdMb2NhbGl6YXRpb24uRGVsZXRlJywgJ1slIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdJyk7CiAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Jbml0KCk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZSAodGhpcyBwYXJ0IGhlcmUgaXMgaW1wb3J0YW50IGlmIHRoZSBwYWdlIGlzIHJlbG9hZGVkIGR1ZSB0byBlLmcuIGF0dGFjaG1lbnQgdXBsb2FkKQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBUaWNrZXRJRDogWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBJbnNlcnRUZW1wbGF0ZSgiQWdlbnRUaWNrZXRBY3Rpb25Db21tb24udHQiKSAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXROb3RlLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBJbnNlcnRUZW1wbGF0ZSgiQWdlbnRUaWNrZXRBY3Rpb25Db21tb24udHQiKSAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRFbWFpbC50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgSW5zZXJ0VGVtcGxhdGUoIkFnZW50Q3VzdG9tZXJTZWFyY2gudHQiKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBGb3JtU2NyZWVuIj4KCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgTmV3IEVtYWlsIFRpY2tldCIpIHwgaHRtbCAlXTwvaDE+CiAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KIyBzaG93IGN1c3RvbWVyIGluZm8gdGFibGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJUYWJsZSIpICVdCiAgICAgICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVySW5mbyIgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVyIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DdXN0b21lclRhYmxlICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iTmV3RW1haWxUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgaWQ9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik93bmVyQWxsIiBpZD0iT3duZXJBbGwiIHZhbHVlPSJbJSBEYXRhLk93bmVyQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVzcG9uc2libGVBbGwiIGlkPSJSZXNwb25zaWJsZUFsbCIgdmFsdWU9IlslIERhdGEuUmVzcG9uc2libGVBbGwgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgaWQ9IlByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgaWQ9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lclVzZXIgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWyAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiRnJvbSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gcm9tU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI0Rlc3QnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBEZXN0ID0gJCh0aGlzKS52YWwoKSB8fCAnJywKICAgICAgICBDdXN0b21lclVzZXIgPSAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoKSB8fCAnJzsKICAgIHZhciBTaWduYXR1cmVVUkwgPSAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyBEZXN0ICsgJztTZWxlY3RlZEN1c3RvbWVyVXNlcj0nICsgQ3VzdG9tZXJVc2VyOwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ0Rlc3QnLCBbJ1R5cGVJRCcsICdTaWduYXR1cmUnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIGlmICghQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uSURDb29raWUnKSkgewogICAgICAgIFNpZ25hdHVyZVVSTCArPSAnOycgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpOwogICAgfQogICAgJCgnI1NpZ25hdHVyZScpLmF0dHIoJ3NyYycsIFNpZ25hdHVyZVVSTCk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIEN1c3RvbWVyS2V5OwogICAgICAgIGlmICggJCh0aGlzKS5wcm9wKCdjaGVja2VkJykgKXsKCiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gJCggJyNDdXN0b21lcktleV8nICskKHRoaXMpLnZhbCgpICkudmFsKCk7CiAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLkN1c3RvbWVyVGlja2V0UmVtb3ZlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZW1vdmVDdXN0b21lclRpY2tldCggJCh0aGlzKSApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoICdUb0N1c3RvbWVyJywgIlslIERhdGEuRW1haWwgfCBodG1sICVdIiwgIlslIERhdGEuQ3VzdG9tZXIgfCBodG1sICVdIiwgdHJ1ZSApOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVG9DdXN0b21lciIgY2xhc3M9Ik1hbmRhdG9yeSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRvIGN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iVG9DdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iVG9DdXN0b21lciIgdmFsdWU9IiIgY2xhc3M9IkN1c3RvbWVyQXV0b0NvbXBsZXRlIFc3NXBjIFslIERhdGEuVG9Jc0xvY2FsQWRkcmVzcyB8IGh0bWwgJV0gWyUgRGF0YS5Ub0ludmFsaWQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVG9DdXN0b21lclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRvU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgdXNlciBmb3IgdGhlIHRpY2tldC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJUb1NlcnZlckVycm9yTXNnIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRvSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgaXMgcmVnaXN0ZXJlZCBhcyBzeXN0ZW0gYWRkcmVzcyBhbmQgY2Fubm90IGJlIHVzZWQ6ICVzIiwgRGF0YS5UbykgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkN1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVUb0N1c3RvbWVyIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXkiIGlkPSJDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUbyBjdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudFRvQ3VzdG9tZXIiIGNsYXNzPSJDdXN0b21lckNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQm94TGFiZWwiPlslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIFslIERhdGEuQ3VzdG9tZXJTZWxlY3RlZCB8IGh0bWwgJV0gIFslIERhdGEuQ3VzdG9tZXJEaXNhYmxlZCB8IGh0bWwgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlclRvQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2NDdXN0b21lciI+WyUgVHJhbnNsYXRlKCJDYyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDY0N1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJDY0N1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5DY0lzTG9jYWxBZGRyZXNzIHwgaHRtbCAlXSBbJSBEYXRhLkNjSW52YWxpZCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2NDdXN0b21lclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgaXMgcmVnaXN0ZXJlZCBhcyBzeXN0ZW0gYWRkcmVzcyBhbmQgY2Fubm90IGJlIHVzZWQ6ICVzIiwgRGF0YS5DYykgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgWyUgRGF0YS5DY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVDY0N1c3RvbWVyIFNwYWNpbmdUb3BTbWFsbCBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkNjQ3VzdG9tZXJLZXkiIGlkPSJDY0N1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNjIikgfCBodG1sICVdIiBuYW1lPSJDY0N1c3RvbWVyVGlja2V0VGV4dCIgaWQ9IkNjQ3VzdG9tZXJUaWNrZXRUZXh0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iQ2NSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIENjIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudENjQ3VzdG9tZXIiIGNsYXNzPSJDY0N1c3RvbWVyQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJCb3hMYWJlbCI+WyUgVHJhbnNsYXRlKCJDYyIpIHwgaHRtbCAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NNdWx0aXBsZUN1c3RvbWVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkNjQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDY0N1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQgWyUgRGF0YS5DdXN0b21lckVycm9yIHwgaHRtbCAlXSIgbmFtZT0iQ2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXSIgaWQ9IkNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iQ2NSZW1vdmVDdXN0b21lclRpY2tldF9bJSBEYXRhLkNvdW50ICVdIiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBDYyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRXhwbGFuYXRpb24gRXJyb3IiPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHJlbW92ZSB0aGlzIGVudHJ5IGFuZCBlbnRlciBhIG5ldyBvbmUgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZS4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNjQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSW52YWxpZEROU1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJETlMgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGVycm9yIGxvZy4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0ludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NNdWx0aXBsZUN1c3RvbWVyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXIiIGlkPSJDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyQ291bnRlciB8IGh0bWwgJV0iLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQmNjQ3VzdG9tZXIiPlslIFRyYW5zbGF0ZSgiQmNjIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkJjY0N1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJCY2NDdXN0b21lciIgdmFsdWU9IiIgY2xhc3M9IkN1c3RvbWVyQXV0b0NvbXBsZXRlIFc3NXBjIFslIERhdGEuQmNjSXNMb2NhbEFkZHJlc3MgfCBodG1sICVdIFslIERhdGEuQmNjSW52YWxpZCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQmNjQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBpcyByZWdpc3RlcmVkIGFzIHN5c3RlbSBhZGRyZXNzIGFuZCBjYW5ub3QgYmUgdXNlZDogJXMiLCBEYXRhLkJjYykgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgWyUgRGF0YS5CY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lciB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDdXN0b21lclRpY2tldFRlbXBsYXRlQmNjQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQmNjQ3VzdG9tZXJLZXkiIGlkPSJCY2NDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJCY2MiKSB8IGh0bWwgJV0iIG5hbWU9IkJjY0N1c3RvbWVyVGlja2V0VGV4dCIgaWQ9IkJjY0N1c3RvbWVyVGlja2V0VGV4dCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkJjY1JlbW92ZUN1c3RvbWVyVGlja2V0IiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgQmNjIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEJjY0N1c3RvbWVyIiBjbGFzcz0iQmNjQ3VzdG9tZXJDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkJveExhYmVsIj5bJSBUcmFuc2xhdGUoIkJjYyIpIHwgaHRtbCAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJCY2NDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkJjY0N1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQgWyUgRGF0YS5DdXN0b21lckVycm9yIHwgaHRtbCAlXSIgbmFtZT0iQmNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIGlkPSJCY2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXSIgdHlwZT0idGV4dCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJFbGVtZW50IHwgaHRtbCAlXSIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJCY2NSZW1vdmVDdXN0b21lclRpY2tldF9bJSBEYXRhLkNvdW50ICVdIiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBCY2MiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQmNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0ludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY011bHRpcGxlQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyIiBpZD0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ3VzdG9tZXJJRCI+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgaWQ9IkN1c3RvbWVySUQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdIiBbJSBJRiBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RW1haWw6OkN1c3RvbWVySURSZWFkT25seSIpICVdIHJlYWRvbmx5IFslIEVORCAlXSBjbGFzcz0iVzc1cGMiLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VydmljZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgfSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICB9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIGNsYXNzPSJWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNMQSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEFNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNMQUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnU2VydmljZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEFNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXJTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1VzZXJJRCI+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPd25lclNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXJlZnJlc2giPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjT3duZXJTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgJCgnI093bmVyQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydOZXdVc2VySUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI05ld1VzZXJJRCcpLmZvY3VzKCk7CiAgICB9KTsKICAgIHJldHVybiBmYWxzZTsKfSk7CgokKCcjTmV3VXNlcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3VXNlcklEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnU2lnbmF0dXJlJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk93bmVyU2VsZWN0aW9uIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlc3BvbnNpYmxlU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdSZXNwb25zaWJsZUlEIj5bJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc3BvbnNpYmxlT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwiIGNsYXNzPSJHZXRBbGxBSkFYIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1yZWZyZXNoIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1Jlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICQoJyNSZXNwb25zaWJsZUFsbCcpLnZhbCgnMScpOyAvLyBOZWVkZWQ/IFdoeT8KICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdSZXNwb25zaWJsZUFsbCcsIFsnTmV3UmVzcG9uc2libGVJRCddLCBmdW5jdGlvbigpIHsKICAgICAgICAkKCcjTmV3UmVzcG9uc2libGVJRCcpLmZvY3VzKCk7CiAgICB9KTsKICAgIHJldHVybiBmYWxzZTsKfSk7CgokKCcjTmV3UmVzcG9uc2libGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCBbICdUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlc3BvbnNpYmxlU2VsZWN0aW9uIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk9wdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgRGF0YS5JbnZhbGlkIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPcHRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5TdWJqZWN0SW52YWxpZCB8IGh0bWwgJV0gVzc1cGMgIiBuYW1lPSJTdWJqZWN0IiBpZD0iU3ViamVjdCIgdmFsdWU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPcHRpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPcHRpb25zIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNwZWxsQ2hlY2siKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uU3BlbGxDaGVjayI+WyBbJSBUcmFuc2xhdGUoIlNwZWxsIGNoZWNrIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJTcGVsbENoZWNrIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWRkcmVzc0Jvb2siKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uQWRkcmVzc0Jvb2siPlsgWyUgVHJhbnNsYXRlKCJBZGRyZXNzIGJvb2siKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFkZHJlc3NCb29rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uQ3VzdG9tZXIiPlsgWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJPcHRpb25DdXN0b21lciIpICVdCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50TGlua09iamVjdDtNb2RlPVRlbXBvcmFyeTtTb3VyY2VPYmplY3Q9VGlja2V0O1NvdXJjZUtleT1bJSBEYXRhLkZvcm1JRCB8IHVyaSAlXTtUYXJnZXRJZGVudGlmaWVyPUlUU01Db25maWdJdGVtIiBpZD0iT3B0aW9uTGlua1RpY2tldCIgY2xhc3M9IkFzUG9wdXAiPlsgWyUgVHJhbnNsYXRlKCJMaW5rIHRpY2tldCIpIHwgaHRtbCAlXSBdPC9hPgojIC0tLQoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNFbmQgLS0+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldE9wdGlvbnMiKSAlXQoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX05vVGlja2V0T3B0aW9uc0ZhbGxiYWNrIC0tPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhbmRhcmRUZW1wbGF0ZUlEIj5bJSBUcmFuc2xhdGUoIlRleHQgVGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRUZW1wbGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiU2V0dGluZyBhIHRlbXBsYXRlIHdpbGwgb3ZlcndyaXRlIGFueSB0ZXh0IG9yIGF0dGFjaG1lbnQuIikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkNvbmZpcm1UZW1wbGF0ZU92ZXJ3cml0ZSgnUmljaFRleHQnLCAkKHRoaXMpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTdGFuZGFyZFRlbXBsYXRlSUQnLCBbJ1JpY2hUZXh0RmllbGQnXSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEZpZWxkIiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Cb2R5SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFFbWFpbCIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2lnbmF0dXJlIj5bJSBUcmFuc2xhdGUoIlNpZ25hdHVyZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTaWduYXR1cmUiIHZhbHVlPSJbJSBEYXRhLlNpZ25hdHVyZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBoZWlnaHQ9IjE0MCIgd2lkdGg9IjYyMCIgZnJhbWVib3JkZXI9IjAiIGlkPSJTaWduYXR1cmUiIGNsYXNzPSJTaWduYXR1cmUiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNpZ25hdHVyZTtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBTcGFjaW5nTGVmdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgICQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykudmFsKDEpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0udHJpZ2dlcignc3VibWl0Jyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmlsZVVwbG9hZCIgbmFtZT0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI0ZpbGVVcGxvYWQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgJEZvcm0gPSAkKCcjRmlsZVVwbG9hZCcpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAkRm9ybS5maW5kKCcjQXR0YWNobWVudFVwbG9hZCcpLnZhbCgnMScpLmVuZCgpLnN1Ym1pdCgpOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXh0U3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHRpY2tldCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05leHRTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05leHRTdGF0ZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGVuZGluZyBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlBlbmRpbmdEYXRlU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkZvciBhbGwgcGVuZGluZyogc3RhdGVzLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiMgc2hvdyB0aGUgaW1wYWN0ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiMgLS0tCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUHJpb3JpdHlJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdQcmlvcml0eUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHNMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGltZVVuaXRzIj5bJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9UaW1lVW5pdHMgWyUgRGF0YS5UaW1lVW5pdHNSZXF1aXJlZCB8IGh0bWwgJV0gWyUgRGF0YS5UaW1lVW5pdHNJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iVGltZVVuaXRzIiBpZD0iVGltZVVuaXRzIiB2YWx1ZT0iWyUgRGF0YS5UaW1lVW5pdHMgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbmQgbWFpbCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2VuZCBtYWlsIikgfCBodG1sICVdIiA+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWVudmVsb3BlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTZW5kIG1haWwiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJDdXN0b21lclRpY2tldHMiPjwvZGl2Pgo8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKQ29yZS5Db25maWcuU2V0KCdMb2NhbGl6YXRpb24uRGVsZXRlJywgWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IEpTT04gJV0pOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgeyBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCggJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsgcmV0dXJuIGZhbHNlOyB9ICk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlICh0aGlzIHBhcnQgaGVyZSBpcyBpbXBvcnRhbnQgaWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgZHVlIHRvIGUuZy4gYXR0YWNobWVudCB1cGxvYWQpCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKIyBleGFtcGxlIHRlbXBsYXRlIGZvcm0gZm9yIGN1c3RvbWl6YXRpb25zCiM8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgaWQ9IlRlbXBsYXRlMSI+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMiIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJFeGFtcGxlIFN1YmplY3QiLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iTmFtZToKI1Byb2R1Y3Q6CiNDb21tZW50OiIvPgojPC9mb3JtPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bS50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvdyIpICVdCjx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93QnVsayIpICVdCiAgICA8bGkgY2xhc3M9IkFsd2F5c1ByZXNlbnQiPgogICAgICAgIDxzcGFuPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV0iIGlkPSJTZWxlY3RBbGxUaWNrZXRzIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJJbnZpc2libGVUZXh0IiBmb3I9IlNlbGVjdEFsbFRpY2tldHMiPlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFsbCIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgPC9zcGFuPgogICAgPC9saT4KICAgIDxsaSBpZD0iQnVsa0FjdGlvbiIgY2xhc3M9IkFsd2F5c1ByZXNlbnQgSW5hY3RpdmUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICA8YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dCdWxrIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dJdGVtIikgJV0KICAgIDxsaT48YSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuTGluayB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dIVE1MIikgJV0KICAgIFslIERhdGEuSFRNTCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dIVE1MIikgJV0KPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50SGVhZGVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuQWN0aW9uUm93LkluaXQoKTsKCiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciBNYXRjaGVzLAogICAgICAgICAgICBQb3B1cFR5cGUgPSAnVGlja2V0QWN0aW9uJzsKCiAgICAgICAgTWF0Y2hlcyA9ICQodGhpcykuYXR0cignY2xhc3MnKS5tYXRjaCgvUG9wdXBUeXBlXyhcdyspLyk7CiAgICAgICAgaWYgKE1hdGNoZXMpIHsKICAgICAgICAgICAgUG9wdXBUeXBlID0gTWF0Y2hlc1sxXTsKICAgICAgICB9CgogICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCBQb3B1cFR5cGUpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KCjx1bCBpZD0iVGlja2V0T3ZlcnZpZXdNZWRpdW0iIGNsYXNzPSJPdmVydmlldyBPdmVydmlld01lZGl1bSI+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb1RpY2tldEZvdW5kIikgJV0KICAgIDxsaSBpZD0iRW1wdHlNZXNzYWdlTWVkaXVtIj4KICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIHRpY2tldCBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vVGlja2V0Rm91bmQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRDb250ZW50IikgJV0KICAgIDxsaSBpZD0iVGlja2V0SURfWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMgSW5saW5lQWN0aW9ucyI+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IlJlc3BvbnNpdmVBY3Rpb25NZW51Ij48YSBocmVmPSIjIiBpZD0iUmVzcG9uc2l2ZUFjdGlvbk1lbnVbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiT3BlbiAvIENsb3NlIHRpY2tldCBhY3Rpb24gbWVudSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWJhcnMiPjwvaT48L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8bGk+PGEgaWQ9IlslIERhdGEuSUQgfCBodG1sICVdWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbUhUTUwiKSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGNsaWNrIG9uIGEgcGFydCBvZiB0aGUgSW5saWVuQWN0aW9uUm93IHdpdGhvdXQgYSBsaW5rCiAgICAvLyBPdGhlcndpc2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBsaS13aWRlIGxpbmsgdG8gdGhlIHRpY2tldHpvb20KICAgICQoJ3VsLklubGluZUFjdGlvbnMnKS5jbGljayhmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgIGlmIChFdmVudC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQnVsayIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUaWNrZXRJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgdGlja2V0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJ1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUljb24iKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ2xhc3NTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9lbT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSWNvbiIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhIikgJV0KICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXVslIENvbmZpZygiVGlja2V0OjpIb29rRGl2aWRlciIpICVdWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gJm5kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iSW5mb3MiPgogICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRnJvbSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5BZ2UgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJXIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBJRiBEYXRhLkN1c3RvbWVySUQgJV08YSBocmVmPSJbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rIikgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgWyUgQ29uZmlnKCJDdXN0b21lckRCTGlua1RhcmdldCIpICVdPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L2E+WyUgRU5EICVdCiNbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJXIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXQojWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSTyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+PGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdIj5bJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMUxpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMVBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRmlyc3QgUmVzcG9uc2UgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlVwZGF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuVXBkYXRlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuVXBkYXRlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5VcGRhdGVUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5Tb2x1dGlvblRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlNvbHV0aW9uVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Tb2x1dGlvblRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuVG8gfCBodG1sICVdIj5bJSBEYXRhLlRvUmVhbG5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMkxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5VcGRhdGVUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5VcGRhdGVUaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlVwZGF0ZVRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iPlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuVXNlckZpcnN0bmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCBodG1sICVdIChbJSBEYXRhLk93bmVyIHwgaHRtbCAlXSkiPlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NrIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+WyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TTEEgfCBodG1sICVdIj5bJSBEYXRhLlNMQSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTwvbGFiZWw+PGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUk8iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+PGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdIj5bJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQzIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWUKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDNMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQzTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQzUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDNQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU29sdXRpb25UaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlNvbHV0aW9uVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIER5bmFtaWNGaWVsZFNlcGFyYXRvciI+PC9kaXY+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iSW5mb3MiPgogICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvdyIpICVdCiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGUiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9saT4KClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudENvbnRlbnQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXIiKSAlXQo8L3VsPgoKPGZvcm0gbmFtZT0iYnVsayIgYWN0aW9uPSIiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPC9mb3JtPgoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im1hdHJpeCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldEJ1bGsiLz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudE1lbnVJdGVtTW92ZUZvcm0iKSAlXQo8bGkgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUgdGlja2V0IHRvIGEgZGlmZmVyZW50IHF1ZXVlIikgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNoYW5nZSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJy5JbmxpbmVBY3Rpb25zLCAuT3ZlcnZpZXdBY3Rpb25zJykub24oJ2NoYW5nZScsICdzZWxlY3RbbmFtZT1EZXN0UXVldWVJRF0nLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBGT1JFQUNIIE1lbnVFbGVtZW50IElOIERhdGEuRGF0YSAlXQogICAgWyUgTWVudUVsZW1lbnQuTmFtZSA9IEludGVycG9sYXRlKE1lbnVFbGVtZW50Lk5hbWUpICVdCiAgICBbJSBNZW51RWxlbWVudC5MaW5rID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTGluaykgJV0KICAgIFslIE1lbnVFbGVtZW50LkRlc2NyaXB0aW9uID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuRGVzY3JpcHRpb24pICVdClslIEVORCAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuQWN0aW9uUm93LkFkZEFjdGlvbnMoJCgnI1RpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdJyksIFslIEpTT04oRGF0YS5EYXRhKSAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeVN0YXJ0IikgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkluaXRDaGVja2JveFNlbGVjdGlvbigkKCdkaXYuQ2hlY2tib3gnKSk7CiAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyk7CiAgICAgICAgLy8gcHJldmVudCBNYXN0ZXJBY3Rpb24gb24gRHluYW1pYyBGaWVsZHMgbGlua3MKICAgICAgICBpZiAoJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdEeW5hbWljRmllbGRMaW5rJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICBpZiAoRXZlbnQuY3RybEtleSB8fCBFdmVudC5tZXRhS2V5KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9KTsKCiAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdUb3VjaERldmljZScpKSB7CiAgICAgICAgJCgndWwuSW5saW5lQWN0aW9ucyBsaTpub3QoLlJlc3BvbnNpdmVBY3Rpb25NZW51KScpLmhpZGUoKTsKICAgIH0KICAgICQoJ2xpLlJlc3BvbnNpdmVBY3Rpb25NZW51Jykub24oJ2NsaWNrLlRvZ2dsZVJlc3BvbnNpdmVBY3Rpb25NZW51JywgZnVuY3Rpb24gKCkgewogICAgICAgICQodGhpcykuc2libGluZ3MoKS50b2dnbGUoKTsKICAgICAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdPcGVuZWQnKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgICQoJy5PdmVydmlld01lZGl1bSA+IGxpLCAuT3ZlcnZpZXdMYXJnZSA+IGxpJykub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJ3VsLklubGluZUFjdGlvbnMnKS5jc3MoJ3RvcCcsICcwcHgnKTsKCiAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnRXZlbnQuQWdlbnQuVGlja2V0T3ZlcnZpZXcuSW5saW5lQWN0aW9ucy5TaG93bicpOwogICAgfSk7CiAgICAkKCcuT3ZlcnZpZXdNZWRpdW0gPiBsaSwgLk92ZXJ2aWV3TGFyZ2UgPiBsaScpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oRXZlbnQpIHsKCiAgICAgICAgICAgIC8vIFRoZSBpbmxpbmUgYWN0aW9ucyB3b3VsZCBoaWRlIGlmIGhvdmVyaW5nIG92ZXIgdGhlIHF1ZXVlIHNlbGVjdGlvbiBkdWUgdG8gYSBidWcgaW4gSUUuCiAgICAgICAgICAgIC8vICAgU2VlIGJ1ZyMxMjQwMyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBoYXMgdG8gYmUgYWRkZWQgYWxzbyBmb3IgbW9kZXJuaXplZCBkcm9wZG93bnMuCiAgICAgICAgICAgIC8vICAgU2VlIGJ1ZyMxMzEwMCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgRXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcKICAgICAgICAgICAgICAgIHx8ICQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnSW5wdXRGaWVsZF9TZWFyY2gnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICQodGhpcykuZmluZCgndWwuSW5saW5lQWN0aW9ucycpLmNzcygndG9wJywgJy0zNXB4Jyk7CgogICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LkFnZW50LlRpY2tldE92ZXJ2aWV3LklubGluZUFjdGlvbnMuSGlkZGVuJywgWyQodGhpcykuZmluZCgndWwuSW5saW5lQWN0aW9ucycpXSk7CiAgICB9KTsKCi8vXV0+PC9zY3JpcHQ+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudFJlYWR5U3RhcnQiKSAlXQpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQo8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQogICAgPGxpIGNsYXNzPSJBbHdheXNQcmVzZW50Ij4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdIiBpZD0iU2VsZWN0QWxsVGlja2V0cyIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iSW52aXNpYmxlVGV4dCIgZm9yPSJTZWxlY3RBbGxUaWNrZXRzIj5bJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgIDwvc3Bhbj4KICAgIDwvbGk+CiAgICA8bGkgaWQ9IkJ1bGtBY3Rpb24iIGNsYXNzPSJBbHdheXNQcmVzZW50IEluYWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93QnVsayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdCiAgICA8bGk+PGEgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCiAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCjwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvdyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEhlYWRlciIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkFjdGlvblJvdy5Jbml0KCk7CgogICAgJCgnYS5Bc1BvcHVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgTWF0Y2hlcywKICAgICAgICAgICAgUG9wdXBUeXBlID0gJ1RpY2tldEFjdGlvbic7CgogICAgICAgIE1hdGNoZXMgPSAkKHRoaXMpLmF0dHIoJ2NsYXNzJykubWF0Y2goL1BvcHVwVHlwZV8oXHcrKS8pOwogICAgICAgIGlmIChNYXRjaGVzKSB7CiAgICAgICAgICAgIFBvcHVwVHlwZSA9IE1hdGNoZXNbMV07CiAgICAgICAgfQoKICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgUG9wdXBUeXBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TGFyZ2UiIGNsYXNzPSJPdmVydmlldyBPdmVydmlld0xhcmdlIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGlja2V0Rm91bmQiKSAlXQogICAgPGxpIGlkPSJFbXB0eU1lc3NhZ2VMYXJnZSI+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJObyB0aWNrZXQgZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RpY2tldEZvdW5kIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50Q29udGVudCIpICVdCiAgICA8bGkgaWQ9IlRpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IFslIERhdGEuQWRkaXRpb25hbENsYXNzZXMgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93IikgJV0KICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIElubGluZUFjdGlvbnMiPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJSZXNwb25zaXZlQWN0aW9uTWVudSI+PGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpdmVBY3Rpb25NZW51WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk9wZW4gLyBDbG9zZSB0aWNrZXQgYWN0aW9uIG1lbnUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PC9hPjwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvd0l0ZW0iKSAlXQogICAgICAgICAgICAgICAgPGxpPjxhIGlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93SXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvd0l0ZW1IVE1MIikgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuSFRNTCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93SXRlbUhUTUwiKSAlXQogICAgICAgICAgICA8L3VsPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgLy8gU3RvcCBwcm9wYWdhdGlvbiBvbiBjbGljayBvbiBhIHBhcnQgb2YgdGhlIElubGllbkFjdGlvblJvdyB3aXRob3V0IGEgbGluawogICAgLy8gT3RoZXJ3aXNlIHRoYXQgd291bGQgdHJpZ2dlciB0aGUgbGktd2lkZSBsaW5rIHRvIHRoZSB0aWNrZXR6b29tCiAgICAkKCd1bC5JbmxpbmVBY3Rpb25zJykuY2xpY2soZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgRXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoRXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIH0KICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJ1bGsiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaGVja2JveCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkNoZWNrYm94IiB0eXBlPSJjaGVja2JveCIgbmFtZT0iVGlja2V0SUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCB0aGlzIHRpY2tldCIpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCdWxrIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGFJY29uIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNsYXNzU3BhbiB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8ZW0+WyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXTwvZW0+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUljb24iKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkluZm9zIj4KICAgICAgICAgICAgICAgIDxoMj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIENvbmZpZygiVGlja2V0OjpIb29rIikgJV1bJSBDb25maWcoIlRpY2tldDo6SG9va0RpdmlkZXIiKSAlXVslIERhdGEuVGlja2V0TnVtYmVyICVdICZuZGFzaDsgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2gyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIGNsYXNzPSJtZW51aXRlbSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBZ2UiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQWdlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV0iPlslIERhdGEuUXVldWUgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+WyUgRGF0YS5TZXJ2aWNlIHwgdHJ1bmNhdGUoMjYpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TTEEgfCBodG1sICVdIj5bJSBEYXRhLlNMQSB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV0gKFslIERhdGEuT3duZXIgfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCB0cnVuY2F0ZSgzMCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxvY2siKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1pZGRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSI+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJOYW1lIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuVXBkYXRlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuVXBkYXRlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5VcGRhdGVUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU29sdXRpb25UaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlNvbHV0aW9uVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1pZGRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JpdGljYWxpdHkiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3JpdGljYWxpdHkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Dcml0aWNhbGl0eSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5JbXBhY3QgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5JbXBhY3QpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJbJSBEYXRhLkNsYXNzICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3ciKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKIyAgICAgICAgICAgICAgICAgICAgPHRyPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgICAgICAgICAgICAgICAgICAgIDx0cj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmQiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmQiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L3RyPgoKICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlc1ByZXZpZXdBcmVhIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJldmlldyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJIZWFkbGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRnJvbVJlYWxuYW1lIHwgdHJ1bmNhdGUoNTApIHwgaHRtbCAlXSAmbmRhc2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJTdWJqZWN0Ij5bJSBEYXRhLlN1YmplY3QgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGF0ZVRpbWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ2xlYXIiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuQmxvY2siPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlUHJldmlld0FjdGlvblJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSIgYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXBseUFsbCIgdmFsdWU9IlslIERhdGEuUmVwbHlBbGwgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVzcG9uc2VJRFslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSIgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRSZXNwb25zZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIHNlbGVjdFtuYW1lPVJlc3BvbnNlSURdJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIFVSTDsKCiAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAkKHRoaXMpLnBhcmVudHMoKS5zZXJpYWxpemUoKTsKICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzZWxlY3QgYm94IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4gZnJvbSB0aGUgc2FtZSB3aW5kb3cKICAgICAgICAgICAgJCh0aGlzKS52YWwoJzAnKTsKICAgICAgICB9CiAgICB9KTsKICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGNsaWNrIGV2ZW50IGRvZXMgbm90IGJ1YmJsZSB1cCB0byB0aGUgdGFibGUgcm93IGFuZCBleGVjdXRlIGl0cyBjbGljayBoYW5kbGVyCiAgICAkKCcjWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIHNlbGVjdFtuYW1lPVJlc3BvbnNlSURdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlUHJldmlld0FjdGlvblJvd0l0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBBcnRpY2xlQm9keSI+ClslIERhdGEuQm9keU5vdGUgJV0KWyUgRGF0YS5Cb2R5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVQcmV2aWV3IikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZXNQcmV2aWV3QXJlYSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudENvbnRlbnQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXIiKSAlXQo8L3VsPgoKCjxmb3JtIG5hbWU9ImJ1bGsiIGFjdGlvbj0iIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJtYXRyaXgiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRCdWxrIi8+ClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50Rm9vdGVyQnVsa0l0ZW0iKSAlXQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Rm9vdGVyQnVsa0l0ZW0iKSAlXQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPC9mb3JtPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRGb290ZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIikgJV0KPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICA8Zm9ybSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNb3ZlIHRpY2tldCB0byBhIGRpZmZlcmVudCBxdWV1ZSIpIHwgaHRtbCAlXSIgYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNoYW5nZSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJy5JbmxpbmVBY3Rpb25zLCAuT3ZlcnZpZXdBY3Rpb25zJykub24oJ2NoYW5nZScsICdzZWxlY3RbbmFtZT1EZXN0UXVldWVJRF0nLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBGT1JFQUNIIE1lbnVFbGVtZW50IElOIERhdGEuRGF0YSAlXQogICAgWyUgTWVudUVsZW1lbnQuTmFtZSA9IEludGVycG9sYXRlKE1lbnVFbGVtZW50Lk5hbWUpICVdCiAgICBbJSBNZW51RWxlbWVudC5MaW5rID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTGluaykgJV0KICAgIFslIE1lbnVFbGVtZW50LkRlc2NyaXB0aW9uID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuRGVzY3JpcHRpb24pICVdClslIEVORCAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuQWN0aW9uUm93LkFkZEFjdGlvbnMoJCgnI1RpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdJyksIFslIEpTT04oRGF0YS5EYXRhKSAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeVN0YXJ0IikgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkluaXRDaGVja2JveFNlbGVjdGlvbigkKCdkaXYuQ2hlY2tib3gnKSk7CiAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyk7CgogICAgICAgIC8vIGlmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBzZWxlY3QgdGV4dCBmcm9tIGFuIGFydGljbGUsIE1hc3RlckFjdGlvbiBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCiAgICAgICAgaWYgKHR5cGVvZiBFdmVudC50YXJnZXQgPT09ICdvYmplY3QnICYmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0FydGljbGVCb2R5JykgfHwgJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdBY3Rpb25Sb3cnKSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gcHJldmVudCBNYXN0ZXJBY3Rpb24gb24gRHluYW1pYyBGaWVsZHMgbGlua3MKICAgICAgICBpZiAoJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdEeW5hbWljRmllbGRMaW5rJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBQcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBNb2Rlcm5pemUgaW5wdXQgZmllbGRzLgogICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0lucHV0RmllbGRfU2VhcmNoJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBvbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkKICAgICAgICBpZiAoRXZlbnQudGFyZ2V0ICE9PSAkTWFzdGVyQWN0aW9uTGluay5nZXQoMCkpIHsKICAgICAgICAgICAgaWYgKEV2ZW50LmN0cmxLZXkgfHwgRXZlbnQubWV0YUtleSkgewogICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSk7CiAgICBDb3JlLlVJLkFjY29yZGlvbi5Jbml0KCQoJy5QcmV2aWV3ID4gdWwnKSwgJ2xpIGgzIGEnLCAnLkhpZGRlbkJsb2NrJyk7CgogICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnVG91Y2hEZXZpY2UnKSkgewogICAgICAgICQoJ3VsLklubGluZUFjdGlvbnMgbGk6bm90KC5SZXNwb25zaXZlQWN0aW9uTWVudSknKS5oaWRlKCk7CiAgICB9CiAgICAkKCdsaS5SZXNwb25zaXZlQWN0aW9uTWVudScpLm9uKCdjbGljay5Ub2dnbGVSZXNwb25zaXZlQWN0aW9uTWVudScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAkKHRoaXMpLnNpYmxpbmdzKCkudG9nZ2xlKCk7CiAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnT3BlbmVkJykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcuT3ZlcnZpZXdNZWRpdW0gPiBsaSwgLk92ZXJ2aWV3TGFyZ2UgPiBsaScpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgJCh0aGlzKS5maW5kKCd1bC5JbmxpbmVBY3Rpb25zJykuY3NzKCd0b3AnLCAnMHB4Jyk7CgogICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LkFnZW50LlRpY2tldE92ZXJ2aWV3LklubGluZUFjdGlvbnMuU2hvd24nKTsKICAgIH0pOwogICAgJCgnLk92ZXJ2aWV3TWVkaXVtID4gbGksIC5PdmVydmlld0xhcmdlID4gbGknKS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKEV2ZW50KSB7CgogICAgICAgICAgICAvLyBUaGUgaW5saW5lIGFjdGlvbnMgd291bGQgaGlkZSBpZiBob3ZlcmluZyBvdmVyIHRoZSBxdWV1ZSBzZWxlY3Rpb24gZHVlIHRvIGEgYnVnIGluIElFLgogICAgICAgICAgICAvLyAgIFNlZSBidWcjMTI0MDMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIC8vIFRoZSBleGNlcHRpb24gaGFzIHRvIGJlIGFkZGVkIGFsc28gZm9yIG1vZGVybml6ZWQgZHJvcGRvd25zLgogICAgICAgICAgICAvLyAgIFNlZSBidWcjMTMxMDAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIEV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWxlY3QnCiAgICAgICAgICAgICAgICB8fCAkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0lucHV0RmllbGRfU2VhcmNoJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkKHRoaXMpLmZpbmQoJ3VsLklubGluZUFjdGlvbnMnKS5jc3MoJ3RvcCcsICctMzVweCcpOwoKICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5BZ2VudC5UaWNrZXRPdmVydmlldy5JbmxpbmVBY3Rpb25zLkhpZGRlbicsIFskKHRoaXMpLmZpbmQoJ3VsLklubGluZUFjdGlvbnMnKV0pOwogICAgfSk7CgovL11dPjwvc2NyaXB0PgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRSZWFkeVN0YXJ0IikgJV0KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRQaG9uZS50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgSW5zZXJ0VGVtcGxhdGUoIkFnZW50Q3VzdG9tZXJTZWFyY2gudHQiKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBGb3JtU2NyZWVuIj4KCiAgICBbJSBJRiBEYXRhLlRpY2tldElEICVdCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJTcGxpdCBJbnRvIE5ldyBQaG9uZSBUaWNrZXQiKSB8IGh0bWwgJV08L2gxPgogICAgWyUgRUxTSUYgRGF0YS5Gcm9tQ2hhdElEICVdCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJTYXZlIENoYXQgSW50byBOZXcgUGhvbmUgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIFslIEVMU0UgJV0KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkNyZWF0ZSBOZXcgUGhvbmUgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIFslIEVORCAlXQoKICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJJbmZvIiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkN1c3RvbWVyVGFibGUgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiIGlkPSJOZXdQaG9uZVRpY2tldCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiBpZD0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMCIvPgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgaWQ9Ik93bmVyQWxsIiB2YWx1ZT0iWyUgRGF0YS5Pd25lckFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSJbJSBEYXRhLlJlc3BvbnNpYmxlQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJVc2VyIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGlua1RpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5MaW5rVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGcm9tQ2hhdElEIiB2YWx1ZT0iWyUgRGF0YS5Gcm9tQ2hhdElEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1R5cGVJRCcsIFsnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkZyb21DdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iRnJvbUN1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5Gcm9tSW52YWxpZCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgZm9yIHRoZSB0aWNrZXQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbVNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkN1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXkiIGlkPSJDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwgIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIFslIERhdGEuQ3VzdG9tZXJTZWxlY3RlZCB8IGh0bWwgJV0gIFslIERhdGEuQ3VzdG9tZXJEaXNhYmxlZCB8IGh0bWwgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIEN1c3RvbWVyS2V5OwogICAgICAgIGlmICggJCh0aGlzKS5wcm9wKCdjaGVja2VkJykgKXsKCiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gJCggJyNDdXN0b21lcktleV8nICskKHRoaXMpLnZhbCgpICkudmFsKCk7CiAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLkN1c3RvbWVyVGlja2V0UmVtb3ZlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZW1vdmVDdXN0b21lclRpY2tldCggJCh0aGlzKSApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoICdGcm9tQ3VzdG9tZXInLCAiWyUgRGF0YS5FbWFpbCB8IGh0bWwgJV0iLCAiWyUgRGF0YS5DdXN0b21lciB8IGh0bWwgJV0iLCB0cnVlICk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbUV4dGVybmFsQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIFslIElGIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZTo6Q3VzdG9tZXJJRFJlYWRPbmx5IikgJV0gcmVhZG9ubHkgWyUgRU5EICVdIGNsYXNzPSJXNzVwYyIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVzdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUbyBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ub1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdEZXN0JywgWydUeXBlSUQnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICB9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIGNsYXNzPSJWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTZXJ2aWNlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2VNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNlcnZpY2VJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NlcnZpY2VJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2VNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U0xBIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ1NlcnZpY2VJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNMQU1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU0xBSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNMQU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPd25lclNlbGVjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3VXNlcklEIj5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik93bmVyU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVmcmVzaCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjT3duZXJTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNPd25lckFsbCcpLnZhbCgnMScpOyAvLyBOZWVkZWQ/IFdoeT8KICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnT3duZXJBbGwnLCBbJ05ld1VzZXJJRCddLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI05ld1VzZXJJRCcpLmZvY3VzKCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnI05ld1VzZXJJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXdVc2VySUQnLCBbICdUeXBlSUQnLCAnRGVzdCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3duZXJTZWxlY3Rpb24iKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGVTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzcG9uc2libGVPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZXNwb25zaWJsZVNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXJlZnJlc2giPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1Jlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKCcjUmVzcG9uc2libGVBbGwnKS52YWwoJzEnKTsgLy8gTmVlZGVkPyBXaHk/CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1Jlc3BvbnNpYmxlQWxsJywgWydOZXdSZXNwb25zaWJsZUlEJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjTmV3UmVzcG9uc2libGVJRCcpLmZvY3VzKCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnI05ld1Jlc3BvbnNpYmxlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UmVzcG9uc2libGVJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlc3BvbnNpYmxlU2VsZWN0aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU3ViamVjdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdEludmFsaWQgfCBodG1sICVdIiB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiBpZD0iU3ViamVjdCIgdmFsdWU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPcHRpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPcHRpb25zIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNwZWxsQ2hlY2siKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uU3BlbGxDaGVjayI+WyBbJSBUcmFuc2xhdGUoIlNwZWxsIGNoZWNrIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJTcGVsbENoZWNrIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk9wdGlvbkN1c3RvbWVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvbkN1c3RvbWVyIj5bIFslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpIHwgaHRtbCAlXSBdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3B0aW9uQ3VzdG9tZXIiKSAlXQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudExpbmtPYmplY3Q7TW9kZT1UZW1wb3Jhcnk7U291cmNlT2JqZWN0PVRpY2tldDtTb3VyY2VLZXk9WyUgRGF0YS5Gb3JtSUQgfCB1cmkgJV07VGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgaWQ9Ik9wdGlvbkxpbmtUaWNrZXQiIGNsYXNzPSJBc1BvcHVwIj5bIFslIFRyYW5zbGF0ZSgiTGluayB0aWNrZXQiKSB8IGh0bWwgJV0gXTwvYT4KIyAtLS0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zRW5kIC0tPgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRPcHRpb25zIikgJV0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19Ob1RpY2tldE9wdGlvbnNGYWxsYmFjayAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJywgWydSaWNoVGV4dEZpZWxkJ10pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRGaWVsZCIgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiUmljaFRleHRFZGl0b3IudHQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmljaFRleHQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5SaWNoVGV4dEludmFsaWQgfCBodG1sICVdIiBuYW1lPSJCb2R5IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNZXNzYWdlIGJvZHkiKSB8IGh0bWwgJV0iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFNwYWNpbmdMZWZ0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgLz4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgJCgnI0F0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS50cmlnZ2VyKCdzdWJtaXQnKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkZpbGVVcGxvYWQiIG5hbWU9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjRmlsZVVwbG9hZCcpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLmZpbmQoJyNBdHRhY2htZW50VXBsb2FkJykudmFsKCcxJykuZW5kKCkuc3VibWl0KCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hhdEFydGljbGVQcmV2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGF0IHByb3RvY29sIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaGF0UHJvdG9jb2wiPgpbJSBJTkNMVURFICJDaGF0RGlzcGxheS50dCIgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoJ1RoZSBjaGF0IHdpbGwgYmUgYXBwZW5kZWQgYXMgYSBzZXBhcmF0ZSBhcnRpY2xlLicpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhdEFydGljbGVQcmV2aWV3IikgJV0KCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXh0U3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHRpY2tldCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmV4dFN0YXRlc1N0cmcgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXh0U3RhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXh0U3RhdGVJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsJ05ld1Jlc3BvbnNpYmxlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBlbmRpbmcgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGVuZGluZ0RhdGVTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSG91ckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiRm9yIGFsbCBwZW5kaW5nKiBzdGF0ZXMuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCgojIHNob3cgdGhlIGltcGFjdApbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiMgLS0tCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNQcmlvcml0eUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1ByaW9yaXR5SUQnLCBbICdUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHNMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaW1lVW5pdHMiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfVGltZVVuaXRzIFslIERhdGEuVGltZVVuaXRzUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuVGltZVVuaXRzSW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IlslIERhdGEuVGltZVVuaXRzIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVyVGlja2V0cyI+PC9kaXY+CiAgICA8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Jbml0KCk7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0xvY2FsaXphdGlvbi5EZWxldGUnLCBbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgSlNPTiAlXSk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7IENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnQWN0aW9uJyk7IHJldHVybiBmYWxzZTt9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgKHRoaXMgcGFydCBoZXJlIGlzIGltcG9ydGFudCBpZiB0aGUgcGFnZSBpcyByZWxvYWRlZCBkdWUgdG8gZS5nLiBhdHRhY2htZW50IHVwbG9hZCkKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgojIGV4YW1wbGUgdGVtcGxhdGUgZm9ybSBmb3IgY3VzdG9taXphdGlvbnMKIzxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iVGVtcGxhdGUxIj4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIxIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IkV4YW1wbGUgU3ViamVjdCIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSJOYW1lOgojUHJvZHVjdDoKI0NvbW1lbnQ6Ii8+CiM8L2Zvcm0+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRUaWNrZXRab29tLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRmlsdGVyRGlhbG9nIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkKCcjQXJ0aWNsZUZpbHRlckRpYWxvZycpLCBbJSBUcmFuc2xhdGUoIkFydGljbGUgZmlsdGVyIikgfCBKU09OICVdLCAnMjBweCcsICdDZW50ZXInLCB0cnVlLCBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIkFwcGx5IikgfCBKU09OICVdLAogICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IENvcmUuQUpBWC5TZXJpYWxpemVGb3JtKCQoJyNBcnRpY2xlRmlsdGVyRGlhbG9nRm9ybScpKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksIERhdGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgJ3RleHQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGFiZWw6IFslIFRyYW5zbGF0ZSgiUmVzZXQiKSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNBcnRpY2xlVHlwZUZpbHRlcicpLnZhbCgnJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKICAgICAgICAgICAgICAgICAgICAkKCcjQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInKS52YWwoJycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICAgICQoJyNSZXNldEFydGljbGVGaWx0ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246ICAgICAgICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICBTdWJhY3Rpb246ICAgICdBcnRpY2xlRmlsdGVyU2V0JywKICAgICAgICAgICAgVGlja2V0SUQ6ICAgICAiWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLAogICAgICAgICAgICBTYXZlRGVmYXVsdHM6IDEKICAgICAgICB9OwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICB9KTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KPGRpdiBpZD0iQXJ0aWNsZUZpbHRlckRpYWxvZyIgY2xhc3M9IkhpZGRlbiI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IkFydGljbGVGaWx0ZXJEaWFsb2dGb3JtIiBuYW1lPSJBcnRpY2xlRmlsdGVyRGlhbG9nRm9ybSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IkFnZW50VGlja2V0Wm9vbSIgbmFtZT0iQWN0aW9uIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IkFydGljbGVGaWx0ZXJTZXQiIG5hbWU9IlN1YmFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgbmFtZT0iVGlja2V0SUQiLz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFydGljbGVUeXBlRmlsdGVyIj5bJSBUcmFuc2xhdGUoIkFydGljbGUgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkFydGljbGVUeXBlRmlsdGVyU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFydGljbGVTZW5kZXJUeXBlRmlsdGVyIj5bJSBUcmFuc2xhdGUoIlNlbmRlciBUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXJTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2F2ZURlZmF1bHRzIj5bJSBUcmFuc2xhdGUoIlNhdmUgZmlsdGVyIHNldHRpbmdzIGFzIGRlZmF1bHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iU2F2ZURlZmF1bHRzIiBuYW1lPSJTYXZlRGVmYXVsdHMiIHZhbHVlPSIxIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgPC9mb3JtPgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVGaWx0ZXJEaWFsb2ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRXZlbnRUeXBlRmlsdGVyRGlhbG9nIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKCcjRXZlbnRUeXBlRmlsdGVyRGlhbG9nJykuZmluZCgnZm9ybScpLmNzcygnd2lkdGgnLCAnNTAwcHgnKTsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkKCcjRXZlbnRUeXBlRmlsdGVyRGlhbG9nJyksIFslIFRyYW5zbGF0ZSgiRXZlbnQgVHlwZSBGaWx0ZXIiKSB8IEpTT04gJV0sICcyMHB4JywgJ0NlbnRlcicsIHRydWUsIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGFiZWw6IFslIFRyYW5zbGF0ZSgiQXBwbHkiKSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gQ29yZS5BSkFYLlNlcmlhbGl6ZUZvcm0oJCgnI0V2ZW50VHlwZUZpbHRlckRpYWxvZ0Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLCBEYXRhLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgIH0sICd0ZXh0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIlJlc2V0IikgfCBKU09OICVdLAogICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjRXZlbnRUeXBlRmlsdGVyJykudmFsKCcnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICAkKCcjUmVzZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAgICAgICAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAgICAnRXZlblR5cGVGaWx0ZXJTZXQnLAogICAgICAgICAgICBUaWNrZXRJRDogICAgICJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIsCiAgICAgICAgICAgIFNhdmVEZWZhdWx0czogMQogICAgICAgIH07CiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLCBEYXRhLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgIH0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8ZGl2IGlkPSJFdmVudFR5cGVGaWx0ZXJEaWFsb2ciIGNsYXNzPSJIaWRkZW4iPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJFdmVudFR5cGVGaWx0ZXJEaWFsb2dGb3JtIiBuYW1lPSJFdmVudFR5cGVGaWx0ZXJEaWFsb2dGb3JtIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iQWdlbnRUaWNrZXRab29tIiBuYW1lPSJBY3Rpb24iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iRXZlblR5cGVGaWx0ZXJTZXQiIG5hbWU9IlN1YmFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgbmFtZT0iVGlja2V0SUQiLz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFydGljbGVUeXBlRmlsdGVyIj5bJSBUcmFuc2xhdGUoIkV2ZW50IFR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5FdmVudFR5cGVGaWx0ZXJTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2F2ZURlZmF1bHRzIj5bJSBUcmFuc2xhdGUoIlNhdmUgYXMgZGVmYXVsdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJTYXZlRGVmYXVsdHMiIG5hbWU9IlNhdmVEZWZhdWx0cyIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICA8L2Zvcm0+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRXZlbnRUeXBlRmlsdGVyRGlhbG9nIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlciIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIFRpY2tldFpvb20gWyUgSUYgRGF0YS5Vc2VBcnRpY2xlQ29sb3JzICVdVXNlQXJ0aWNsZUNvbG9yc1slIEVORCAlXSI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj48c3BhbiBjbGFzcz0iUHJpb3JpdHlJRC1bJSBEYXRhLlByaW9yaXR5SUQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9zcGFuPjwvZGl2PgogICAgICAgIDxoMT4KICAgICAgICAgICAgWyUgRGF0YS5Ib29rICVdWyUgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgJV1bJSBEYXRhLlRpY2tldE51bWJlciAlXSAmbWRhc2g7IFslIERhdGEuVGl0bGUgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgoKIyBJZnJhbWUgdXNlZCBmb3IgZml4aW5nIGJ1ZyM4NTQ1OiBBdHRhY2htZW50IGRvd25sb2FkIG5vdCBwb3NzaWJsZSBpZiBwb3AgdXAgb2YgYW5vdGhlciBhY3Rpb24gaXMgb3BlbgojIEFsbCBkb3dubG9hZHMgKGUuZy4gYXR0YWNobWVudHMpIGhhdmUgdGhpcyBpZnJhbWUgYXMgdGFyZ2V0LiBUaGlzIHByZXZlbnRzIHRoZSBicm93c2VyIGZyb20gc2VuZGluZwojIGFuIGh0dHAgcmVxdWVzdCB0byB0aGUgVGlja2V0Wm9vbSB3aW5kb3cuIEl0IHNlbmRzIHRoZSBkb3dubG9hZCByZXF1ZXN0IHRvIHRoaXMgaWZyYW1lIGluc3RlYWQuCiMgU2VuZGluZyB0aGUgZG93bmxvYWQgcmVxdWVzdCB0byB0aGUgbWFpbiB3aW5kb3cgd291bGQgbGVhZCB0byBhbiBhbGVydCBtZXNzYWdlIGFib3V0IGxlYXZpbmcgdGhlIHBhZ2UKIyBpZiBhdCB0aGUgc2FtZSB0aW1lIGEgcG9wdXAgd2luZG93IChlLmcuIGZvciBhIHRpY2tldCBhbnN3ZXIpIGlzIG9wZW5lZC4KICAgIDxpZnJhbWUgc3JjPSJhYm91dDpibGFuayIgd2lkdGg9IjAiIGhlaWdodD0iMCIgbmFtZT0iQXR0YWNobWVudFdpbmRvdyIgaWQ9IkF0dGFjaG1lbnRXaW5kb3ciPjwvaWZyYW1lPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5XaWRnZXRUaXRsZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFyY2hpdmVGbGFnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXJjaGl2ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIFRyYW5zbGF0ZSgiVGhpcyB0aWNrZXQgaXMgYXJjaGl2ZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcmNoaXZlRmxhZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSBGaXhlZFZhbHVlU21hbGwiIHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlZhbGlkICE9IDEgJV0gPGVtIGNsYXNzPSJFcnJvciI+WyUgVHJhbnNsYXRlKCJOb3RlOiBUeXBlIGlzIGludmFsaWQhIikgfCBodG1sICVdPC9lbT4gWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBZ2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5BZ2UgJV0iPlslIERhdGEuQWdlICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXSI+WyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDcmVhdGVkQnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ3JlYXRlZEJ5VXNlciAlXSI+WyUgRGF0YS5DcmVhdGVkQnlVc2VyICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDcmVhdGVkQnkiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTG9ja2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvcD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCB8IHJlcGxhY2UoJzo6JywgJzx3YnI+Ojo8d2JyPicpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdIj5bJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9WyUgRGF0YS5TZXJ2aWNlSUQgfCB1cmkgJV07IiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckluY2lTaWduYWwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTZXJ2aWNlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TTEEgfCBodG1sICVdIj5bJSBEYXRhLlNMQSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU0xBWm9vbTtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgdXJpICVdOyIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eV9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5IikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01JbXBhY3RfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBUaWdodCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWRfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWRfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uUmVzdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHRfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHRfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdCIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvbkRhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlX0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvbkRhdGUiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZV9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lIikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVjb3ZlcnlTdGFydFRpbWVfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVjb3ZlcnlTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZSIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIC0tLQoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpIHwgSW50ZXJwb2xhdGUgJV0iIGNsYXNzPSJbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rQ2xhc3MiKSAlXSIgWyUgQ29uZmlnKCJDdXN0b21lckRCTGlua1RhcmdldCIpICVdPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb3RhbEFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY2NvdW50ZWQgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuVGlja2V0VGltZVVuaXRzICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja0VuZCgiVG90YWxBY2NvdW50ZWRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGVuZGluZ1VudGlsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGVuZGluZyB0aWxsIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSBbJSBEYXRhLlBlbmRpbmdVbnRpbENsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlBlbmRpbmdVbnRpbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVW50aWxUaW1lSHVtYW4gfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQZW5kaW5nVW50aWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPd25lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5Vc2VyTG9naW4gfCBodG1sICVdKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkVuYWJsZUNoYXQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJVc2VyU3RhdHVzSWNvbiBbJSBEYXRhLlVzZXJTdGF0ZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jaXJjbGUiIHRpdGxlPSJbJSBEYXRhLlVzZXJTdGF0ZURlc2NyaXB0aW9uIHwgaHRtbCAlXSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuQWdlbnRFbmFibGVDaGF0ICYmIERhdGEuVXNlcklEICE9IEVudignVXNlcklEJykgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJVc2VyQ2hhdEljb25zIEJsb2NrIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3RhcnQgY2hhdCIpIHwgaHRtbCAlXSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iVXNlckNoYXRTdGFydCIgZGF0YS11c2VyLWlkPSJbJSBEYXRhLlVzZXJJRCB8IGh0bWwgJV0iIGRhdGEtdXNlci10eXBlPSJVc2VyIiBkYXRhLXVzZXItZnVsbG5hbWU9IlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSIgZGF0YS10aWNrZXQtaWQ9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvbW1lbnRzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuVmlkZW9DaGF0RW5hYmxlZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlZpZGVvIGNhbGwiKSB8IGh0bWwgJV0iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IlVzZXJWaWRlb0NhbGxTdGFydFslIElGICFEYXRhLlZpZGVvQ2hhdEF2YWlsYWJsZSAlXSBVbmF2YWlsYWJsZVslIEVMU0lGICFEYXRhLlZpZGVvQ2hhdFN1cHBvcnQgJV0gVW5zdXBwb3J0ZWRbJSBFTkQgJV0iIGRhdGEtdXNlci1pZD0iWyUgRGF0YS5Vc2VySUQgfCBodG1sICVdIiBkYXRhLXVzZXItdHlwZT0iVXNlciIgZGF0YS11c2VyLWZ1bGxuYW1lPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iIGRhdGEtdGlja2V0LWlkPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS12aWRlby1jYW1lcmEiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXVkaW8gY2FsbCIpIHwgaHRtbCAlXSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iVXNlckF1ZGlvQ2FsbFN0YXJ0WyUgSUYgIURhdGEuVmlkZW9DaGF0QXZhaWxhYmxlICVdIFVuYXZhaWxhYmxlWyUgRUxTSUYgIURhdGEuVmlkZW9DaGF0U3VwcG9ydCAlXSBVbnN1cHBvcnRlZFslIEVORCAlXSIgZGF0YS11c2VyLWlkPSJbJSBEYXRhLlVzZXJJRCB8IGh0bWwgJV0iIGRhdGEtdXNlci10eXBlPSJVc2VyIiAgZGF0YS11c2VyLWZ1bGxuYW1lPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iIGRhdGEtdGlja2V0LWlkPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taWNyb3Bob25lIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk93bmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuVXNlckxvZ2luIHwgaHRtbCAlXSkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5FbmFibGVDaGF0ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVXNlclN0YXR1c0ljb24gWyUgRGF0YS5Vc2VyU3RhdGUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2lyY2xlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyU3RhdGVEZXNjcmlwdGlvbiB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkFnZW50RW5hYmxlQ2hhdCAmJiBEYXRhLlVzZXJJRCAhPSBFbnYoJ1VzZXJJRCcpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVXNlckNoYXRJY29ucyBCbG9jayBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN0YXJ0IGNoYXQiKSB8IGh0bWwgJV0iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IlVzZXJDaGF0U3RhcnQiIGRhdGEtdXNlci1pZD0iWyUgRGF0YS5Vc2VySUQgfCBodG1sICVdIiBkYXRhLXVzZXItdHlwZT0iVXNlciIgZGF0YS11c2VyLWZ1bGxuYW1lPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iIGRhdGEtdGlja2V0LWlkPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb21tZW50cyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlZpZGVvQ2hhdEVuYWJsZWQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJWaWRlbyBjYWxsIikgfCBodG1sICVdIiB0eXBlPSJidXR0b24iIGNsYXNzPSJVc2VyVmlkZW9DYWxsU3RhcnRbJSBJRiAhRGF0YS5WaWRlb0NoYXRBdmFpbGFibGUgJV0gVW5hdmFpbGFibGVbJSBFTFNJRiAhRGF0YS5WaWRlb0NoYXRTdXBwb3J0ICVdIFVuc3VwcG9ydGVkWyUgRU5EICVdIiBkYXRhLXVzZXItaWQ9IlslIERhdGEuVXNlcklEIHwgaHRtbCAlXSIgZGF0YS11c2VyLXR5cGU9IlVzZXIiIGRhdGEtdXNlci1mdWxsbmFtZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIiBkYXRhLXRpY2tldC1pZD0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdmlkZW8tY2FtZXJhIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1ZGlvIGNhbGwiKSB8IGh0bWwgJV0iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IlVzZXJBdWRpb0NhbGxTdGFydFslIElGICFEYXRhLlZpZGVvQ2hhdEF2YWlsYWJsZSAlXSBVbmF2YWlsYWJsZVslIEVMU0lGICFEYXRhLlZpZGVvQ2hhdFN1cHBvcnQgJV0gVW5zdXBwb3J0ZWRbJSBFTkQgJV0iIGRhdGEtdXNlci1pZD0iWyUgRGF0YS5Vc2VySUQgfCBodG1sICVdIiBkYXRhLXVzZXItdHlwZT0iVXNlciIgIGRhdGEtdXNlci1mdWxsbmFtZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIiBkYXRhLXRpY2tldC1pZD0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWljcm9waG9uZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NEYXRhIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlByb2Nlc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0aXZpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQWN0aXZpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQWN0aXZpdHkpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzRGF0YSIpICVdCgojIHNob3cgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIlslIElGIERhdGEuTGlua1ByZXZpZXcgJV0gZGF0YS10cmlnZ2VyPSJmbG9hdGVyIiBkYXRhLWZsb2F0ZXItdXJsPSJbJSBEYXRhLkxpbmtQcmV2aWV3IHwgSW50ZXJwb2xhdGUgJV0iWyUgRU5EICVdIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3VzdG9tZXJUYWJsZSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJUYWJsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgT3ZlcmZsb3dWaXNpYmxlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3cgQ2x1c3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE1lbnUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPSJuYXYtWyUgRGF0YS5OYW1lIHwgcmVwbGFjZSgnICcsICctJykgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuVHlwZSA9PSAnQ2x1c3RlcicgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DbGFzcyAlXSIgPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0TWVudVN1YkNvbnRhaW5lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPSJuYXYtWyUgRGF0YS5OYW1lIHwgcmVwbGFjZSgnICcsICctJykgfCBodG1sICVdLWNvbnRhaW5lciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE1lbnVTdWJDb250YWluZXJJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPSJuYXYtWyUgRGF0YS5OYW1lIHwgcmVwbGFjZSgnICcsICctJykgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXVslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRNZW51U3ViQ29udGFpbmVySXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldE1lbnVTdWJDb250YWluZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldE1lbnUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRNZW51UGhvbmVBc0Ryb3Bkb3duIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0IiBpZD0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5QaG9uZUVsZW1lbnRJRCB8IGh0bWwgJV0iIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFJlcGx5U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1slIERhdGEuRm9ybUlEIHwgaHRtbCAlXSBzZWxlY3RbbmFtZT1bJSBEYXRhLlBob25lRWxlbWVudElEIHwgaHRtbCAlXV0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBVUkw7CgogICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdwogICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICB9Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRNZW51UGhvbmVBc0Ryb3Bkb3duIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTW92ZUxpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUiKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1ZXVlSUQiIHZhbHVlPSJbJSBEYXRhLlF1ZXVlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdFF1ZXVlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBpZiAoJCgnI0Rlc3RRdWV1ZUlEIG9wdGlvbjpzZWxlY3RlZCcpLnZhbCgpKSB7CiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgICAgIH0KICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNb3ZlTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1vdmVGb3JtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRNb3ZlO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07IiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUXVldWUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTW92ZUZvcm0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0IikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKdmFyIFdpZGdldFdpZHRoICAgPSBwYXJzZUludCgkKCcjRHluYW1pY0ZpZWxkc1dpZGdldCcpLmlubmVyV2lkdGgoKSAtIDE1LCAxMCksCiAgICBGaWVsZHNQZXJSb3cgID0gNCwKICAgIEZpZWxkTWFyZ2luICAgPSBwYXJzZUludCgkKCcuRHluYW1pY0ZpZWxkQXV0b1Jlc2l6ZScpLmNzcygnbWFyZ2luLXJpZ2h0JyksIDEwKSArIDIsCiAgICBGaWVsZFdpZHRoICAgID0gMDsKCi8vIGRlZmluZSBhbW91bnQgb2YgZmllbGRzIHBlciByb3cgZGVwZW5kaW5nIG9uIGRpc3BsYXkgcmVzb2x1dGlvbgppZiAoIFdpZGdldFdpZHRoIDwgMTAwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDM7Cn0KaWYgKCBXaWRnZXRXaWR0aCA8IDYwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDI7Cn0KaWYgKCBXaWRnZXRXaWR0aCA8IDQwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDE7Cn0KCi8vIGRldGVybWluZSB0aGUgbmVlZGVkIGZpZWxkIHdpZHRoIGFuZCByZXNpemUgdGhlIGZpZWxkcwoKaWYgKEZpZWxkc1BlclJvdyA9PT0gMSkgewogICAgRmllbGRXaWR0aCA9ICcxMDAlJzsKfQplbHNlIHsKICAgIEZpZWxkV2lkdGggPSBwYXJzZUludChXaWRnZXRXaWR0aCAvIEZpZWxkc1BlclJvdyAtIEZpZWxkTWFyZ2luIC0gMSwgMTApOwp9CgokKCcuRHluYW1pY0ZpZWxkQXV0b1Jlc2l6ZScpLndpZHRoKEZpZWxkV2lkdGgpOwoKJCgnLlNob3dGaWVsZEluZm9PdmVybGF5JykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKCiAgICB2YXIgT3ZlcmxheVRpdGxlICA9ICQodGhpcykuY2xvc2VzdCgnbGFiZWwnKS5hdHRyKCd0aXRsZScpLAogICAgICAgIE92ZXJsYXlIVE1MICAgPSAkKHRoaXMpLmNsb3Nlc3QoJy5GaWVsZENvbnRhaW5lcicpLmZpbmQoJy5WYWx1ZScpLmh0bWwoKTsKCiAgICBPdmVybGF5SFRNTCA9ICc8ZGl2IGNsYXNzPSJGaWVsZE92ZXJsYXkiPicgKyBPdmVybGF5SFRNTCArICc8L2Rpdj4nOwoKICAgIENvcmUuVUkuRGlhbG9nLlNob3dEaWFsb2coewogICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgIFRpdGxlOiBPdmVybGF5VGl0bGUsCiAgICAgICAgSFRNTDogT3ZlcmxheUhUTUwsCiAgICAgICAgUG9zaXRpb25Ub3A6ICcxMDBweCcsCiAgICAgICAgUG9zaXRpb25MZWZ0OiAnQ2VudGVyJywKICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgIEJ1dHRvbnM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZTogJ0Nsb3NlJywKICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIkNsb3NlIGRpYWxvZyIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLkVuYWJsZUZvcm0oJCgnZm9ybVtuYW1lPSJjb21wb3NlIl0nKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIiBpZD0iRHluYW1pY0ZpZWxkc1dpZGdldCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPjxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLldpZGdldFRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5leHRBY3Rpdml0eURpYWxvZ3MiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGlnaHRSb3cgQm90dG9tIj4KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5bJSBUcmFuc2xhdGUoRGF0YS5BY3Rpdml0eU5hbWUpIHwgaHRtbCAlXTo8L3N0cm9uZz48L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGNsYXNzPSJBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFByb2Nlc3M7U3ViYWN0aW9uPURpc3BsYXlBY3Rpdml0eURpYWxvZztUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO1Byb2Nlc3NFbnRpdHlJRD1bJSBEYXRhLlByb2Nlc3NFbnRpdHlJRCB8IHVyaSAlXTtBY3Rpdml0eURpYWxvZ0VudGl0eUlEPVslIERhdGEuQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQWN0aW9uTWVzc2FnZSI+WyUgVHJhbnNsYXRlKCJUaGVyZSBhcmUgbm8gZGlhbG9ncyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4iKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJOb0FjdGl2aXR5RGlhbG9ncyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOZXh0QWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgUHJvY2Vzc0luZm8iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb2Nlc3NJbmZvcm1hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cFNlcGFyYXRvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IkZpZWxkU2V0U2VwYXJhdG9yIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwU2VwYXJhdG9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENvbnRhaW5lciBEeW5hbWljRmllbGRBdXRvUmVzaXplIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGl0bGU9IlslIERhdGEuTGFiZWwgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFZhbHVlT3ZlcmxheVRyaWdnZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iU2hvd0ZpZWxkSW5mb092ZXJsYXkiPis8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUgQ3V0VmFsdWUgRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSAlXSI+CjwhLS0gT3V0cHV0RmlsdGVySG9va19XaWRnZXREeW5hbWljRmllbGRCZWdpbiAtLT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iWyUgSUYgRGF0YS5MaW5rUHJldmlldyAlXSBkYXRhLXRyaWdnZXI9ImZsb2F0ZXIiIGRhdGEtZmxvYXRlci11cmw9IlslIERhdGEuTGlua1ByZXZpZXcgfCBJbnRlcnBvbGF0ZSAlXSJbJSBFTkQgJV0gdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWx1ZSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFBsYWluIikgJV0KPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1dpZGdldER5bmFtaWNGaWVsZEVuZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlTG9uZyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRWYWx1ZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbHVlICVdClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldCIpICVdCgogICAgICAgICAgICA8ZGl2IGlkPSJBcnRpY2xlVHJlZSI+ClslIERhdGEuQXJ0aWNsZVRyZWUgJV0KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIaW50Tm9BcnRpY2xlcyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgaXRlbSBoYXMgbm8gYXJ0aWNsZXMgeWV0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSGludE5vQXJ0aWNsZXMiKSAlXQoKICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZUl0ZW1zIj4KWyUgRGF0YS5BcnRpY2xlSXRlbXMgJV0KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICAgICAgWyUgRGF0YS5MaW5rVGFibGVTdHJnICVdClslIFJlbmRlckJsb2NrRW5kKCJMaW5rVGFibGVDb21wbGV4IikgJV0KCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPC9kaXY+Cgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlIikgJV0KPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+CiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDI+CiAgICAgICAgWyUgSUYgRGF0YS5ab29tVGltZWxpbmUgJV0KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaWNrZXQgVGltZWxpbmUgVmlldyIpIHwgaHRtbCAlXQogICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBcnRpY2xlIE92ZXJ2aWV3IikgfCBodG1sICVdIC0gWyUgRGF0YS5BcnRpY2xlQ291bnQgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiQXJ0aWNsZShzKSIpIHwgaHRtbCAlXQogICAgICAgIFslIEVORCAlXQogICAgICAgIDwvaDI+CiAgICAgICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbEluZm9ybWF0aW9uIENvbnRyb2xSb3ciPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVBhZ2VzIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZVBhZ2VzIEljb25zIj4KICAgICAgICBbJSBGT1JFQUNIIHBhZ2UgSU4gWzEgLi4gRGF0YS5QYWdlc107ICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZVBhZ2U9WyUgcGFnZSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnUGFnZScpICVdIFslIHBhZ2UgJV0iIGRhdGEtcGFnZT0iWyUgcGFnZSAlXSIgWyUgSUYgcGFnZSA9PSBEYXRhLkN1cnJlbnRQYWdlICVdY2xhc3M9IkFjdGl2ZSJbJSBFTkQgJV0+WyUgcGFnZSAlXTwvYT4KICAgICAgICBbJSBFTkQ7ICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVBhZ2VzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlRmlsdGVyIEljb25zIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkFydGljbGUgRmlsdGVyIikgfCBodG1sICVdOjwvc3Bhbj4KIyBPbmx5IHNob3cgb25lOiBTZXQgb3IgUmVzZXQuCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRmlsdGVyU2V0TGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iU2V0QXJ0aWNsZUZpbHRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIEZpbHRlciIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWZpbHRlciI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2V0IikgfCBodG1sICVdPC9zcGFuPjwvYT4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRmlsdGVyU2V0TGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWx0ZXJSZXNldExpbmsiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlc2V0QXJ0aWNsZUZpbHRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVzZXQgRmlsdGVyIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVzZXQiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpbHRlclJlc2V0TGluayIpICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlVmlldyBJY29ucyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBcnRpY2xlIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiVmlldyIpIHwgaHRtbCAlXTo8L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cGFuZCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSBBY3RpdmUiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0wO0FydGljbGVQYWdlPVslIERhdGEuUGFnZSB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IG9uZSBhcnRpY2xlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBbGxBcnRpY2xlcyIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTE7QXJ0aWNsZVBhZ2U9WyUgRGF0YS5QYWdlIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWJhcnMiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNob3cgYWxsIGFydGljbGVzIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgSUYgQ29uZmlnKCJUaW1lbGluZVZpZXdFbmFibGVkIikgPT0gMSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlRpbWVsaW5lIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21UaW1lbGluZT0xIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2xvY2stbyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBUaWNrZXQgVGltZWxpbmUgVmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgIFslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwYW5kIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29sbGFwc2UiKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUFydGljbGUiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0wIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9uZSBhcnRpY2xlIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFsbEFydGljbGVzIEFjdGl2ZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgYWxsIGFydGljbGVzIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtYmFycyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICBbJSBJRiBDb25maWcoIlRpbWVsaW5lVmlld0VuYWJsZWQiKSA9PSAxICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVGltZWxpbmUgWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDb2xsYXBzZSIpICVdClslIElGIENvbmZpZygiVGltZWxpbmVWaWV3RW5hYmxlZCIpID09IDEgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZWxpbmUiKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUFydGljbGUiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0wIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9uZSBhcnRpY2xlIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFsbEFydGljbGVzIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21FeHBhbmQ9MSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVGltZWxpbmUgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21UaW1lbGluZT0xIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2xvY2stbyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBUaWNrZXQgVGltZWxpbmUgVmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lbGluZSIpICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVMaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRMaXN0Ij4KICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZVRhYmxlQm9keSIgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY3JvbGxlciI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGlkPSJBcnRpY2xlVGFibGUiIGNsYXNzPSJEYXRhVGFibGUgWyUgRGF0YS5UYWJsZUNsYXNzZXMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlVucmVhZCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJObyBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJOby4iKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlR5cGUgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRGlyZWN0aW9uIFNvcnRhYmxlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEaXJlY3Rpb24iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1leGNoYW5nZSI+PC9pPjwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRnJvbSBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJGcm9tIikgfCBodG1sICVdPC9hPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJTdWJqZWN0IFNvcnRhYmxlIj48YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNyZWF0ZWQgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQXR0YWNobWVudHMgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iWyUgRGF0YS5TZW5kZXJUeXBlIHwgaHRtbCAlXS1bJSBEYXRhLkFydGljbGVUeXBlIHwgaHRtbCAlXSBbJSBEYXRhLkNsYXNzUm93IHwgaHRtbCAlXSIgaWQ9IlJvd1slIERhdGEuQ291bnQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0gVW5yZWFkQXJ0aWNsZXMgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUltcG9ydGFudEFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW1wb3J0YW50QXJ0aWNsZXMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXTwvZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtSW1wb3J0YW50QXJ0aWNsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVW5yZWFkIEFydGljbGUhIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5ld0FydGljbGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbU5vTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJOb0NvbnRlbnQiPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtTm9OZXdBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iTm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvdW50IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iQXJ0aWNsZUluZm8iIG5hbWU9IkxpbmtbJSBEYXRhLkNvdW50IHwgdXJpICVdIiB2YWx1ZT0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtTdWJhY3Rpb249QXJ0aWNsZVVwZGF0ZTtDb3VudD1bJSBEYXRhLkNvdW50IHwgdXJpICVdO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJUeXBlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5TZW5kZXJUeXBlKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBUcmFuc2xhdGUoRGF0YS5BcnRpY2xlVHlwZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIFRyYW5zbGF0ZShEYXRhLlNlbmRlclR5cGUpIHwgaHRtbCAlXSAmbmRhc2g7IFslIFRyYW5zbGF0ZShEYXRhLkFydGljbGVUeXBlKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkRpcmVjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGlyZWN0aW9uIEluY29taW5nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbWluZyBtZXNzYWdlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1sb25nLWFycm93LWxlZnQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjAiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbkluY29taW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gT3V0Z29pbmciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk91dGdvaW5nIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWxvbmctYXJyb3ctcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjEiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbk91dGdvaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25JbnRlcm5hbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gSW50ZXJuYWwiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkludGVybmFsIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iMiIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtRGlyZWN0aW9uSW50ZXJuYWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJGcm9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCB0cnVuY2F0ZSgzNCkgfCBodG1sICVdPC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iU29ydERhdGEiIHZhbHVlPSJbJSBEYXRhLkZyb20gfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJTdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5TdWJqZWN0IHwgdHJ1bmNhdGUoMzYpIHwgaHRtbCAlXTwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ3JlYXRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvYT4KIyBJbmNsdWRlIGN1c3RvbSBzb3J0aW5nIGluZm9ybWF0aW9uOiBkYXRlIGluIElTTyBmb3JtYXQuCiMgT3RoZXIgZGF0ZSBmb3JtYXRzIGNhbm5vdCBiZSBzb3J0ZWQgcmVsaWFibHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ3JlYXRlZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkF0dGFjaG1lbnRzIEF0dGFjaG1lbnQgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUF0dGFjaG1lbnQiKSAlXQpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJlZUl0ZW1BdHRhY2htZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1Ob0F0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTm9Db250ZW50Ij48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5vQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGFuZGxlIHVpLXJlc2l6YWJsZS1oYW5kbGUgdWktcmVzaXphYmxlLXMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiUmVzaXplIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZWxpbmVWaWV3IikgJV0KCiAgICAgICAgPGRpdiBjbGFzcz0iVGltZWxpbmVWaWV3VGlja2V0QWN0aW9ucyBIaWRkZW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lbGluZVZpZXdUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iVGlja2V0QWN0aW9ucyBBcnRpY2xlSURfWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIj4KWyUgUFJPQ0VTUyBBcnRpY2xlQWN0aW9uTWVudS50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVsaW5lVmlld1RpY2tldEFjdGlvbnMiKSAlXQogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJUaW1lbGluZVZpZXdBcnRpY2xlQXR0YWNobWVudHMgSGlkZGVuIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZWxpbmVWaWV3QXJ0aWNsZUF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUF0dGFjaG1lbnRzIEFydGljbGVJRF9bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iPgpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVsaW5lVmlld0FydGljbGVBdHRhY2htZW50cyIpICVdCiAgICAgICAgPC9kaXY+CgogICAgICAgIDx1bCBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgPGxpIGlkPSJUZW1wbGF0ZUxpc3RJdGVtIj4KICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJVbnJlYWRBcnRpY2xlcyBSZW1hcmthYmxlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJrIHRoaXMgYXJ0aWNsZSBhcyByZWFkIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXSI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxlbT48L2VtPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9IlR5cGUiPjwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IlNob3dGdWxsQXJ0aWNsZVRleHQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgRnVsbCBUZXh0IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNlYXJjaC1wbHVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgoKICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZUFydGljbGVEYXRhIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJzdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTogPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJmcm9tIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiRnJvbSIpIHwgaHRtbCAlXTogPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ0byI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRvIikgfCBodG1sICVdOiA8L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImNjIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiQ2MiKSB8IGh0bWwgJV06IDwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIEZ1bGxBcnRpY2xlUGxhaW5UZXh0IiBkYXRhLXRpdGxlPSJbJSBUcmFuc2xhdGUoIkZ1bGwgQXJ0aWNsZSBUZXh0IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRpbWVsaW5lUGxhaW5UZXh0Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJQbGFpblRleHQiPjwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIEFydGljbGVJRnJhbWUiIGRhdGEtdGl0bGU9IlslIFRyYW5zbGF0ZSgiRnVsbCBBcnRpY2xlIFRleHQiKSB8IGh0bWwgJV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJUaW1lbGluZVZpZXcgWyUgSUYgRGF0YS5Vc2VBcnRpY2xlQ29sb3JzICVdVXNlQXJ0aWNsZUNvbG9yc1slIEVORCAlXSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iTGlzdExlZnQiPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJOb0V2ZW50cyI+WyUgVHJhbnNsYXRlKCJObyBtb3JlIGV2ZW50cyBmb3VuZC4gUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgZmlsdGVyIHNldHRpbmdzLiIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iTGlzdFJpZ2h0Ij48L3VsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT48L3NwYW4+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpbJSBJRiBDb25maWcoIlRpbWVsaW5lVmlld0VuYWJsZWQiKSA9PSAxICVdCnZhciBUaWNrZXRJRCAgICA9IFslIERhdGEuVGlja2V0SUQgfCBKU09OICVdLAogICAgQXJ0aWNsZUlEICAgPSBbJSBEYXRhLkFydGljbGVJRCB8IEpTT04gJV0sCiAgICBOb1RpbWVsaW5lVmlld0F1dG9BcnRpY2xlID0gWyUgRGF0YS5Ob1RpbWVsaW5lVmlld0F1dG9BcnRpY2xlIHwgSlNPTiAlXSwKICAgIExpc3RPYmplY3RzID0gWwpbJSBGT1JFQUNIIEl0ZW0gSU4gRGF0YS5JdGVtcyAlXQogICAgewogICAgICAgICdvcmllbnRhdGlvbicgICA6IFslIEl0ZW0uT3JpZW50YXRpb24gfCBKU09OICVdLAogICAgICAgICdvcmRlcicgICAgICAgICA6IFslIEl0ZW0uQ291bnRlciB8IEpTT04gJV0sCiAgICAgICAgJ2lkJyAgICAgICAgICAgIDogIlslIElGIEl0ZW0uQXJ0aWNsZUlEICVdQXJ0aWNsZUlEX1slIEl0ZW0uQXJ0aWNsZUlEICVdWyUgRU5EICVdIiwKICAgICAgICAnY2xhc3MnICAgICAgICAgOiBbJSBJdGVtLkNsYXNzIHwgSlNPTiAlXSwKICAgICAgICAndGltZScgICAgICAgICAgOiBbJSBJdGVtLkNyZWF0ZVRpbWUgfCBKU09OICVdLAogICAgICAgICd0aW1lX2xvbmcnICAgICA6IFslIEl0ZW0uQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpIHwgSlNPTiAlXSwKICAgICAgICAndHlwZScgICAgICAgICAgOiBbJSBJdGVtLkhpc3RvcnlUeXBlIHwgSlNPTiAlXSwKICAgICAgICAndHlwZV9yZWFkYWJsZScgOiBbJSBUcmFuc2xhdGUoSXRlbS5IaXN0b3J5VHlwZVJlYWRhYmxlKSB8IEpTT04gJV0sCiAgICAgICAgJ25hbWUnICAgICAgICAgIDogWyUgSXRlbS5OYW1lIHwgSlNPTiAlXSwKICAgICAgICAnYXJ0aWNsZV9pZCcgICAgOiBbJSBJdGVtLkFydGljbGVJRCB8IEpTT04gJV0sCiAgICAgICAgJ2lzX2NoYXQnICAgICAgIDogWyUgSXRlbS5Jc0NoYXRBcnRpY2xlIHwgSlNPTiAlXSwKICAgICAgICAnYXJ0aWNsZV9kYXRhJyAgOiB7CiAgICAgICAgWyUgSUYgSXRlbS5BcnRpY2xlSUQgJV0KICAgICAgICAgICAgJ3NlbmRlcl90eXBlJyA6IFslIEl0ZW0uQXJ0aWNsZURhdGEuU2VuZGVyVHlwZSB8IGh0bWwgfCBKU09OICVdLAogICAgICAgICAgICAnYXJ0aWNsZV90eXBlJyA6IFslIEl0ZW0uQXJ0aWNsZURhdGEuQXJ0aWNsZVR5cGUgfCBodG1sIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3N1YmplY3QnOiBbJSBJdGVtLkFydGljbGVEYXRhLlN1YmplY3QgfCBodG1sIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2Zyb20nICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLkZyb20gfCBodG1sIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3RvJyAgICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLlRvIHwgaHRtbCB8IEpTT04gJV0sCiAgICAgICAgICAgICdjYycgICAgIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5DYyB8IGh0bWwgfCBKU09OICVdLAogICAgICAgICAgICAnaXNfaW1wb3J0YW50JyA6IFslIEl0ZW0uQXJ0aWNsZURhdGEuQXJ0aWNsZUlzSW1wb3J0YW50IHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2lzX3NlZW4nIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5BcnRpY2xlSXNTZWVuIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3RleHQnICAgOiBbJSBJRiBJdGVtLklzQ2hhdEFydGljbGUgJV1bJSBJdGVtLkFydGljbGVEYXRhLkJvZHlDaGF0IHwgSlNPTiAlXVslIEVMU0UgJV1bJSBJdGVtLkFydGljbGVEYXRhLkJvZHkgfCB0cnVuY2F0ZSg2NTApIHwgSlNPTiAlXVslIEVORCAlXSwKICAgICAgICAgICAgJ3RleHRfbG9uZycgOiBbJSBJRiBJdGVtLklzQ2hhdEFydGljbGUgJV1bJSBKU09OKEl0ZW0uQXJ0aWNsZURhdGEuQ2hhdE1lc3NhZ2VzKSAlXVslIEVMU0UgJV1bJSBJRiAhSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5ICVdWyUgSXRlbS5BcnRpY2xlRGF0YS5Cb2R5IHwgSlNPTiAlXVslIEVMU0UgJV0iIlslIEVORCAlXVslIEVORCAlXSwKICAgICAgICAgICAgJ2F0dGFjaG1lbnRfaWQnIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2lmcmFtZV9odG1sJyA6ICc8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBkYXRhLXVybD0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPVslIEl0ZW0uQXJ0aWNsZUlEIHwgaHRtbCAlXTtGaWxlSUQ9WyUgSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIiB3aWR0aD0iMTAwJSIgZnJhbWVib3JkZXI9IjAiIGlkPSJJZnJhbWVbJSBJdGVtLkFydGljbGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJUaW1lbGluZUFydGljbGVpRnJhbWUiIHNyYz0iIj48L2lmcmFtZT4nCiAgICAgICAgWyUgRU5EICVdCiAgICAgICAgfQogICAgfVslIElGICFsb29wLmxhc3QgJV0sWyUgRU5EICVdClslIEVORCAlXQpdOwoKQ29yZS5BZ2VudC5UaWNrZXRab29tLlRpbWVsaW5lVmlldy5Jbml0KFRpY2tldElELCBMaXN0T2JqZWN0cywgQXJ0aWNsZUlELCBOb1RpbWVsaW5lVmlld0F1dG9BcnRpY2xlKTsKClslIEVORCAlXQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrRW5kKCJUaW1lbGluZVZpZXciKSAlXQoKICAgIDwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUl0ZW0iKSAlXQo8ZGl2PgogICAgPGEgbmFtZT0iQXJ0aWNsZVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSI+PC9hPgogICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIFslIERhdGEuU2VuZGVyVHlwZSB8IGh0bWwgJV0tWyUgRGF0YS5BcnRpY2xlVHlwZSB8IGh0bWwgJV0iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFydGljbGUiKSB8IGh0bWwgJV0gI1slIERhdGEuQ291bnQgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFkZGl0aW9uYWxJbmZvcm1hdGlvbiBTcGFjaW5nTG9hZGVyIj4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTogWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVDcmVhdGVkQnkiKSAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJieSIpIHwgaHRtbCAlXSBbJSBEYXRhLkNyZWF0ZWRCeVVzZXIgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQ3JlYXRlZEJ5IikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgpbJSBQUk9DRVNTIEFydGljbGVBY3Rpb25NZW51LnR0ICVdCgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlTWFpbEhlYWRlciI+CiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dSZWNpcGllbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iU3dpdGNoYWJsZSI+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJTd2l0Y2ggWyUgRGF0YS5WYWx1ZUhpZGRlbiB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iU3dpdGNoIFslIERhdGEuUmVhbG5hbWVIaWRkZW4gfCBodG1sICVdIj5bJSBEYXRhLlJlYWxuYW1lIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93UmVjaXBpZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93RGF0YSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd0RhdGEiKSAlXQoKIyBzaG93IGFydGljbGUgZHluYW1pYyBmaWVsZHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiBbJSBJRiBEYXRhLkxpbmtQcmV2aWV3ICVdIGRhdGEtdHJpZ2dlcj0iZmxvYXRlciIgZGF0YS1mbG9hdGVyLXVybD0iWyUgRGF0YS5MaW5rUHJldmlldyB8IEludGVycG9sYXRlICVdIlslIEVORCAlXSB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDFMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZDFMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDFQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMVBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDJMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMkxpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvcD4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQyUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDIiKSAlXQoKIyBzaG93IGFydGljbGUgb3B0aW9ucyBsaWtlIHNpZ25lZCwgY3J5cHRlZCwgLi4uClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVPcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVmFsdWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5SZXN1bHQgfCBodG1sICVdIFZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5WYWx1ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZU9wdGlvbiIpICVdCgojICAgICAgICAgICAgICAgICAgICA8IS0tIEluY2x1ZGUgdGhlIGZ1bGwgc3ViamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBjb3BpZWQuIFRoZSBvbmUgaW4gdGhlIHRpdGxlIGJhciBpcyBzaG9ydGVuZWQuIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKIyBzaG93IGFydGljbGUgYWNjb3VudGVkIHRpbWUKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUFjY291bnRlZFRpbWUiKSAlXQoKIyBzaG93IGF0dGFjaG1lbnRzClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuTGluayAlXSIgWyUgRGF0YS5UYXJnZXQgJV0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkFjdGlvbikgfCBodG1sICVdIj5bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXTwvYT4gWyUgRGF0YS5EYXRhRmlsZVNpemUgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdLCBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3dOb0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVNYWlsQ29udGVudFslIElGIERhdGEuQXJ0aWNsZU1ldGFEYXRhICYmIERhdGEuQXJ0aWNsZU1ldGFEYXRhLnNpemUoKSAlXSBXaXRoTWV0YVslIEVORCAlXSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5UGxhaW4iKSAlXQpbJSBEYXRhLkJvZHlOb3RlICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlQm9keSI+ClslIERhdGEuQm9keSAlXQogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCb2R5UGxhaW4iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5SFRNTCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlTWFpbENvbnRlbnRIVE1MV3JhcHBlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMgU2hvdyBpbmZvLCB0aGF0IGxpbmtzIHdpdGhpbiB0aGUgaWZyYW1lIG11c3QgYmUgY2xpY2tlZCB3aXRoIHN0cmcvY21kL3NoaWZ0IChkZXBlbmRpbmcgb24gdGhlIHVzZWQgYnJvd3NlciBhbmQgb3MpCiMgdG8gb3BlbiB0aGUgbGlua3MgaW4gYSBuZXcgd2luZG93IHdpdGhvdXQgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdpdmVuIHRvIHRoZSBpZnJhbWUKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQnJvd3NlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGFydGljbGUsIHlvdSBtaWdodCBuZWVkIHRvIHByZXNzIEN0cmwgb3IgQ21kIG9yIFNoaWZ0IGtleSB3aGlsZSBjbGlja2luZyB0aGUgbGluayAoZGVwZW5kaW5nIG9uIHlvdXIgYnJvd3NlciBhbmQgT1MpLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDbG9zZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2xvc2UgdGhpcyBtZXNzYWdlIikgfCBodG1sICVdIiBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQojIGV4ZWN1dGUgSUZyYW1lIEpTIGFzeW5jaHJvbm91c2x5LiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIGJlZm9yZSBvdXIgQVBJIHdhcyBsb2FkZWQKIyB0aGUgZm9sbG93aW5nIEpTIGNvZGUgbXVzdCBiZSB3aXRoaW4gdGhlIHRlbXBsYXRlLCBvdGhlcndpc2UgaXQgY291bGQgaGFwcGVuLCB0aGF0IGFsc28gdGhpcyBjb2RlIGl0c2VsZiBpcyBub3QgbG9hZGVkIHlldAo8c2NyaXB0PgpmdW5jdGlvbiBDaGVja0lGcmFtZUhlaWdodChJRnJhbWVJRCkgewogICAgaWYgKHR5cGVvZiBDb3JlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgQ29yZS5BZ2VudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIENvcmUuQWdlbnQuVGlja2V0Wm9vbSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldFpvb20uSWZyYW1lQXV0b0hlaWdodCgkKCcjJyArIElGcmFtZUlEKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENoZWNrSUZyYW1lSGVpZ2h0KElGcmFtZUlEKTsKICAgICAgICB9LCA1MDApOwogICAgfQp9Cjwvc2NyaXB0PgoKIyBVc2UgdGhlIEhUTUw1IHNhbmRib3ggYXR0cmlidXRlIHRvIHByZXZlbnQgcGx1Z2lucyBhbmQgc2NyaXB0cyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGluIHRoZSBicm93c2VyLgojIFVzZSBJRSdzIChub24tc3RhbmRhcmQpIHNlY3VyaXR5IGF0dHJpYnV0ZSB0byBhY2hpZXZlIHNvbWV0aGluZyBzaW1pbGFyIGluIG9sZGVyIElFIGJyb3dzZXJzLiBBcHBlbmQgc2Vzc2lvbiBpbmZvIHRvIFVSTCBiZWNhdXNlIElFIHdpbGwgbm90IHNlbmQgY29va2llcy4KIyBTZXQgJ2FsbG93LXBvcHVwcycgdG8gYWxsb3cgSUUxMCsgdG8gb3BlbiBsaW5rcy4gcmVmOiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL3dpa2kvQ2hhbmdlUHJvcG9zYWxzL3NhbmRib3hfYWxsb3dfcG9wdXBzCiAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgbXMtYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCIgd2lkdGg9IjEwMCUiIGZyYW1lYm9yZGVyPSIwIiBpZD0iSWZyYW1lWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiBvbmxvYWQ9IndpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXsgQ2hlY2tJRnJhbWVIZWlnaHQoJ0lmcmFtZVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXScpOyB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdO0ZpbGVJRD1bJSBEYXRhLkF0dGFjaG1lbnRJRE9mSFRNTEJvZHkgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBmaXJlZm94LCB3aGljaCBzZWVtcyB0byBjYWNoZSB0aGUgc3JjIGF0dHJpYnV0ZSBvZiBpZnJhbWVzIHNvbWV0aW1lcyB3aGljaCBsZWFkcyB0bwogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3cm9uZyBpZnJhbWUgY29udGVudCBiZWluZyBkaXNwbGF5ZWQgKHNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zNTY1NTgpCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0lmcmFtZVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXScpLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdJZnJhbWVbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0nKS5zcmMKICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUhUTUwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5Q2hhdCIpICVdClslIElOQ0xVREUgIkNoYXREaXNwbGF5LnR0IiAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUNoYXQiKSAlXQoKICAgICAgICAgICAgWyUgSUYgRGF0YS5BcnRpY2xlTWV0YURhdGEgJiYgRGF0YS5BcnRpY2xlTWV0YURhdGEuc2l6ZSgpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlTWV0YSI+CiAgICAgICAgICAgICAgICBbJSBGT1JFQUNIIEVudHJ5IElOIERhdGEuQXJ0aWNsZU1ldGFEYXRhICVdCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIEVudHJ5Lk5hbWUgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgWyUgRk9SRUFDSCBJdGVtIElOIEVudHJ5Lk1hdGNoZXMgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEl0ZW0uVVJMIHwgaHRtbCAlXSJbJSBJRiBJdGVtLlVSTFByZXZpZXcgJV0gZGF0YS10cmlnZ2VyPSJmbG9hdGVyIiBkYXRhLWZsb2F0ZXItdXJsPSJbJSBJdGVtLlVSTFByZXZpZXcgfCBodG1sICVdIlslIEVORCAlXSB0YXJnZXQ9IlslIEl0ZW0uVGFyZ2V0IHwgaHRtbCAlXSI+WyUgSXRlbS5UZXh0IHwgdHJ1bmNhdGUoMTAwKSB8IGh0bWwgJV08L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlSXRlbU1hcmtBc1NlZW4iKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRab29tLk1hcmtBc1NlZW4oWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sIFslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUl0ZW1NYXJrQXNTZWVuIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVJdGVtIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEl0ZW1NYXJrQXNTZWVuIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5NYXJrVGlja2V0QXNTZWVuKFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRJdGVtTWFya0FzU2VlbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRab29tSW5pdCIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRab29tLkluaXQoeyBBcnRpY2xlVGFibGVIZWlnaHQ6IHBhcnNlSW50KCdbJSBFbnYoIlVzZXJUaWNrZXRab29tQXJ0aWNsZVRhYmxlSGVpZ2h0IikgJV0nLCAxMCl9KTsKICAgIENvcmUuQ29uZmlnLlNldCgnVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHREZWZhdWx0JywgcGFyc2VJbnQoIlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHREZWZhdWx0IikgJV0iIHx8IDAsIDEwKSk7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkhUTUxBcnRpY2xlSGVpZ2h0TWF4JywgcGFyc2VJbnQoIlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHRNYXgiKSAlXSIgfHwgMCwgMTApKTsKICAgIENvcmUuQ29uZmlnLlNldCgnTGFuZ3VhZ2UuQXR0YWNobWVudFZpZXdNZXNzYWdlJywgWyUgVHJhbnNsYXRlKCdBcnRpY2xlIGNvdWxkIG5vdCBiZSBvcGVuZWQhIFBlcmhhcHMgaXQgaXMgb24gYW5vdGhlciBhcnRpY2xlIHBhZ2U/JykgfCBKU09OICVdKTsKCiAgICBpZiAodHlwZW9mIENvcmUuVUkuRmxvYXRlciAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBDb3JlLlVJLkZsb2F0ZXIuSW5pdCgpOwogICAgfQoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIElOQ0xVREUgIk1ldGFGbG9hdGVyLnR0IiAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0Wm9vbUluaXQiKSAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQ3VzdG9tZXJUaWNrZXRab29tLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCjxkaXYgaWQ9Ik1haW5Cb3giIGNsYXNzPSJUaWNrZXRab29tIEFSSUFSb2xlTWFpbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJhY2siKSAlXQogICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICA8dWwgY2xhc3M9IlRhYnMiPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRW52KCJMYXN0U2NyZWVuT3ZlcnZpZXciKSAlXSI+JmxhcnI7IFslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvYT48L2xpPgogICAgICAgIDwvdWw+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCYWNrIikgJV0KICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9IlRpY2tldEhlYWRlciI+CiAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmlvcml0eUZsYWciKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV0iPjxzcGFuIGNsYXNzPSJQcmlvcml0eUlELVslIERhdGEuUHJpb3JpdHlJRCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3NwYW4+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQcmlvcml0eUZsYWciKSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgPHVsIGlkPSJUaWNrZXRPcHRpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hhdCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckNoYXQ7U3ViYWN0aW9uPUNyZWF0ZUNoYXRSZXF1ZXN0O1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07IiBjbGFzcz0iUHJpbnQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN0YXJ0IGEgY2hhdCBmcm9tIHRoaXMgdGlja2V0IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvbW1lbnRzLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiU3RhcnQgYSBjaGF0IGZyb20gdGhpcyB0aWNrZXQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoYXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmludCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0UHJpbnQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXSIgY2xhc3M9IlByaW50IEFzUG9wdXAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlByaW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXByaW50Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlByaW50IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJQcmludCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFeHBhbmQiKSAlXQogICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtab29tRXhwYW5kPVslIERhdGEuWm9vbUV4cGFuZCB8IHVyaSAlXSIgY2xhc3M9Ilpvb21FeHBhbmQgRXhwYW5kWyUgRGF0YS5FeHBhbmRPcHRpb24gJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5FeHBhbmRUZXh0KSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtYmFycyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZShEYXRhLkV4cGFuZFRleHQpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWm9vbUV4cGFuZCIgaWQ9Ilpvb21FeHBhbmQiIHZhbHVlPSJbJSBEYXRhLlpvb21FeHBhbmQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkV4cGFuZCIpICVdCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0jRm9sbG93VXAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IlJlcGx5Q3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJUaWNrZXRab29tIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZyb21DaGF0SUQiIHZhbHVlPSJbJSBEYXRhLkZyb21DaGF0SUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8dWwgaWQ9Ik1lc3NhZ2VzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuU2VuZGVyVHlwZSB8IGh0bWwgJV0tWyUgRGF0YS5BcnRpY2xlVHlwZSB8IGh0bWwgJV0gWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUNvbnRyYWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aDM+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07VGlja2V0TnVtYmVyPVslIERhdGEuVGlja2V0TnVtYmVyIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXSI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCBodG1sICVdICZuZGFzaDsgPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZSgiRXhwYW5kIGFydGljbGUiKSB8IGh0bWwgJV0uLi4iPlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV08L3NwYW4+PC9hPjwvaDM+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQ29udHJhY3RlZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRXhwYW5kZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aDM+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07VGlja2V0TnVtYmVyPVslIERhdGEuVGlja2V0TnVtYmVyIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXSI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCBodG1sICVdICZuZGFzaDsgPHNwYW4gdGl0bGU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iPlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV08L3NwYW4+PC9hPjwvaDM+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRXhwYW5kZWQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkFnZSIgdGl0bGU9IlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpIHwgaHRtbCAlXSI+WyUgRGF0YS5BZ2UgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlU3RhdGUiIHZhbHVlPSIiIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJEZXRhaWxzIFNlcGVyYXRvclJvdyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYWJlbCBTd2l0Y2hhYmxlIj5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iU3dpdGNoIFslIERhdGEuVmFsdWVIaWRkZW4gfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlN3aXRjaCBbJSBEYXRhLlJlYWxuYW1lSGlkZGVuIHwgaHRtbCAlXSI+WyUgRGF0YS5SZWFsbmFtZSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9kaXY+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKIyBzaG93IGFydGljbGUgZHluYW1pYyBmaWVsZHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIiB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiBbJSBJRiBEYXRhLkxpbmtQcmV2aWV3ICVdIGRhdGEtdHJpZ2dlcj0iZmxvYXRlciIgZGF0YS1mbG9hdGVyLXVybD0iWyUgRGF0YS5MaW5rUHJldmlldyB8IEludGVycG9sYXRlICVdIlslIEVORCAlXSB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYWJlbCIgdGl0bGU9IlslIERhdGEuTGFiZWwgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiIHRpdGxlPSJbJSBEYXRhLkxhYmVsIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXR0YWNobWVudHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIj5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIC0gWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiBbJSBEYXRhLlRhcmdldCAlXSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQWN0aW9uKSB8IGh0bWwgJV0iPlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdPC9hPiwgWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93TGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdLCBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3dOb0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkJvZHlOb3RlICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBcnRpY2xlQm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Cb2R5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvZHlQbGFpbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlIVE1MTG9hZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMgU2hvdyBpbmZvLCB0aGF0IGxpbmtzIHdpdGhpbiB0aGUgaWZyYW1lIG11c3QgYmUgY2xpY2tlZCB3aXRoIHN0cmcvY21kL3NoaWZ0IChkZXBlbmRpbmcgb24gdGhlIHVzZWQgYnJvd3NlciBhbmQgb3MpCiMgdG8gb3BlbiB0aGUgbGlua3MgaW4gYSBuZXcgd2luZG93IHdpdGhvdXQgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdpdmVuIHRvIHRoZSBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VCcm93c2VyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIG9wZW4gbGlua3MgaW4gdGhlIGZvbGxvd2luZyBhcnRpY2xlLCB5b3UgbWlnaHQgbmVlZCB0byBwcmVzcyBDdHJsIG9yIENtZCBvciBTaGlmdCBrZXkgd2hpbGUgY2xpY2tpbmcgdGhlIGxpbmsgKGRlcGVuZGluZyBvbiB5b3VyIGJyb3dzZXIgYW5kIE9TKS4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KIyBVc2UgdGhlIEhUTUw1IHNhbmRib3ggYXR0cmlidXRlIHRvIHByZXZlbnQgcGx1Z2lucyBhbmQgc2NyaXB0cyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGluIHRoZSBicm93c2VyLgojIFVzZSBJRSdzIChub24tc3RhbmRhcmQpIHNlY3VyaXR5IGF0dHJpYnV0ZSB0byBhY2hpZXZlIHNvbWV0aGluZyBzaW1pbGFyIGluIG9sZGVyIElFIGJyb3dzZXJzLiBBcHBlbmQgc2Vzc2lvbiBpbmZvIHRvIFVSTCBiZWNhdXNlIElFIHdpbGwgbm90IHNlbmQgY29va2llcy4KIyBTZXQgJ2FsbG93LXBvcHVwcycgdG8gYWxsb3cgSUUxMCsgdG8gb3BlbiBsaW5rcy4gcmVmOiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL3dpa2kvQ2hhbmdlUHJvcG9zYWxzL3NhbmRib3hfYWxsb3dfcG9wdXBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiB0aXRsZT0iYWJvdXQ6YmxhbmsiIGZyYW1lYm9yZGVyPSIwIiBpZD0iVmlzaWJsZUZyYW1lIiBjbGFzcz0iVmlzaWJsZUZyYW1lIiBzcmM9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07RmlsZUlEPVslIERhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSB8IGh0bWwgJV07WyUgRW52KCJTZXNzaW9uTmFtZSIpIHwgaHRtbCAlXT1bJSBFbnYoIlNlc3Npb25JRCIpIHwgaHRtbCAlXSI+PC9pZnJhbWU+ClslIFJlbmRlckJsb2NrRW5kKCJCb2R5SFRNTExvYWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5SFRNTFBsYWNlaG9sZGVyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVyZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgc2Vzc2lvbiBpbmZvIGlmIGNvb2tpZXMgYXJlIGRpc2FibGVkLCBiZWNhdXNlIHRoZSBsYXlvdXQgb2JqZWN0IGNhbm5vdCBhdXRvbWF0aWNhbGx5IGRvIHRoYXQgaGVyZSwgbGlrZSBpbiB0aGUgb3RoZXIgaWZyYW1lIChvbmx5IGZvciBzcmMgYXR0cmlidXRlKS4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBtcy1hbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBzcmM9ImFib3V0OmJsYW5rIiBmcmFtZWJvcmRlcj0iMCIgdGl0bGU9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07RmlsZUlEPVslIERhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSB8IGh0bWwgJV07WyUgRGF0YS5TZXNzaW9uSW5mb3JtYXRpb24gfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUhUTUxQbGFjZWhvbGRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlDaGF0IikgJV0KWyUgSU5DTFVERSAiQ2hhdERpc3BsYXkudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJCb2R5Q2hhdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGUiKSAlXQogICAgICAgICAgICA8L3VsPiA8IS0tIC9NZXNzYWdlcyAtLT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9BcnRpY2xlcyIpICVdCiAgICAgICAgICAgIDx1bCBpZD0iTm9BcnRpY2xlcyI+CiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJOb0FydGljbGVzIikgJV0KICAgICAgICAgICAgPGRpdiBpZD0iWm9vbVNpZGViYXIiPgogICAgICAgICAgICAgICAgPHVsIGlkPSJNZXRhZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIkluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgRGF0YS5Ib29rIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuPlslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9zcGFuPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TZXJ2aWNlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlNlcnZpY2UpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlNMQSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TTEEpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlIikgJV0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayIgWyUgSUYgRGF0YS5MaW5rUHJldmlldyAlXSBkYXRhLXRyaWdnZXI9ImZsb2F0ZXIiIGRhdGEtZmxvYXRlci11cmw9IlslIERhdGEuTGlua1ByZXZpZXcgfCBJbnRlcnBvbGF0ZSAlXSJbJSBFTkQgJV0gdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmlvcml0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJRdWV1ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV0iPlslIERhdGEuUXVldWUgfCBodG1sIHwgcmVwbGFjZSgnOjonLCAnPHdicj46Ojx3YnI+JykgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlF1ZXVlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvc3Bhbj4gWyUgRGF0YS5Pd25lck5hbWUgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk93bmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvc3Bhbj4gWyUgRGF0YS5SZXNwb25zaWJsZU5hbWUgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlc3BvbnNpYmxlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc0RhdGEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlByb2Nlc3MiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIkFjdGl2aXR5IikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuQWN0aXZpdHkgfCBodG1sICVdIj5bJSBEYXRhLkFjdGl2aXR5IHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc0RhdGEiKSAlXQoKIyBzaG93IHRpY2tldCBkeW5hbWljIGZpZWxkcwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQojICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZExpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiIFslIElGIERhdGEuTGlua1ByZXZpZXcgJV0gZGF0YS10cmlnZ2VyPSJmbG9hdGVyIiBkYXRhLWZsb2F0ZXItdXJsPSJbJSBEYXRhLkxpbmtQcmV2aWV3IHwgSW50ZXJwb2xhdGUgJV0iWyUgRU5EICVdIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZTIgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICA8L2xpPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5leHRBY3Rpdml0aWVzIikgJV0KICAgICAgICAgICAgICAgIDx1bCBpZD0iQWN0aXZpdGllcyI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIk5leHQgU3RlcHMiKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIHRpdGxlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJUaWNrZXRQcm9jZXNzO1N1YmFjdGlvbj1EaXNwbGF5QWN0aXZpdHlEaWFsb2c7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtQcm9jZXNzRW50aXR5SUQ9WyUgRGF0YS5Qcm9jZXNzRW50aXR5SUQgfCB1cmkgJV07QWN0aXZpdHlEaWFsb2dFbnRpdHlJRD1bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGl2aXR5RGlhbG9nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9BY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgiVGhlcmUgYXJlIG5vIGRpYWxvZ3MgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIikgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIk5leHRBY3Rpdml0aWVzIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwIikgJV0KICAgICAgICAgICAgPGRpdiBpZD0iRm9sbG93VXAiIGNsYXNzPSJbJSBEYXRhLkZvbGxvd1VwVmlzaWJsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iTWVzc2VuZ2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IkRvbnRQcmludCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJEb250UHJpbnQiIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSaWNoVGV4dCIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0iIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IERvbnRQcmludCBWYWxpZGF0ZV9SZXF1aXJlZFJpY2hUZXh0IFslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iQm9keSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IkRvbnRQcmludCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYXRQcm90b2NvbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDaGF0UHJvdG9jb2wiPlslIFRyYW5zbGF0ZSgiQ2hhdCBQcm90b2NvbCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBJTkNMVURFICJDaGF0RGlzcGxheS50dCIgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhdFByb3RvY29sIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQXR0YWNobWVudEhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBdHRhY2htZW50Ij5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXSIgaWQ9IkF0dGFjaG1lbnQiIHR5cGU9ImZpbGUiIHNpemU9IjMwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjQXR0YWNobWVudCcpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLmZpbmQoJyNBdHRhY2htZW50VXBsb2FkJykudmFsKCcxJykuZW5kKCkuc3VibWl0KCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcEF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXR0YWNobWVudCIgdGl0bGU9IlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIC0gWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgLz4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgJCgnI0F0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS50cmlnZ2VyKCdzdWJtaXQnKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBBdHRhY2htZW50IikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXRlSUQiPlslIFRyYW5zbGF0ZSgiTmV4dCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPiBbJSBEYXRhLk5leHRTdGF0ZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1N0YXRlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjUmVwbHlDdXN0b21lclRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTdGF0ZUlEJywgWyAnUHJpb3JpdHlJRCcsICdUaWNrZXRJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcFN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBQcmlvcml0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+IFslIERhdGEuUHJpb3JpdHlTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1ByaW9yaXR5SUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjUmVwbHlDdXN0b21lclRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdQcmlvcml0eUlEJywgWyAnU3RhdGVJRCcsICdUaWNrZXRJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcFByaW9yaXR5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+IFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0gPGEgaWQ9IkNsb3NlQnV0dG9uIiBocmVmPSIiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8YSBpZD0iUmVwbHlCdXR0b24iIGNsYXNzPSJEb250UHJpbnQiIGhyZWY9IiI+PGkgY2xhc3M9ImZhIGZhLXJlcGx5Ij48L2k+IFslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXAiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9mb3JtPgoKICAgIDwvZGl2Pgo8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICBDb3JlLkN1c3RvbWVyLlRpY2tldFpvb20uSW5pdCgpOwogICAgQ29yZS5VSS5GbG9hdGVyLkluaXQoKTsKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdUaWNrZXRBY3Rpb24nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKPC9zY3JpcHQ+ClslIEVORCAlXQoKWyUgSU5DTFVERSAiTWV0YUZsb2F0ZXIudHQiICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIHNjcmlwdHMvdGVzdC9TZWxlbml1bS9BZ2VudC9BZ2VudFRpY2tldFBob25lL1NlcnZpY2VEcm9wZG93bi50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBjb25maWcgb2JqZWN0Cm15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKIyBkbyBub3QgY2hlY2tteAokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKIyB0aGlzIHRlc3QgaXMgdG8gY2hlY2sgdGhhdCB3aGVuIEFnZW50VGlja2V0UGhvbmUgaXMgbG9hZGVkIGFscmVhZHkgd2l0aAojIGN1c3RvbWVyIGRhdGEgb24gaXQgKGxpa2Ugd2hlbiBkb2luZyBTcGxpdCksIHRoZSBkcm9wZG93biBvZiBTZXJ2aWNlIGlzCiMgcHJlZmlsbGVkIHdpdGggdGhlIGNvcnJlY3QgZGF0YS4gVGhpcyBpcyBiZWNhdXNlIG9mIGJ1ZwojIGh0dHA6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD03MDYwCgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgdXBkYXRlIHN5c2NvbmZpZyBzZXR0aW5ncwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyd1c2VycyddLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBjdXN0b21lciBhbmQgYSB0aWNrZXQgZnJvbSB0aGF0IGN1c3RvbWVyIGFzIHByZXZpb3VzCiAgICAgICAgIyBzdGVwcyB0byBkbyB0aGUgc2VsZW5pdW0gdGVzdGluZwoKICAgICAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgY3JlYXRlIGEgdGVzdCBjdXN0b21lcgogICAgICAgIG15ICRUZXN0VXNlckN1c3RvbWVyID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICAgICAgICAgIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBjcmVhdGUgYSB0aWNrZXQgZnJvbSB0aGUganVzdCBjcmVhdGVkIGN1c3RvbWVyCiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1NlbGVuaXVtIFRlc3QtU29tZSBUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnY2xvc2VkIHN1Y2Nlc3NmdWwnLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RVc2VyQ3VzdG9tZXIsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgIG15ICRUZXN0U2VydmljZSA9ICJTZXJ2aWNlLSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSBhIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVzdFNlcnZpY2UsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1NlbGVuaXVtIFRlc3QgU2VydmljZScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICJTZXJ2aWNlIGlzIGNyZWF0ZWQgLSAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGFsbG93IGFjY2VzcyB0byB0aGUganVzdCBjcmVhdGVkIHNlcnZpY2UgdG8gdGhlIHRlc3QgdXNlcgogICAgICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkVGVzdFVzZXJDdXN0b21lciwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbiBhcnRpY2xlIGZvciB0aGUgdGVzdCB0aWNrZXQKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAnbm90ZS1pbnRlcm5hbCcsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICdTZWxlbml1bSB0ZXN0JywKICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJ0p1c3QgYSB0ZXN0IGJvZHkgZm9yIHNlbGVuaXVtIHRlc3RpbmcnLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAnSVNPLTg4NTktMTUnLAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICdBZGROb3RlJywKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJ1NlbGVuaXVtIHRlc3RpbmcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXJ0aWNsZUlELAogICAgICAgICAgICAiQXJ0aWNsZSBpcyBjcmVhdGVkIC0gJEFydGljbGVJRCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIHJlYWwgc2VsZW5pdW0gdGVzdCBzdGFydAogICAgICAgICMgb3BlbiB0aGUgcGFnZSB0aGF0IGNsaWNraW5nIG9uIFNwbGl0IGxpbmsgb2YgdGhlIHpvb20gdmlldyBvZiB0aGUKICAgICAgICAjIGp1c3QgY3JlYXRlZCB0aWNrZXQgd291bGQgb3BlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFBob25lO1RpY2tldElEPSRUaWNrZXRJRDtBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IHRoZSBzZXJ2aWNlcyBkcm9wZG93biBoYXMganVzdCBjcmVhdGVkIHNlcnZpY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJzZWxlY3QjU2VydmljZUlEIG9wdGlvblt2YWx1ZT0nJFNlcnZpY2VJRCddIiwgJ2NzcycgKSwKICAgICAgICAgICAgIlRoZSBzZXJ2aWNlcyBkcm9wZG93biBoYXMgY3JlYXRlZCBzZXJ2aWNlIC0gJFRlc3RTZXJ2aWNlIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBjbGVhbiB1cCB0ZXN0IGRhdGEKICAgICAgICAjIGRlbGV0ZSB0aGUgdGVzdCB0aWNrZXQKICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGlja2V0IC0gJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlQ3VzdG9tZXJVc2VyIGRlbGV0ZWQgLSAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCBTZXJ2aWNlIC0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAoCiAgICAgICAgICAgIHF3IChTZXJ2aWNlIFRpY2tldCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIERvIG5vdCBjaGVjayBSaWNoVGV4dC4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlJpY2hUZXh0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlci4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAnaXRzbS1zZXJ2aWNlJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHR3byB0ZXN0IHRpY2tldHMuCiAgICAgICAgbXkgQFRpY2tldElEczsKICAgICAgICBteSBAVGlja2V0TnVtYmVyczsKICAgICAgICBteSAkVGlja2V0VGl0bGUgPSAiU2VsZW5pdW0gVGlja2V0IiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgZm9yIG15ICRUaWNrZXQgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGVOdW1iZXIoKTsKICAgICAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgICAgIFROICAgICAgICAgICA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICdTZWxlbml1bUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAiU2VsZW5pdW1DdXN0b21lclxAbG9jYWxob3N0LmNvbSIsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgIlRpY2tldCBpcyBjcmVhdGVkIC0gSUQgJFRpY2tldElEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzLCAgICAgJFRpY2tldElEOwogICAgICAgICAgICBwdXNoIEBUaWNrZXROdW1iZXJzLCAkVGlja2V0TnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIHpvb20gdmlldyBvZiBmaXJzdCBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SURzWzBdIik7CgogICAgICAgICMgV2FpdCB1bnRpbCBhIGxpbmsgaGFzIGxvYWRlZCB0byB0aGUgZWxlbWVudC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnYVtocmVmKj1cIkFjdGlvbj1BZ2VudFRpY2tldENsb3NlO1RpY2tldElEPSRUaWNrZXRJRHNbMF1cIl0nKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBTZXQgcmV2aWV3IHJlcXVpcmVkIHZpYSBDbG9zZSBtZW51LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldENsb3NlO1RpY2tldElEPSRUaWNrZXRJRHNbMF0nICldIiktPmNsaWNrKCk7CgogICAgICAgICMgU3dpdGNoIHRvIENsb3NlIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIikubGVuZ3RoICYmICQoIiNTdWJqZWN0IikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgdGlja2V0IGFuZCBzZXQgcmV2aWV3IHJlcXVpcmVkLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0R5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWQnKS52YWwoJ1llcycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICAnY3NzJyApLT5zZW5kX2tleXMoJ1NlbGVuaXVtIFRlc3QnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSaWNoVGV4dCIsICdjc3MnICktPnNlbmRfa2V5cygnUmV2aWV3UmVxdWlyZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byB6b29tIHZpZXcgb2Ygc2Vjb25kIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRHNbMV0iKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGEgbGluayBoYXMgbG9hZGVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdhW2hyZWYqPVwiQWN0aW9uPUFnZW50VGlja2V0Q2xvc2U7VGlja2V0SUQ9JFRpY2tldElEc1sxXVwiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFNldCByZXZpZXcgcmVxdWlyZWQgdmlhIENsb3NlIG1lbnUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Q2xvc2U7VGlja2V0SUQ9JFRpY2tldElEc1sxXScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjRHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZCIpLmxlbmd0aCAmJiAkKCIjU3ViamVjdCIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIENsb3NlIHRpY2tldCBhbmQgc2V0IHJldmlldyByZXF1aXJlZC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkJykudmFsKCdZZXMnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1YmplY3QiLCAgJ2NzcycgKS0+c2VuZF9rZXlzKCdTZWxlbml1bSBUZXN0Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQiLCAnY3NzJyApLT5zZW5kX2tleXMoJ1Jldmlld1JlcXVpcmVkJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNHbG9iYWxTZWFyY2hOYXYiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2xpY2sgb24gc2VhcmNoLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0dsb2JhbFNlYXJjaE5hdiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNBdHRyaWJ1dGUnKS5sZW5ndGggJiYgXCQoJyNTZWFyY2hGb3JtU3VibWl0JykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgU2VsZWN0IHJldmlldyByZXF1aXJlZCBhbmQgdGl0bGUgc2VhcmNoIGZpZWxkLgogICAgICAgIG15ICRSZXZpZXdSZXF1aXJlZElEID0gIlNlYXJjaF9EeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIjsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNBdHRyaWJ1dGUnKS52YWwoJyRSZXZpZXdSZXF1aXJlZElEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5BZGRCdXR0b24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoSW5zZXJ0ICMkUmV2aWV3UmVxdWlyZWRJRCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnVGl0bGUnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkFkZEJ1dHRvbiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTZWFyY2hJbnNlcnQgaW5wdXRbbmFtZT1cIlRpdGxlXCJdJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgU2VhcmNoIHRpY2tldHMgYnkgcmV2aWV3IHJlcXVpcmVkIGFuZCB0aWNrZXQgdGl0bGUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdUaXRsZSddIiktPnNlbmRfa2V5cygkVGlja2V0VGl0bGUpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnIyRSZXZpZXdSZXF1aXJlZElEJykudmFsKCdZZXMnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJyQoIiNTZWFyY2hGb3JtU3VibWl0IikuY2xpY2soKTsnKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2E6Y29udGFpbnMoXCIkVGlja2V0TnVtYmVyc1swXVwiKScpLmxlbmd0aCAmJiBcJCgnYTpjb250YWlucyhcIiRUaWNrZXROdW1iZXJzWzFdXCIpJykubGVuZ3RoIgogICAgICAgICk7CiAgICAgICAgc2xlZXAgMjsKCiAgICAgICAgIyBDaGVjayBmb3IgdGVzdCBjcmVhdGVkIHRpY2tldHMgb24gc2NyZWVuLgogICAgICAgIGZvciBteSAkVGlja2V0TnVtYmVyIChAVGlja2V0TnVtYmVycykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnYTpjb250YWlucyhcIiRUaWNrZXROdW1iZXJcIiknKS5sZW5ndGgiKSwKICAgICAgICAgICAgICAgICJUZXN0IHRpY2tldCBudW1iZXIgJFRpY2tldE51bWJlciAtIGZvdW5kIiwKICAgICAgICAgICAgKSB8fCBkaWU7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cy4KICAgICAgICBmb3IgbXkgJFRpY2tldERlbGV0ZSAoQFRpY2tldElEcykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXREZWxldGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUaWNrZXQgaXMgZGVsZXRlZCAtIElEICRUaWNrZXREZWxldGUiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIHNjcmlwdHMvdGVzdC9TZWxlbml1bS9BZ2VudC9BZ2VudFRpY2tldEFjdGlvbkNvbW1vbkFDTC50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBub3RlOiB0aGlzIFVUIGNvdmVycyBidWcgIzExODc0IC0gUmVzdHJpY3Qgc2VydmljZSBiYXNlZCBvbiBzdGF0ZSB3aGVuIHBvc3RpbmcgYSBub3RlCgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tNWFJlY29yZCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1NlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1F1ZXVlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNQcmlvcml0eScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB0aWNrZXQgZHluYW1pYyBmaWVsZC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRJRCAgICAgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0ZpZWxkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnRmllbGQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTk4LAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgPT4gJycsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gewogICAgICAgICAgICAgICAgICAgIDAgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtIEFkZGVkIGR5bmFtaWMgZmllbGQgKCREeW5hbWljRmllbGRJRCkiLAogICAgICAgICk7CgogICAgICAgIG15ICREeW5hbWljRmllbGRJRDIgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0ZpZWxkMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0ZpZWxkMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5OTksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgYSA9PiAnYScsCiAgICAgICAgICAgICAgICAgICAgYiA9PiAnYicsCiAgICAgICAgICAgICAgICAgICAgYyA9PiAnYycsCiAgICAgICAgICAgICAgICAgICAgZCA9PiAnZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZElEMiwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtIEFkZGVkIGR5bmFtaWMgZmllbGQgKCREeW5hbWljRmllbGRJRCkiLAogICAgICAgICk7CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNEeW5hbWljRmllbGQnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAnRmllbGQnIC4gJFJhbmRvbUlEICA9PiAxLAogICAgICAgICAgICAgICAgJ0ZpZWxkMicgLiAkUmFuZG9tSUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICdGaWVsZCcgLiAkUmFuZG9tSUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkQUNMT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkFDTDo6REI6OkFDTCcpOwoKICAgICAgICAjIEltcG9ydCB0ZXN0IEFDTC4KICAgICAgICAkQUNMT2JqZWN0LT5BQ0xJbXBvcnQoCiAgICAgICAgICAgIENvbnRlbnQgPT4gPDwiRU9GIiwKLSBDaGFuZ2VCeTogcm9vdFxAbG9jYWxob3N0CiAgQ2hhbmdlVGltZTogMjAxNi0wMi0xNiAwMzowODo1OAogIENvbW1lbnQ6ICcnCiAgQ29uZmlnQ2hhbmdlOgogICAgUG9zc2libGU6CiAgICAgIFRpY2tldDoKICAgICAgICBTZXJ2aWNlOgogICAgICAgIC0gVVQgVGVzdCBTZXJ2aWNlIDEgJFJhbmRvbUlECiAgQ29uZmlnTWF0Y2g6CiAgICBQcm9wZXJ0aWVzOgogICAgICBUaWNrZXQ6CiAgICAgICAgU3RhdGU6CiAgICAgICAgLSBuZXcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMjo1NTozNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMScKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMQogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTYtMDItMTYgMDM6MTA6MDUKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlOgogICAgICBUaWNrZXQ6CiAgICAgICAgU0xBOgogICAgICAgIC0gVVQgVGVzdCBTTEEgMSAkUmFuZG9tSUQKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIER5bmFtaWNGaWVsZDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQkUmFuZG9tSUQ6CiAgICAgICAgLSAnMCcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMzoxMDowNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMicKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMgogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTYtMDItMTYgMDM6MTE6MDUKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlTm90OgogICAgICBUaWNrZXQ6CiAgICAgICAgUXVldWU6CiAgICAgICAgLSAnSnVuaycKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIFRpY2tldDoKICAgICAgICBQcmlvcml0eToKICAgICAgICAtICcyIGxvdycKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMzoxMTowNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMycKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMwogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTctMDctMDcgMDk6NDY6MzgKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlTm90OgogICAgICBUaWNrZXQ6CiAgICAgICAgU3RhdGU6CiAgICAgICAgLSBjbG9zZWQgc3VjY2Vzc2Z1bAogIENvbmZpZ01hdGNoOgogICAgUHJvcGVydGllczoKICAgICAgRHluYW1pY0ZpZWxkOgogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZCRSYW5kb21JRDoKICAgICAgICAtICcwJwogIENyZWF0ZUJ5OiByb290XEBsb2NhbGhvc3QKICBDcmVhdGVUaW1lOiAyMDE3LTA3LTA3IDA5OjQ1OjM4CiAgRGVzY3JpcHRpb246ICcnCiAgSUQ6ICc0JwogIE5hbWU6IFRoaXNJc0FVbml0VGVzdEFDTC00CiAgU3RvcEFmdGVyTWF0Y2g6IDAKICBWYWxpZElEOiAnMScKLSBDaGFuZ2VCeTogcm9vdFxAbG9jYWxob3N0CiAgQ2hhbmdlVGltZTogMjAxNy0wNy0xMCAwOTowMDowMAogIENvbW1lbnQ6ICcnCiAgQ29uZmlnQ2hhbmdlOgogICAgUG9zc2libGU6CiAgICAgIFRpY2tldDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQyJFJhbmRvbUlEOgogICAgICAgIC0gJ2EnCiAgICAgICAgLSAnYicKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIER5bmFtaWNGaWVsZDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQkUmFuZG9tSUQ6CiAgICAgICAgLSAnMCcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNy0wNy0xMCAwOTowMDowMAogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnNScKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtNQogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCkVPRgogICAgICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBBZnRlciBsb2dpbiwgd2UgbmVlZCB0byBuYXZpZ2F0ZSB0byB0aGUgQUNMIGRlcGxveW1lbnQgdG8gbWFrZSB0aGUgaW1wb3J0ZWQgQUNMIHdvcmsuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BQ0w7U3ViYWN0aW9uPUFDTERlcGxveSIpOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLAogICAgICAgICAgICAgICAgJ0FDTCBpbmZvcm1hdGlvbiBmcm9tIGRhdGFiYXNlIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLCBwbGVhc2UgZGVwbG95IGFsbCBBQ0xzLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgID4gLTEsCiAgICAgICAgICAgICJBQ0wgZGVwbG95bWVudCBzdWNjZXNzZnVsLiIKICAgICAgICApOwoKICAgICAgICAjIEFkZCBhIGN1c3RvbWVyLgogICAgICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnSHViZXInLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnTWFuZnJlZCcsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICdBMTI0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJ2N1c3RvbWVydXNlcl8nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgVXNlclBhc3N3b3JkICAgPT4gJ3NvbWUtcGFzcycsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICRIZWxwZXItPkdldFJhbmRvbUlEKCkgLiAnQGxvY2FsaG9zdC5jb20nLAogICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdTZWxlbml1bSBUaWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICcxMjM0NjUnLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0Q3JlYXRlIC0gSUQgJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCB0ZXN0IHRpY2tldCBkeW5hbWljIGZpZWxkIHRvIHplcm8tdmFsdWUsIHBsZWFzZSBzZWUgYnVnIzEyMjczIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScpOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVUZXh0ID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHNvbWUgdGVzdCBzZXJ2aWNlcy4KICAgICAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCiAgICAgICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaAogICAgICAgIG15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2Ygc2xhIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCiAgICAgICAgbXkgJFNMQVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGEgbG9va3VwIGhhc2gKICAgICAgICBteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKICAgICAgICBteSAkU2VydmljZUlEOwogICAgICAgIG15IEBTZXJ2aWNlczsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICJVVCBUZXN0IFNlcnZpY2UgJENvdW50ICRSYW5kb21JRCIsCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAU2VydmljZXMsICRTZXJ2aWNlSUQ7CgogICAgICAgICAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJUZXN0IHNlcnZpY2UgJENvdW50ICgkU2VydmljZUlEKSBjcmVhdGVkIGFuZCBhc3NpZ25lZCB0byBjdXN0b21lciB1c2VyIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ3JlYXRlIHNldmVyYWwgdGVzdCBTTEFzLgogICAgICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgogICAgICAgIG15IEBTTEFzOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gXEBTZXJ2aWNlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlVUIFRlc3QgU0xBICRDb3VudCAkUmFuZG9tSUQiLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAU0xBcywgJFNMQUlEOwogICAgICAgIH0KCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20gc2NyZWVuIG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIEZvcmNlIHN1YiBtZW51IHRvIGJlIHZpc2libGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayBvbmUgb2YgdGhlIGxpbmtzLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbiciICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNuYXYtQ29tbXVuaWNhdGlvbi1jb250YWluZXInKS5jc3MoJ2hlaWdodCcsICdhdXRvJykiKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI25hdi1Db21tdW5pY2F0aW9uLWNvbnRhaW5lcicpLmNzcygnb3BhY2l0eScsICcxJykiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNuYXYtQ29tbXVuaWNhdGlvbi1jb250YWluZXInKS5jc3MoJ2hlaWdodCcpICE9PSAnMHB4JyAmJiBcJCgnI25hdi1Db21tdW5pY2F0aW9uLWNvbnRhaW5lcicpLmNzcygnb3BhY2l0eScpID09ICcxJyIKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uICdOb3RlJyBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXROb3RlO1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjU2VydmljZUlEIikubGVuZ3RoOycgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgZW50cmllcyBpbiB0aGUgc2VydmljZSBzZWxlY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjU2VydmljZUlEIG9wdGlvbjpub3QoW3ZhbHVlPVwiXCJdKScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUaGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgc2VydmljZSBzZWxlY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgU2V0IHRlc3Qgc2VydmljZSBhbmQgdHJpZ2dlciBBSkFYIHJlZnJlc2guCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VydmljZUlEIG9wdGlvbjpub3QoW3ZhbHVlPVwiXCJdKScpLmF0dHIoJ3NlbGVjdGVkJywgdHJ1ZSkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGg7JyApOwoKICAgICAgICAjIENoZWNrIGZvciByZXN0cmljdGVkIGVudHJpZXMgaW4gdGhlIFNMQSBzZWxlY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjU0xBSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRoZXJlIGlzIG9ubHkgb25lIGVudHJ5IGluIHRoZSBTTEEgc2VsZWN0aW9uIiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBxdWV1ZSBpcyB1cGRhdGVkIG9uIEFDTCB0cmlnZ2VyLCBzZWUgYnVnIzEyODYyICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjg2MiApLgogICAgICAgIG15ICVKdW5rUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0p1bmsnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI05ld1F1ZXVlSUQgb3B0aW9uW3ZhbHVlPVwiJEp1bmtRdWV1ZXtRdWV1ZUlEfVwiXScpLmxlbmd0aCA+IDA7IiksCiAgICAgICAgICAgICJKdW5rIHF1ZXVlIGlzIGF2YWlsYWJsZSBpbiBzZWxlY3Rpb24gYmVmb3JlIEFDTCB0cmlnZ2VyIgogICAgICAgICk7CgogICAgICAgICMgVHJpZ2dlciBBQ0wgb24gcHJpb3JpdHkgY2hhbmdlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjTmV3UHJpb3JpdHlJRCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoOycgKTsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNOZXdRdWV1ZUlEIG9wdGlvblt2YWx1ZT1cIiRKdW5rUXVldWV7UXVldWVJRH1cIl0nKS5sZW5ndGggPiAwOyIpLAogICAgICAgICAgICAiSnVuayBxdWV1ZSBpcyBub3QgYXZhaWxhYmxlIGluIHNlbGVjdGlvbiBhZnRlciBBQ0wgdHJpZ2dlciIKICAgICAgICApOwoKICAgICAgICAjIFR1cm4gb2ZmIHByaW9yaXR5IGFuZCB0cnkgYWdhaW4uIFBsZWFzZSBzZWUgYnVnIzEzMzEyIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNQcmlvcml0eScsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbG9zZSB0aGUgbmV3IG5vdGUgcG9wdXAuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ2FuY2VsQ2xvc2VQb3B1cCcsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAjIENsaWNrIG9uICdOb3RlJyBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXROb3RlO1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjU2VydmljZUlEIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIGZvciBlbnRyaWVzIGluIHRoZSBzZXJ2aWNlIHNlbGVjdGlvbiwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNTZXJ2aWNlSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAnVGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhlIHNlcnZpY2Ugc2VsZWN0aW9uJwogICAgICAgICk7CgogICAgICAgICMgU2V0IHRlc3Qgc2VydmljZSBhbmQgdHJpZ2dlciBBSkFYIHJlZnJlc2guCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VydmljZUlEIG9wdGlvbjpub3QoW3ZhbHVlPVwiXCJdKScpLmF0dHIoJ3NlbGVjdGVkJywgdHJ1ZSkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgZW50cmllcyBpbiB0aGUgU0xBIHNlbGVjdGlvbiwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNTTEFJRCBvcHRpb246bm90KFt2YWx1ZT1cIlwiXSknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdUaGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgU0xBIHNlbGVjdGlvbicKICAgICAgICApOwoKICAgICAgICAjIENsb3NlIHRoZSBuZXcgbm90ZSBwb3B1cC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5DYW5jZWxDbG9zZVBvcHVwJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICMgUGxlYXNlIHNlZSBidWcjMTI4NzEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBGaWVsZElEICA9PiAkRHluYW1pY0ZpZWxkSUQyLAogICAgICAgICAgICBPYmplY3RJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZVRleHQgPT4gJ2EnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiAnTm90ZScgYW5kIHN3aXRjaCB3aW5kb3cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Tm90ZTtUaWNrZXRJRD0kVGlja2V0SUQnICldIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKENvcmUpID09ICJvYmplY3QiICYmIHR5cGVvZihDb3JlLkFwcCkgPT0gIm9iamVjdCIgJiYgQ29yZS5BcHAuUGFnZUxvYWRDb21wbGV0ZTsnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0R5bmFtaWNGaWVsZF9GaWVsZDIkUmFuZG9tSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAyLAogICAgICAgICAgICAiVGhlcmUgYXJlIG9ubHkgdHdvIGVudHJpZXMgaW4gdGhlIGR5bmFtaWMgZmllbGQgMiBzZWxlY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgRGUtc2VsZWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvciB0aGUgZmlyc3QgZmllbGQuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0ZpZWxkJFJhbmRvbUlEJykudmFsKCcnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aDsnICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNEeW5hbWljRmllbGRfRmllbGQyJFJhbmRvbUlEIG9wdGlvbjpub3QoW3ZhbHVlPVwiXCJdKScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgICJUaGVyZSBhcmUgYWxsIGZvdXIgZW50cmllcyBpbiB0aGUgZHluYW1pYyBmaWVsZCAyIHNlbGVjdGlvbiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbG9zZSB0aGUgbmV3IG5vdGUgcG9wdXAuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ2FuY2VsQ2xvc2VQb3B1cCcsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAjIENsaWNrIG9uICdDbG9zZScgYWN0aW9uIGFuZCBzd2l0Y2ggdG8gaXQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Q2xvc2U7VGlja2V0SUQ9JFRpY2tldElEJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iOycgKTsKCiAgICAgICAgIyBBdCB0aGlzIHBvaW50LCBzdGF0ZSBmaWVsZCBzaG91bGQgYmUgbWlzc2luZyAnY2xvc2VkIHN1Y2Nlc3NmdWwnIHN0YXRlIGJlY2F1c2Ugb2YgQUNMLgogICAgICAgICMgICBDaGFuZ2UgdGhlIGR5bmFtaWMgZmllbGQgcHJvcGVydHkgdG8gJzEnIGFuZCB3YWl0IHVudGlsICdjbG9zZWQgc3VjY2Vzc2Z1bCcgaXMgYXZhaWxhYmxlIGFnYWluLgogICAgICAgICMgICBUaGVuLCBjbG9zZSB0aGUgdGlja2V0IGFuZCB2ZXJpZnkgaXQgd2FzIGFjdHVhbGx5IGNsb3NlZC4KICAgICAgICAjICAgUGxlYXNlIHNlZSBidWcjMTI2NzEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI05ld1N0YXRlSUQgb3B0aW9uOmNvbnRhaW5zKFwiY2xvc2VkIHN1Y2Nlc3NmdWxcIiknKS5sZW5ndGggPT0gMCIpLAogICAgICAgICAgICAiU3RhdGUgJ2Nsb3NlZCBzdWNjZXNzZnVsJyBub3QgYXZhaWxhYmxlIGluIG5ldyBzdGF0ZSBzZWxlY3Rpb24gYmVmb3JlIERGIHVwZGF0ZSIKICAgICAgICApOwoKICAgICAgICAjIFNldCBkeW5hbWljIGZpZWxkIHZhbHVlIHRvIG5vbi16ZXJvLCBhbmQgd2FpdCBmb3IgQUpBWCB0byBjb21wbGV0ZS4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEeW5hbWljRmllbGRfRmllbGQkUmFuZG9tSUQnKS52YWwoJzEnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI05ld1N0YXRlSUQgb3B0aW9uOmNvbnRhaW5zKFwiY2xvc2VkIHN1Y2Nlc3NmdWxcIiknKS5sZW5ndGggPT0gMSIpLAogICAgICAgICAgICAiU3RhdGUgJ2Nsb3NlZCBzdWNjZXNzZnVsJyBhdmFpbGFibGUgaW4gbmV3IHN0YXRlIHNlbGVjdGlvbiBhZnRlciBERiB1cGRhdGUiCiAgICAgICAgKTsKCiAgICAgICAgIyBDbG9zZSB0aGUgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI05ld1N0YXRlSUQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1N1YmplY3QnLCAgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCdDbG9zZScpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1JpY2hUZXh0JywgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCdDbG9zaW5nLi4uJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjc3VibWl0UmljaFRleHQnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byB0aWNrZXQgaGlzdG9yeSBzY3JlZW4gb2YgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRIaXN0b3J5O1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB0aWNrZXQgd2FzIGluZGVlZCBjbG9zZWQgc3VjY2Vzc2Z1bGx5LgogICAgICAgIG15ICRDbG9zZU1zZyA9ICdPbGQ6ICJuZXciIE5ldzogImNsb3NlZCBzdWNjZXNzZnVsIic7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2xvc2VNc2cgKSA+IC0xLAogICAgICAgICAgICAnVGlja2V0IGNsb3NlZCBzdWNjZXNzZnVsbHknCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBBQ0xzIHJ1bGVzLgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDUgKSB7CiAgICAgICAgICAgIG15ICRBQ0xEYXRhID0gJEFDTE9iamVjdC0+QUNMR2V0KAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdUaGlzSXNBVW5pdFRlc3RBQ0wtJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQUNMT2JqZWN0LT5BQ0xEZWxldGUoCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJEFDTERhdGEtPntJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJBQ0wgd2l0aCBJRCAkQUNMRGF0YS0+e0lEfSBpcyBkZWxldGVkIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZXBsb3kgYWdhaW4gYWZ0ZXIgd2UgZGVsZXRlZCB0aGUgdGVzdCBhY2wuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BQ0w7U3ViYWN0aW9uPUFDTERlcGxveSIpOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLAogICAgICAgICAgICAgICAgJ0FDTCBpbmZvcm1hdGlvbiBmcm9tIGRhdGFiYXNlIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLCBwbGVhc2UgZGVwbG95IGFsbCBBQ0xzLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgID4gLTEsCiAgICAgICAgICAgICJBQ0wgZGVwbG95bWVudCBzdWNjZXNzZnVsLiIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cy4KICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVGlja2V0IGRlbGV0aW9uIGNvdWxkIGZhaWwgaWYgYXBhY2hlIHN0aWxsIHdyaXRlcyB0byB0aWNrZXQgaGlzdG9yeS4gVHJ5IGFnYWluIGluIHRoaXMgY2FzZS4KICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgc2xlZXAgMzsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZXQgd2l0aCB0aWNrZXQgSUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ1RpY2tldCcgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBTTEFzLgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIGZvciBteSAkU0xBSUQgKEBTTEFzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNsYV9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkU0xBSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIFNMQSB3aXRoIElEICRTTEFJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBzZXJ2aWNlcyBhbmQgcmVsYXRpb25zLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIGN1c3RvbWVyX3VzZXJfbG9naW4gPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJVc2VyTG9naW4gXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgc2VydmljZSByZWxhdGlvbnMgZm9yICRDdXN0b21lclVzZXJMb2dpbiIsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VzKSB7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgIyBjbGVhbiB1cCBzZXJ2aWNhIGRhdGEKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2VydmljZV9wcmVmZXJlbmNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRTZXJ2aWNlSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJTZXJ2aWNlUHJlZmVyZW5jZXMgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwojIC0tLQogICAgICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIElEID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRTZXJ2aWNlSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHNlcnZpY2Ugd2l0aCBJRCAkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY3VzdG9tZXJfdXNlciBXSEVSRSBsb2dpbiA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDdXN0b21lclVzZXJMb2dpbiBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCBDdXN0b21lciAkQ3VzdG9tZXJVc2VyTG9naW4iLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgZHluYW1pYyBmaWVsZC4KICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZERlbGV0ZSgKICAgICAgICAgICAgSUQgICAgID0+ICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEeW5hbWljRmllbGREZWxldGUgLSBEZWxldGVkIHRlc3QgZHluYW1pYyBmaWVsZCAkRHluYW1pY0ZpZWxkSUQiLAogICAgICAgICk7CgogICAgICAgICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJER5bmFtaWNGaWVsZElEMiwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEeW5hbWljRmllbGREZWxldGUgLSBEZWxldGVkIHRlc3QgZHluYW1pYyBmaWVsZCAkRHluYW1pY0ZpZWxkSUQyIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoIFNlcnZpY2UgU0xBIEN1c3RvbWVyVXNlciBEeW5hbWljRmllbGQgKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLXNlcnZpY2UnIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0aWNrZXRzCiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gIlNlbGVuaXVtIFRlc3QgVGlja2V0IiwKICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAnU2VsZW5pdW1DdXN0b21lcicsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAiU2VsZW5pdW1DdXN0b21lclxAbG9jYWxob3N0LmNvbSIsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldCBpcyBjcmVhdGVkIC0gSUQgJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gem9vbSB2aWV3IG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIik7CgogICAgICAgICMgY2xpY2sgJ0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsICdBY3Rpb249QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDtUaWNrZXRJRD0kVGlja2V0SUQnICldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVwYWlyU3RhcnRUaW1lVXNlZCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoIFJlcGFpclN0YXJ0VGltZVVzZWQgUmVjb3ZlcnlTdGFydFRpbWVVc2VkIER1ZURhdGVVc2VkKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0R5bmFtaWNGaWVsZF9JVFNNJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2UgdGl0bGUgYW5kIGFkZCByZXBhaXIsIHJlY292ZXJ5IGFuZCBkdWUgZGF0ZXMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGl0bGUiLCAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtIElUU00gRmllbGRzIFRpY2tldCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0R5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lVXNlZCIsICAgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lVXNlZCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBzd2l0Y2ggYmFjayB0byB6b29tIHZpZXcKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DbHVzdGVyIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0SGlzdG9yeTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNoZWNrIGZvciBUaWNrZXREeW5hbWljRmllbGRVcGRhdGVzCiAgICAgICAgZm9yIG15ICRVcGRhdGVUZXh0IChxdyhSZXBhaXJTdGFydFRpbWUgUmVjb3ZlcnlTdGFydFRpbWUgRHVlRGF0ZSkpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIlVwZGF0ZWQ6IEZpZWxkTmFtZT1JVFNNJFVwZGF0ZVRleHQiICkgPiAtMSwKICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRVcGRhdGUgJFVwZGF0ZVRleHQgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cwogICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0IGlzIGRlbGV0ZWQgLSBJRCAkVGlja2V0SUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICJTZWxlbml1bSBUZXN0IFRpY2tldCIsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJ1NlbGVuaXVtQ3VzdG9tZXInLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gIlNlbGVuaXVtQ3VzdG9tZXJcQGxvY2FsaG9zdC5jb20iLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXRJRCAkVGlja2V0SUQgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldERlY2lzaW9uIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldERlY2lzaW9uO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIENoZWNrIHNjcmVlbi4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoIFJlc3VsdCBEYXRlVXNlZCBEYXRlTW9udGggRGF0ZURheSBEYXRlWWVhciBEYXRlSG91ciBEYXRlTWludXRlICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNEeW5hbWljRmllbGRfSVRTTURlY2lzaW9uJElEJykubGVuZ3RoOyIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEeW5hbWljRmllbGRfSVRTTURlY2lzaW9uJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGFuZ2UgZGVjaXNpb24gcmVzdWx0IGFuZCBkYXRlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0R5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHQnKS52YWwoJ1JlamVjdGVkJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZVVzZWQiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuICQoIiNEeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZVVzZWQiKS5wcm9wKCJjaGVja2VkIikgPT09IHRydWU7JyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldEhpc3Rvcnkgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0SGlzdG9yeTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGRlY2lzaW9uIFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZXMuCiAgICAgICAgZm9yIG15ICRVcGRhdGVUZXh0IChxdyhSZXN1bHQgRGF0ZSkpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIlVwZGF0ZWQ6IEZpZWxkTmFtZT1JVFNNRGVjaXNpb24kVXBkYXRlVGV4dCIgKSA+IC0xLAogICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZFVwZGF0ZSBkZWNpc2lvbiAkVXBkYXRlVGV4dCAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgdGlja2V0cy4KICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIFRpY2tldCBkZWxldGlvbiBjb3VsZCBmYWlsIGlmIGFwYWNoZSBzdGlsbCB3cml0ZXMgdG8gdGlja2V0IGhpc3RvcnkuIFRyeSBhZ2FpbiBpbiB0aGlzIGNhc2UuCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHNsZWVwIDM7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCBpcyBkZWxldGVkIgogICAgICAgICk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIHNjcmlwdHMvdGVzdC9TZWxlbml1bS9BZ2VudC9BZ2VudFRpY2tldEVtYWlsLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRTaWduYXR1cmVPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2lnbmF0dXJlJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgICAgICMgRGlzYWJsZSBjaGVjayBlbWFpbCBhZGRyZXNzZXMuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIFJpY2hUZXh0LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIHNlcnZpY2UgYW5kIHR5cGUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpUeXBlJywKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICAgICAgVmFsdWUgPT4gMSwKIyAtLS0KICAgICAgICApOwoKICAgICAgICAjIEVuYWJsZSBzZXNzaW9uIG1hbmFnZW1lbnQgdXNlIGh0bWwgY29va2llcy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnU2Vzc2lvblVzZUNvb2tpZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWZpbmUgcmFuZG9tIHRlc3QgdmFyaWFibGUuCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgbXkgQFNpZ25hdHVyZUlEczsKICAgICAgICBteSBAUXVldWVJRHM7CiAgICAgICAgbXkgQFF1ZXVlTmFtZXM7CiAgICAgICAgbXkgQEN1c3RvbWVyVXNlcklEczsKICAgICAgICBteSBAVGVzdERhdGEgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNpZ25hdHVyZU5hbWUgPT4gJ1NpZ25hdHVyZTEnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgU2lnbmF0dXJlVGV4dCA9PiAnQ3VzdG9tZXIgRmlyc3QgTmFtZTogPE9UUlNfQ1VTVE9NRVJfREFUQV9Vc2VyRmlyc3RuYW1lPicsCiAgICAgICAgICAgICAgICBRdWV1ZU5hbWUgICAgID0+ICdRdWV1ZTEnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlckZpcnN0TmFtZSA9PiAnRmlyc3ROYW1lMScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBVc2VyTGFzdE5hbWUgID0+ICdMYXN0TmFtZTEnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVXNlckxvZ2luMScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNpZ25hdHVyZU5hbWUgPT4gJ1NpZ25hdHVyZTInIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgU2lnbmF0dXJlVGV4dCA9PiAnQ3VzdG9tZXIgTGFzdCBOYW1lOiA8T1RSU19DVVNUT01FUl9EQVRBX1VzZXJMYXN0bmFtZT4nLAogICAgICAgICAgICAgICAgUXVldWVOYW1lICAgICA9PiAnUXVldWUyJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIFVzZXJGaXJzdE5hbWUgPT4gJ0ZpcnN0TmFtZTInIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlckxhc3ROYW1lICA9PiAnTGFzdE5hbWUyJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VzZXJMb2dpbjInIC4gJFJhbmRvbUlELAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRGF0YSAoQFRlc3REYXRhKSB7CiAgICAgICAgICAgIG15ICRTaWduYXR1cmVJRCA9ICRTaWduYXR1cmVPYmplY3QtPlNpZ25hdHVyZUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICREYXRhLT57U2lnbmF0dXJlTmFtZX0sCiAgICAgICAgICAgICAgICBUZXh0ICAgICAgICA9PiAkRGF0YS0+e1NpZ25hdHVyZVRleHR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJ1NlbGVuaXVtIHNpZ25hdHVyZScsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2lnbmF0dXJlSUQsCiAgICAgICAgICAgICAgICAiU2lnbmF0dXJlSUQgJFNpZ25hdHVyZUlEIGlzIGNyZWF0ZWQiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFNpZ25hdHVyZUlEcywgJFNpZ25hdHVyZUlEOwoKICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICREYXRhLT57UXVldWVOYW1lfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICAgICAgU2lnbmF0dXJlSUQgICAgID0+ICRTaWduYXR1cmVJRCwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgICA9PiAnU2VsZW5pdW0gUXVldWUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICAiUXVldWVJRCAkUXVldWVJRCBpcyBjcmVhdGVkIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBRdWV1ZUlEcywgICAkUXVldWVJRDsKICAgICAgICAgICAgcHVzaCBAUXVldWVOYW1lcywgJERhdGEtPntRdWV1ZU5hbWV9OwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAkRGF0YS0+e1VzZXJGaXJzdE5hbWV9LAogICAgICAgICAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gJERhdGEtPntVc2VyTGFzdE5hbWV9LAogICAgICAgICAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJERhdGEtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJERhdGEtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gIiREYXRhLT57VXNlckxvZ2lufVxAbG9jYWxob3N0LmNvbSIsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAiQ3VzdG9tZXJVc2VySUQgJEN1c3RvbWVyVXNlcklEIGlzIGNyZWF0ZWQiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlcklEcywgJEN1c3RvbWVyVXNlcklEOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbi4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnIF0sCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLXNlcnZpY2UnIF0sCiMgLS0tCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRFbWFpbCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbCIpOwoKICAgICAgICAjIENoZWNrIHBhZ2UuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KERlc3QgVG9DdXN0b21lciBDY0N1c3RvbWVyIEJjY0N1c3RvbWVyIEN1c3RvbWVySUQgUmljaFRleHQKICAgICAgICAgICAgU2lnbmF0dXJlIEZpbGVVcGxvYWQgTmV4dFN0YXRlSUQgUHJpb3JpdHlJRCBzdWJtaXRSaWNoVGV4dCkKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAsIHF3KFR5cGVJRCBTZXJ2aWNlSUQgT3B0aW9uTGlua1RpY2tldCBEeW5hbWljRmllbGRfSVRTTUltcGFjdCkKIyAtLS0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNsaWVudCBzaWRlIHZhbGlkYXRpb24uCiAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgJ2NzcycgKTsKICAgICAgICAkRWxlbWVudC0+c2VuZF9rZXlzKCIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNzdWJtaXRSaWNoVGV4dCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNTdWJqZWN0LkVycm9yIikubGVuZ3RoJyApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjU3ViamVjdC5FcnJvcicpLmxlbmd0aCIpLAogICAgICAgICAgICAnQ2xpZW50IHNpZGUgdmFsaWRhdGlvbiBjb3JyZWN0bHkgZGV0ZWN0ZWQgbWlzc2luZyBpbnB1dCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldEVtYWlsIHNjcmVlbiBhZ2Fpbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsIik7CgogICAgICAgICMgVmVyaWZ5IHNpZ25hdHVyZSB0YWdzIGxpa2UgPE9UUlNfQ1VTVE9NRVJfREFUQV8qPiwgcGxlYXNlIHNlZSBidWcjMTI4NTMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgIyAgIFNlbGVjdCBmaXJzdCBxdWV1ZS4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEZXN0JykudmFsKFwkKCcjRGVzdCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gXCQodGhpcykuaHRtbCgpID09ICckUXVldWVOYW1lc1swXSc7IH0gKS52YWwoKSApLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIFRoZXJlIGlzIG5vIHNlbGVjdGVkIGN1c3RvbWVyLCBzaG91bGQgYmUgbm8gcmVwbGFjZWQgdGFncyBpbiBzaWduYXR1cmUuCiAgICAgICAgbXkgJFNpZ25hdHVyZVRleHQgPSAiQ3VzdG9tZXIgRmlyc3QgTmFtZTogLSI7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiI1NpZ25hdHVyZSIpLnZhbCgpJyksCiAgICAgICAgICAgICRTaWduYXR1cmVUZXh0LAogICAgICAgICAgICAiU2lnbmF0dXJlIGlzIGZvdW5kIHdpdGggbm8gcmVwbGFjZWQgdGFncyIKICAgICAgICApOwoKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgZ2V0IHNlcnZpY2Ugb2JqZWN0CiAgICAgICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHNlcnZpY2UKICAgICAgICBteSAkU2VydmljZU5hbWUgPSAiU2VsZW5pdW0iIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkU2VydmljZUlEICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2UgaXMgY3JlYXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGN1c3RvbWVyIHVzZXIgYXMgbWVtYmVyIHRvIHRoZSB0ZXN0IHNlcnZpY2UKICAgICAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKIyAtLS0KICAgICAgICAjIFNlbGVjdCBjdXN0b21lciB1c2VyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RvQ3VzdG9tZXIiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RvQ3VzdG9tZXIiLCAnY3NzJyApLT5zZW5kX2tleXMoICRUZXN0RGF0YVswXS0+e1VzZXJMb2dpbn0gKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdERhdGFbMF0tPntVc2VyTG9naW59KScpLmNsaWNrKCkiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDdXN0b21lclNlbGVjdGVkXzEiKS5sZW5ndGggJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgJFNpZ25hdHVyZVRleHQgPSAiQ3VzdG9tZXIgRmlyc3QgTmFtZTogJFRlc3REYXRhWzBdLT57VXNlckZpcnN0TmFtZX0iOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2lnbmF0dXJlJykudmFsKCkuaW5kZXhPZignJFNpZ25hdHVyZVRleHQnKSAhPT0gLTE7IgogICAgICAgICk7CgogICAgICAgICMgSW5wdXQgc3ViamVjdCBkYXRhLgogICAgICAgIG15ICRUaWNrZXRTdWJqZWN0ID0gIlNlbGVuaXVtIFRpY2tldCI7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICdjc3MnICktPnNlbmRfa2V5cygkVGlja2V0U3ViamVjdCk7CgogICAgICAgICMgUXVldWUgYW5kIGN1c3RvbWVyIGFyZSBzZWxlY3RlZCwgc2lnbmF0dXJlIGhhcyByZXBsYWNlZCB0YWdzLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgncmV0dXJuICQoIiNTaWduYXR1cmUiKS52YWwoKScpLAogICAgICAgICAgICAkU2lnbmF0dXJlVGV4dCwKICAgICAgICAgICAgIlNpZ25hdHVyZSBpcyBmb3VuZCB3aXRoIHJlcGxhY2VkIHRhZ3Mgb24gc2VsZWN0ZWQgY3VzdG9tZXIiCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGFuZ2UgcXVldWUsIHRyaWdnZXIgbmV3IHNpZ25hdHVyZS4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEZXN0JykudmFsKFwkKCcjRGVzdCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gXCQodGhpcykuaHRtbCgpID09ICckUXVldWVOYW1lc1sxXSc7IH0gKS52YWwoKSApLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIFF1ZXVlIGlzIGNoYW5nZWQsIHZlcmlmeSBzaWduYXR1cmUgY2hhbmdlIHdpdGggcmVwbGFjZWQgdGFncy4KICAgICAgICAkU2lnbmF0dXJlVGV4dCA9ICJDdXN0b21lciBMYXN0IE5hbWU6ICRUZXN0RGF0YVswXS0+e1VzZXJMYXN0TmFtZX0iOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgncmV0dXJuICQoIiNTaWduYXR1cmUiKS52YWwoKScpLAogICAgICAgICAgICAkU2lnbmF0dXJlVGV4dCwKICAgICAgICAgICAgIlNpZ25hdHVyZSBpcyBmb3VuZCB3aXRoIHJlcGxhY2VkIHRhZ3Mgb24gcXVldWUgY2hhbmdlIgogICAgICAgICk7CgogICAgICAgICMgQWRkIG5ldyBjdXN0b21lciBpbiAnVG8nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RvQ3VzdG9tZXIiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RvQ3VzdG9tZXIiLCAnY3NzJyApLT5zZW5kX2tleXMoICRUZXN0RGF0YVsxXS0+e1VzZXJMb2dpbn0gKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdERhdGFbMV0tPntVc2VyTG9naW59KScpLmNsaWNrKCkiKTsKCiAgICAgICAgIyBDaGFuZ2Ugc2VsZWN0ZWQgY3VzdG9tZXIsIHRyaWdnZXIgcmVwbGFjZW1lbnQgdGFnIGluIHNpZ25hdHVyZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0N1c3RvbWVyU2VsZWN0ZWRfMiIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDdXN0b21lclNlbGVjdGVkXzIiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNpZ25hdHVyZVRleHQgPSAiQ3VzdG9tZXIgTGFzdCBOYW1lOiAkVGVzdERhdGFbMV0tPntVc2VyTGFzdE5hbWV9IjsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NpZ25hdHVyZScpLnZhbCgpLmluZGV4T2YoJyRTaWduYXR1cmVUZXh0JykgIT09IC0xOyIKICAgICAgICApOwoKICAgICAgICAjIElucHV0IGJvZHkgZGF0YS4KICAgICAgICBteSAkVGlja2V0Qm9keSA9ICJTZWxlbml1bSBib2R5IHRlc3QiOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSaWNoVGV4dCIsICdjc3MnICktPnNlbmRfa2V5cygkVGlja2V0Qm9keSk7CgogICAgICAgICMgU2VsZWN0ZWQgY3VzdG9tZXIgaXMgY2hhbmdlZCwgc2lnbmF0dXJlIHJlcGxhY2VkIHRhZ3MgYXJlIGNoYW5nZWQuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiI1NpZ25hdHVyZSIpLnZhbCgpJyksCiAgICAgICAgICAgICRTaWduYXR1cmVUZXh0LAogICAgICAgICAgICAiU2lnbmF0dXJlIGlzIGZvdW5kIHdpdGggcmVwbGFjZWQgdGFncyBvbiBzZWxlY3RlZCBjdXN0b21lciBjaGFuZ2UiCiAgICAgICAgKTsKCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNUeXBlSUQnKS52YWwoXCQoJyNUeXBlSUQgb3B0aW9uJykuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwkKHRoaXMpLmh0bWwoKSA9PSAnVW5jbGFzc2lmaWVkJzsgfSApLnZhbCgpICkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjU2VydmljZUlEIG9wdGlvblt2YWx1ZT1cIiRTZXJ2aWNlSURcIl0nKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjU2VydmljZUlEJykudmFsKCckU2VydmljZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCIjU2VydmljZUluY2lkZW50U3RhdGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgZm9yIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgZmllbGQKICAgICAgICBteSAkU2VydmljZUluY2lkZW50U3RhdGVFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VydmljZUluY2lkZW50U3RhdGUiLCAnY3NzJyApOwogICAgICAgICRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAkU2VydmljZUluY2lkZW50U3RhdGVFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNEeW5hbWljRmllbGRfSVRTTUltcGFjdCBvcHRpb25bdmFsdWU9XCIzIG5vcm1hbFwiXScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNQcmlvcml0eUlEIG9wdGlvblt2YWx1ZT1cIjRcIl0nKS5sZW5ndGg7IiApOwoKICAgICAgICAjIHRlc3QgcHJpb3JpdHkgdXBkYXRlIGJhc2VkIG9uIGltcGFjdCB2YWx1ZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUHJpb3JpdHlJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAnNCcsCiAgICAgICAgICAgICIjUHJpb3JpdHlJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JykudmFsKCcxIHZlcnkgbG93JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IGxvYWRpbmcgaWNvbiB0byBzaG93IHVwCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBSkFYTG9hZGVyUHJpb3JpdHlJRDp2aXNpYmxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IGxvYWRpbmcgaWNvbiB0byBoaWRlCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gIVwkKCcjQUpBWExvYWRlclByaW9yaXR5SUQ6dmlzaWJsZScpLmxlbmd0aDsiICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUHJpb3JpdHlJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAnMycsCiAgICAgICAgICAgICIjUHJpb3JpdHlJRCB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwojIC0tLQogICAgICAgICMgU3VibWl0IGZvcm0uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjc3VibWl0UmljaFRleHQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgR2V0IGNyZWF0ZWQgdGVzdCB0aWNrZXQgZGF0YS4KICAgICAgICBteSAlVGlja2V0SURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgTGltaXQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAoJVRpY2tldElEcylbMV07CiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICglVGlja2V0SURzKVswXTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldCB3YXMgY3JlYXRlZCBhbmQgZm91bmQgLSAkVGlja2V0SUQiLAogICAgICAgICkgfHwgZGllOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQnICldIiksCiAgICAgICAgICAgICJUaWNrZXQgd2l0aCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byB0aWNrZXQgem9vbSBwYWdlIG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIENoZWNrIGlmIHRlc3QgdGlja2V0IHZhbHVlcyBhcmUgZ2VudWluZS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUaWNrZXRTdWJqZWN0ICkgPiAtMSwKICAgICAgICAgICAgIiRUaWNrZXRTdWJqZWN0IGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICkgfHwgZGllICIkVGlja2V0U3ViamVjdCBub3QgZm91bmQgb24gcGFnZSI7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0Qm9keSApID4gLTEsCiAgICAgICAgICAgICIkVGlja2V0Qm9keSBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRpY2tldEJvZHkgbm90IGZvdW5kIG9uIHBhZ2UiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSApID4gLTEsCiAgICAgICAgICAgICIkVGVzdERhdGFbMV0tPntVc2VyTG9naW59IGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICkgfHwgZGllICIkVGVzdERhdGFbMV0tPntVc2VyTG9naW59IG5vdCBmb3VuZCBvbiBwYWdlIjsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRTaWduYXR1cmVUZXh0ICkgPiAtMSwKICAgICAgICAgICAgIlNpZ25hdHVyZSBmb3VuZCBvbiBwYWdlIgogICAgICAgICkgfHwgZGllICIkU2lnbmF0dXJlVGV4dCBub3QgZm91bmQgb24gcGFnZSI7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGZvcmNlIHN1YiBtZW51cyB0byBiZSB2aXNpYmxlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgb25lIG9mIHRoZSBsaW5rcwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcuQ2x1c3RlciB1bCB1bCcpLmFkZENsYXNzKCdGb3JjZVZpc2libGUnKTsiKTsKCiAgICAgICAgIyBjbGljayBvbiBoaXN0b3J5IGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vKlt0ZXh0KCk9J0hpc3RvcnknXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgSVRTTSB1cGRhdGVkIGZpZWxkcwogICAgICAgIGZvciBteSAkVXBkYXRlVGV4dCAocXcoSW1wYWN0IENyaXRpY2FsaXR5KSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiVXBkYXRlZDogRmllbGROYW1lPUlUU00kVXBkYXRlVGV4dCIgKSA+IC0xLAogICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZFVwZGF0ZSAkVXBkYXRlVGV4dCAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxlbml1bS0+Y2xvc2UoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKIyAtLS0KCiAgICAgICAgIyBEaXNhYmxlIHNlc3Npb24gbWFuYWdlbWVudCB1c2UgaHRtbCBjb29raWVzIHRvIGNoZWNrIHNpZ25hdHVyZSB1cGRhdGUgKHNlZSBidWcjMTI4OTApLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdTZXNzaW9uVXNlQ29va2llJywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0RW1haWwgc2NyZWVuIGFuZCBsb2dpbiBiZWNhdXNlIHRoZXJlIGlzIG5vIHNlc3Npb24gY29va2llcy4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsIik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVXNlciIsICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJFRlc3RVc2VyTG9naW4pOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1Bhc3N3b3JkIiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0VXNlckxvZ2luKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNMb2dpbkJ1dHRvbiIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRGVzdCcpLnZhbChcJCgnI0Rlc3Qgb3B0aW9uJykuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwkKHRoaXMpLmh0bWwoKSA9PSAnJFF1ZXVlTmFtZXNbMF0nOyB9ICkudmFsKCkgKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBTZWxlY3QgY3VzdG9tZXIgdXNlci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUb0N1c3RvbWVyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCAkVGVzdERhdGFbMF0tPntVc2VyTG9naW59ICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCdsaS51aS1tZW51LWl0ZW06Y29udGFpbnMoJFRlc3REYXRhWzBdLT57VXNlckxvZ2lufSknKS5jbGljaygpIik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ3VzdG9tZXJTZWxlY3RlZF8xIikubGVuZ3RoICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTaWduYXR1cmVUZXh0ID0gIkN1c3RvbWVyIEZpcnN0IE5hbWU6ICRUZXN0RGF0YVswXS0+e1VzZXJGaXJzdE5hbWV9IjsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NpZ25hdHVyZScpLnZhbCgpLmluZGV4T2YoJyRTaWduYXR1cmVUZXh0JykgIT09IC0xOyIKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHNpZ25hdHVyZSBoYXZlIGNvcnJlY3QgdGV4dCBhZnRlciBzZXQgcXVldWUgYW5kIGN1c3RvbWVyIHVzZXIuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiI1NpZ25hdHVyZSIpLnZhbCgpJyksCiAgICAgICAgICAgICRTaWduYXR1cmVUZXh0LAogICAgICAgICAgICAiU2lnbmF0dXJlIGhhcyBjb3JyZWN0IHRleHQiCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICBzbGVlcCAzOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0IHdpdGggdGlja2V0IElEICRUaWNrZXRJRCBpcyBkZWxldGVkIiwKICAgICAgICApOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlIC0gdGVzdCBjdXN0b21lciBjb25uZWN0aW9uCiAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZSBzZXJ2aWNlLWN1c3RvbWVyIGNvbm5lY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3Qgc2VydmljZSBwcmVmZXJlbmNlcwogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBwcmVmZXJlbmNlcyBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHNlcnZpY2UKICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlIGlzIGRlbGV0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgY3VzdG9tZXIgdXNlcnMuCiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICAgICAgZm9yIG15ICRDdXN0b21lckxvZ2luIChAQ3VzdG9tZXJVc2VySURzKSB7CiAgICAgICAgICAgIG15ICRUZXN0Q3VzdG9tZXIgPSAkREJPYmplY3QtPlF1b3RlKCRDdXN0b21lckxvZ2luKTsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY3VzdG9tZXJfdXNlciBXSEVSRSBsb2dpbiA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVGVzdEN1c3RvbWVyIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiQ3VzdG9tZXIgdXNlciAkVGVzdEN1c3RvbWVyIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IHF1ZXVlcy4KICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKEBRdWV1ZUlEcykgewogICAgICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkUXVldWVJRCBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlF1ZXVlSUQgJFF1ZXVlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3Qgc2lnbmF0dXJlLgogICAgICAgIGZvciBteSAkU2lnbmF0dXJlSUQgKEBTaWduYXR1cmVJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2lnbmF0dXJlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRTaWduYXR1cmVJRCBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlNpZ25hdHVyZUlEICRTaWduYXR1cmVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICBmb3IgbXkgJENhY2hlIChxdyAoVGlja2V0IEN1c3RvbWVyVXNlcikpIHsKICAgICAgICBmb3IgbXkgJENhY2hlIChxdyAoVGlja2V0IEN1c3RvbWVyVXNlciBTZXJ2aWNlKSkgewojIC0tLQogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQoKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIHNjcmlwdHMvdGVzdC9TZWxlbml1bS9BZ2VudC9BZ2VudFRpY2tldFBob25lLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgR2V0IHNlbGVuaXVtIG9iamVjdC4KbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBPdmVybG9hZCBDdXN0b21lclVzZXIgPT4gTWFwIHNldHRpbmcgZGVmaW5lZCBpbiB0aGUgRGVmYXVsdHMucG0gLSB1c2UgZXh0ZXJuYWwgdXJsLgogICAgICAgIG15ICREZWZhdWx0Q3VzdG9tZXJVc2VyID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIiKTsKICAgICAgICAkRGVmYXVsdEN1c3RvbWVyVXNlci0+e01hcH0tPls1XSA9IFsKICAgICAgICAgICAgJ1VzZXJFbWFpbCcsCiAgICAgICAgICAgICdFbWFpbCcsCiAgICAgICAgICAgICdlbWFpbCcsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICd2YXInLAogICAgICAgICAgICAnaHR0cDovL3d3dy5vdHJzLmNvbScsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnQXNQb3B1cCBPVFJTUG9wdXBfVGlja2V0QWN0aW9uJywKICAgICAgICBdOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lclVzZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAkRGVmYXVsdEN1c3RvbWVyVXNlciwKICAgICAgICApOwoKICAgICAgICAjIERvIG5vdCBjaGVjayBlbWFpbCBhZGRyZXNzZXMuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIFJpY2hUZXh0LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIHNlcnZpY2UgYW5kIHR5cGUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpUeXBlJywKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICAgICAgVmFsdWUgPT4gMSwKIyAtLS0KICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tc2VydmljZScgXSwKIyAtLS0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgR2V0IHRlc3QgdXNlciBJRC4KICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIEFkZCB0ZXN0IGN1c3RvbWVyIGZvciB0ZXN0aW5nLgogICAgICAgIG15ICRUZXN0Q3VzdG9tZXIgICAgICAgPSAnQ3VzdG9tZXInIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRUZXN0Q3VzdG9tZXJVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICRUZXN0Q3VzdG9tZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICRUZXN0Q3VzdG9tZXIsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRUZXN0Q3VzdG9tZXIsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICRUZXN0Q3VzdG9tZXIsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICIkVGVzdEN1c3RvbWVyXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRlc3RDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgIkN1c3RvbWVyVXNlckFkZCAtIElEICRUZXN0Q3VzdG9tZXJVc2VySUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgc2NyaXB0IGFsaWFzLgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFBob25lIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFBob25lIik7CgogICAgICAgICMgQ2hlY2sgcGFnZS4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoRnJvbUN1c3RvbWVyIEN1c3RvbWVySUQgRGVzdCBTdWJqZWN0IFJpY2hUZXh0IEZpbGVVcGxvYWQKICAgICAgICAgICAgTmV4dFN0YXRlSUQgUHJpb3JpdHlJRCBzdWJtaXRSaWNoVGV4dCkKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAsIHF3KFR5cGVJRCBTZXJ2aWNlSUQgT3B0aW9uTGlua1RpY2tldCBEeW5hbWljRmllbGRfSVRTTUltcGFjdCkKIyAtLS0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNsaWVudCBzaWRlIHZhbGlkYXRpb24uCiAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgJ2NzcycgKTsKICAgICAgICAkRWxlbWVudC0+c2VuZF9rZXlzKCIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNzdWJtaXRSaWNoVGV4dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI1N1YmplY3QnKS5oYXNDbGFzcygnRXJyb3InKSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAnQ2xpZW50IHNpZGUgdmFsaWRhdGlvbiBjb3JyZWN0bHkgZGV0ZWN0ZWQgbWlzc2luZyBpbnB1dCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFBob25lIHNjcmVlbiBhZ2Fpbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFBob25lIik7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gIlNlbGVuaXVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgU2VydmljZScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBzZXJ2aWNlIElEIC0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBsaW5rIHRlc3Qgc2VydmljZSB3aXRoIHRlc3QgY3VzdG9tZXIKICAgICAgICBteSAkU2VydmljZU1lbWJlckFkZFN1Y2Nlc3MgPSAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlTWVtYmVyQWRkU3VjY2VzcywKICAgICAgICAgICAgIkFkZGVkIHNlcnZpY2UgSUQgJFNlcnZpY2VJRCB0byBDdXN0b21lclVzZXIgJFRlc3RDdXN0b21lci4iLAogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1R5cGVJRCcpLnZhbChcJCgnI1R5cGVJRCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gXCQodGhpcykuaHRtbCgpID09ICdVbmNsYXNzaWZpZWQnOyB9ICkudmFsKCkgKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiMgLS0tCgogICAgICAgICMgQ3JlYXRlIHRlc3QgcGhvbmUgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRTdWJqZWN0ID0gIlNlbGVuaXVtIFRpY2tldCI7CiAgICAgICAgbXkgJFRpY2tldEJvZHkgICAgPSAiU2VsZW5pdW0gYm9keSB0ZXN0IjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNGcm9tQ3VzdG9tZXIiLCAnY3NzJyApLT5zZW5kX2tleXMoJFRlc3RDdXN0b21lcik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCdsaS51aS1tZW51LWl0ZW06Y29udGFpbnMoJFRlc3RDdXN0b21lciknKS5jbGljaygpIik7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNTZXJ2aWNlSUQgb3B0aW9uW3ZhbHVlPVwiJFNlcnZpY2VJRFwiXScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNTZXJ2aWNlSUQnKS52YWwoJyRTZXJ2aWNlSUQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuICQoIiNTZXJ2aWNlSW5jaWRlbnRTdGF0ZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3Igc2VydmljZSBpbmNpZGVudCBzdGF0ZSBmaWVsZAogICAgICAgIG15ICRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZXJ2aWNlSW5jaWRlbnRTdGF0ZSIsICdjc3MnICk7CiAgICAgICAgJFNlcnZpY2VJbmNpZGVudFN0YXRlRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IG9wdGlvblt2YWx1ZT1cIjMgbm9ybWFsXCJdJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1ByaW9yaXR5SUQgb3B0aW9uW3ZhbHVlPVwiNFwiXScpLmxlbmd0aDsiICk7CgogICAgICAgICMgdGVzdCBwcmlvcml0eSB1cGRhdGUgYmFzZWQgb24gaW1wYWN0IHZhbHVlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNQcmlvcml0eUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICc0JywKICAgICAgICAgICAgIiNQcmlvcml0eUlEIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnKS52YWwoJzEgdmVyeSBsb3cnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwoKICAgICAgICAjIHdhaXQgZm9yIGFqYXggbG9hZGluZyBpY29uIHRvIHNob3cgdXAKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0FKQVhMb2FkZXJQcmlvcml0eUlEOnZpc2libGUnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIHdhaXQgZm9yIGFqYXggbG9hZGluZyBpY29uIHRvIGhpZGUKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiAhXCQoJyNBSkFYTG9hZGVyUHJpb3JpdHlJRDp2aXNpYmxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNQcmlvcml0eUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICczJywKICAgICAgICAgICAgIiNQcmlvcml0eUlEIHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNEZXN0JykudmFsKCcyfHxSYXcnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICAnY3NzJyApLT5zZW5kX2tleXMoJFRpY2tldFN1YmplY3QpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXRCb2R5KTsKCiAgICAgICAgIyBXYWl0IGZvciAiQ3VzdG9tZXIgSW5mb3JtYXRpb24iLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuU2lkZWJhckNvbHVtbiBmaWVsZHNldCAuVmFsdWUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBDdXN0b21lciBlbWFpbCBpcyBsaW5rLgogICAgICAgIG15ICRMaW5rVmlzaWJsZSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuU2lkZWJhckNvbHVtbiBmaWVsZHNldCBhLkFzUG9wdXA6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTGlua1Zpc2libGUsCiAgICAgICAgICAgICJDdXN0b21lciBlbWFpbCBpcyBhIGxpbmsgd2l0aCBjbGFzcyBBc1BvcHVwLiIKICAgICAgICApOwoKICAgICAgICAjIE92ZXJsb2FkIEN1c3RvbWVyVXNlciA9PiBNYXAgc2V0dGluZyBkZWZpbmVkIGluIHRoZSBEZWZhdWx0cy5wbSAtIHVzZSBpbnRlcm5hbCB1cmwuCiAgICAgICAgJERlZmF1bHRDdXN0b21lclVzZXItPntNYXB9LT5bNV0gPSBbCiAgICAgICAgICAgICdVc2VyRW1haWwnLAogICAgICAgICAgICAnRW1haWwnLAogICAgICAgICAgICAnZW1haWwnLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAndmFyJywKICAgICAgICAgICAgJ1slIEVudigiQ0dJSGFuZGxlIikgJV0/QWN0aW9uPUFnZW50VGlja2V0Q29tcG9zZTtSZXNwb25zZUlEPTE7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0nLAogICAgICAgICAgICAwLAogICAgICAgICAgICAnJywKICAgICAgICAgICAgJ0FzUG9wdXAgT1RSU1BvcHVwX1RpY2tldEFjdGlvbicsCiAgICAgICAgXTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gJERlZmF1bHRDdXN0b21lclVzZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgY3VzdG9tZXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaWNrZXRDdXN0b21lckNvbnRlbnRGcm9tQ3VzdG9tZXIgYS5DdXN0b21lclRpY2tldFJlbW92ZSIsICJjc3MiICktPmNsaWNrKCk7CgogICAgICAgICMgYWRkIGN1c3RvbWVyIGFnYWluCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRnJvbUN1c3RvbWVyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0Q3VzdG9tZXIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRUZXN0Q3VzdG9tZXIpJykuY2xpY2soKSIpOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IEN1c3RvbWVyIGVtYWlsIGlzIG5vdCBhIGxpbmsuCiAgICAgICAgJExpbmtWaXNpYmxlID0gJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcuU2lkZWJhckNvbHVtbiBmaWVsZHNldCBhLkFzUG9wdXAnKS5sZW5ndGg7Iik7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkTGlua1Zpc2libGUsCiAgICAgICAgICAgICJDdXN0b21lciBlbWFpbCBpcyBub3QgYSBsaW5rIHdpdGggY2xhc3MgQXNQb3B1cC4iCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjc3VibWl0UmljaFRleHQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgR2V0IGNyZWF0ZWQgdGVzdCB0aWNrZXQgSUQgYW5kIG51bWJlci4KICAgICAgICBteSBAVGlja2V0ID0gc3BsaXQoICdUaWNrZXRJRD0nLCAkU2VsZW5pdW0tPmdldF9jdXJyZW50X3VybCgpICk7CgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRbMV07CgogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IHdhcyBjcmVhdGVkIGFuZCBmb3VuZCAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEJyApXSIpLAogICAgICAgICAgICAiVGlja2V0IHdpdGggdGlja2V0IG51bWJlciAkVGlja2V0TnVtYmVyIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgR28gdG8gdGlja2V0IHpvb20gcGFnZSBvZiBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBpZiB0ZXN0IHRpY2tldCB2YWx1ZXMgYXJlIGdlbnVpbmUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0U3ViamVjdCApID4gLTEsCiAgICAgICAgICAgICIkVGlja2V0U3ViamVjdCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRpY2tldFN1YmplY3Qgbm90IGZvdW5kIG9uIHBhZ2UiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpY2tldEJvZHkgKSA+IC0xLAogICAgICAgICAgICAiJFRpY2tldEJvZHkgZm91bmQgb24gcGFnZSIsCiAgICAgICAgKSB8fCBkaWUgIiRUaWNrZXRCb2R5IG5vdCBmb3VuZCBvbiBwYWdlIjsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUZXN0Q3VzdG9tZXIgKSA+IC0xLAogICAgICAgICAgICAiJFRlc3RDdXN0b21lciBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRlc3RDdXN0b21lciBub3QgZm91bmQgb24gcGFnZSI7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGZvcmNlIHN1YiBtZW51cyB0byBiZSB2aXNpYmxlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgb25lIG9mIHRoZSBsaW5rcwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcuQ2x1c3RlciB1bCB1bCcpLmFkZENsYXNzKCdGb3JjZVZpc2libGUnKTsiKTsKCiAgICAgICAgIyBjbGljayBvbiBoaXN0b3J5IGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vKlt0ZXh0KCk9J0hpc3RvcnknXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgSVRTTSB1cGRhdGVkIGZpZWxkcwogICAgICAgIGZvciBteSAkVXBkYXRlVGV4dCAocXcoSW1wYWN0IENyaXRpY2FsaXR5KSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiVXBkYXRlZDogRmllbGROYW1lPUlUU00kVXBkYXRlVGV4dCIgKSA+IC0xLAogICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZFVwZGF0ZSAkVXBkYXRlVGV4dCAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgojIC0tLQoKICAgICAgICAjIFRlc3QgYnVnICMxMjIyOQogICAgICAgIG15ICRRdWV1ZUlEMSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICI8UXVldWU+JFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFF1ZXVlSUQyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIkp1bms6OlN1YlF1ZXVlICRSYW5kb21JRCAgJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRDEsCiAgICAgICAgICAgICJRdWV1ZSAjMSBjcmVhdGVkLiIKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRDIsCiAgICAgICAgICAgICJRdWV1ZSAjMiBjcmVhdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0UGhvbmUgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0UGhvbmUiKTsKCiAgICAgICAgIyBzZWxlY3QgPFF1ZXVlPgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0Rlc3Qgb3B0aW9uJykuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSAnPFF1ZXVlPiRSYW5kb21JRCc7IH0pLmF0dHIoJ3NlbGVjdGVkJyx0cnVlKTsiCiAgICAgICAgICAgICAgICAuICIgXCQoJyNEZXN0JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IGZvciBsb2FkZXIuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIFF1ZXVlICMxIGlzIGRpc3BsYXllZCBhcyBzZWxlY3RlZC4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gXCJmdW5jdGlvblwiICYmIFwkKCdkaXYuVGV4dCcpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRleHRDb250ZW50ID09ICc8UXVldWU+JFJhbmRvbUlEJzsgfSkubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ01ha2Ugc3VyZSB0aGF0IFF1ZXVlICMxIGlzIGRpc3BsYXllZC4nLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgUXVldWUgIzEgaXMgZGlzcGxheWVkIHByb3Blcmx5LgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRGVzdCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkUXVldWVJRDEgLiAifHw8UXVldWU+JFJhbmRvbUlEIiwKICAgICAgICAgICAgJ1F1ZXVlICMxIGlzIHNlbGVjdGVkLicsCiAgICAgICAgKTsKCiAgICAgICAgIyBTZWxlY3QgU3ViUXVldWUgb24gbG9hZGluZyBzY3JlZW4uCiAgICAgICAgIyBidWcjMTI4MTkgKCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEyODE5ICkgLSBxdWV1ZSBjb250YWlucyBzcGFjZXMgaW4gdGhlIG5hbWUuCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFBob25lIHNjcmVlbiBhZ2FpbiB0byBjaGVjayBzZWxlY3RpbmcgYSBxdWV1ZSBhZnRlciBsb2FkaW5nIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFBob25lIik7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRGVzdCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50ZXh0Q29udGVudCA9PSAnXFx1MDBBMFxcdTAwQTBTdWJRdWV1ZSAkUmFuZG9tSUQgICRSYW5kb21JRCc7IH0pLmF0dHIoJ3NlbGVjdGVkJyx0cnVlKTsiCiAgICAgICAgICAgICAgICAuICIgXCQoJyNEZXN0JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBTdWJRdWV1ZSBpcyBkaXNwbGF5ZWQgcHJvcGVybHkuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNEZXN0JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRRdWV1ZUlEMiAuICJ8fEp1bms6OlN1YlF1ZXVlICRSYW5kb21JRCAgJFJhbmRvbUlEIiwKICAgICAgICAgICAgJ1F1ZXVlICMyIGlzIHNlbGVjdGVkLicsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgUXVldWVzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkIElOICg/LCA/KSIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFF1ZXVlSUQxLCBcJFF1ZXVlSUQyIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJRdWV1ZXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHRpY2tldAogICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICBzbGVlcCAzOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCB3aXRoIHRpY2tldCBJRCAkVGlja2V0SUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgZGVsZXRlIHRlc3Qgc2VydmljZSAtIHRlc3QgY3VzdG9tZXIgY29ubmVjdGlvbgogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlLWN1c3RvbWVyIGNvbm5lY3Rpb24gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9wcmVmZXJlbmNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlIHByZWZlcmVuY2VzIGlzIGRlbGV0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3Qgc2VydmljZQogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgIHNsZWVwIDE7CiAgICAgICAgaWYgKCBzY2FsYXIoIEB7ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCkgfSApID09IDIgKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+Y2xvc2UoKTsKICAgICAgICB9CiMgLS0tCgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBjdXN0b21lciB1c2VyLgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgICRUZXN0Q3VzdG9tZXIgPSAkREJPYmplY3QtPlF1b3RlKCRUZXN0Q3VzdG9tZXIpOwogICAgICAgICRTdWNjZXNzICAgICAgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyIFdIRVJFIGxvZ2luID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRlc3RDdXN0b21lciBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbWVyIHVzZXIgLSAkVGVzdEN1c3RvbWVyIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlICgKICAgICAgICAgICAgcXcgKFRpY2tldCBDdXN0b21lclVzZXIpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgppZiAoICRTZWxlbml1bS0+e2Jyb3dzZXJfbmFtZX0gbmUgJ2ZpcmVmb3gnICkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAnUERGIHRlc3QgY3VycmVudGx5IHN1cHBvcnRzIEZpcmVmb3ggb25seScKICAgICk7CiAgICByZXR1cm4gMTsKfQoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLXNlcnZpY2UnIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCiAgICAgICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaAogICAgICAgIG15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7JFNlcnZpY2VUeXBlTGlzdH07CgogICAgICAgICMgY3JlYXRlIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSAgICAgPSAiU2VydmljZSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRJVFNNQ3JpdGljYWxpdHkgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgICAgIG15ICRTZXJ2aWNlSUQgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICdTZWxlbml1bSBUZXN0IFNlcnZpY2UnLAogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZSBpcyBjcmVhdGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgSVRTTUltcGFjdCB0byAnMyBub3JtYWwnIGFuZCBnZXQgcHJpb3JpdHkKICAgICAgICAjIGV4cGVjdGVkIHZhbHVlIGlzICc0IGhpZ2gnLCBpdCB3aWxsIGJlIGNoZWNrZWQgaW4gQWdlbnRUaWNrZXRQcmludCBzY3JlZW4KICAgICAgICBteSAkSVRTTUltcGFjdCA9ICczIG5vcm1hbCc7CiAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJElUU01JbXBhY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgVGlja2V0IG9iamVjdAogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgbG9va3VwIHR5cGUgaWQgZm9yIHR5cGUgJ0luY2lkZW50JwogICAgICAgIG15ICRUeXBlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlTG9va3VwKCBUeXBlID0+ICdJbmNpZGVudCcgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lcgogICAgICAgIG15ICRUZXN0Q3VzdG9tZXIgPSAnQ3VzdG9tZXInIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgVGlja2V0JywKICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICIkVGVzdEN1c3RvbWVyXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldCBpcyBjcmVhdGVkIC0gSUQgJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSAkSVRTTUNyaXRpY2FsaXR5Q29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICJJVFNNQ3JpdGljYWxpdHkiLAogICAgICAgICk7CiAgICAgICAgbXkgJElUU01JbXBhY3RDb25maWcgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gIklUU01JbXBhY3QiLAogICAgICAgICk7CgogICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgZm9yIENyaXRpY2FsaXR5IGFuZCBJbXBhY3QKICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkSVRTTUNyaXRpY2FsaXR5Q29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkSVRTTUltcGFjdENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRJVFNNSW1wYWN0LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBjbGljayBvbiBwcmludCBtZW51IGl0ZW0KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0SURcJyApXSIpLT5jbGljaygpOwoKICAgICAgICAjIHN3aXRjaCB0byBhbm90aGVyIHdpbmRvdwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHByaW50IHNjcmVlbiBpcyBsb2FkZWQKICAgICAgICBBQ1RJVkVTTEVFUDoKICAgICAgICBmb3IgbXkgJFNlY29uZCAoIDEgLi4gMjAgKSB7CiAgICAgICAgICAgIGlmICggaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJQcmlvcml0eSIgKSA+IC0xLCApIHsKICAgICAgICAgICAgICAgIGxhc3QgQUNUSVZFU0xFRVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2xlZXAgMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIHByaW50ZWQgdmFsdWVzIG9mIHRlc3QgdGlja2V0CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiUHJpb3JpdHk6IiApID4gLTEKICAgICAgICAgICAgICAgICYmIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiNCBoaWdoIiApID4gLTEsCiAgICAgICAgICAgICJQcmlvcml0eTogNCBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkltcGFjdDoiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIzIG5vcm1hbCIgKSA+IC0xLAogICAgICAgICAgICAiSW1wYWN0OiAzIG5vcm1hbCAtIGZvdW5kIG9uIHByaW50IHNjcmVlbiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDcml0aWNhbGl0eToiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICI1IHZlcnkgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiQ3JpdGljYWxpdHk6IDUgdmVyeSBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwoKICAgICAgICAjIGNsZWFuIHVwIHRlc3QgZGF0YSBmcm9tIHRoZSBEQgogICAgICAgICMgZGVsZXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBpcyBkZWxldGVkIC0gSUQgJFRpY2tldElEIgogICAgICAgICk7CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGNsZWFuIHVwIHNlcnZpY2EgZGF0YQogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2VQcmVmZXJlbmNlcyBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAoCiAgICAgICAgICAgIHF3IChUaWNrZXQgU2VydmljZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgppZiAoICRTZWxlbml1bS0+e2Jyb3dzZXJfbmFtZX0gbmUgJ2ZpcmVmb3gnICkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiUERGIHRlc3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgRmlyZWZveCIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IGhlbHBlciBvYmplY3QKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IGN1c3RvbWVyIHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG5lZWRlZCBkYXRhCiAgICAgICAgbXkgQFVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVySURzKAogICAgICAgICAgICBVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgKTsKICAgICAgICBteSAkVGVzdEN1c3RvbWVySUQgPSAkVXNlclswXTsKCiAgICAgICAgbXkgJFR5cGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMb29rdXAoIFR5cGUgPT4gJ0luY2lkZW50JyApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHNlcnZpY2UKICAgICAgICBteSAkU2VydmljZU5hbWUgICAgID0gIlNlcnZpY2UiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkSVRTTUNyaXRpY2FsaXR5ID0gJzUgdmVyeSBoaWdoJzsKICAgICAgICBteSAkU2VydmljZUlEICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZSBpcyBjcmVhdGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgSVRTTUltcGFjdCB0byAnMyBub3JtYWwnIGFuZCBnZXQgcHJpb3JpdHkKICAgICAgICAjIGV4cGVjdGVkIHZhbHVlIGlzICc0IGhpZ2gnLCBpdCB3aWxsIGJlIGNoZWNrZWQgaW4gQWdlbnRUaWNrZXRQcmludCBzY3JlZW4KICAgICAgICBteSAkSVRTTUltcGFjdCA9ICczIG5vcm1hbCc7CiAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJElUU01JbXBhY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgVGlja2V0IG9iamVjdAogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY3VzdG9tZXIKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlTnVtYmVyKCk7CiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVE4gICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBUaWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkVGVzdEN1c3RvbWVySUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAiJFRlc3RDdXN0b21lclVzZXJMb2dpblxAbG9jYWxob3N0LmNvbSIsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgaXMgY3JlYXRlZCAtIElEICRUaWNrZXRJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgbXkgJElUU01Dcml0aWNhbGl0eUNvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAiSVRTTUNyaXRpY2FsaXR5IiwKICAgICAgICApOwogICAgICAgIG15ICRJVFNNSW1wYWN0Q29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICJJVFNNSW1wYWN0IiwKICAgICAgICApOwoKICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlIGZvciBDcml0aWNhbGl0eSBhbmQgSW1wYWN0CiAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJElUU01Dcml0aWNhbGl0eUNvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRJVFNNQ3JpdGljYWxpdHksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJElUU01JbXBhY3RDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkSVRTTUltcGFjdCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEN1c3RvbWVyVGlja2V0Wm9vbSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWN1c3RvbWVyLnBsP0FjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0TnVtYmVyPSRUaWNrZXROdW1iZXIiKTsKCiAgICAgICAgIyBjbGljayBvbiBwcmludCBtZW51IGl0ZW0KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249Q3VzdG9tZXJUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0SURcJyApXSIpLT5jbGljaygpOwoKICAgICAgICAjIHN3aXRjaCB0byBhbm90aGVyIHdpbmRvdwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHByaW50IHNjcmVlbiBpcyBsb2FkZWQKICAgICAgICBBQ1RJVkVTTEVFUDoKICAgICAgICBmb3IgbXkgJFNlY29uZCAoIDEgLi4gMjAgKSB7CiAgICAgICAgICAgIGlmICggaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJQcmlvcml0eSIgKSA+IC0xLCApIHsKICAgICAgICAgICAgICAgIGxhc3QgQUNUSVZFU0xFRVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2xlZXAgMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIHByaW50ZWQgdmFsdWVzIG9mIHRlc3QgdGlja2V0CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiUHJpb3JpdHk6IiApID4gLTEKICAgICAgICAgICAgICAgICYmIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiNCBoaWdoIiApID4gLTEsCiAgICAgICAgICAgICJQcmlvcml0eTogNCBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkltcGFjdDoiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIzIG5vcm1hbCIgKSA+IC0xLAogICAgICAgICAgICAiSW1wYWN0OiAzIG5vcm1hbCAtIGZvdW5kIG9uIHByaW50IHNjcmVlbiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDcml0aWNhbGl0eToiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICI1IHZlcnkgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiQ3JpdGljYWxpdHk6IDUgdmVyeSBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwoKICAgICAgICAjIGNsZWFuIHVwIHRlc3QgZGF0YSBmcm9tIHRoZSBEQgogICAgICAgICMgZGVsZXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBpcyBkZWxldGVkIC0gJFRpY2tldElEIgogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3Qgc2VydmljZQogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcgKFRpY2tldCBTZXJ2aWNlKSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlldy9NZWRpdW0ucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE92ZXJ2aWV3OjpNZWRpdW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IFwlUGFyYW07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgVXNlcklEIHBhcmFtCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAkUGFyYW17VXNlcklEfSB8fCBkaWUgIkdvdCBubyBVc2VySUQhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBY3Rpb25Sb3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgKSB7CiAgICAgICAgICAgIEBHcm91cHMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvd0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdCdWxrJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgb3ZlcnZpZXcgZG9jdW1lbnQgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICgKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e092ZXJ2aWV3TWVudU1vZHVsZXN9CiAgICAgICAgJiYgcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlTWVudXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3TWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJE1lbnVzeyRNZW51fSApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgKCAkTWVudXN7JE1lbnV9LT57Vmlld30gJiYgJE1lbnVzeyRNZW51fS0+e1ZpZXd9IG5lICRQYXJhbXtWaWV3fSApOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtKTsKCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SXRlbScgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIGlmICggISRMYXlvdXRPYmplY3QtPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaWQKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRBY3Rpb25Sb3dIVE1MJyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRJdGVtLT57SFRNTH07CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGluaXQgZm9yIHRhYmxlIGNvbnRyb2wKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50UmVhZHlTdGFydCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU29ydE9yZGVyQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlJykgKSB7CiAgICAgICAgbXkgQEdyb3VwczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXRNZXRhID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwogICAgbXkgJE91dHB1dFJhdyA9ICcnOwogICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgICA9ICcnOwogICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgbXkgJENvdW50ZXJPblNpdGUgPSAwOwogICAgbXkgQFRpY2tldElEc1Nob3duOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHRpY2tldHMgdG8gc2hvdwogICAgaWYgKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKCiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNTaG93biwgJFRpY2tldElEOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fU2hvdygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXJPblNpdGUsCiAgICAgICAgICAgICAgICAgICAgQnVsayAgICAgPT4gJEJ1bGtGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRQYXJhbXtDb25maWd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb3VudGVyT25TaXRlKys7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5QcmludCggT3V0cHV0ID0+ICRPdXRwdXQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJHskT3V0cHV0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdOb1RpY2tldEZvdW5kJyApOwogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEZvb3RlckJ1bGtJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dE1ldGEgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gcm93IGpzIGRhdGEKCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldElEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFRpY2tldE9iamVjdC0+TW92ZUxpc3QoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJExheW91dE9iamVjdC0+e0FjdGlvbn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICApOwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJUFydGljbGUgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlTGFzdEN1c3RvbWVyQXJ0aWNsZSgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgKTsKCiAgICAjIEZhbGxiYWNrIGZvciB0aWNrZXRzIHdpdGhvdXQgYXJ0aWNsZXM6IGdldCBhdCBsZWFzdCBiYXNpYyB0aWNrZXQgZGF0YQogICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgJUFydGljbGUgPSAlVGlja2V0OwogICAgICAgIGlmICggISRBcnRpY2xle1RpdGxlfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VGl0bGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ1RoaXMgdGlja2V0IGhhcyBubyB0aXRsZSBvciBzdWJqZWN0JwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRBcnRpY2xle1RpdGxlfTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGNyZWF0ZSB0aW1lIGluIGN1cnJlbnQgdmlldwogICAgJEFydGljbGV7Q3JlYXRlZH0gPSAkVGlja2V0e0NyZWF0ZWR9OwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIHNldCBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAkQXJ0aWNsZXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAnLSc7CiAgICAkQXJ0aWNsZXtJbXBhY3R9ICAgICAgPSAkQXJ0aWNsZXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQXJ0aWNsZXtPd25lcklEfSwKICAgICk7CiAgICAlQXJ0aWNsZSA9ICggJVVzZXJJbmZvLCAlQXJ0aWNsZSApOwoKICAgICMgY3JlYXRlIGh1bWFuIGFnZQogICAgJEFydGljbGV7QWdlfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0FnZX0sCiAgICAgICAgU3BhY2UgPT4gJyAnCiAgICApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzIC4uLgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSB8fCB7fSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57Q3VzdG9tZXJJbmZvfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Q3VzdG9tZXJOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgfTsKCiAgICAgICAgIyBvbmx5IHVzZSB0aG9zZSBBY3Rpb25zIHRoYXQgc3RhdHMgd2l0aCBBZ2VudFRpY2tldAogICAgICAgICVQb3NzaWJsZUFjdGlvbnMgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQWdlbnRUaWNrZXQnICkgZXEgJ0FnZW50VGlja2V0JyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CiAgICB9CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIHJ1biB0aWNrZXQgcHJlIG1lbnUgbW9kdWxlcwogICAgbXkgQEFjdGlvbkl0ZW1zOwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiByZWYgJEl0ZW0gbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhJExheW91dE9iamVjdC0+e1Nlc3Npb25JRENvb2tpZX0gJiYgJEl0ZW0tPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57TGlua30KICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgbXkgJE91dHB1dDsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAnPGxpIGlkPSInCiAgICAgICAgICAgICAgICAgICAgLiAkSXRlbS0+e0lEfQogICAgICAgICAgICAgICAgICAgIC4gJyI+PGEgaHJlZj0iIyIgdGl0bGU9IicKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyI+JwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICkKICAgICAgICAgICAgICAgICAgICAuICc8L2E+PC9saT4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXG4rLy9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXHMrLyAvZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzLzxcIS0tLis/LS0+Ly9nOwoKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgIEhUTUwgICAgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgIFRhcmdldCAgICAgID0+ICRJdGVtLT57VGFyZ2V0fSwKICAgICAgICAgICAgICAgIFBvcHVwVHlwZSAgID0+ICRJdGVtLT57UG9wdXBUeXBlfSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Q29udGVudCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICk7CgogICAgIyBpZiAiQWN0aW9ucyBwZXIgVGlja2V0IiAoSW5saW5lIEFjdGlvbiBSb3cpIGlzIGFjdGl2ZQogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgbGlzdCBlbnRyaWVzIGZvciBldmVyeSBhY3Rpb24KICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBY3Rpb25JdGVtcykgewogICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgJExpbmsgPSAnIyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRJdGVtLT57UG9wdXBUeXBlfSApIHsKICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRMaW5rLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFRpY2tldElEICAgPSAkUGFyYW17VGlja2V0SUR9OwogICAgICAgICAgICAgICAgbXkgJFNlbGVjdEhUTUwgPSAkSXRlbS0+e0hUTUx9OwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9pZD0iRGVzdFF1ZXVlSUQiL2lkPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRTZWxlY3RIVE1MID1+IHMvZm9yPSJEZXN0UXVldWVJRCIvZm9yPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvd0l0ZW1IVE1MJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSFRNTCA9PiAkU2VsZWN0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRQYXJhbXtCdWxrfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0J1bGsnKSwKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRpY2tldCBmbGFncwogICAgbXkgQFRpY2tldE1ldGFJdGVtcyA9ICRMYXlvdXRPYmplY3QtPlRpY2tldE1ldGFJdGVtcygKICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgKTsKICAgIGZvciBteSAkSXRlbSAoQFRpY2tldE1ldGFJdGVtcykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICApOwogICAgICAgIGlmICgkSXRlbSkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01ldGFJY29uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIGFydGljbGUgbW9kdWxlcwogICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZmlsdGVyIG9wdGlvbgogICAgICAgICAgICAgICAgJE9iamVjdC0+RmlsdGVyKAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXInLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICApOwogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPayApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICYmICgKICAgICAgICAgICAgIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPSyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlclBob25lT3V0Ym91bmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRBcnRpY2xle1NMQX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHVwZGF0ZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1VwZGF0ZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVIdW1hbn0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAkQ291bnRlciA9IDA7CiAgICBteSAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID0gMTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkRHluYW1pY0ZpZWxkRmlsdGVyCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3TWVkaXVtIiktPntEeW5hbWljRmllbGR9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICREeW5hbWljRmllbGRGaWx0ZXIgfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgICMgZ2V0IGZpZWxkIHZhbHVlCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKTsKCiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICMgc2hvdyBkeW5hbWljIGZpZWxkIHRhYmxlIGlmIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBkaXNwbGF5ZWQKICAgICAgICBpZiAoICREaXNwbGF5RHluYW1pY0ZpZWxkVGFibGUgPT0gMSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID0gMDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGEgbmV3IHJvdyBpZiBjb3VudGVyIGlzIHN0YXJ0aW5nCiAgICAgICAgaWYgKCAkQ291bnRlciA9PSAxICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb25seSA1IGR5bmFtaWMgZmllbGRzIGJ5IHJvdyBhcmUgYWxsb3dlZCwgcmVzZXQgY291dGVyIGlmIG5lZWRlZAogICAgICAgIGlmICggJENvdW50ZXIgPT0gNSApIHsKICAgICAgICAgICAgJENvdW50ZXIgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIHBsYWluCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ1BsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsbCB0aGUgcmVzdCBvZiB0aGUgRHluYW1pYyBGaWVsZHMgcm93IHdpdGggZW1wdHkgY2VsbHMsIHRoaXMgd2lsbCBsb29rIGJldHRlcgogICAgaWYgKCAkQ291bnRlciA+IDAgJiYgJENvdW50ZXIgPCA1ICkgewoKICAgICAgICBmb3IgKCAkQ291bnRlciArIDEgLi4uIDUgKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRlc3QgYWNjZXNzIHRvIGZyb250ZW5kIG1vZHVsZSBmb3IgQ3VzdG9tZXIKICAgIG15ICRBY2Nlc3MgPSAkTGF5b3V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRDdXN0b21lcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwogICAgaWYgKCRBY2Nlc3MpIHsKCiAgICAgICAgIyB0ZXN0IGFjY2VzcyB0byB0aWNrZXQKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEN1c3RvbWVyJyk7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPSyA9ICRUaWNrZXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgcHJvcGVyIHR0IGJsb2NrIGJhc2VkIG9uIHBlcm1pc3Npb25zCiAgICBteSAkQ3VzdG9tZXJJREJsb2NrID0gJEFjY2VzcyA/ICdDdXN0b21lcklEUlcnIDogJ0N1c3RvbWVySURSTyc7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRDdXN0b21lcklEQmxvY2ssCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICk7CgogICAgIyBnZXQgTW92ZVF1ZXVlc1N0cmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNb3ZlVHlwZScpID1+IC9eZm9ybSQvaSApIHsKICAgICAgICAkUGFyYW17TW92ZVF1ZXVlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vdmVRdWV1ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0TW92ZX0KICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBBY3Rpb25JdGVtcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgcmV0dXJuIFwkT3V0cHV0Owp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlldy9QcmV2aWV3LnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRPdmVydmlldzo6UHJldmlldzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBcJVBhcmFtOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWN0aW9uUm93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBteSAkQnVsa0ZlYXR1cmUgPSAwOwogICAgaWYgKCAkUGFyYW17QnVsa30gJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpIH07CiAgICAgICAgfQogICAgICAgIGlmICggIUBHcm91cHMgKSB7CiAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvdycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93QnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0J1bGsnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcnVuIHRpY2tldCBvdmVydmlldyBkb2N1bWVudCBpdGVtIG1lbnUgbW9kdWxlcwogICAgaWYgKAogICAgICAgICRQYXJhbXtDb25maWd9LT57T3ZlcnZpZXdNZW51TW9kdWxlc30KICAgICAgICAmJiByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICVNZW51cyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgfTsKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkTWVudXN7JE1lbnV9ICk7CiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAoICRNZW51c3skTWVudX0tPntWaWV3fSAmJiAkTWVudXN7JE1lbnV9LT57Vmlld30gbmUgJFBhcmFte1ZpZXd9ICk7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEl0ZW0pOwoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRBY3Rpb25Sb3dJdGVtJyApIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBzZXNzaW9uIGlkIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgaWYgKCAhJExheW91dE9iamVjdC0+e1Nlc3Npb25JRENvb2tpZX0gJiYgJEl0ZW0tPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAgICAgJEl0ZW0tPntJRH0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICAgICAgICAgJEl0ZW0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICAgICAgbXkgJExpbmsgPSAkSXRlbS0+e0xpbmt9OwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1RhcmdldH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExpbmsgPSAnIyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJENsYXNzID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57UG9wdXBUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnQXNQb3B1cCBQb3B1cFR5cGVfJyAuICRJdGVtLT57UG9wdXBUeXBlfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30gLiAkSXRlbS0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57QmxvY2t9IGVxICdEb2N1bWVudEFjdGlvblJvd0hUTUwnICkgewoKICAgICAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAhJEl0ZW0tPntIVE1MfTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaW5pdCBmb3IgdGFibGUgY29udHJvbAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeVN0YXJ0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU29ydE9yZGVyQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICByZXR1cm4gJyc7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXRJRHMgUGFnZVNob3duIFN0YXJ0SGl0KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlJykgKSB7CiAgICAgICAgbXkgQEdyb3VwczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXRNZXRhID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgfQogICAgbXkgJE91dHB1dCAgICAgICAgPSAnJzsKICAgIG15ICRDb3VudGVyICAgICAgID0gMDsKICAgIG15ICRDb3VudGVyT25TaXRlID0gMDsKICAgIG15IEBUaWNrZXRJRHNTaG93bjsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSB0aWNrZXRzIHRvIHNob3cKICAgIGlmICggc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9CiAgICAgICAgICAgICAgICAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzU2hvd24sICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyT25TaXRlLAogICAgICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgICAgICAgICBPdXRwdXQgICA9PiAkUGFyYW17T3V0cHV0fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiAkT3V0cHV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0UmF3IC49ICR7JE91dHB1dH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTm9UaWNrZXRGb3VuZCcgKTsKICAgIH0KCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEc1Nob3duKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXJCdWxrSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRPdXRwdXRNZXRhID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCnN1YiBfU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRQYXJhbXtCdWxrfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0J1bGsnKSwKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjb2xsZWN0IHBhcmFtcyBmb3IgQXJ0aWNsZUdldAogICAgbXkgJUFydGljbGVHZXRQYXJhbXMgPSAoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICBPcmRlciAgICAgICAgID0+ICdERVNDJywKICAgICAgICBMaW1pdCAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXc6OlByZXZpZXdBcnRpY2xlTGltaXQnKSB8fCA1LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNlcnRhaW4gYXJ0aWNsZSBzZW5kZXIgdHlwZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJldmlldwogICAgbXkgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3OjpQcmV2aWV3QXJ0aWNsZVNlbmRlclR5cGVzJyk7CiAgICBteSBAQWN0aXZlQXJ0aWNsZVNlbmRlclR5cGVzOwogICAgaWYgKCByZWYgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMgZXEgJ0hBU0gnICkgewogICAgICAgIEBBY3RpdmVBcnRpY2xlU2VuZGVyVHlwZXMgPSBncmVwIHsgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMtPnskX30gPT0gMSB9IGtleXMgJXskUHJldmlld0FydGljbGVTZW5kZXJUeXBlc307CiAgICB9CgogICAgIyBpZiBhIGxpc3Qgb2YgYWN0aXZlIGFydGljbGUgc2VuZGVyIHR5cGVzIGhhcyBiZWVuIGRldGVybWluZWQsIGFkZCB0aGVtIHRvIHBhcmFtcyBoYXNoCiAgICBpZiAoQEFjdGl2ZUFydGljbGVTZW5kZXJUeXBlcykgewogICAgICAgICRBcnRpY2xlR2V0UGFyYW1ze0FydGljbGVTZW5kZXJUeXBlfSA9IFxAQWN0aXZlQXJ0aWNsZVNlbmRlclR5cGVzOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgbGFzdCA1IGFydGljbGVzCiAgICBteSBAQXJ0aWNsZUJvZHkgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICVBcnRpY2xlR2V0UGFyYW1zLAogICAgKTsKICAgIG15ICVBcnRpY2xlICAgICAgPSAleyAkQXJ0aWNsZUJvZHlbMF0gfHwge30gfTsKICAgIG15ICRBcnRpY2xlQ291bnQgPSBzY2FsYXIgQEFydGljbGVCb2R5OwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiMgLS0tCiAgICApOwoKICAgICMgRmFsbGJhY2sgZm9yIHRpY2tldHMgd2l0aG91dCBhcnRpY2xlczogZ2V0IGF0IGxlYXN0IGJhc2ljIHRpY2tldCBkYXRhCiAgICBpZiAoICElQXJ0aWNsZSApIHsKICAgICAgICAlQXJ0aWNsZSA9ICVUaWNrZXQ7CiAgICAgICAgaWYgKCAhJEFydGljbGV7VGl0bGV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtUaXRsZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnVGhpcyB0aWNrZXQgaGFzIG5vIHRpdGxlIG9yIHN1YmplY3QnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJEFydGljbGV7VGl0bGV9OwogICAgfQoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEFydGljbGV7T3duZXJJRH0sCiAgICApOwogICAgJUFydGljbGUgPSAoICVVc2VySW5mbywgJUFydGljbGUgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBzZXQgY3JpdGljYWxpdHkgYW5kIGltcGFjdAogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICctJzsKICAgICRUaWNrZXR7SW1wYWN0fSAgICAgID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJEFydGljbGV7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcKICAgICk7CgogICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcyAuLi4KICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0gfHwge30sCiAgICApOwoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0N1c3RvbWVySW5mb30gKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0N1c3RvbWVyTmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBnZXQgYWxsIHJlZ2lzdGVyZWQgQWN0aW9ucwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlQWN0aW9ucyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXRzIHdpdGggQWdlbnRUaWNrZXQKICAgICAgICAlUG9zc2libGVBY3Rpb25zID0gbWFwIHsgKyskQ291bnRlciA9PiAkXyB9CiAgICAgICAgICAgIGdyZXAgeyBzdWJzdHIoICRfLCAwLCBsZW5ndGggJ0FnZW50VGlja2V0JyApIGVxICdBZ2VudFRpY2tldCcgfQogICAgICAgICAgICBzb3J0IGtleXMgJUFjdGlvbnM7CiAgICB9CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVBY2xBY3Rpb24gPSAlUG9zc2libGVBY3Rpb25zOwogICAgaWYgKCRBQ0wpIHsKICAgICAgICAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwogICAgfQoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBydW4gdGlja2V0IHByZSBtZW51IG1vZHVsZXMKICAgIG15IEBBY3Rpb25JdGVtczsKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIEFDTCAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNRU5VIGlmICEkSXRlbTsKICAgICAgICAgICAgbmV4dCBNRU5VIGlmIHJlZiAkSXRlbSBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGFkZCBzZXNzaW9uIGlkIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoICEkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbklEQ29va2llfSAmJiAkSXRlbS0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1Nlc3Npb25OYW1lfSAuICc9JwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgJEl0ZW0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICBteSAkT3V0cHV0OwogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAnPGxpIGlkPSInCiAgICAgICAgICAgICAgICAgICAgLiAkSXRlbS0+e0lEfQogICAgICAgICAgICAgICAgICAgIC4gJyI+PGEgaHJlZj0iIyIgdGl0bGU9IicKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyI+JwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICkKICAgICAgICAgICAgICAgICAgICAuICc8L2E+PC9saT4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXG4rLy9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXHMrLyAvZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzLzxcIS0tLis/LS0+Ly9nOwoKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgIEhUTUwgICAgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgIFRhcmdldCAgICAgID0+ICRJdGVtLT57VGFyZ2V0fSwKICAgICAgICAgICAgICAgIFBvcHVwVHlwZSAgID0+ICRJdGVtLT57UG9wdXBUeXBlfSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJEl0ZW0tPntCbG9ja30sCgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQWRkaXRpb25hbENsYXNzZXMgPSAkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ID8gJ1Nob3dJbmxpbmVBY3Rpb25zJyA6ICcnOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Q29udGVudCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAlVGlja2V0LAojIC0tLQogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgPT4gJ0FydGljbGVDb3VudCcgLiAkQXJ0aWNsZUNvdW50LAogICAgICAgICAgICBBZGRpdGlvbmFsQ2xhc3NlcyA9PiAkQWRkaXRpb25hbENsYXNzZXMsCiAgICAgICAgICAgIENyZWF0ZWQgICAgICAgICAgID0+ICRUaWNrZXR7Q3JlYXRlZH0sICAgICAgICAgICAgICAgICAjIHVzZSB2YWx1ZSBmcm9tIHRpY2tldCwgbm90IGFydGljbGUKICAgICAgICB9LAogICAgKTsKCiAgICAjIGlmICJBY3Rpb25zIHBlciBUaWNrZXQiIChJbmxpbmUgQWN0aW9uIFJvdykgaXMgYWN0aXZlCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvdycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIEFkZCBsaXN0IGVudHJpZXMgZm9yIGV2ZXJ5IGFjdGlvbgogICAgICAgIGZvciBteSAkSXRlbSAoQEFjdGlvbkl0ZW1zKSB7CiAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1RhcmdldH0gKSB7CiAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENsYXNzID0gJyc7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVGlja2V0SUQgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICBteSAkU2VsZWN0SFRNTCA9ICRJdGVtLT57SFRNTH07CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2lkPSJEZXN0UXVldWVJRCIvaWQ9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9mb3I9IkRlc3RRdWV1ZUlEIi9mb3I9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbUhUTUwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIVE1MID0+ICRTZWxlY3RIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFBhcmFte0J1bGt9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnQnVsaycpLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICBteSBAVGlja2V0TWV0YUl0ZW1zID0gJExheW91dE9iamVjdC0+VGlja2V0TWV0YUl0ZW1zKAogICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICApOwogICAgZm9yIG15ICRJdGVtIChAVGlja2V0TWV0YUl0ZW1zKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICk7CiAgICAgICAgaWYgKCRJdGVtKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWV0YUljb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSBtb2R1bGVzCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjaygKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPntSZXN1bHR9ID0gJ1N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlcicsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlJyk7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRUaWNrZXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyQ29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQnKTsKICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgbXkgJE9LID0gJFRpY2tldE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgc2VydmljZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggJEFydGljbGV7U0xBfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBDdXN0b21lcklEIGFuZCBDdXN0b21lck5hbWUKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtDdXN0b21lcklEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IGFjY2VzcyB0byBmcm9udGVuZCBtb2R1bGUKICAgICAgICBteSAkQWNjZXNzID0gJExheW91dE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldEN1c3RvbWVyJywKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAgICAgIyB0ZXN0IGFjY2VzcyB0byB0aWNrZXQKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDdXN0b21lcicpOwogICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG15ICRPSyA9ICRUaWNrZXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBwcm9wZXIgdHQgYmxvY2sgYmFzZWQgb24gcGVybWlzc2lvbnMKICAgICAgICBteSAkQ3VzdG9tZXJJREJsb2NrID0gJEFjY2VzcyA/ICdDdXN0b21lcklEUlcnIDogJ0N1c3RvbWVySURSTyc7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRDdXN0b21lcklEQmxvY2ssCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0N1c3RvbWVyTmFtZX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJOYW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHVwZGF0ZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1VwZGF0ZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVIdW1hbn0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAkQ291bnRlciA9IDA7CiAgICBteSAkQ2xhc3MgPSAnTWlkZGxlJzsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkRHluYW1pY0ZpZWxkRmlsdGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld1ByZXZpZXciKS0+e0R5bmFtaWNGaWVsZH07CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJER5bmFtaWNGaWVsZEZpbHRlciB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgIyBnZXQgZmllbGQgdmFsdWUKICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICFkZWZpbmVkICRWYWx1ZSApOwoKICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgcm93IGlmIGNvdW50ZXIgaXMgc3RhcnRpbmcKICAgICAgICBpZiAoICRDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBzZXBhcmF0aW9uIHJvdyBqdXN0IG9uY2UKICAgICAgICAkQ2xhc3MgPSAnJzsKCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgMiBkeW5hbWljIGZpZWxkcyBieSByb3cgYXJlIGFsbG93ZWQsIHJlc2V0IGNvdXRlciBpZiBuZWVkZWQKICAgICAgICBpZiAoICRDb3VudGVyID09IDIgKSB7CiAgICAgICAgICAgICRDb3VudGVyID0gMDsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgbGluawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsbCB0aGUgcmVzdCBvZiB0aGUgRHluYW1pYyBGaWVsZHMgcm93IHdpdGggZW1wdHkgY2VsbHMsIHRoaXMgd2lsbCBsb29rIGJldHRlcgogICAgaWYgKCAkQ291bnRlciA+IDAgJiYgJENvdW50ZXIgPCAyICkgewoKICAgICAgICBmb3IgKCAkQ291bnRlciArIDEgLi4uIDIgKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoQEFydGljbGVCb2R5KSB7CgogICAgICAgICMgY2hlY2sgaWYgYSBjZXJ0YWluIGFydGljbGUgdHlwZSBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGV4cGFuZGVkCiAgICAgICAgbXkgJFByZXZpZXdBcnRpY2xlVHlwZUV4cGFuZGVkID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlldzo6UHJldmlld0FydGljbGVUeXBlRXhwYW5kZWQnKQogICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgIyBpZiBhIGNlcnRhaW4gYXJ0aWNsZSB0eXBlIHNob3VsZCBiZSBzaG93biBhcyBleHBhbmRlZCwgc2V0IHRoZQogICAgICAgICMgbGFzdCBhcnRpY2xlIG9mIHRoaXMgdHlwZSBhcyBhY3RpdmUKICAgICAgICBpZiAoJFByZXZpZXdBcnRpY2xlVHlwZUV4cGFuZGVkKSB7CgogICAgICAgICAgICBteSAkQ2xhc3NDb3VudCA9IDA7CiAgICAgICAgICAgIEFSVElDTEVfSVRFTToKICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlSXRlbSAoQEFydGljbGVCb2R5KSB7CiAgICAgICAgICAgICAgICBuZXh0IEFSVElDTEVfSVRFTSBpZiAhJEFydGljbGVJdGVtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgY3VycmVudCBhcnRpY2xlIHR5cGUgc2hvdWxkIGJlIHNob3duIGFzIGV4cGFuZGVkCiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xlSXRlbS0+e0FydGljbGVUeXBlfSBlcSAkUHJldmlld0FydGljbGVUeXBlRXhwYW5kZWQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBBUlRJQ0xFX0lURU07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgZGlzcGxheSB0aGUgbGFzdCBhcnRpY2xlIGluIHRoZSBsaXN0IGFzIGV4cGFuZGVkIChkZWZhdWx0KQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ2xhc3NDb3VudCA9PSAkI0FydGljbGVCb2R5ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keVswXS0+e0NsYXNzfSA9ICdBY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENsYXNzQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgZGlzcGxheSB0aGUgbGFzdCBhcnRpY2xlIGluIHRoZSBsaXN0IGFzIGV4cGFuZGVkIChkZWZhdWx0KQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgJEFydGljbGVTZWxlY3RlZDsKICAgICAgICAgICAgbXkgJElnbm9yZVN5c3RlbVNlbmRlciA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJyk7CgogICAgICAgICAgICBBUlRJQ0xFOgogICAgICAgICAgICBmb3IgbXkgJEFydGljbGVJdGVtIChAQXJ0aWNsZUJvZHkpIHsKCiAgICAgICAgICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRSBpZiAkSWdub3JlU3lzdGVtU2VuZGVyICYmICRBcnRpY2xlSXRlbS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nOwoKICAgICAgICAgICAgICAgICRBcnRpY2xlSXRlbS0+e0NsYXNzfSA9ICdBY3RpdmUnOwogICAgICAgICAgICAgICAgJEFydGljbGVTZWxlY3RlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHNlbGVjdGVkIGFydGljbGUKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVTZWxlY3RlZCApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keVswXS0+e0NsYXNzfSA9ICdBY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZXNQcmV2aWV3QXJlYScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgaW5saW5lIGFydGljbGUKICAgIGZvciBteSAkQXJ0aWNsZUl0ZW0gKCByZXZlcnNlIEBBcnRpY2xlQm9keSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRMYXlvdXRPYmplY3QtPkNoZWNrTWltZVR5cGUoCiAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICk7CiAgICAgICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Qm9keU5vdGV9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Qm9keX0gICAgID0gJyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgID0+ICRQYXJhbXtDb25maWd9LT57RGVmYXVsdFZpZXdOZXdMaW5lfSB8fCA5MCwKICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgICA9PiAkQXJ0aWNsZUl0ZW0tPntCb2R5fSwKICAgICAgICAgICAgICAgIFZNYXggICAgICAgICAgICA9PiAkUGFyYW17Q29uZmlnfS0+e0RlZmF1bHRQcmVWaWV3TGluZXN9IHx8IDI1LAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSAgPT4gMSwKICAgICAgICAgICAgICAgIFN0cmlwRW1wdHlMaW5lcyA9PiAkUGFyYW17Q29uZmlnfS0+e1N0cmlwRW1wdHlMaW5lc30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQXJ0aWNsZUl0ZW0tPntTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xlSXRlbS0+e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZUl0ZW0tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRBcnRpY2xlSXRlbS0+e0NsYXNzfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYWN0aW9ucwogICAgICAgIGlmICggJEFydGljbGVJdGVtLT57QXJ0aWNsZVR5cGV9ICF+IC9eKG5vdGV8ZW1haWwtbm90aSkvaSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgY29tcG9zZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UnKTsKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPayA9ICRUaWNrZXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2tlZCA9ICRUaWNrZXRPYmplY3QtPkxvY2tJc1RpY2tldExvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUHJldmlld0FjdGlvblJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzCiAgICAgICAgICAgICAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VzOwogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICVTdGFuZGFyZFJlc3BvbnNlcyA9ICV7ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9IH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAgICAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZSBiZWNhdXNlIHdlIG5lZWQgdG8gc29ydCBieSBWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZFJlc3BvbnNlIFZhbHVlCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKCiAgICAgICAgICAgICAgICAgICAgbXkgJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCA9IHJldmVyc2UgJVN0YW5kYXJkUmVzcG9uc2VzOwogICAgICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkgICAgICAgPSBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoeyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZFJlc3BvbnNlczsKCiAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXBseScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYnVpbGQgaHRtbCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgID0+ICdSZXNwb25zZUlEJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgID0+IFxAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUHJldmlld0FjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVwbHknKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5JyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXBseSBhbGwgaXMgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgICAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkQXJ0aWNsZUl0ZW0tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICRBcnRpY2xlSXRlbS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRW1haWxQYXJzZXIgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBZGRyZXNzZXMgPSAkRW1haWxQYXJzZXItPlNwbGl0QWRkcmVzc0xpbmUoIExpbmUgPT4gJFJlY2lwaWVudHMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRW1haWwgPSAkRW1haWxQYXJzZXItPkdldEVtYWlsQWRkcmVzcyggRW1haWwgPT4gJEFkZHJlc3MgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQUREUkVTUyBpZiAhJEVtYWlsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRJc0xvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50Q291bnQgPiAxICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgU3RhbmRhcmRSZXNwb25zZXNTdHJnCiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0KEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVwbHkgQWxsJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZUl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3dJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPT4gJFN0YW5kYXJkUmVzcG9uc2VzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXBseSBBbGwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5QWxsJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAQWN0aW9uSXRlbXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICB9LAogICAgKTsKICAgIHJldHVybiBcJE91dHB1dDsKfQoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNMQScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0gPSAkUGFyYW17REJTbGF2ZU9iamVjdH0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIG15ICgkRGF0ZSkgPSBzcGxpdCAvXHMrLywgJFRpbWVTdGFtcDsKICAgIG15ICRUb2RheSA9IHNwcmludGYgIiVzIDIzOjU5OjU5IiwgJERhdGU7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0JywKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgIG15ICRBQ0wgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEFjbCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAnQWdlbnRTdGF0cycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICAkUG9zc2libGVWYWx1ZXNGaWx0ZXIgPSBcJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICBteSAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXIKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcikgKSB7CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnRQcmV2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGludCByYW5kIDUwOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhIGxpc3QKICAgICAgICBteSAkQXJ0aWNsZURhdGFMaXN0ID0gJFNlbGYtPl9BcnRpY2xlRGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkQXJ0aWNsZURhdGFMaXN0OwoKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICFAeyRBcnRpY2xlRGF0YUxpc3R9OwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgQHskQXJ0aWNsZURhdGFMaXN0fSA+IDI7CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhIHBob25lIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVEYXRhTGlzdC0+WzFdICkgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhbiBleHRlcm5hbCBlbWFpbCBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlVHlwZUlEfSBlcSAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gYW4gYWdlbnQgKEVtYWlsLVRpY2tldCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgISRBcnRpY2xlRGF0YUxpc3QtPlsxXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gY3VzdG9tZXIgYW5kIHRoZSBzZWNvbmQgb25lIGZyb20gYW4gYWdlbnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZURhdGFMaXN0LT5bMV0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHM7Cn0KCnN1YiBfQXJ0aWNsZURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSB0eXBlICdwaG9uZScKICAgIGlmICggISRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57UGhvbmVUeXBlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5BcnRpY2xlVHlwZUxvb2t1cCgKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJ3Bob25lJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgdHlwZSAnZW1haWwtZXh0ZXJuYWwnCiAgICBpZiAoICEkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVUeXBlTG9va3VwKAogICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAnZW1haWwtZXh0ZXJuYWwnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSBzZW5kZXIgdHlwZSAnYWdlbnQnCiAgICBpZiAoICEkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgc2VuZGVyIHR5cGUgJ2N1c3RvbWVyJwogICAgaWYgKCAhJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBhcnRpY2xlX3R5cGVfaWQsIGFydGljbGVfc2VuZGVyX3R5cGVfaWQgRlJPTSBhcnRpY2xlICcKICAgICAgICAgICAgLiAnV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgYXJ0aWNsZV90eXBlX2lkIElOICggPywgPyApIEFORCAnCiAgICAgICAgICAgIC4gJ2FydGljbGVfc2VuZGVyX3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBcJFNlbGYtPntQaG9uZVR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9LAogICAgICAgICAgICBcJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDMsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEFydGljbGVEYXRhTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhOwogICAgICAgICRBcnRpY2xlRGF0YXtBcnRpY2xlVHlwZUlEfSAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVTZW5kZXJUeXBlSUR9ID0gJFJvd1sxXTsKCiAgICAgICAgcHVzaCBAQXJ0aWNsZURhdGFMaXN0LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIHJldHVybiBcQEFydGljbGVEYXRhTGlzdDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNMQScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0gPSAkUGFyYW17REJTbGF2ZU9iamVjdH0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIG15ICgkRGF0ZSkgPSBzcGxpdCAvXHMrLywgJFRpbWVTdGFtcDsKICAgIG15ICRUb2RheSA9IHNwcmludGYgIiVzIDIzOjU5OjU5IiwgJERhdGU7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0JywKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgIG15ICRBQ0wgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEFjbCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAnQWdlbnRTdGF0cycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICAkUG9zc2libGVWYWx1ZXNGaWx0ZXIgPSBcJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICBteSAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXIKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcikgKSB7CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudFByZXZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaW50IHJhbmQgNTA7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGFsbCBjbG9zZWQgc3RhdHMgaWYgbm8gc3RhdGVzIGFyZSBnaXZlbgogICAgaWYgKCAhJFBhcmFte1N0YXRlSURzfSApIHsKICAgICAgICAkUGFyYW17U3RhdGVUeXBlfSA9IFsnY2xvc2VkJ107CiAgICB9CgogICAgIyBzdGFydCB0aWNrZXQgc2VhcmNoCiAgICBteSBAVGlja2V0U2VhcmNoSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZWFyY2goCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICApOwoKICAgIHJldHVybiAnLScgaWYgIUBUaWNrZXRTZWFyY2hJRHM7CgogICAgbXkgJFRpbWUgPSAwOwoKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldFNlYXJjaElEcykgewoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICRUaWNrZXREYXRhID0gJFNlbGYtPl9UaWNrZXREYXRhR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICdFUlJPUicgaWYgISV7JFRpY2tldERhdGF9OwoKICAgICAgICAjIGdldCByZWxldmFudCB0aWNrZXQgaGlzdG9yeQogICAgICAgIG15ICRIaXN0b3J5RGF0YSA9ICRTZWxmLT5fVGlja2V0SGlzdG9yeURhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJEhpc3RvcnlEYXRhOwoKICAgICAgICAjIGlmIHRpY2tldCBpcyBjbG9zZWQgaW4gdGhlIHRpY2tldCBjcmVhdGUgbWFzawogICAgICAgIGlmICggQHskSGlzdG9yeURhdGF9ID09IDEgKSB7CiAgICAgICAgICAgICRUaW1lICs9ICggMyAqIDYwICk7CiAgICAgICAgICAgIG5leHQgVElDS0VUSUQ7CiAgICAgICAgfQoKICAgICAgICBteSAlVGltZXNwYW5zOwogICAgICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7JEhpc3RvcnlEYXRhfSApIHsKCiAgICAgICAgICAgIGlmICggJFRpbWVzcGFuc3skQ291bnRlcn0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPntWaWV3YWJsZX07CgogICAgICAgICAgICAgICAgIyBzZXQgc3RvcCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0b3BUaW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRW50cnktPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICEkRW50cnktPntWaWV3YWJsZX07CgogICAgICAgICAgICAgICAgIyBzZXQgc3RhcnQgdGltZQogICAgICAgICAgICAgICAgJFRpbWVzcGFuc3skQ291bnRlcn0tPntTdGFydFRpbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbnRyeS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2FsZW5kYXIKICAgICAgICBteSAkQ2FsZW5kYXIgPSAkU2VsZi0+X0NhbGVuZGFyR2V0KAogICAgICAgICAgICBUaWNrZXREYXRhID0+ICRUaWNrZXREYXRhLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkQ291bnQgKCBzb3J0IGtleXMgJVRpbWVzcGFucyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0aW1lc3RhbXAKICAgICAgICAgICAgbXkgJFRpbWVzcGFuID0gJFRpbWVzcGFuc3skQ291bnR9OwoKICAgICAgICAgICAgJFRpbWVzcGFuLT57U3RvcFRpbWV9IHx8PSAkVGltZXNwYW4tPntTdGFydFRpbWV9ICsgKCAzICogNjAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHdvcmtpbmcgdGltZQogICAgICAgICAgICBteSAkV29ya2luZ1RpbWVQYXJ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+V29ya2luZ1RpbWUoCiAgICAgICAgICAgICAgICAleyRUaW1lc3Bhbn0sCiAgICAgICAgICAgICAgICBDYWxlbmRhciA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVGltZSArPSAkV29ya2luZ1RpbWVQYXJ0OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0Q291bnQgPSBAVGlja2V0U2VhcmNoSURzOwogICAgbXkgJEF2ZXJhZ2VUaW1lID0gJFRpbWUgLyAkVGlja2V0Q291bnQ7CgogICAgIyB0cmFuc2xhdGUgc2Vjb25kcyBpbiBhIHJlYWRhYmxlIGZvcm1hdAogICAgbXkgJFZhbHVlID0gJFNlbGYtPl9TZWNvbmRlVG9TdHJpbmcoCiAgICAgICAgU2Vjb25kcyA9PiBpbnQgJEF2ZXJhZ2VUaW1lLAogICAgKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgX1RpY2tldERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4ge30gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgcXVldWVfaWQsIHNsYV9pZCwgY3JlYXRlX3RpbWVfdW5peCAnCiAgICAgICAgICAgIC4gJ0ZST00gdGlja2V0IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RpY2tldElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRpY2tldERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRpY2tldERhdGF7UXVldWVJRH0gICAgPSAkUm93WzBdOwogICAgICAgICRUaWNrZXREYXRhe1NMQUlEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVGlja2V0RGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbMl07CiAgICB9CgogICAgcmV0dXJuIFwlVGlja2V0RGF0YTsKfQoKc3ViIF9DYWxlbmRhckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvcHRpb24KICAgICRTZWxmLT57VGlja2V0U2VydmljZUZlYXR1cmV9IHx8PSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZScpOwoKICAgIG15ICVFc2NhbGF0aW9uRGF0YTsKICAgIGlmICggJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gJiYgJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9ICkgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1F1ZXVlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEVzY2FsYXRpb25EYXRhe0NhbGVuZGFyfSB8fCB1bmRlZjsKfQoKc3ViIF9UaWNrZXRIaXN0b3J5RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBTdGF0ZVVwZGF0ZQogICAgaWYgKCAhJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnU3RhdGVVcGRhdGUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgaGlzdG95IHR5cGUgTmV3VGlja2V0CiAgICBpZiAoICEkU2VsZi0+e05ld1RpY2tldElEfSApIHsKICAgICAgICAkU2VsZi0+e05ld1RpY2tldElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2aWV3YWJsZSBzdGF0ZSBpZHMKICAgIGlmICggISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlU3RhdGVJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVmlld2FibGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICAgICApOwoKICAgICAgICBteSAlVmlld2FibGVTdGF0ZUlETGlzdDsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBWaWV3YWJsZVN0YXRlSURzKSB7CiAgICAgICAgICAgICRWaWV3YWJsZVN0YXRlSURMaXN0eyRTdGF0ZUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9ID0gXCVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHN0YXRlX2lkLCBjcmVhdGVfdGltZSBGUk9NIHRpY2tldF9oaXN0b3J5ICcKICAgICAgICAgICAgLiAnV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgaGlzdG9yeV90eXBlX2lkIElOICggPywgPyApICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgY3JlYXRlX3RpbWUnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RpY2tldElEfSwgXCRTZWxmLT57U3RhdGVVcGRhdGVJRH0sIFwkU2VsZi0+e05ld1RpY2tldElEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBUaWNrZXRIaXN0b3J5TGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJUhpc3RvcnlEYXRhOwogICAgICAgICRIaXN0b3J5RGF0YXtTdGF0ZUlEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJEhpc3RvcnlEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1sxXTsKCiAgICAgICAgcHVzaCBAVGlja2V0SGlzdG9yeUxpc3QsIFwlSGlzdG9yeURhdGE7CiAgICB9CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5IChAVGlja2V0SGlzdG9yeUxpc3QpIHsKCiAgICAgICAgJEVudHJ5LT57Vmlld2FibGV9ID0gMDsKICAgICAgICBuZXh0IEVOVFJZIGlmICEkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9LT57ICRFbnRyeS0+e1N0YXRlSUR9IH07CiAgICAgICAgJEVudHJ5LT57Vmlld2FibGV9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXEBUaWNrZXRIaXN0b3J5TGlzdDsKfQoKc3ViIF9TZWNvbmRlVG9TdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJFBhcmFte1NlY29uZHN9OwoKICAgICMgY2FsY3VsYXRlIHRoZSBzZWNvbmRzCiAgICBteSAkU2Vjb25kcyA9ICRQYXJhbXtTZWNvbmRzfSAlIDYwOwogICAgJFBhcmFte1NlY29uZHN9ID0gKCAkUGFyYW17U2Vjb25kc30gLSAkU2Vjb25kcyApIC8gNjA7CgogICAgIyBjYWxjdWxhdGUgdGhlIG1pbnV0ZXMKICAgIG15ICRNaW51dGVzID0gJFBhcmFte1NlY29uZHN9ICUgNjA7CgogICAgIyBjYWxjdWxhdGUgdGhlIGhvdXJzCiAgICBteSAkSG91cnMgPSAoICRQYXJhbXtTZWNvbmRzfSAtICRNaW51dGVzICkgLyA2MDsKCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICAkSG91cnMgICB8fD0gMDsKICAgICRNaW51dGVzIHx8PSAwOwogICAgJFNlY29uZHMgfHw9IDA7CgogICAgaWYgKCAkU2Vjb25kcyA+PSAzMCApIHsKICAgICAgICAkTWludXRlcysrOwogICAgfQoKICAgICRNaW51dGVzID0gc3ByaW50ZiAiJTAyZCIsICRNaW51dGVzOwoKICAgIG15ICRIb3Vyc1N0cmluZyAgID0gJ0hvdXJzJzsKICAgIG15ICRNaW51dGVzU3RyaW5nID0gJ01pbnV0ZXMnOwoKICAgIHJldHVybiAiJEhvdXJzICRIb3Vyc1N0cmluZyAkTWludXRlcyAkTWludXRlc1N0cmluZyI7Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpPdXRwdXQ6OlRlbXBsYXRlOjpQcm92aWRlcjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VHlwZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHJlYnVpbGQgWlpaKiBmaWxlcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpLT5Xcml0ZURlZmF1bHQoKTsKCiAgICAjIGRlZmluZSB0aGUgWlpaIGZpbGVzCiAgICBteSBAWlpaRmlsZXMgPSAoCiAgICAgICAgJ1paWkFBdXRvLnBtJywKICAgICAgICAnWlpaQXV0by5wbScsCiAgICApOwoKICAgICMgcmVsb2FkIHRoZSBaWlogZmlsZXMgKG1vZF9wZXJsIHdvcmthcm91bmQpCiAgICBmb3IgbXkgJFpaWkZpbGUgKEBaWlpGaWxlcykgewoKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgIS1mICRGaWxlOwogICAgICAgICAgICBkbyAkRmlsZTsKICAgICAgICAgICAgbGFzdCBQUkVGSVg7CiAgICAgICAgfQogICAgfQoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICAjIHRoZSBzdGF0cyBvYmplY3QgbmVlZHMgYSBVc2VySUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IKICAgICMgd2UgbmVlZCB0byBkaXNjYXJkIGFueSBleGlzdGluZyBzdGF0cyBvYmplY3QgYmVmb3JlCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoCiAgICAgICAgT2JqZWN0cyA9PiBbJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cyddLAogICAgKTsKCiAgICAjIGRlZmluZSBVc2VySUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN0YXRzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBkZWZpbmUgZmlsZSBwcmVmaXggZm9yIHN0YXRzCiAgICAkU2VsZi0+e0ZpbGVQcmVmaXh9ID0gJ0lUU01TdGF0cyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAU3RhdGVOYW1lcyA9ICgKICAgICAgICAgICAgJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHN0YXRlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0U3RhdGVWYWxpZCgKICAgICAgICAgICAgU3RhdGVOYW1lcyA9PiBcQFN0YXRlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyB0aWNrZXQgdHlwZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6Ok1ham9yJywKICAgICAgICAgICAgJ1NlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ1Byb2JsZW0nLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgICAgIFR5cGVOYW1lcyA9PiBcQFR5cGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgJFNlbGYtPl9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAzLjIuOTEgKDMuMy4wIEJldGEgMSkuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzJfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmVuYW1lIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT5fUmVuYW1lRHluYW1pY0ZpZWxkcygpOwoKICAgICMgc2V0IHRoZSBzY3JlZW4gZHluYW1pYyBmaWVsZCBjb25maWcKICAgICRTZWxmLT5fU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfMigpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gNC4wLjIuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfMigpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfMiB7ICAgICMjIG5vIGNyaXRpYwogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1pZ3JhdGUgdGhlIERUTCBDb250ZW50IGluIHRoZSBTeXNDb25maWcKICAgICRTZWxmLT5fTWlncmF0ZURUTEluU3lzQ29uZmlnKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1ha2UgZHluYW1pYyBmaWVsZHMgaW50ZXJuYWwKICAgICRTZWxmLT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gaW52YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIGludmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6Ok1ham9yJywKICAgICAgICAgICAgJ1NlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ1Byb2JsZW0nLAoKICAgICAgICAgICAgIyBvbGQgdHlwZXMgZnJvbSBJVFNNIGJlZm9yZSB2ZXJzaW9uIDMuMi45MQogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtOjpLbm93bkVycm9yJywKICAgICAgICAgICAgJ1Byb2JsZW06OlBlbmRpbmdSZkMnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGVzIHRvIGludmFsaWQKICAgICAgICAkU2VsZi0+X1NldFR5cGVWYWxpZCgKICAgICAgICAgICAgVHlwZU5hbWVzID0+IFxAVHlwZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnKCkKClRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc2NyZWVuIGR5bmFtaWMgc2NyZWVuIGNvbmZpZwoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnKCk7Cgo9Y3V0CgpzdWIgX1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWFwcGluZyBvbGQgbmFtZSB0byBuZXcgbmFtZSBvZiBkeW5hbWljIGZpZWxkcwogICAgbXkgJU9sZDJOZXcgPSAoCiAgICAgICAgVGlja2V0RnJlZVRleHQxMyA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICBUaWNrZXRGcmVlVGV4dDE0ID0+ICdJVFNNSW1wYWN0JywKICAgICAgICBUaWNrZXRGcmVlVGV4dDE1ID0+ICdJVFNNUmV2aWV3UmVxdWlyZWQnLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTYgPT4gJ0lUU01EZWNpc2lvblJlc3VsdCcsCiAgICAgICAgVGlja2V0RnJlZVRpbWUzICA9PiAnSVRTTVJlcGFpclN0YXJ0VGltZScsCiAgICAgICAgVGlja2V0RnJlZVRpbWU0ICA9PiAnSVRTTVJlY292ZXJ5U3RhcnRUaW1lJywKICAgICAgICBUaWNrZXRGcmVlVGltZTUgID0+ICdJVFNNRGVjaXNpb25EYXRlJywKICAgICAgICBUaWNrZXRGcmVlVGltZTYgID0+ICdJVFNNRHVlRGF0ZScsCiAgICApOwoKICAgICMgZGVmaW5lIHRoZSBlbmFibGVkIGR5bmFtaWMgZmllbGRzIGZvciBlYWNoIHNjcmVlbgogICAgIyAodGFrZW4gZnJvbSBzeXNjb25maWcgb2YgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQpCiAgICBteSAlU2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnID0gKAogICAgICAgIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQgPT4gewogICAgICAgICAgICBJVFNNUmVwYWlyU3RhcnRUaW1lICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgICAgIElUU01EdWVEYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXREZWNpc2lvbiA9PiB7CiAgICAgICAgICAgIElUU01EZWNpc2lvblJlc3VsdCA9PiAxLAogICAgICAgICAgICBJVFNNRGVjaXNpb25EYXRlICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0UGhvbmUgPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRFbWFpbCA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgID0+IDEsCiAgICAgICAgICAgIElUU01EdWVEYXRlID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldFNlYXJjaCA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmV2aWV3UmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uUmVzdWx0ICAgID0+IDEsCiAgICAgICAgICAgIElUU01SZXBhaXJTdGFydFRpbWUgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVjb3ZlcnlTdGFydFRpbWUgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uRGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgIElUU01EdWVEYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRab29tID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIElUU01Dcml0aWNhbGl0eSAgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmV2aWV3UmVxdWlyZWQgICAgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uUmVzdWx0ICAgID0+IDEsCiAgICAgICAgICAgIElUU01SZXBhaXJTdGFydFRpbWUgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVjb3ZlcnlTdGFydFRpbWUgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uRGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgIElUU01EdWVEYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRQcmlvcml0eSA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0Q2xvc2UgPT4gewogICAgICAgICAgICBJVFNNUmV2aWV3UmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0Q29tcG9zZSA9PiB7CiAgICAgICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkU2NyZWVuICggc29ydCBrZXlzICVTY3JlZW5EeW5hbWljRmllbGRDb25maWcgKSB7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIGNvbmZpZyBmb3IgZWFjaCBzY3JlZW4KICAgICAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2NyZWVuIik7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIGR5bmFtaWMgZmllbGQgY29uZmlnCiAgICAgICAgbXkgJUV4aXN0aW5nU2V0dGluZyA9ICV7ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9IH07CgogICAgICAgICMgYWRkIHRoZSBuZXcgc2V0dGluZ3MKICAgICAgICBteSAlTmV3U2V0dGluZyA9ICggJUV4aXN0aW5nU2V0dGluZywgJXsgJFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZ3skU2NyZWVufSB9ICk7CgogICAgICAgICMgZGVsZXRlIG5vIGxvbmdlciB1c2VkIGR5bmFtaWMgZmllbGQgbmFtZXMgZnJvbSBlYWNoIGNvbmZpZwogICAgICAgIGZvciBteSAkT2xkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVPbGQyTmV3ICkgewoKICAgICAgICAgICAgIyBhbiBvbGQgc2V0dGluZyBleGlzdHMKICAgICAgICAgICAgaWYgKCBleGlzdHMgJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH0gKSB7CgogICAgICAgICAgICAgICAgIyBjb3B5IHRoZSBvbGQgc2V0dGluZyB0byB0aGUgbmV3IHNldHRpbmcKICAgICAgICAgICAgICAgICROZXdTZXR0aW5neyAkT2xkMk5ld3skT2xkRHluYW1pY0ZpZWxkfSB9ID0gJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH07CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIG9sZCBzZXR0aW5nCiAgICAgICAgICAgICAgICBkZWxldGUgJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzeXNjb25maWcKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OicgLiAkU2NyZWVuIC4gJyMjI0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlID0+IFwlTmV3U2V0dGluZywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2V0U3RhdGVWYWxpZCgpCgpzZXRzIHN0YXRlcyB0byB2YWxpZHxpbnZhbGlkCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0U3RhdGVWYWxpZCgKICAgICAgICBTdGF0ZU5hbWVzID0+IFsgJ25ldycsICdvcGVuJyBdLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1NldFN0YXRlVmFsaWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1N0YXRlTmFtZXN9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTdGF0ZU5hbWVzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgdmFsaWQgaWQKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAlVmFsaWRMaXN0ID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgbXkgJFZhbGlkSUQgPSAkUGFyYW17VmFsaWR9ID8gJFZhbGlkTGlzdHt2YWxpZH0gOiAkVmFsaWRMaXN0e2ludmFsaWR9OwoKICAgIFNUQVRFTkFNRToKICAgIGZvciBteSAkU3RhdGVOYW1lICggQHsgJFBhcmFte1N0YXRlTmFtZXN9IH0gKSB7CgogICAgICAgICMgZ2V0IHN0YXRlCiAgICAgICAgbXkgJVN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICBOYW1lID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBTVEFURU5BTUUgaWYgISVTdGF0ZTsKCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVVcGRhdGUoCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRUeXBlVmFsaWQoKQoKc2V0cyB0eXBlcyB0byB2YWxpZHxpbnZhbGlkCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0VHlwZVZhbGlkKAogICAgICAgIFR5cGVOYW1lcyA9PiBbICdJbmNpZGVudCcsICdQcm9ibGVtJyBdLAogICAgICAgIFZhbGlkICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0VHlwZVZhbGlkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUeXBlTmFtZXN9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlTmFtZXMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgIyBnZXQgbGlzdCBvZiBhbGwgdHlwZXMKICAgIG15ICVUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgcmV2ZXJzZSB0aGUgdHlwZSBsaXN0IGZvciBlYXNpZXIgbG9va3VwCiAgICBteSAlVHlwZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVHlwZUxpc3Q7CgogICAgVFlQRU5BTUU6CiAgICBmb3IgbXkgJFR5cGVOYW1lICggQHsgJFBhcmFte1R5cGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkVHlwZUxpc3RSZXZlcnNleyRUeXBlTmFtZX07CgogICAgICAgIG5leHQgVFlQRU5BTUUgaWYgISRUeXBlSUQ7CgogICAgICAgICMgZ2V0IHR5cGUKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVHZXQoCiAgICAgICAgICAgIElEID0+ICRUeXBlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVVcGRhdGUoCiAgICAgICAgICAgICVUeXBlLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NyZWF0ZUlUU01EeW5hbWljRmllbGRzKCkKCmNyZWF0ZXMgYWxsIGR5bmFtaWMgZmllbGRzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgSVRTTQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0NyZWF0ZUlUU01EeW5hbWljRmllbGRzKCk7Cgo9Y3V0CgpzdWIgX0NyZWF0ZUlUU01EeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICk7CgogICAgIyBnZXQgYWxsIGN1cnJlbnQgZHluYW1pYyBmaWVsZHMKICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIG9yZGVyIG51bWJlcnMgKGlzIGFscmVhZHkgc29ydGVkKS4KICAgIG15IEBEeW5hbWljZmllbGRPcmRlckxpc3Q7CiAgICBmb3IgbXkgJER5bmFtaWNmaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIHB1c2ggQER5bmFtaWNmaWVsZE9yZGVyTGlzdCwgJER5bmFtaWNmaWVsZC0+e0ZpZWxkT3JkZXJ9OwogICAgfQoKICAgICMgZ2V0IHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgb3JkZXIgbGlzdCBhbmQgYWRkIDEKICAgIG15ICROZXh0T3JkZXJOdW1iZXIgPSAxOwogICAgaWYgKEBEeW5hbWljZmllbGRPcmRlckxpc3QpIHsKICAgICAgICAkTmV4dE9yZGVyTnVtYmVyID0gJER5bmFtaWNmaWVsZE9yZGVyTGlzdFstMV0gKyAxOwogICAgfQoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCiAgICAjIGNyZWF0ZSBhIGR5bmFtaWMgZmllbGRzIGxvb2t1cCB0YWJsZQogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cDsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgcmVmICREeW5hbWljRmllbGQgbmUgJ0hBU0gnOwogICAgICAgICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICAjIGNyZWF0ZSBvciB1cGRhdGUgZHluYW1pYyBmaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICBteSAkQ3JlYXRlRHluYW1pY0ZpZWxkOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBkeW5hbWljIGZpZWxkIGFscmVhZHkgZXhpc3RzCiAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkQ3JlYXRlRHluYW1pY0ZpZWxkID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGZpZWxkIGV4aXN0cyBjaGVjayBpZiB0aGUgdHlwZSBtYXRjaCB3aXRoIHRoZSBuZWVkZWQgdHlwZQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZFR5cGV9CiAgICAgICAgICAgIG5lICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIHJlbmFtZSB0aGUgZmllbGQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9IH0sCiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntOYW1lfSAuICdPbGQnLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ3JlYXRlRHluYW1pY0ZpZWxkID0gMTsKICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGlmIHRoZSBmaWVsZCBleGlzdHMgYW5kIHRoZSB0eXBlIG1hdGNoLCB1cGRhdGUgaXQgdG8gdGhlIElUU00gZGVmaW5pdGlvbgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICAgICAgJXskRHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgIElEICAgICAgICAgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntJRH0sCiAgICAgICAgICAgICAgICBGaWVsZE9yZGVyID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57RmllbGRPcmRlcn0sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+ICRWYWxpZElELAogICAgICAgICAgICAgICAgUmVvcmRlciAgICA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuZXcgZmllbGQgaGFzIHRvIGJlIGNyZWF0ZWQKICAgICAgICBpZiAoJENyZWF0ZUR5bmFtaWNGaWVsZCkgewoKICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgZmllbGQKICAgICAgICAgICAgbXkgJEZpZWxkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgICAgIEludGVybmFsRmllbGQgPT4gMSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGRPcmRlciAgICA9PiAkTmV4dE9yZGVyTnVtYmVyLAogICAgICAgICAgICAgICAgRmllbGRUeXBlICAgICA9PiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSwKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgICAgPT4gJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9LAogICAgICAgICAgICAgICAgQ29uZmlnICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57Q29uZmlnfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRmllbGRJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIG9yZGVyIG51bWJlcgogICAgICAgICAgICAkTmV4dE9yZGVyTnVtYmVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBkeW5hbWljIGZpZWxkcyBpbnRlcm5hbAogICAgJFNlbGYtPl9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9SZW5hbWVEeW5hbWljRmllbGRzKCkKClRoaXMgZnVuY3Rpb24gcmVuYW1lcyB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fUmVuYW1lRHluYW1pY0ZpZWxkcygpOwoKPWN1dAoKc3ViIF9SZW5hbWVEeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCiAgICBteSAkU3VjY2Vzc0NvdW50ZXI7CgogICAgIyByZW5hbWUgdGhlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGROZXcgKEBEeW5hbWljRmllbGRzKSB7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIGR5bmFtaWMgZmllbGQgZGF0YQogICAgICAgIG15ICREeW5hbWljRmllbGRPbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmV3LT57T2xkTmFtZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgdGhlIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICBJRCAgICAgICAgID0+ICREeW5hbWljRmllbGRPbGQtPntJRH0sCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZE9sZC0+e0ZpZWxkT3JkZXJ9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREeW5hbWljRmllbGROZXctPntOYW1lfSwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57TGFiZWx9LAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICREeW5hbWljRmllbGROZXctPntGaWVsZFR5cGV9LAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGROZXctPntPYmplY3RUeXBlfSwKICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkT2xkLT57Q29uZmlnfSwgICAgICAgIyB1c2UgdGhlIG9sZCBjb25maWcgc2V0dGluZ3MKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgJFN1Y2Nlc3NDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZXJyb3IgaGFuZGxpbmcgaWYgbm90IGFsbCBkeW5hbWljIGZpZWxkcyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQogICAgaWYgKCBzY2FsYXIgQER5bmFtaWNGaWVsZHMgIT0gJFN1Y2Nlc3NDb3VudGVyICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCByZW5hbWUgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCkKCnJldHVybnMgdGhlIGRlZmluaXRpb24gZm9yIElUU00gcmVsYXRlZCBkeW5hbWljIGZpZWxkcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKPWN1dAoKc3ViIF9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgIG15IEBEeW5hbWljRmllbGRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZXZpZXdSZXF1aXJlZCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXZpZXcgUmVxdWlyZWQnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgID0+ICdObycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm8gID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgICAgICBZZXMgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01EZWNpc2lvblJlc3VsdCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdEZWNpc2lvbiBSZXN1bHQnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAnUGVuZGluZycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAnQXBwcm92ZWQnICAgICA9PiBUcmFuc2xhdGFibGUoJ0FwcHJvdmVkJyksCiAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcnICAgICAgPT4gVHJhbnNsYXRhYmxlKCdQZW5kaW5nJyksCiAgICAgICAgICAgICAgICAgICAgJ1Bvc3Rwb25lZCcgICAgPT4gVHJhbnNsYXRhYmxlKCdQb3N0cG9uZWQnKSwKICAgICAgICAgICAgICAgICAgICAnUHJlLWFwcHJvdmVkJyA9PiBUcmFuc2xhdGFibGUoJ1ByZS1hcHByb3ZlZCcpLAogICAgICAgICAgICAgICAgICAgICdSZWplY3RlZCcgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVqZWN0ZWQnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lMycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZXBhaXJTdGFydFRpbWUnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVwYWlyIFN0YXJ0IFRpbWUnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lNCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZWNvdmVyeVN0YXJ0VGltZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZWNvdmVyeSBTdGFydCBUaW1lJyksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDAsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgWWVhcnNJbkZ1dHVyZSA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNJblBhc3QgICA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNQZXJpb2QgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGltZTUnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNRGVjaXNpb25EYXRlJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RlY2lzaW9uIERhdGUnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lNicsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01EdWVEYXRlJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiBUcmFuc2xhdGFibGUoJ0R1ZSBEYXRlJyksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDI1OTIwMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDksCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBEeW5hbWljRmllbGRzOwp9Cgo9aXRlbSBfTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpCgpDb252ZXJ0cyB0aGUgZHluYW1pYyBmaWVsZHMgdG8gaW50ZXJuYWwgZmllbGRzLCB3aGljaCBtZWFucyB0aGF0IHRoZXkgY2FuIG5vdCBiZSBkZWxldGVkIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKPWN1dAoKc3ViIF9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIHNldCBhcyBpbnRlcm5hbCBmaWVsZAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgZHluYW1pY19maWVsZAogICAgICAgICAgICAgICAgU0VUIGludGVybmFsX2ZpZWxkID0gMQogICAgICAgICAgICAgICAgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZURUTEluU3lzQ29uZmlnKCkKCkNvbnZlcnRzIERUTCBzZXR0aW5ncyBpbiBzeXNjb25maWcgdG8gVFQuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWlncmF0ZURUTEluU3lzQ29uZmlnKCk7Cgo9Y3V0CgpzdWIgX01pZ3JhdGVEVExJblN5c0NvbmZpZyB7CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKICAgIG15ICRQcm92aWRlck9iamVjdCAgPSBLZXJuZWw6Ok91dHB1dDo6VGVtcGxhdGU6OlByb3ZpZGVyLT5uZXcoKTsKCiAgICAjIGhhbmRsZSBoYXNoIHNldHRpbmdzCiAgICBOQU1FOgogICAgZm9yIG15ICROYW1lIChxdyhUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlKSkgewoKICAgICAgICAjIGdldCBzZXR0aW5nJ3MgY29udGVudAogICAgICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCROYW1lKTsKICAgICAgICBuZXh0IE5BTUUgaWYgISRTZXR0aW5nOwoKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgICAgICMgc2V0dGluZyBpcyBhIGhhc2gKICAgICAgICAgICAgU0VUVElOR0lURU06CiAgICAgICAgICAgIGZvciBteSAkU2V0dGluZ0l0ZW0gKCBzb3J0IGtleXMgJXsgJFNldHRpbmctPnskTWVudU1vZHVsZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkU2V0dGluZ0NvbnRlbnQgPSAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+eyRTZXR0aW5nSXRlbX07CgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBtaWdyYXRpbmcKICAgICAgICAgICAgICAgIG5leHQgU0VUVElOR0lURU0gaWYgISRTZXR0aW5nQ29udGVudDsKCiAgICAgICAgICAgICAgICBteSAkVFRDb250ZW50OwogICAgICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAgICAgJFRUQ29udGVudCA9ICRQcm92aWRlck9iamVjdC0+TWlncmF0ZURUTHRvVFQoIENvbnRlbnQgPT4gJFNldHRpbmdDb250ZW50ICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkTWVudU1vZHVsZS0+JFNldHRpbmdJdGVtIDogJEAhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnskU2V0dGluZ0l0ZW19ID0gJFRUQ29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIGNvbmZpZyBpdGVtCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXR0aW5nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBzY2FsYXIgc2V0dGluZ3MKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHF3KAogICAgICAgIFRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQKICAgICAgICBUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uCiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBnZXQgc2V0dGluZydzIGNvbnRlbnQKICAgICAgICBteSAkU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCgkTmFtZSk7CiAgICAgICAgbmV4dCBOQU1FIGlmICEkU2V0dGluZzsKCiAgICAgICAgU0VUVElOR0lURU06CiAgICAgICAgZm9yIG15ICRTZXR0aW5nSXRlbSAocXcoU3ViamVjdCBCb2R5KSkgewoKICAgICAgICAgICAgbXkgJFNldHRpbmdDb250ZW50ID0gJFNldHRpbmctPnskU2V0dGluZ0l0ZW19OwoKICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBtaWdyYXRpbmcKICAgICAgICAgICAgbmV4dCBTRVRUSU5HSVRFTSBpZiAhJFNldHRpbmdDb250ZW50OwoKICAgICAgICAgICAgbXkgJFRUQ29udGVudDsKICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAkVFRDb250ZW50ID0gJFByb3ZpZGVyT2JqZWN0LT5NaWdyYXRlRFRMdG9UVCggQ29udGVudCA9PiAkU2V0dGluZ0NvbnRlbnQgKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkTmFtZS0+JFNldHRpbmdJdGVtIDogJEAhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2V0dGluZy0+eyRTZXR0aW5nSXRlbX0gPSAkVFRDb250ZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNldHRpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
closed with workaround
Ticket is closed with workaround.
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::Major
1
current_timestamp
1
current_timestamp
1
ServiceRequest
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1