ITSMCore
2.0.93
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.0 beta3.
Build for OTRS::ITSM 2.1.0 beta2.
Build for OTRS::ITSM 2.1.0 beta1.
Build for OTRS::ITSM 2.1.0 alpha1.
The OTRS::ITSM Core package.
Das OTRS::ITSM Core Paket.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package ITSMCore.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>GeneralCatalog 2.0.93</li>
</ul>
<br>
<b>ATTENTION</b>
<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMCore zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>GeneralCatalog 2.0.93</li>
</ul>
<br>
<b>ACHTUNG</b>
<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standardmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the service menu, you need to add them as member to the group 'itsm-service'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf das Service-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-service' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'itsm-service' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'itsm-service' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package ITSMCore.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>GeneralCatalog 2.0.93</li>
</ul>
<br>
</b>ATTENTION</b>
<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMCore zu aktualisieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>GeneralCatalog 2.0.93</li>
</ul>
<br>
<b>ACHTUNG</b>
<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standardmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
GeneralCatalog
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2010-09-07 16:21:36
opms.otrs.com
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vLi+vv6pT30qdCEUZH19/bu/+7tDVwHzT7QEABRhb2+vXq/X6/XQhcyKriUov+/6ru96/etf//Wvfz10IRTkc5/73Kc//enQVcD888UaAFCEl19++bnnntva2gpdyKyk0ZKuJQBg0ehaAgBm7tatWzs7O7VabWVlJXQts2JBHFRCq9Xa2NgIXQUFuX37dugSYCGIlgCA2Wq1WlevXo2i6MSJE43G3J57WBAH5RfH8X//93/fd999oQuhOD/xEz8RugSYf3N7egcAlMQrr7zSarWWl5dPnDgRupYZ0rUE5fcDP/ADzWYzdBUA88bZDwAwQ7dv375582YURadPn57vjh5dSwDAYhItAQCz0m63r1y5EkXR2tra6upq6HJmyzbeAMBicvYDAMzKtWvX9vf3G43GyZMnQ9cycxbEAQCLydkPADATOzs7N27ciKLo9OnTixC4WBAHACym+T/PAwCKlyRJuhTu2LFjR44cCV1OESyIAwAWk7MfAGD6rl+/vru7W6/XT506FbqWglgQBwAsJmc/AMCU7e3tra+vR1F06tSper0eupyC1Ov15eXlxXm9AACpRugCAIB58/LLLydJcuTIkWPHjoWupTinT58OXQIAQAC6lgCAabpx48bOzk6tVhO1AAAsAtESADA1u7u7r7zyShRFJ0+ebDQ0RwMAzD/REgAwHUmSXL58OV0Kt7a2FrocAACKIFoCAKbj6tWre3t7jUbj/vvvD10LAAAFES0BAFNw+/btjY2NKIruv/9+V0kDAFgcNkEAAKbg0KFDx44dazQahw8fDl0LAADFES0BAFNQq9XOnDmTJEnoQgAAKJQFcQDA1MRxHLoEAAAKpWsJAGAKLl++3Gw2T506tbKyEroWAIDiiJYAAKZgZ2dnf3+/3W6HLgQAoFCiJQCAKTh9+nSr1VpeXg5dCABAoURLAABT4NJ4AMBiso03ADC2nZ2dVqsVugoAAMLTtQQAjKfZbF68eDFJkoceesiW1QAAC060BACMbWlpKUmSpaWl0IUAABCYaAkAGE+j0XjNa17TbDZrNSvrAQAWnTNCAGASjYYvqAAAEC0BAAAAMCnREgAAAAAT0soOADAF29vbURQdOnQojuPQtQAAFEfXEgDAFJw/f/78+fOtVit0IQAAhRItAQBZNjY22u126CoqQ8sSALBoREsAwFAbGxtXrlx58cUX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H3/88enTp6oLAYAjJVoCAGCPTSaTJEkGg0HVhQDAkRItAQCwxzqdThAEoiUAqIpoCQCAPZZHS0mSTCaTqmsBgGMkWgIAYI9FUdRqtYIgGA6HVdcCAMdItAQAwH7TEwcAFRItAQCw30RLAFAh0RIAAPut3W4HQTAajdI0rboWADg6oiUAAPZbHMfNZjMwcQkAqiBaAgBg7+mJA4CqiJYAANh7oiUAqIpoCQCAvZdHS6PRKMuyqmsBgOMiWgIAYO81m804jrMsGw6HVdcCAMdFtAQAwCHI3xOnJw4Adky0BADAIbDcEgBUQrQEAMAhyKOl4XBouSUA2CXREgAAh6DVakVRlKbpaDSquhYAOCKiJQAADsRs4lLVhQDAEREtAQBwICy3BAC7J1oCAOBAeEkcAOxeXHUBAACwGe12u9Pp9Hq9LMvCMKy6HAA4CqE3aAAAAABQjoY4AAAAAEoSLQEAAABQkmgJAAAAgJJESwAAAACUJFoCAAAAoCTREgAAAAAl/Q/GAOyVx0UjDQAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBGcmFtZXdvcmtJVFNNQ29yZS54bWwsdiAxLjQ3LjIuMiAyMDEwLzA5LzA3IDEzOjU3OjA4IHViIEV4cCAkPC9DVlM+CiAgICA8Q1ZTPiRPbGRJZDogRnJhbWV3b3JrLnhtbCx2IDEuMjQyLjIuNiAyMDEwLzAzLzA5IDA5OjM3OjQ2IGR6IEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQcm9kdWN0TmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBjb250cm9scyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gYXMgaXMgc2hvd24gaW4gdGhlIHdlYiBpbnRlcmZhY2UgYXMgd2VsbCBhcyB0aGUgdGFicyBhbmQgdGl0bGUgYmFyIG9mIHlvdXIgd2ViIGJyb3dzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkltIFdlYkZyb250ZW5kIGFuZ2V6ZWlndGVyIE5hbWUgZGVyIFNvZnR3YXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk9UUlM6OklUU00gMi4xIEJldGEgMzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlZpZXdNb2RlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGV0ZXJtaW5lcyB0aGUgd2F5IHRoZSBsaW5rZWQgb2JqZWN0cyBhcmUgZGlzcGxheWVkIGluIGVhY2ggem9vbSBtYXNrLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGRpZSBBbnNpY2h0IGRlciB2ZXJsaW5rdGVuIE9iamVrdGUgaW4gZGVuIGpld2VpbGlnZW4gWm9vbS1NYXNrZW4gZmVzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJDb21wbGV4Ij4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2ltcGxlIj5TaW1wbGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbXBsZXgiPkNvbXBsZXg8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlBhY2thZ2U6OlJlcG9zaXRvcnlMaXN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TGlzdCBvZiBvbmxpbmUgcmVwb3NpdG9yaWVzIChmb3IgZXhhbXBsZSB5b3UgYWxzbyBjYW4gdXNlIG90aGVyIGluc3RhbGxhdGlvbnMgYXMgcmVwb3NpdG9yaXkgYnkgdXNpbmcgS2V5PSJodHRwOi8vZXhhbXBsZS5jb20vb3Rycy9wdWJsaWMucGw/QWN0aW9uPVB1YmxpY1JlcG9zaXRvcnkmYW1wO0ZpbGU9IiBhbmQgQ29udGVudD0iU29tZSBOYW1lIikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxpc3RlIGRlciB6dXIgVmVyZvxndW5nIHN0ZWhlbmRlbiBPbmxpbmUtUXVlbGxlbiAoZXMga/ZubmVuIHouIEIuIGF1Y2ggYW5kZXJlIEluc3RhbGxhdGlvbmVuIGFscyBPbmxpbmUtUXVlbGxlbiB2ZXJ3ZW5kZXQgd2VyZGVuIG1pdCBkZXIgVmVyd2VuZHVuZyB2b24gS2V5PSJodHRwOi8vZXhhbXBsZS5jb20vb3Rycy9wdWJsaWMucGw/QWN0aW9uPVB1YmxpY1JlcG9zaXRvcnkmYW1wO0ZpbGU9IiBhbmQgQ29udGVudD0iRWluIE5hbWUiKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpQYWNrYWdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imh0dHA6Ly9mdHAub3Rycy5vcmcvcHViL290cnMvaXRzbS9wYWNrYWdlczIxLyI+Wy0tT1RSUzo6SVRTTSAyLjEgTWFzdGVyLS1dIGh0dHA6Ly9mdHAub3Rycy5vcmcvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29yZS54bWwsdiAxLjMwIDIwMTAvMDQvMTMgMTI6Mjg6MjggdWIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbklUU01DSVBBbGxvY2F0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01DSVBBbGxvY2F0ZSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5JVFNNQ0lQQWxsb2NhdGUgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q3JpdGljYWxpdHkgJmx0Oy0mZ3Q7IEltcGFjdCAmbHQ7LSZndDsgUHJpb3JpdHk8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+Q3JpdGljYWxpdHkgJmx0Oy0mZ3Q7IEltcGFjdCAmbHQ7LSZndDsgUHJpb3JpdHk8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrMzwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDMwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCB0aGUgdHlwZSBvZiBsaW5rIHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpbmNpZGVudCBzdGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBkZW4gTGlua3R5cCBmZXN0LCBkZXIgenVyIEJlcmVjaG51bmcgZGVzIFZvcmZhbGxzdGF0dXMgdmVyd2VuZGV0IHdpcmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkRlcGVuZHNPbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNBbHRlcm5hdGl2ZVRvIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnQWx0ZXJuYXRpdmVUbycuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRlbiBMaW5rdHlwICdBbHRlcm5hdGl2ZVRvJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZXIgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIGdlcmljaHRldGVyIExpbmt0eXAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIj5BbHRlcm5hdGl2ZSB0bzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSI+QWx0ZXJuYXRpdmUgdG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpUeXBlIyMjQ29ubmVjdGVkVG8iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlICdDb25uZWN0ZWRUbycuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRlbiBMaW5rdHlwICdDb25uZWN0ZWRUbycuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgZGVyIGdsZWljaGUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIHVuZ2VyaWNodGV0ZXIgTGlua3R5cC4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSB2ZXJzY2hpZWRlbmVyIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSI+Q29ubmVjdGVkIHRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXROYW1lIj5Db25uZWN0ZWQgdG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpUeXBlIyMjRGVwZW5kc09uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnRGVwZW5kc09uJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGVuIExpbmt0eXAgJ0RlcGVuZHNPbicuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgZGVyIGdsZWljaGUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIHVuZ2VyaWNodGV0ZXIgTGlua3R5cC4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSB2ZXJzY2hpZWRlbmVyIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSI+RGVwZW5kcyBvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSI+UmVxdWlyZWQgZm9yPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6VHlwZSMjI0luY2x1ZGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnSW5jbHVkZXMnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkZW4gTGlua3R5cCAnSW5jbHVkZXMnLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIGRlciBnbGVpY2hlIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiB1bmdlcmljaHRldGVyIExpbmt0eXAuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgdmVyc2NoaWVkZW5lciBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gZ2VyaWNodGV0ZXIgTGlua3R5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiPkluY2x1ZGVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXROYW1lIj5QYXJ0IG9mPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6VHlwZSMjI1JlbGV2YW50VG8iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlICdSZWxldmFudFRvJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGVuIExpbmt0eXAgJ1JlbGV2YW50VG8nLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIGRlciBnbGVpY2hlIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiB1bmdlcmljaHRldGVyIExpbmt0eXAuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgdmVyc2NoaWVkZW5lciBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gZ2VyaWNodGV0ZXIgTGlua3R5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiPlJlbGV2YW50IHRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXROYW1lIj5SZWxldmFudCB0bzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ0FsdGVybmF0aXZlVG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ0FsdGVybmF0aXZlVG8nIG1pdCBhbmRlcmVuICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkFsdGVybmF0aXZlVG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjAxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdDb25uZWN0ZWRUbycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnQ29ubmVjdGVkVG8nIG1pdCBhbmRlcmVuICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkNvbm5lY3RlZFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIwMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgJ0lUU01Db25maWdJdGVtJyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdEZXBlbmRzT24nIG1pdCBhbmRlcmVuICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ0luY2x1ZGVzJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdJbmNsdWRlcycgbWl0IGFuZGVyZW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+SW5jbHVkZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjA0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdSZWxldmFudFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdSZWxldmFudFRvJyBtaXQgYW5kZXJlbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIyMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ0FsdGVybmF0aXZlVG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ0FsdGVybmF0aXZlVG8nIG1pdCAnVGlja2V0Jy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkFsdGVybmF0aXZlVG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjIxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnVGlja2V0JyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdEZXBlbmRzT24nIG1pdCAnVGlja2V0Jy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdUaWNrZXQnIG9iamVjdHMgdXNpbmcgdGhlICdSZWxldmFudFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdSZWxldmFudFRvJyBtaXQgJ1RpY2tldCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI0MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdBbHRlcm5hdGl2ZVRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdBbHRlcm5hdGl2ZVRvJyBtaXQgJ1NlcnZpY2UnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkFsdGVybmF0aXZlVG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjQxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnU2VydmljZScgb2JqZWN0cyB1c2luZyB0aGUgJ0RlcGVuZHNPbicgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnRGVwZW5kc09uJyBtaXQgJ1NlcnZpY2UnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyNDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdTZXJ2aWNlJyBvYmplY3RzIHVzaW5nIHRoZSAnUmVsZXZhbnRUbycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnUmVsZXZhbnRUbycgbWl0ICdTZXJ2aWNlJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI2MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ0ZBUScgb2JqZWN0cyB1c2luZyB0aGUgJ05vcm1hbCcgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnTm9ybWFsJyBtaXQgJ0ZBUSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjYxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnUGFyZW50Q2hpbGQnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ1BhcmVudENoaWxkJyBtaXQgJ0ZBUSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5QYXJlbnRDaGlsZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyNjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdGQVEnIG9iamVjdHMgdXNpbmcgdGhlICdSZWxldmFudFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdSZWxldmFudFRvJyBtaXQgJ0ZBUSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI4MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnU2VydmljZScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnTm9ybWFsJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ1NlcnZpY2UnLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ05vcm1hbCcgbWl0ICdGQVEnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjgxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdTZXJ2aWNlJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdGQVEnIG9iamVjdHMgdXNpbmcgdGhlICdQYXJlbnRDaGlsZCcgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdTZXJ2aWNlJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdQYXJlbnRDaGlsZCcgbWl0ICdGQVEnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5QYXJlbnRDaGlsZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyODIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ1NlcnZpY2UnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ0ZBUScgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnU2VydmljZSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnUmVsZXZhbnRUbycgbWl0ICdGQVEnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzM0MDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Xb3JrT3JkZXInIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTVdvcmtPcmRlcictT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnTm9ybWFsJyBtaXQgJ1NlcnZpY2UnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzQwMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTVdvcmtPcmRlcicgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnU2VydmljZScgb2JqZWN0cyB1c2luZyB0aGUgJ0RlcGVuZHNPbicgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNV29ya09yZGVyJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdEZXBlbmRzT24nIG1pdCAnU2VydmljZSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNV29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzNDEwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNV29ya09yZGVyJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ05vcm1hbCcgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNV29ya09yZGVyJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwICdOb3JtYWwnIG1pdCAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzM0MTEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Xb3JrT3JkZXInIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ0lUU01Db25maWdJdGVtJyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Xb3JrT3JkZXInLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ0RlcGVuZHNPbicgbWl0ICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNV29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzQxMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTVdvcmtPcmRlcicgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnVGlja2V0JyBvYmplY3RzIHVzaW5nIHRoZSAnTm9ybWFsJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Xb3JrT3JkZXInLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgJ05vcm1hbCcgbWl0ICdUaWNrZXQnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzNDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ2hhbmdlJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdUaWNrZXQnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNoYW5nZSctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCAnTm9ybWFsJyBtaXQgJ1RpY2tldCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU006OkZyb250ZW5kOjpUZXh0QXJlYSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldpZHRoIG9mIElUU00gdGV4dGFyZWFzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbnphaGwgZGVyIFplaWNoZW4gcHJvIFplaWxlIGluIElUU00gVGV4dEFyZWFzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il5bMC05XXsxLDN9JCI+Nzg8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjSW5jaWRlbnRTdGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QYXJhbWV0ZXJzIGZvciB0aGUgaW5jaWRlbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGVuIFZvcmZhbGxzc3RhdHVzIGluIGRlciBBbnNpY2h0IGb8ciBkaWUgRWluc3RlbGx1bmdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5HZW5lcmFsQ2F0YWxvZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xhc3MiPklUU006OkNvcmU6OkluY2lkZW50U3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5JbmNpZGVudCBTdGF0ZSBUeXBlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5JbmNpZGVudCBTdGF0ZSBUeXBlLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0id2FybmluZyI+V2FybmluZzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJvcGVyYXRpb25hbCI+T3BlcmF0aW9uYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaW5jaWRlbnQiPkluY2lkZW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+RnVuY3Rpb25hbGl0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPk9wdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlZpcnR1YWxGUzo6QmFja2VuZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNvbmZpZ3VyZSBtb2R1bGUgdXNlZCBhcyBiYWNrZW5kIGZvciBWaXJ0dWFsRlMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPktvbmZpZ3VyYXRpb24gZvxyIGRhcyBCYWNrZW5kLU1vZHVsIGRlcyBWaXJ0dWFsRlMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ0V4PSIiPktlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlM6OkRCPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNU2VydmljZS54bWwsdiAxLjcgMjAwOC8wOC8wOCAxMzowNDoyMyB1YiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNlcnZpY2UtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1zZXJ2aWNlPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIFNlcnZpY2UgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+U2VydmljZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5TZXJ2aWNlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlcnZpY2UtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2VydmljZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPml0c21fc2VydmljZS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01TZXJ2aWNlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+U2VydmljZTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2VydmljZSBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2VydmljZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU2VydmljZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5TZXJ2aWNlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU0xBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNMQSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNMQS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIFNMQSBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5TZXJ2aWNlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPlNMQTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TTEEgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNMQTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU0xBPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlNlcnZpY2U8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01TZXJ2aWNlWm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TZXJ2aWNlWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNlcnZpY2Vab29tLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1zZXJ2aWNlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlcnZpY2UgWm9vbTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Wm9vbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5TZXJ2aWNlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01TZXJ2aWNlUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNU2VydmljZVByaW50LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1zZXJ2aWNlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlcnZpY2UgUHJpbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNlcnZpY2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNMQVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU0xBWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNMQVpvb20tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLXNlcnZpY2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U0xBIFpvb208L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+U2VydmljZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU0xBUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU0xBUHJpbnQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TTEFQcmludC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TTEEgUHJpbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNlcnZpY2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAwLUJhY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBiYWNrIGxpbmsgaW4gc2VydmljZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU2VydmljZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TZXJ2aWNlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+b25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxMDAtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBwcmludCBsaW5rIGluIHNlcnZpY2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgRHJ1Y2tlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNlcnZpY2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01TZXJ2aWNlUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TZXJ2aWNlUHJpbnQmYW1wO1NlcnZpY2VJRD0kUURhdGF7IlNlcnZpY2VJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rUGFyYW0iPnRhcmdldD0icHJpbnQiPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMjAwLUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgbGluayBsaW5rIGluIHNlcnZpY2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgVmVya278cGZlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNlcnZpY2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNU2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdCZhbXA7U291cmNlT2JqZWN0PVNlcnZpY2UmYW1wO1NvdXJjZUtleT0kUURhdGF7IlNlcnZpY2VJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBzbGEgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgWnVy/GNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFNMQS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TTEE6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNMQU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TTEE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+b25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNU0xBOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHByaW50IGxpbmsgaW4gc2xhIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIERydWNrZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU0xBLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNMQTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU0xBTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNU0xBUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TTEFQcmludCZhbXA7U0xBSUQ9JFFEYXRheyJTTEFJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rUGFyYW0iPnRhcmdldD0icHJpbnQiPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBUaWNrZXRJVFNNU2VydmljZS54bWwsdiAxLjEwIDIwMTAvMDMvMDEgMTM6MDE6MTkgdWIgRXhwICQ8L0NWUz4KICAgIDxDVlM+JE9sZElkOiBUaWNrZXQueG1sLHYgMS4yNzAuMi45IDIwMTAvMDIvMjYgMTE6NTE6MTYgbWFydGluIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OlNlcnZpY2UiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aWNrZXQgc2VydmljZS9TTEEgZmVhdHVyZSBpcyBlbmFibGVkLCB5b3UgY2FuIGRlZmluZSB0aWNrZXQgc2VydmljZXMgYW5kIFNMQXMgZm9yIHRpY2tldHMgKGUuIGcuIGVtYWlsLCBkZXNrdG9wLCBuZXR3b3JrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRhcyBUaWNrZXQtU2VydmljZS9TTEEgRmVhdHVyZSBha3RpdmllcnQgaXN0LCBr9m5uZW4gVGlja2V0IFNlcnZpY2VzIHVuZCBTTEFzIHBybyBUaWNrZXQgZ2VzZXR6dCB3ZXJkZW4gKHouIEIuIEVtYWlsLCBBcmJlaXRzcGxhdHosIE5ldHp3ZXJrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNQ29yZS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0lUU01Db3JlLnBtLHYgMS4xNSAyMDEwLzA2LzAxIDE5OjI1OjIyIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK8Ojy6Pft7vHyJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwuvo/+3o5Sc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ8rw6PLo9+3u8fI8LT7C6+j/7ejlPC0+z/Do7vLo8uXyJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn7u/w5eTl6+XtJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAn0fru8uLl8uXtIPEnOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfC6uv+9+Xt6Cc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9fg8fIg7vInOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfH4OLo8egg7vInOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfN5e7h9e7k6Owg5+AnOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR4vrw5+DtIPEnOwogICAgJExhbmctPnsnQWx0ZXJuYXRpdmUgdG8nfSAgICAgICAgICAgICAgICAgICAgICA9ICfA6/Ll8O3g8uji5e0g7eAnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICfM6O3o7ODr7e4g4vDl7OUg7OXm5PMg6O326OTl7fLo8uUnOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTZXJ2aWNlcyd9ICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICfR4vrw5+Dt6CBTTEEg5O7j7uLu8OgnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfO8e3u4u3gIPHo8fLl7OAvQmFja0VuZCc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Tl7O7t8fLw4Pbo/yc7CiAgICAkTGFuZy0+eydFbmQgVXNlciBTZXJ2aWNlJ30gICAgICAgICAgICAgICAgICAgID0gJ9Px6/Pj6CDn4CDq8ODp7egg7+7y8OXh6PLl6+gnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6uAg8ejx8uXs4C9Gcm9udEVuZCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ9Pv8ODi6+Xt6OUg7eAgyNInOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICfI0iDO7+Xw4Pbo6Cc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Du5eryJzsKICAgICRMYW5nLT57J1JlcG9ydGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzvL35fLt7vHyJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzuHz9+Xt6OUnOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICfO8e3u4uXtIOTu4+7i7vAnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICfE7vHy+u/t7vHyJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw/Dl+OroJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+gnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfC8OXs5SDn4CDi+ufx8uDt7uL/4uDt5Sc7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ8Lw5ezlIOfgIPDg5/Dl+ODi4O3lJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnwvDl7OUg5+Ag7vLj7uLu8Cc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hk5evq6C/y8ODt5+Dq9ujoJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNQ29yZS5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIElUU01Db3JlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfSVRTTUNvcmUucG0sdiAxLjUgMjAxMC8wNi8wMSAxOToyNToyMiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFc3RhdCBjcu10aWMnOwogICAgJExhbmctPnsnSW1wYWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXBhY3RlJzsKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5J30gPSAnRXN0YXQgY3LtdGljIDwtPiBJbXBhY3RlIDwtPiBQcmlvcml0YXQnOwogICAgJExhbmctPnsnYWxsb2NhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdhc3NpZ25hcic7CiAgICAkTGFuZy0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlbGV2YW50IHBlcic7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2xvdSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhcnQgZGUnOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZXDobiBkZSc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcXVlcml0IHBlcic7CiAgICAkTGFuZy0+eydDb25uZWN0ZWQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Nvbm5lY3RhdCBhJzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWx0ZXJuYXRpdmEgYSc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0VzdGF0IGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgPSAnRXN0YXQgYWN0dWFsIGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J0N1cnJlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnRXN0YXQgYWN0dWFsJzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVpLcByZWEnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICdUZW1wcyBt7W5pbSBlbnRyZSBpbmNpZGVudHMnOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICdWaXNp8yBnZW5lcmFsIGRlbCBzZXJ2ZWknOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWaXNp8yBnZW5lcmFsIGRlIFNMQSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ1NlcnZlaXMgYXNzb2NpYXRzJzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU0xBcyd9ICAgICAgICAgICAgICAgICAgICAgPSAnU0xBcyBhc3NvY2lhdHMnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aWRvcic7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9zdHJhY2nzJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVpIHVzdWFyaSBmaW5hbCc7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NsaWVudCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0dlc3Rp8yBJVCc7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ09wZXJhY2nzIElUJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWx0cmVzJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVjdGUnOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmZvcm1lcyc7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zvcm1hY2nzJzsKICAgICRMYW5nLT57J1VuZGVycGlubmluZyBDb250cmFjdCd9ICAgICAgICAgICAgICAgPSAnQ29udHJhY3RlIGRlIHN1cG9ydCc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc3BvbmliaWxpdGF0JzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXJyb3JzJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWx0cmVzJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVtcHMgZGUgcmVjdXBlcmFjafMnOwogICAgJExhbmctPnsnUmVzb2x1dGlvbiBSYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdQZXJjZW50YXRnZSBkZSByZXNvbHVjafMnOwogICAgJExhbmctPnsnUmVzcG9uc2UgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUZW1wcyBkZSByZXNwb3N0YSc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWNjaW9ucyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29yZS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29yZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyBDb3B5cmlnaHQgKEMpIDIwMTAgTzJCUy5jb20sIHMgci5vLiBKYWt1YiBIYW51cwojIC0tCiMgJElkOiBjel9JVFNNQ29yZS5wbSx2IDEuMTYgMjAxMC8wNi8wMSAxOToyNToyMiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnS3JpdGnobm9zdCc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZsaXYnOwogICAgJExhbmctPnsnQ3JpdGljYWxpdHkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHknfSA9ICdLcml0aehub3N0PC0+VmxpdjwtPlByaW9yaXRhJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAncPhpZOxsaXQnOwogICAgJExhbmctPnsnUmVsZXZhbnQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZWxldmFudG7tIGsnOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdaYWhybnVqZSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jhc3Qgeic7CiAgICAkTGFuZy0+eydEZXBlbmRzIG9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1phbGW+7SBuYSc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BvvmFkb3Zhbv0gcHJvJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3BvamVuIHMnOwogICAgJExhbmctPnsnQWx0ZXJuYXRpdmUgdG8nfSAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRlcm5hdGl2bu0gayc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YXYgSW5jaWRlbnR1JzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgPSAnU2916GFzbv0gU3RhdiBJbmNpZGVudHUnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTb3XoYXNu/SBTdGF2JzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvc3RvciDaZHK+YnknOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICdNaW5pbeFsbu0g6GFzIG1lemkgaW5jaWRlbnR5JzsKICAgICRMYW5nLT57J1NlcnZpY2UgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnUPhlaGxlZCBTbHW+YnknOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTTEEgUPhlaGxlZCc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ1D4afhhemVu6SBTbHW+YnknOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICdQ+Gn4YXplbukgU0xBIHNtbG91dnknOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICda4WtsYWRu7SByb3pocmFu7S9CYWNrRW5kJzsKICAgICRMYW5nLT57J0RlbW9uc3RyYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVWvhemthJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnU2x1vmJ5IGtvbmNvdv1tIHW+aXZhdGVs+W0nOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICda4Wthem5pY2vpIHJvemhyYW7tL0Zyb250RW5kJzsKICAgICRMYW5nLT57J0lUIE1hbmFnZW1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2O16ZW7tIElUJzsKICAgICRMYW5nLT57J0lUIE9wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgPSAnSVQgT3BlcmFjZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhbLntJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVrdCc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcG9ydGluZyc7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ6lrb2xlbu0nOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICda4WtsYWRu7SBzbWxvdXZhJzsKICAgICRMYW5nLT57J0F2YWlsYWJpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRG9zdHVwbm9zdCc7CiAgICAkTGFuZy0+eydFcnJvcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NoeWJ5JzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGFsue0nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfIYXMgT2Jub3Z5JzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnyGFzINhluWVu7Sc7CiAgICAkTGFuZy0+eydSZXNwb25zZSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8hhcyBPZHBvduxkaSc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWtjZSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNQ29yZS5wbSAtIHByb3ZpZGVzIGRhIChEYW5pc2gpIGxhbmd1YWdlIHRyYW5zbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkYV9JVFNNQ29yZS5wbSx2IDEuMSAyMDEwLzA2LzI1IDA4OjU2OjU3IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0tyaXRpa2FsaXRldCc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Dldmlya25pbmcnOwogICAgJExhbmctPnsnQ3JpdGljYWxpdHkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHknfSA9ICdLcml0aWthbGl0ZXQgPC0+IFDldmlya25pbmcgPC0+IFByaW9yaXRldCc7CiAgICAkTGFuZy0+eydhbGxvY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3RpbGRlbGUnOwogICAgJExhbmctPnsnUmVsZXZhbnQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZWxldmFudCBmb3InOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmRrbHVkZXJlJzsKICAgICRMYW5nLT57J1BhcnQgb2YnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVsIGFmJzsKICAgICRMYW5nLT57J0RlcGVuZHMgb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWZo5m5nZXIgYWYnOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdLcuZ2ZXMgZm9yJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRm9yYnVuZGV0IHRpbCc7CiAgICAkTGFuZy0+eydBbHRlcm5hdGl2ZSB0byd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdGVybmF0aXYgdGlsJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnSW5jaWRlbnQgdGlsc3RhbmQnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdOdXbmcmVuZGUgSW5jaWRlbnQgdGlsc3RhbmQnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdOdXbmcmVuZGUgdGlsc3RhbmQnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aWNlIG9tcuVkZSc7CiAgICAkTGFuZy0+eydNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMnfSAgICAgID0gJ01pbmltdW1zdGlkIG1lbGxlbSBJbmNpZGVudHMnOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aWNlIG92ZXJzaWd0JzsKICAgICRMYW5nLT57J1NMQSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU0xBIG92ZXJzaWd0JzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU2VydmljZXMnfSAgICAgICAgICAgICAgICAgPSAnVGlsa255dHRlZGUgc2VydmljZXMnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICdUaWxrbnl0dGVkZSBTTEFzJzsKICAgICRMYW5nLT57J0JhY2sgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmFja2VuZCc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9uc3RyYXRpb24nOwogICAgJExhbmctPnsnRW5kIFVzZXIgU2VydmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdLdW5kZXNlcnZpY2UnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcm9udGVuZCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIE1hbmFnZW1lbnQnOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJVCBvcGVyYXRpb25lbCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FuZHJlJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVrdCc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcG9ydGVyaW5nJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHLmbmluZyc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICAgICAgID0gJ1VuZGVybGlnZ2VuZGUga29udHJha3QnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdUaWxn5m5nZWxpZ2hlZCc7CiAgICAkTGFuZy0+eydFcnJvcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZlamwnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbmRyZSc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0dlbmV0YWJsZXJpbmdzdGlkJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnTPhzbmluZ3NyYXRlJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVha3Rpb25zdGlkJzsKICAgICRMYW5nLT57J1RyYW5zYWN0aW9ucyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHJhbnNha3Rpb25lcic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29yZS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db3JlLnBtLHYgMS4xNyAyMDEwLzA2LzAxIDE5OjI1OjIyIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLcml0aWthbGl05HQnOwogICAgJExhbmctPnsnSW1wYWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdXN3aXJrdW5nJzsKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5J30gPSAnS3JpdGlrYWxpdOR0IDwtPiBBdXN3aXJrdW5nIDwtPiBQcmlvcml05HQnOwogICAgJExhbmctPnsnYWxsb2NhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICd6dW9yZG5lbic7CiAgICAkTGFuZy0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgID0gJ1ByaW9yaXTkdCB6dW9yZG5lbic7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlbGV2YW50IGb8cic7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlaW5oYWx0ZXQnOwogICAgJExhbmctPnsnUGFydCBvZid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWlsIHZvbic7CiAgICAkTGFuZy0+eydEZXBlbmRzIG9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0jkbmd0IGFiIHZvbic7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlbvZ0aWd0IGb8cic7CiAgICAkTGFuZy0+eydDb25uZWN0ZWQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZlcmJ1bmRlbiBtaXQnOwogICAgJExhbmctPnsnQWx0ZXJuYXRpdmUgdG8nfSAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRlcm5hdGl2IHp1JzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnVm9yZmFsbHNzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdBa3R1ZWxsZXIgVm9yZmFsbHNzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdBa3R1ZWxsZXIgU3RhdHVzJzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmljZS1CZXJlaWNoJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ICAgICAgPSAnTWluZGVzdHplaXQgendpc2NoZW4gSW5jaWRlbnRzJzsKICAgICRMYW5nLT57J1NlcnZpY2UgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnU2VydmljZSDcYmVyc2ljaHQnOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTTEEg3GJlcnNpY2h0JzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU2VydmljZXMnfSAgICAgICAgICAgICAgICAgPSAnWnVnZWj2cmlnZSBTZXJ2aWNlcyc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICAgICAgID0gJ1p1Z2Vo9nJpZ2UgU0xBcyc7CiAgICAkTGFuZy0+eydCYWNrIEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JhY2tlbmQnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vbnN0cmF0aW9uJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnQW53ZW5kZXItU2VydmljZSc7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zyb250ZW5kJzsKICAgICRMYW5nLT57J0lUIE1hbmFnZW1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnSVQgTWFuYWdlbWVudCc7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIEJldHJpZWInOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnUHJvamVjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9qZWt0JzsKICAgICRMYW5nLT57J1JlcG9ydGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVwb3J0aW5nJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHJhaW5pbmcnOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWZXJm/GdiYXJrZWl0JzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRmVobGVyJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnV2llZGVyaGVyc3RlbGx1bmdzemVpdCc7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0z2c3VuZ3N6ZWl0JzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVha3Rpb25zemVpdCc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWt0aW9uZW4nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNQ29yZS5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIElUU01Db3JlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0lUU01Db3JlLnBtLHYgMS42IDIwMTAvMDYvMDEgMTk6MjU6MjIgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVXJnZW5jaWEnOwogICAgJExhbmctPnsnSW1wYWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXBhY3RvJzsKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5J30gPSAnVXJnZW5jaWEgPC0+IEltcGFjdG8gPC0+IFByaW9yaWRhZCc7CiAgICAkTGFuZy0+eydhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FzaWduYXInOwogICAgJExhbmctPnsnUHJpb3JpdHkgYWxsb2NhdGlvbid9ICAgICAgICAgICAgICAgICA9ICdBc2lnbmFyIHByaW9yaWRhZCc7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlbGV2YW50ZSBhJzsKICAgICRMYW5nLT57J0luY2x1ZGVzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5jbHV5ZSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhcnRlIGRlJzsKICAgICRMYW5nLT57J0RlcGVuZHMgb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVwZW5kZSBlbic7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcXVlcmlkbyBwYXJhJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ29uZWN0YWRvIGEnOwogICAgJExhbmctPnsnQWx0ZXJuYXRpdmUgdG8nfSAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRlcmFudGl2YSBhJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRXN0YWRvIGRlbCBJbmNpZGVudGUnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdFc3RhZG8gQWN0dWFsIGRlbCBJbmNpZGVudGUnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdFc3RhZG8gQWN0dWFsJzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJlYS1TZXJ2aWNpbyc7CiAgICAkTGFuZy0+eydNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMnfSAgICAgID0gJ03tbmltbyBUaWVtcG8gZW50cmUgSW5jaWRlbnRlcyc7CiAgICAkTGFuZy0+eydTZXJ2aWNlIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgID0gJ0Rlc2NyaXBjafNuIGRlIFNlcnZpY2lvcyc7CiAgICAkTGFuZy0+eydTTEEgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2NyaXBjafNuIGRlIFNMQSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ1NlcnZpY2lvcyBBc29jaWFkb3MnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICdTTEFzIEFzb2NpYWRvcyc7CiAgICAkTGFuZy0+eydCYWNrIEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9zdHJhY2nzbic7CiAgICAkTGFuZy0+eydFbmQgVXNlciBTZXJ2aWNlJ30gICAgICAgICAgICAgICAgICAgID0gJ1NlcnZpY2lvIGRlIFVzdWFyaW8gRmluYWwnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSVQgTWFuYWdlbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdBZG1pbmlzdHJhY2nzbiBkZSBUSSc7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ09wZXJhY2nzbiBkZSBUSSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ090cm8nOwogICAgJExhbmctPnsnUHJvamVjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm95ZWN0byc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luZm9ybWVzJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW50cmVuYW1pZW50byc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc3BvbmliaWxpZGFkJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXJyb3Jlcyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ090cm8nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUaWVtcG8gZGUgUmVjdXBlcmFjafNuJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnVGFzYSBkZSBSZXNvbHVjafNuJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGllbXBvIGRlIFJlc3B1ZXN0YSc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWNjaW9uZXMnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNQ29yZS5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLS0KIyAkSWQ6IGZhX0lUU01Db3JlLnBtLHYgMS4zIDIwMTAvMDYvMDEgMTk6MjU6MjIgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZmFfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KfZh9mF24zYqic7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in2KvYsSc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ9in2YfZhduM2KogPC0+INin2KvYsSA8LT4g2KfZiNmE2YjbjNiqJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KfYrtiq2LXYp9i1JzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYsdiq2KjYtyDYqNinJzsKICAgICRMYW5nLT57J0luY2x1ZGVzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYtNiq2YXZhCDYp9iz2Kog2KjYsSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2K7YtNuMINin2LInOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZiNin2KjYs9iq2Ycg2KfYs9iqINio2YcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfZhdmI2LHYryDZhtuM2KfYsiDYp9iz2Kog2KjYsdin24wnOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfZhdiq2LXZhCDYp9iz2Kog2KjZhyc7CiAgICAkTGFuZy0+eydBbHRlcm5hdGl2ZSB0byd9ICAgICAgICAgICAgICAgICAgICAgID0gJ9is2KfbjNqv2LLbjNmG24wg2KjYsdin24wnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINix2K7Yr9in2K8nOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINis2KfYsduMINix2K7Yr9in2K8nOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINis2KfYsduMJzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjYrti0INiz2LHZiNuM2LMnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICfYrdiv2KfZgtmEINiy2YXYp9mGINio24zZhiDYr9mIINix2K7Yr9in2K8nOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICfYrtmE2KfYtdmHINiz2LHZiNuM2LMnOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICfYrtmE2KfYtdmHIFNMQSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ9iz2LHZiNuM2LPigIzZh9in24wg2YXYsdiq2KjYtyc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICAgICAgID0gJ1NMQdmH2KfbjCDZhdix2KrYqNi3JzsKICAgICRMYW5nLT57J0JhY2sgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2b7YtNiqINi12K3ZhtmHJzsKICAgICRMYW5nLT57J0RlbW9uc3RyYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbZhdin24zYtCc7CiAgICAkTGFuZy0+eydFbmQgVXNlciBTZXJ2aWNlJ30gICAgICAgICAgICAgICAgICAgID0gJ9iz2LHZiNuM2LMg2qnYp9ix2KjYsSDZhtmH2KfbjNuMJzsKICAgICRMYW5nLT57J0Zyb250IEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KzZhNmIINi12K3ZhtmHJzsKICAgICRMYW5nLT57J0lUIE1hbmFnZW1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYr9uM2LHbjNiqIElUJzsKICAgICRMYW5nLT57J0lUIE9wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgPSAn2LnZhdmE24zYp9iqIElUJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZgtuM2YcnOwogICAgJExhbmctPnsnUHJvamVjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZvtix2YjamNmHJzsKICAgICRMYW5nLT57J1JlcG9ydGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2q/Ystin2LHYtNuMJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KLZhdmI2LLYtNuMJzsKICAgICRMYW5nLT57J1VuZGVycGlubmluZyBDb250cmFjdCd9ICAgICAgICAgICAgICAgPSAn2YLYsdin2LHYr9in2K8g2KLZhdin2K/ZhyDahtin2b4nOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICfZhduM2LLYp9mGINiv2LEg2K/Ys9iq2LHYsyDYqNmI2K/Zhic7CiAgICAkTGFuZy0+eydFcnJvcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iu2LfYp9mH2KcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYqNmC24zZhyc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9iy2YXYp9mGINio2YfYqNmI2K8nOwogICAgJExhbmctPnsnUmVzb2x1dGlvbiBSYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICfZhtix2K4g2K3ZhCDZhdiz2KbZhNmHJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2LLZhdin2YYg2b7Yp9iz2K7ar9mI24zbjCc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2LHYp9qp2YbYtOKAjNmH2KcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNQ29yZS5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9JVFNNQ29yZS5wbSx2IDEuNCAyMDEwLzA2LzAxIDE5OjI1OjIyIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NyaXRpY2l06Sc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcGFjdCc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ0NyaXRpY2l06SA8LT4gSW1wYWN0IDwtPiBQcmlvcml06Sc7CiAgICAkTGFuZy0+eydhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2FsbG91ZSc7CiAgICAkTGFuZy0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NvcnJlc3BvbmQg4Cc7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2x1cyc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhcnQgZGUnOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdE6XBlbmQgZGUnOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXF1aXMgcG91cic7CiAgICAkTGFuZy0+eydDb25uZWN0ZWQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xp6SDgJzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWx0ZXJuYXRpdmUg4Cc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YXQgZFwnaW5jaWRlbnQnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdFdGF0IGFjdHVlbCBkXCdpbmNpZGVudCc7CiAgICAkTGFuZy0+eydDdXJyZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YXQgYWN0dWVsJzsKICAgICRMYW5nLT57J1NlcnZpY2UtQXJlYSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnWm9uZSBkZSBzZXJ2aWNlJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ICAgICAgPSAnVGVtcHMgbWluaW1hbCBlbnRyZSBsZXMgaW5jaWRlbnRzJzsKICAgICRMYW5nLT57J1NlcnZpY2UgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnQXBlcud1IGRlcyBzZXJ2aWNlcyc7CiAgICAkTGFuZy0+eydTTEEgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FwZXLndSBkZXMgU0xBJzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU2VydmljZXMnfSAgICAgICAgICAgICAgICAgPSAnU2VydmljZXMgYXNzb2Np6XMnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICdTTEFzIGFzc29jaellcyc7CiAgICAkTGFuZy0+eydCYWNrIEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JhY2tlbmQnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdE6W1vbnN0cmF0aW9uJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnU2VydmljZSB1dGlsaXNhdGV1cic7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zyb250ZW5kJzsKICAgICRMYW5nLT57J0lUIE1hbmFnZW1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnR2VzdGlvbiBJVCc7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ09w6XJhdGlvbnMgSVQnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdXRyZSc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2pldCc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhcHBvcnQnOwogICAgJExhbmctPnsnVHJhaW5pbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGb3JtYXRpb24nOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICdDb250cmF0IGV4dGVybmUnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb25pYmlsaXTpJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXJyZXVycyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1dHJlJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVtcHMgZGUgculwYXJhdGlvbic7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ1RhdXggZGUgculzb2x1dGlvbic7CiAgICAkTGFuZy0+eydSZXNwb25zZSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbXBzIGRlIHLpcG9uc2UnOwogICAgJExhbmctPnsnVHJhbnNhY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdUcmFuc2FjdGlvbnMnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNQ29yZS5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db3JlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9JVFNNQ29yZS5wbSx2IDEuMyAyMDEwLzA2LzAxIDE5OjI1OjIyIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VyZ2VuemlhJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW1wYXR0byc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ1VyZ2VuemEgPC0+IEltcGF0dG8gPC0+IFByaW9yaXTgJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnYXNzZWduYXJlJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmlsZXZhbnRlIHBlcic7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2x1ZGUnOwogICAgJExhbmctPnsnUGFydCBvZid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXJ0ZSBkaSc7CiAgICAkTGFuZy0+eydEZXBlbmRzIG9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlcGVuZGUgZGEnOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdSaWNoaWVzdG8gcGVyJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ29ubmVzc28gYSc7CiAgICAkTGFuZy0+eydBbHRlcm5hdGl2ZSB0byd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdGVybmF0aXZvIGEnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdTdGF0byBkZWxsXCdJbmNpZGVudGUnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdTdGF0byBBdHR1YWxlIGRlbGxcJ0luY2lkZW50ZSc7CiAgICAkTGFuZy0+eydDdXJyZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YXRvIEF0dHVhbGUnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmVhLWRpLVNlcnZpemlvJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ICAgICAgPSAnTWluaW1vIFRlbXBvIFRyYSBJbmNpZGVudGknOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICdEZXNjcml6aW9uZSBkZWwgU2Vydml6aW8nOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEZXNjcml6aW9uZSBkZWxsbyBTTEEnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTZXJ2aWNlcyd9ICAgICAgICAgICAgICAgICA9ICdTZXJ2aXppIEFzc29jaWF0aSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICAgICAgID0gJ1NMQXMgQXNzb2NpYXRpJzsKICAgICRMYW5nLT57J0JhY2sgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmFjayBFbmQnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdEaW1vc3RyYXppb25lJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnU2Vydml6aW8gVXRlbnRlIEZpbmFsZSc7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zyb250IEVuZCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIE1hbmFnZW1lbnQnOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJVCBPcGVyYXRpb25hbCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZ2V0dG8nOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSYXBwb3J0aSc7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zvcm1hemlvbmUnOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb25pYmlsaXTgJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXJyb3JpJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWx0cm8nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUZW1wbyBkaSBSZWN1cGVybyc7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ1Rhc3NvIGRpIFJpc29sdXppb25lJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVtcG8gZGkgUmlzcG9zdGEnOwogICAgJExhbmctPnsnVHJhbnNhY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdUcmFuc2F6aW9uaSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNQ29yZS5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29yZQojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfSVRTTUNvcmUucG0sdiAxLjMgMjAxMC8wNi8wMSAxOToyNToyMiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVcmdlbnRpZSc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcGFjdCc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ1VyZ2VudGllIDwtPiBJbXBhY3QgPC0+IFByaW9yaXRlaXQnOwogICAgJExhbmctPnsnYWxsb2NhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICd0b2VrZW5uZW4nOwogICAgJExhbmctPnsnUHJpb3JpdHkgYWxsb2NhdGlvbid9ICAgICAgICAgICAgICAgICA9ICdQcmlvcml0ZWl0IHRvZWtlbm5lbic7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZhbiBiZWxhbmcgdm9vcic7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JldmF0JzsKICAgICRMYW5nLT57J1BhcnQgb2YnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT25kZXJkZWVsIHZhbic7CiAgICAkTGFuZy0+eydEZXBlbmRzIG9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FmaGFua2VsaWprIHZhbic7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Jlbm9kaWdkIHZvb3InOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWZXJib25kZW4gbWV0JzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWx0ZXJuYXRpZWYgdm9vcic7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50IHN0YXR1cyc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgID0gJ0h1aWRpZ2UgaW5jaWRlbnQgc3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnSHVpZGlnZSBzdGF0dXMnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aWNlLUFyZWEnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICdNaW5pbXVtdGlqZCB0dXNzZW4gaW5jaWRlbnRlbic7CiAgICAkTGFuZy0+eydTZXJ2aWNlIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgID0gJ1NlcnZpY2Utb3ZlcnppY2h0JzsKICAgICRMYW5nLT57J1NMQSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU0xBLW92ZXJ6aWNodCc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ0JpamJlaG9yZW5kZSBTZXJ2aWNlcyc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICAgICAgID0gJ0JpamJlaG9yZW5kZSBTTEFzJzsKICAgICRMYW5nLT57J0JhY2sgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmFja2VuZCc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9uc3RyYXRpb24nOwogICAgJExhbmctPnsnRW5kIFVzZXIgU2VydmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdFaW5kZ2VicnVpa2VyIHNlcnZpY2UnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcm9udGVuZCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIE1hbmFnZW1lbnQnOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJVCBPcGVyYXRpb25zJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVjdCc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhcHBvcnRhZ2UnOwogICAgJExhbmctPnsnVHJhaW5pbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUcmFpbmluZyc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICAgICAgID0gJ1VuZGVycGlubmluZyBDb250cmFjdCc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Jlc2NoaWtiYWFyaGVpZCc7CiAgICAkTGFuZy0+eydFcnJvcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZvdXRlbic7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0hlcnN0ZWx0aWpkJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnT3Bsb3N0aWpkJzsKICAgICRMYW5nLT57J1Jlc3BvbnNlIFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVzcG9uc2lldGlqZCc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWN0aWVzJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNQ29yZS5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0lUU01Db3JlLnBtLHYgMS42IDIwMTAvMDYvMDEgMTk6MjU6MjIgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5J30gPSAnJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2x1ZGVzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnWmF3aWVyYSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEZXBlbmRzIG9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1phbGW/bmUgb2QnOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3RyemVibmUgZG8nOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2SzsWN6b25lIGRvJzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnU3RhbiB6ZGFyemVuaWEnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdBa3R1YWxueSBzdGFuIHpkYXJ6ZW5pYSc7CiAgICAkTGFuZy0+eydDdXJyZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0FrdHVhbG55IHN0YW4nOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTZWtjamEgc2Vyd2lzb3dhJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ICAgICAgPSAnTWluaW1hbG55IGN6YXMgbWnqZHp5IHpkYXJ6ZW5pYW1pJzsKICAgICRMYW5nLT57J1NlcnZpY2UgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1NMQSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU2VydmljZXMnfSAgICAgICAgICAgICAgICAgPSAnUG+zsWN6b25lIHVzs3VnaSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICAgICAgID0gJ1Bvs7Fjem9uZSBTTEEnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vbnN0cmFjamEnOwogICAgJExhbmctPnsnRW5kIFVzZXIgU2VydmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSVQgTWFuYWdlbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbm5lJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVrdCc7CiAgICAkTGFuZy0+eydSZXBvcnRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhcG9ydG93YW5pZSc7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyZW5pbmcnOwogICAgJExhbmctPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEb3N06nBub7bmJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQrPqZHknOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbm5lJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQ3phcyBvZHp5c2thbmlhJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnQ3phcyByb3p3abF6YW5pYSc7CiAgICAkTGFuZy0+eydSZXNwb25zZSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0N6YXMgb2Rwb3dpZWR6aSc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYWtjamUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNQ29yZS5wbSAtIHRoZSBCcmF6aWxpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDEwIENyaXN0aWFubyBLb3JuZPZyZmVyLCBodHRwOi8vd3d3LmRvcmZlci5jb20uYnIvCiMgLS0KIyAkSWQ6IHB0X0JSX0lUU01Db3JlLnBtLHYgMS4yIDIwMTAvMDYvMDEgMTk6MjU6MjIgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ3JpdGljYWxpZGFkZSc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcGFjdG8nOwogICAgJExhbmctPnsnQ3JpdGljYWxpdHkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHknfSA9ICdDcml0aWNhbGlkYWRlIDwtPiBJbXBhY3RvIDwtPiBQcmlvcmlkYWRlJzsKICAgICRMYW5nLT57J2FsbG9jYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWxvY2FyJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnQWxvY2FyIHByaW9yaWRhZGUnOwogICAgJExhbmctPnsnUmVsZXZhbnQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZWxldmFudGUgYSc7CiAgICAkTGFuZy0+eydJbmNsdWRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2x1aSc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhcnRlIGRlJzsKICAgICRMYW5nLT57J0RlcGVuZHMgb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVwZW5kZSBkZSc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcXVpc2l0YWRvIHBvcic7CiAgICAkTGFuZy0+eydDb25uZWN0ZWQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NvbmVjdGFkbyBhJzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWx0ZXJuYXRpdmEgYSc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1NpdHVh5+NvIGRlIEluY2lkZW50ZXMnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICdTaXR1YefjbyBBdHVhbCBkZSBJbmNpZGVudGVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnU2l0dWHn428gQXR1YWwnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aedvLcFyZWEnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICdUZW1wbyBN7W5pbW8gZW50cmUgSW5jaWRlbnRlcyc7CiAgICAkTGFuZy0+eydTZXJ2aWNlIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgID0gJ1Jlc3VtbyBkbyBTZXJ2aedvJzsKICAgICRMYW5nLT57J1NMQSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVzdW1vIGRhIFNMQSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ1NlcnZp529zIEFzc29jaWFkb3MnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICdTTEFzIEFzc29jaWFkYXMnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vbnN0cmHn428nOwogICAgJExhbmctPnsnRW5kIFVzZXIgU2VydmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2aedvIGEgVXN14XJpbyBGaW5hbCc7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0dlcmVuY2lhbWVudG8gZGUgVEknOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYef1ZXMgZGUgVEknOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdXRybyc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2pldG8nOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZWxhdPNyaW8nOwogICAgJExhbmctPnsnVHJhaW5pbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUcmVpbmFtZW50byc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICAgICAgID0gJ0NvbnRyYXRvIGNvbSBUZXJjZWlyb3MgKFVDKSc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F2YWxpYWJpbGlkYWRlJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXJyb3MnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdXRybyc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbXBvIGRlIFJlY3VwZXJh5+NvJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnVGF4YSBkZSBSZXNvbHXn428nOwogICAgJExhbmctPnsnUmVzcG9uc2UgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUZW1wbyBkZSBSZXNwb3N0YSc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RyYW5zYef1ZXMnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNQ29yZS5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db3JlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0lUU01Db3JlLnBtLHYgMS40IDIwMTAvMDYvMDEgMTk6MjU6MjIgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnyvDo8uj37e7x8vwnOwogICAgJExhbmctPnsnSW1wYWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfC6+j/7ejlJzsKICAgICRMYW5nLT57J0NyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5J30gPSAnyvDo8uj37e7x8vwgPC0+IMLr6P/t6OUgPC0+IM/w6O7w6PLl8ic7CiAgICAkTGFuZy0+eydhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83g5+3g9+Xt6OUg7/Do7vDo8uXy7uIgJzsKICAgICRMYW5nLT57J1ByaW9yaXR5IGFsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnzvLt7vHo8vH/IOonOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfC6uv+9+Dl8ic7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hu8fLu6PIg6OcnOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfH4OLo8ejyIO7yJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIGZvcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn0vDl4fPl8vH/IOTr/yc7CiAgICAkTGFuZy0+eydDb25uZWN0ZWQgdG8nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hi/+fg7SDxJzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnx+Ds5e3gIOTr/yc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ9Hu8fLu/+3o5SDo7fbo5OXt8uAnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICA9ICfS5erz+eXlIPHu8fLu/+3o5SDo7fbo5OXt8uAnOwogICAgJExhbmctPnsnQ3VycmVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfS5erz+eXlIPHu8fLu/+3o5Sc7CiAgICAkTGFuZy0+eydTZXJ2aWNlLUFyZWEnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ87h5+7wIPHl8OLo8e7iJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ICAgICAgPSAnzOjt6Ozg6/zt7uUg4vDl7P8g7OXm5PMg6O326OTl7fLg7OgnOwogICAgJExhbmctPnsnU2VydmljZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICA9ICfO4efu8CDx5fDi6PHu4ic7CiAgICAkTGFuZy0+eydTTEEgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ87h5+7wIFNMQSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ9Hi/+fg7e375SDx5fDi6PH7JzsKICAgICRMYW5nLT57J0Fzc29jaWF0ZWQgU0xBcyd9ICAgICAgICAgICAgICAgICAgICAgPSAn0eL/5+Dt7fvlIFNMQSc7CiAgICAkTGFuZy0+eydCYWNrIEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8OLl8O3g/yD34PHy/Cc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Tl7O7t8fLw4Pbo/yc7CiAgICAkTGFuZy0+eydFbmQgVXNlciBTZXJ2aWNlJ30gICAgICAgICAgICAgICAgICAgID0gJ8ru7eX37fvpIPHl8OLo8SDv7uv85+7i4PLl6/8nOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfI7fLl8PTl6fHt4P8g9+Dx8vwnOwogICAgJExhbmctPnsnSVQgTWFuYWdlbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfT7/Dg4uvl7ejlIMjSJzsKICAgICRMYW5nLT57J0lUIE9wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgPSAn3erx7+vz4PLg9uj/IMjSJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+7lJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+vg7ejw7uLg7ejlJzsKICAgICRMYW5nLT57J1JlcG9ydGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0e7x8uDi6+Xt6OUg7vL35fLu4ic7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87h8/fl7ejlJzsKICAgICRMYW5nLT57J1VuZGVycGlubmluZyBDb250cmFjdCd9ICAgICAgICAgICAgICAgPSAnyu7t8vDg6vIg7+7k5OXw5uroJzsKICAgICRMYW5nLT57J0F2YWlsYWJpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnxO7x8vPv7e7x8vwnOwogICAgJExhbmctPnsnRXJyb3JzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfO+Ojh6ugnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfC8OXs/yDi7vHx8uDt7uLr5e3o/yc7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ87y7e7x6PLl6/zt4P8g8eru8O7x8vwg8OX45e3o/yc7CiAgICAkTGFuZy0+eydSZXNwb25zZSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Lw5ez/IPDl4Or26OgnOwogICAgJExhbmctPnsnVHJhbnNhY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfU6O3g7fHu4vvlIO7v5fDg9ujoJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNQ29yZS5wbSAtIHRoZSBDaGluZXNlIHNpbXBsZSB0cmFuc2xhdGlvbiBvZiBJVFNNQ29yZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogemhfQ05fSVRTTUNvcmUucG0sdiAxLjQgMjAxMC8wNi8wMSAxOToyNToyMiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfOo7yxs8y2yCc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Owz+y2yCc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ86jvLGzzLbIIDwtPiDTsM/stsggPC0+INPFz8i8trHwJzsKICAgICRMYW5nLT57J2FsbG9jYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnt9bF5Cc7CiAgICAkTGFuZy0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSZWxldmFudCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/gudgnOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICew/MCoJzsKICAgICRMYW5nLT57J1BhcnQgb2YnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnsr+31tPaJzsKICAgICRMYW5nLT57J0RlcGVuZHMgb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyKG+9tPaJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIGZvcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnsdjQ6LXEJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnway907W9JzsKICAgICRMYW5nLT57J0FsdGVybmF0aXZlIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAn0aHU8bbUz/MnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICfKwrz+17TMrCc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgID0gJ7Wxx7DKwrz+17TMrCc7CiAgICAkTGFuZy0+eydDdXJyZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8/W17QnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICe3/s7xx/gnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gICAgICA9ICfX7rbMtcTKsbzk0+vKwrz+JzsKICAgICRMYW5nLT57J1NlcnZpY2UgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnt/7O8bjFyvYnOwogICAgJExhbmctPnsnU0xBIE92ZXJ2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTTEEguMXK9ic7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gICAgICAgICAgICAgICAgID0gJ7nYwaq1xLf+zvEnOwogICAgJExhbmctPnsnQXNzb2NpYXRlZCBTTEFzJ30gICAgICAgICAgICAgICAgICAgICA9ICe52MGqtcQgU0xBcyc7CiAgICAkTGFuZy0+eydCYWNrIEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7rztssnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfKvre2JzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAn1+7W1dPDu6e3/s7xJzsKICAgICRMYW5nLT57J0Zyb250IEVuZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnx7C2yyc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICAgICAgID0gJ0lUILncwO0nOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJVCDUy9OqJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxuTL/Cc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/uxL8nOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICexqLjmJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0bXBtyc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICAgICAgID0gJ9LAvt26z82sJzsKICAgICRMYW5nLT57J0F2YWlsYWJpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnuam79cfpv/YnOwogICAgJExhbmctPnsnRXJyb3JzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICe07c7zJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxuTL/Cc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ7vWuLTKsbzkJzsKICAgICRMYW5nLT57J1Jlc29sdXRpb24gUmF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnveK+9r34tsgnOwogICAgJExhbmctPnsnUmVzcG9uc2UgVGltZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfP7NOmyrG85Cc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ7270tcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNJUEFsbG9jYXRlLnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQ4OjM1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JVFNNQ0lQQWxsb2NhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UHJpb3JpdHlPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDSVBBbGxvY2F0ZScgKSB7CgogICAgICAgICMgZ2V0IG9wdGlvbiBsaXN0cwogICAgICAgIG15ICVPYmplY3RPcHRpb247CiAgICAgICAgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJE9iamVjdE9wdGlvbntJbXBhY3RMaXN0fSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICBteSAlT3B0aW9uUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntQcmlvcml0eU9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkT2JqZWN0T3B0aW9ue1ByaW9yaXR5TGlzdH0gPSBcJU9wdGlvblByaW9yaXR5TGlzdDsKCiAgICAgICAgIyBnZXQgYWxsIFByaW9yaXR5SURzIG9mIHRoZSBtYXRyaXgKICAgICAgICBteSAkQWxsb2NhdGVEYXRhOwogICAgICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gfSApIHsKCiAgICAgICAgICAgIENSSVRJQ0FMSVRZSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ3JpdGljYWxpdHlJRCAoIGtleXMgJXsgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZm9ybSBwYXJhbQogICAgICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gIlByaW9yaXR5SUQiIC4gJEltcGFjdElEIC4gJy0nIC4gJENyaXRpY2FsaXR5SUQKICAgICAgICAgICAgICAgICkgfHwgJyc7CgogICAgICAgICAgICAgICAgbmV4dCBDUklUSUNBTElUWUlEIGlmICEkUHJpb3JpdHlJRDsKCiAgICAgICAgICAgICAgICAkQWxsb2NhdGVEYXRhLT57JEltcGFjdElEfS0+eyRDcml0aWNhbGl0eUlEfSA9ICRQcmlvcml0eUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBhbGxvY2F0aW9ucwogICAgICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICAgICAgQWxsb2NhdGVEYXRhID0+ICRBbGxvY2F0ZURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb3B0aW9uIGxpc3RzCiAgICAgICAgbXkgJU9iamVjdE9wdGlvbjsKICAgICAgICAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgIG15ICVPcHRpb25Qcmlvcml0eUxpc3QgPSAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9IFwlT3B0aW9uUHJpb3JpdHlMaXN0OwoKICAgICAgICAjIGdldCBhbGxvY2F0aW9uIGRhdGEKICAgICAgICBteSAkQWxsb2NhdGVEYXRhID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFsbG9jYXRlTWF0cml4OwogICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bMF0tPntDbGFzc30gPSAnRGVzY3JpcHRpb24nOwoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlIGRlc2NyaXB0aW9uIChJbXBhY3QpCiAgICAgICAgbXkgJENvdW50ZXIxID0gMTsKICAgICAgICBmb3IgbXkgJEltcGFjdCAoCiAgICAgICAgICAgIHNvcnQgeyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGF9IGNtcCAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0VHlwZX0gICA9ICdJbXBhY3QnOwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskQ291bnRlcjFdLT5bMF0tPntJbXBhY3RLZXl9ICAgID0gJEltcGFjdDsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0T3B0aW9ufSA9ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH17JEltcGFjdH07CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRDb3VudGVyMV0tPlswXS0+e0NsYXNzfSAgICAgICAgPSAnRGVzY3JpcHRpb24nOwogICAgICAgICAgICAkQ291bnRlcjErKzsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgdGFibGUgZGVzY3JpcHRpb24gKENyaXRpY2FsaXR5KQogICAgICAgIG15ICRDb3VudGVyMiA9IDE7CiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eSAoCiAgICAgICAgICAgIHNvcnQgeyAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0tPnskYX0gY21wICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fS0+eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ291bnRlcjJdLT57T2JqZWN0VHlwZX0gICAgID0gJ0NyaXRpY2FsaXR5JzsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ291bnRlcjJdLT57Q3JpdGljYWxpdHlLZXl9ID0gJENyaXRpY2FsaXR5OwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntPYmplY3RPcHRpb259CiAgICAgICAgICAgICAgICA9ICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fXskQ3JpdGljYWxpdHl9OwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntDbGFzc30gPSAnRGVzY3JpcHRpb24nOwogICAgICAgICAgICAkQ291bnRlcjIrKzsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgY29udGVudAogICAgICAgIGZvciBteSAkUm93ICggMSAuLiAoICRDb3VudGVyMSAtIDEgKSApIHsKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCAxIC4uICggJENvdW50ZXIyIC0gMSApICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBrZXlzCiAgICAgICAgICAgICAgICBteSAkSW1wYWN0S2V5ICAgICAgPSAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WzBdLT57SW1wYWN0S2V5fTsKICAgICAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUtleSA9ICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvbHVtbl0tPntDcml0aWNhbGl0eUtleX07CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgb3B0aW9uIHN0cmluZwogICAgICAgICAgICAgICAgbXkgJE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ByaW9yaXR5SUQnIC4gJEltcGFjdEtleSAuICctJyAuICRDcml0aWNhbGl0eUtleSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBbGxvY2F0ZURhdGEtPnskSW1wYWN0S2V5fXskQ3JpdGljYWxpdHlLZXl9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WyRDb2x1bW5dLT57T3B0aW9uU3RyZ30gPSAkT3B0aW9uU3RyZzsKICAgICAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0tPntDbGFzc30gICAgICA9ICdDb250ZW50JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYWxsb2NhdGlvbiBtYXRyaXgKICAgICAgICBmb3IgbXkgJFJvd1JlZiAoIEB7JEFsbG9jYXRlTWF0cml4fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NJUEFsbG9jYXRlUm93JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JFJvd1JlZn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NJUEFsbG9jYXRlUm93Q29sdW1uJyAuICRDZWxsLT57Q2xhc3N9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENlbGwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01DSVBBbGxvY2F0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU2VydmljZS5wbSAtIGFkbWluIGZyb250ZW5kIHRvIG1hbmFnZSBzZXJ2aWNlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TZXJ2aWNlLnBtLHYgMS4yIDIwMDkvMDYvMzAgMTQ6NTA6MjQgdWIgRXhwICQKIyAkT2xkSWQ6IEFkbWluU2VydmljZS5wbSx2IDEuMTcgMjAwOS8wNC8yMiAxNDo0MjowMiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXJ2aWNlIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXJ2aWNlRWRpdCcgKSB7CiAgICAgICAgbXkgJVNlcnZpY2VEYXRhOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKTsKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9IG5lICdORVcnICkgewogICAgICAgICAgICAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgUGFyZW50T3B0aW9uU3RyZwogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdQYXJlbnRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgRGlzYWJsZWRCcmFuY2ggPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBnZW5lcmF0ZSBUeXBlT3B0aW9uU3RyZwogICAgICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgICk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1R5cGVPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFR5cGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZXJ2aWNlRGF0YXtUeXBlSUR9LAogICAgICAgICk7CiAgICAgICAgIyBnZW5lcmF0ZSBDcml0aWNhbGl0eU9wdGlvblN0cmcKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRDcml0aWNhbGl0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eUlEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VydmljZURhdGF7VmFsaWRJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzZXJ2aWNlIGVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVTZXJ2aWNlRGF0YSwgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZWFjaCBwcmVmZXJlbmNlcyBzZXR0aW5nCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2VydmljZVByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTZXJ2aWNlUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6U2VydmljZVByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBTZXJ2aWNlRGF0YSA9PiBcJVNlcnZpY2VEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICB8fCByZWYoICRQcmVmZXJlbmNlc3skSXRlbX0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW1JdGVtLT57J09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skSXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skSXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VydmljZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlcnZpY2Ugc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlcnZpY2VTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW07CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBmb3IgKHF3KFNlcnZpY2VJRCBQYXJlbnRJRCBOYW1lIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICBmb3IgKHF3KFNlcnZpY2VJRCBQYXJlbnRJRCBOYW1lIFZhbGlkSUQgQ29tbWVudCBUeXBlSUQgQ3JpdGljYWxpdHlJRCkpIHsKIyAtLS0KICAgICAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVVwZGF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTZXJ2aWNlUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NlcnZpY2VQcmVmZXJlbmNlcycpIH07CiAgICAgICAgfQogICAgICAgIGZvciBteSAkSXRlbSAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEl0ZW19LT57TW9kdWxlfQogICAgICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpTZXJ2aWNlUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE5vdGU7CiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggU2VydmljZURhdGEgPT4gXCVTZXJ2aWNlRGF0YSApOwogICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkT2JqZWN0LT5SdW4oIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sIFNlcnZpY2VEYXRhID0+IFwlU2VydmljZURhdGEgKSApIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXJ2aWNlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIGVuYWJsZWQgdG8gdXNlIGl0IGhlcmUKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRUZXh0eyJZb3UgbmVlZCB0byBhY3RpdmF0ZSAlcyBmaXJzdCB0byB1c2UgaXQhIiwgIlNlcnZpY2UifScsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5TeXNDb25maWcmU3ViYWN0aW9uPUVkaXQmU3lzQ29uZmlnR3JvdXA9VGlja2V0JlN5c0NvbmZpZ1N1Ykdyb3VwPUNvcmU6OlRpY2tldCNUaWNrZXQ6OlNlcnZpY2UiJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGFkZCBzdWZmaXggZm9yIGNvcnJlY3Qgc29ydGluZwogICAgICAgIGZvciAoIGtleXMgJVNlcnZpY2VMaXN0ICkgewogICAgICAgICAgICAkU2VydmljZUxpc3R7JF99IC49ICc6Oic7CiAgICAgICAgfQogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQgeyAkU2VydmljZUxpc3R7JGF9IGNtcCAkU2VydmljZUxpc3R7JGJ9IH0ga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCAkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnICkgewogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGxldmVsIHNwYWNlCiAgICAgICAgICAgICAgICBteSBARnJhZ21lbnQgICA9IHNwbGl0ICc6OicsICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgICAgICAgICAgICAgIG15ICRMZXZlbCAgICAgID0gc2NhbGFyIEBGcmFnbWVudCAtIDE7CiAgICAgICAgICAgICAgICBteSAkTGV2ZWxTcGFjZSA9ICcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnIHggJExldmVsOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlU2VydmljZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIExldmVsU3BhY2UgPT4gJExldmVsU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCAgICAgID0+ICRWYWxpZExpc3R7ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlU2VydmljZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgPT4gJFZhbGlkTGlzdHsgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2UnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU0xBLnBtIC0gYWRtaW4gZnJvbnRlbmQgdG8gbWFuYWdlIHNsYXMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluU0xBLnBtLHYgMS41IDIwMDkvMDYvMzAgMTQ6NDk6NDMgdWIgRXhwICQKIyAkT2xkSWQ6IEFkbWluU0xBLnBtLHYgMS4yMCAyMDA5LzAyLzE3IDIzOjM3OjExIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluU0xBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NMQU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzbGEgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NMQUVkaXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlU0xBRGF0YTsKICAgICAgICAkU0xBRGF0YXtTTEFJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTTEFJRCcgKTsKCiAgICAgICAgaWYgKCAkU0xBRGF0YXtTTEFJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBzbGEgZGF0YQogICAgICAgICAgICAlU0xBRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICAgICAgU0xBSUQgID0+ICRTTEFEYXRhe1NMQUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU0xBRGF0YXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgU2VydmljZU9wdGlvblN0cmcKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU0xBRGF0YXtTZXJ2aWNlSURzfSB8fCBbXSwKICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBnZW5lcmF0ZSBUeXBlT3B0aW9uU3RyZwogICAgICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkVHlwZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNMQURhdGF7VHlwZUlEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIGdlbmVyYXRlIENhbGVuZGFyT3B0aW9uU3RyZwogICAgICAgIG15ICVDYWxlbmRhckxpc3Q7CiAgICAgICAgZm9yICggJycsIDEgLi4gNTAgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpbWVWYWNhdGlvbkRheXM6OkNhbGVuZGFyJF8iKSApIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhckxpc3R7JF99ID0gIkNhbGVuZGFyICRfIC0gIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICJUaW1lWm9uZTo6Q2FsZW5kYXIiIC4gJF8gLiAiTmFtZSIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU0xBRGF0YXtDYWxlbmRhck9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhbGVuZGFyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTTEFEYXRhe0NhbGVuZGFyfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZ5TGV2ZWxMaXN0ID0gKAogICAgICAgICAgICAxMCA9PiAnMTAlJywKICAgICAgICAgICAgMjAgPT4gJzIwJScsCiAgICAgICAgICAgIDMwID0+ICczMCUnLAogICAgICAgICAgICA0MCA9PiAnNDAlJywKICAgICAgICAgICAgNTAgPT4gJzUwJScsCiAgICAgICAgICAgIDYwID0+ICc2MCUnLAogICAgICAgICAgICA3MCA9PiAnNzAlJywKICAgICAgICAgICAgODAgPT4gJzgwJScsCiAgICAgICAgICAgIDkwID0+ICc5MCUnLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTm90aWZ5TGV2ZWxMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VOb3RpZnknLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7VXBkYXRlTm90aWZ5T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVOb3RpZnlMZXZlbExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVXBkYXRlTm90aWZ5JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTTEFEYXRhe1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7U29sdXRpb25Ob3RpZnlPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJU5vdGlmeUxldmVsTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTb2x1dGlvbk5vdGlmeScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU0xBRGF0YXtTb2x1dGlvbk5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICAkU0xBRGF0YXtWYWxpZE9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNMQURhdGF7VmFsaWRJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzbGEgZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEFFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZWFjaCBwcmVmZXJlbmNlcyBzZXR0aW5nCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU0xBUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NMQVByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlNMQVByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBTTEFEYXRhID0+IFwlU0xBRGF0YSApOwogICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEFJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmKCAkUGFyYW1JdGVtLT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVmKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+eydPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0Jsb2NrfSB8fCAnT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2xhIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTTEFTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbSAoCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgcXcoU0xBSUQgTmFtZSBDYWxlbmRhciBGaXJzdFJlc3BvbnNlVGltZSBGaXJzdFJlc3BvbnNlTm90aWZ5IFNvbHV0aW9uVGltZSBTb2x1dGlvbk5vdGlmeSBVcGRhdGVUaW1lIFVwZGF0ZU5vdGlmeSBWYWxpZElEIENvbW1lbnQpCiAgICAgICAgICAgIHF3KFNMQUlEIE5hbWUgQ2FsZW5kYXIgRmlyc3RSZXNwb25zZVRpbWUgRmlyc3RSZXNwb25zZU5vdGlmeSBTb2x1dGlvblRpbWUgU29sdXRpb25Ob3RpZnkgVXBkYXRlVGltZSBVcGRhdGVOb3RpZnkgVmFsaWRJRCBDb21tZW50IFR5cGVJRCBNaW5UaW1lQmV0d2VlbkluY2lkZW50cykKIyAtLS0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VydmljZSBpZHMKICAgICAgICBteSBAU2VydmljZUlEcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRHMnICk7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRHN9ID0gXEBTZXJ2aWNlSURzOwoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBpZiAoICEkR2V0UGFyYW17U0xBSUR9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgc2xhCiAgICAgICAgICAgICRHZXRQYXJhbXtTTEFJRH0gPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTTEFJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHNsYQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBVXBkYXRlKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIG15ICVTTEFEYXRhID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFHZXQoCiAgICAgICAgICAgIFNMQUlEICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU0xBUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NMQVByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlNMQVByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRJdGVtfSwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICROb3RlOwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIFNMQURhdGEgPT4gXCVTTEFEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISRPYmplY3QtPlJ1biggR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwgU0xBRGF0YSA9PiBcJVNMQURhdGEgKSApIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNsYSBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBlbmFibGVkIHRvIHVzZSBpdCBoZXJlCiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICckVGV4dHsiWW91IG5lZWQgdG8gYWN0aXZhdGUgJXMgZmlyc3QgdG8gdXNlIGl0ISIsICJTZXJ2aWNlIn0nLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ0dyb3VwPVRpY2tldCZTeXNDb25maWdTdWJHcm91cD1Db3JlOjpUaWNrZXQjVGlja2V0OjpTZXJ2aWNlIicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEFMaXN0ID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBTTEFJRDoKICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCB7IGxjICRTTEFMaXN0eyRhfSBjbXAgbGMgJFNMQUxpc3R7JGJ9IH0ga2V5cyAlU0xBTGlzdCApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCB0aGUgc2xhIGRhdGEKICAgICAgICAgICAgbXkgJVNMQURhdGEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCB0aGUgc2VydmljZSBsaXN0CiAgICAgICAgICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKAogICAgICAgICAgICAgICAgc29ydCB7IGxjICRTZXJ2aWNlTGlzdHskYX0gY21wIGxjICRTZXJ2aWNlTGlzdHskYn0gfQogICAgICAgICAgICAgICAgQHsgJFNMQURhdGF7U2VydmljZUlEc30gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9IHx8ICctJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgbGlzdCByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRTZXJ2aWNlTGlzdFswXSB8fCAnLScsCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRTTEFEYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBTTEFJRCBpZiBzY2FsYXIgQFNlcnZpY2VMaXN0IDw9IDE7CgogICAgICAgICAgICAjIHJlbW92ZSB0aGUgZmlyc3Qgc2VydmljZSBpZAogICAgICAgICAgICBzaGlmdCBAU2VydmljZUxpc3Q7CgogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBsaXN0IHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2UucG0gLSB0aGUgT1RSUzo6SVRTTSBTZXJ2aWNlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZS5wbSx2IDEuNyAyMDEwLzA0LzEzIDEyOjMwOjIxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3IgbXkgJFNlcnZpY2UgKCB2YWx1ZXMgJVNlcnZpY2VMaXN0ICkgewogICAgICAgICRTZXJ2aWNlIC49ICc6Oic7CiAgICB9CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyBjaGVjayBpZiB0cmVldmlldyBpcyBlbmFibGVkCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCB7ICRTZXJ2aWNlTGlzdHskYX0gY21wICRTZXJ2aWNlTGlzdHskYn0gfSBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgIyBzZXQgb3V0cHV0IG9iamVjdAogICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICBpZiAoJFRyZWVWaWV3KSB7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBsZXZlbCBzcGFjZQogICAgICAgICAgICBteSBARnJhZ21lbnQgICA9IHNwbGl0ICc6OicsICRTZXJ2aWNle05hbWV9OwogICAgICAgICAgICBteSAkTGV2ZWwgICAgICA9IHNjYWxhciBARnJhZ21lbnQgLSAxOwogICAgICAgICAgICBteSAkTGV2ZWxTcGFjZSA9ICcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnIHggJExldmVsOwoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBMZXZlbFNwYWNlICAgID0+ICRMZXZlbFNwYWNlLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZXJ2aWNle05hbWV9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICAgICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgICA9PiAnT3ZlcnZpZXcnLAogICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2VQcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBzZXJ2aWNlIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVByaW50LnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NDg6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01TZXJ2aWNlUHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1BERk9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlcnZpY2VJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gU2VydmljZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNlcnZpY2V7U2VydmljZUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZUlEICRTZXJ2aWNlSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2xhIGxpc3QKICAgIG15ICVTTEFMaXN0ID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXtTZXJ2aWNlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZGF0YSAoY3JlYXRlIGJ5KQogICAgbXkgJUNyZWF0ZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTZXJ2aWNle0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBkYXRhIChjaGFuZ2UgYnkpCiAgICBteSAlQ2hhbmdlQnkgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICVQYWdlOwogICAgICAgIG15ICRVcmwgPSAnICc7CiAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSApIHsKICAgICAgICAgICAgJFVybAogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSHR0cFR5cGUnKSAuICc6Ly8nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgICAgIC4gJEVOVntSRVFVRVNUX1VSSX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KICAgICAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAgICAgJFBhZ2V7TWFyZ2luUmlnaHR9ICA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAgICAgJFBhZ2V7SGVhZGVyUmlnaHR9ICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJyk7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSA9ICRTZXJ2aWNle05hbWVTaG9ydH07CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgncHJpbnRlZCBieScpIC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAkVXJsOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50TmV3KAogICAgICAgICAgICBUaXRsZSAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkU2VydmljZXtOYW1lU2hvcnR9LAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgZ2VuZXJhbCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0R2VuZXJhbEluZm9zKAogICAgICAgICAgICBQYWdlICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFNlcnZpY2UgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gXCVDcmVhdGVCeSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gXCVDaGFuZ2VCeSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBhc3NvY2lhdGVkIHNsYXMKICAgICAgICBpZiAoJVNMQUxpc3QpIHsKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRBc3NvY2lhdGVkU0xBcygKICAgICAgICAgICAgICAgIFBhZ2UgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgU0xBTGlzdCA9PiBcJVNMQUxpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBkZXRhaWxlZCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0RGV0YWlsZWRJbmZvcygKICAgICAgICAgICAgUGFnZSAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFNlcnZpY2UgPT4gXCVTZXJ2aWNlLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpbGUgbmFtZQogICAgICAgIG15ICRGaWxlbmFtZSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVuYW1lQ2xlYW5VcCgKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CgogICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnc2VydmljZV8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkU2VydmljZXtOYW1lU2hvcnR9ICk7CgogICAgICAgICMgb3V0cHV0IGFzc29jaWF0ZWQgc2xhcwogICAgICAgIGlmICgga2V5cyAlU0xBTGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAiQXNzb2NpYXRlZFNMQXMiICk7CiAgICAgICAgICAgIGZvciBteSAkU0xBSUQgKCBzb3J0IGtleXMgJVNMQUxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIkFzc29jaWF0ZWRTTEFzUm93IiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkU0xBTGlzdHskU0xBSUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNU2VydmljZVByaW50JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckxvZ2luICAgICA9PiAkQ3JlYXRlQnl7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckZpcnN0bmFtZSA9PiAkQ3JlYXRlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMYXN0bmFtZSAgPT4gJENyZWF0ZUJ5e1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJMb2dpbiAgICAgPT4gJENoYW5nZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJGaXJzdG5hbWUgPT4gJENoYW5nZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTGFzdG5hbWUgID0+ICRDaGFuZ2VCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgJVNlcnZpY2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dEdlbmVyYWxJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhQYWdlIFNlcnZpY2UgQ3JlYXRlQnkgQ2hhbmdlQnkpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZpY2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57TmFtZVNob3J0fSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57Q3VySW5jaVN0YXRlfSwKICAgICAgICB9LAogICAgXTsKCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte1NlcnZpY2V9IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTZXJ2aWNlfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGFzdCBjaGFuZ2VkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JFdmVufSAgPSAnI0FBQUFBQSc7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JPZGR9ICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dERldGFpbGVkSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTZXJ2aWNlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0YWJsZQogICAgbXkgJFRhYmxlID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZpY2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U2VydmljZX0tPntUeXBlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtTZXJ2aWNlfS0+e0NyaXRpY2FsaXR5fSApLAogICAgICAgIH0sCiAgICBdOwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93cyA9IEB7JFRhYmxlfTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gICAgICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXNzb2NpYXRlZFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTTEFMaXN0KSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdlbmVyYXRlIHRhYmxlIGRhdGEKICAgIGZvciBteSAkU0xBSUQgKCBzb3J0IGtleXMgJXsgJFBhcmFte1NMQUxpc3R9IH0gKSB7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NMQScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkUGFyYW17U0xBTGlzdH0tPnskU0xBSUR9OwogICAgICAgICRSb3crKzsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQXNzb2NpYXRlZCBTTEFzJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIHRhYmxlIHBhcmFtcwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2Vab29tLnBtIC0gdGhlIE9UUlM6OklUU00gU2VydmljZSB6b29tIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVpvb20ucG0sdiAxLjYgMjAwOS8xMC8wNiAyMDoyOTozMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNlcnZpY2Vab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TGlua09iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlcnZpY2VJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gU2VydmljZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNlcnZpY2V7U2VydmljZUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZUlEICRTZXJ2aWNlSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIH07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VsZi0+e1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMDsKCiAgICAjIGdldCBzbGEgbGlzdAogICAgbXkgJVNMQUxpc3QgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxpc3QoCiAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoJVNMQUxpc3QpIHsKICAgICAgICAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMTsKCiAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCB7ICRTTEFMaXN0eyRhfSBjbXAgJFNMQUxpc3R7JGJ9IH0ga2V5cyAlU0xBTGlzdCApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEFSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVNMQSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgS2V5ICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0YWJsZSB2aWV3IG1vZGUKICAgIG15ICRMaW5rVGFibGVWaWV3TW9kZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0OjpWaWV3TW9kZScpOwoKICAgICMgY3JlYXRlIHRoZSBsaW5rIHRhYmxlCiAgICBteSAkTGlua1RhYmxlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICApOwoKICAgICMgb3V0cHV0IHRoZSBsaW5rIHRhYmxlCiAgICBpZiAoJExpbmtUYWJsZVN0cmcpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dEhvcml6b250YWxSdWxlciA9IDE7CiAgICB9CgogICAgIyBvdXRwdXQgaG9yaXpvbnRhbCBydWxlcgogICAgaWYgKCRPdXRwdXRIb3Jpem9udGFsUnVsZXIpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIb3Jpem9udGFsUnVsZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRTZXJ2aWNleyAnQ3JlYXRlJyAuICRQb3N0Zml4IH0gPSAkQ3JlYXRlVXNlcnskUG9zdGZpeH07CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHVzZXIgZGF0YQogICAgbXkgJUNoYW5nZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRTZXJ2aWNleyAnQ2hhbmdlJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlVXNlcnskUG9zdGZpeH07CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TZXJ2aWNlWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQS5wbSAtIHRoZSBPVFJTOjpJVFNNIFNMQSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQS5wbSx2IDEuNCAyMDA5LzA1LzE4IDA5OjQ4OjM1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU0xBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTTEE7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTTEFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgZ2V0IHNsYSBsaXN0CiAgICBteSAlU0xBTGlzdCA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgIGZvciBteSAkU0xBSUQgKCBzb3J0IHsgJFNMQUxpc3R7JGF9IGNtcCAkU0xBTGlzdHskYn0gfSBrZXlzICVTTEFMaXN0ICkgewoKICAgICAgICAjIHNldCBvdXRwdXQgb2JqZWN0CiAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAjIGdldCBzbGEgZGF0YQogICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgU0xBSUQgID0+ICRTTEFJRCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVNMQSwKICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlICAgPT4gJ092ZXJ2aWV3JywKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TTEEnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVByaW50LnBtIC0gcHJpbnQgbGF5b3V0IGZvciBpdHNtIHNsYSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVByaW50LnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NDg6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01TTEFQcmludDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6UERGOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1BERk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UERGLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNMQUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU0xBSUQiICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTTEFJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gU0xBSUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNMQXtTTEFJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNMQUlEICRTTEFJRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBuYW1lCiAgICBpZiAoICRTTEF7Q2FsZW5kYXJ9ICkgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9ICJDYWxlbmRhciAkU0xBe0NhbGVuZGFyfSAtICIKICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkU0xBe0NhbGVuZGFyfSAuICJOYW1lIiApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNMQXtDYWxlbmRhck5hbWV9ID0gJ0NhbGVuZGFyIERlZmF1bHQnOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSAoY3JlYXRlIGJ5KQogICAgbXkgJUNyZWF0ZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNoYW5nZSBieSkKICAgIG15ICVDaGFuZ2VCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkU0xBe0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAlUGFnZTsKICAgICAgICBteSAkVXJsID0gJyAnOwogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwKICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJyk7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSA9ICRTTEF7TmFtZX07CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgncHJpbnRlZCBieScpIC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAkVXJsOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50TmV3KAogICAgICAgICAgICBUaXRsZSAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkU0xBe05hbWV9LAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgZ2VuZXJhbCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0R2VuZXJhbEluZm9zKAogICAgICAgICAgICBQYWdlICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFNMQSAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBDcmVhdGVCeSA9PiBcJUNyZWF0ZUJ5LAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBcJUNoYW5nZUJ5LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGRldGFpbGVkIGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXREZXRhaWxlZEluZm9zKAogICAgICAgICAgICBQYWdlID0+IFwlUGFnZSwKICAgICAgICAgICAgU0xBICA9PiBcJVNMQSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaWxlIG5hbWUKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRTTEF7TmFtZX0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICApOwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NsYV8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkU0xBe05hbWV9ICk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TTEFQcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJENyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENyZWF0ZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTGFzdG5hbWUgID0+ICRDcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTG9naW4gICAgID0+ICRDaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDaGFuZ2VCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5VXNlckxhc3RuYW1lICA9PiAkQ2hhbmdlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dEdlbmVyYWxJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhQYWdlIFNMQSBDcmVhdGVCeSBDaGFuZ2VCeSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57TmFtZX0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTTEF9IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTTEF9IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gNTA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAyMDAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjQUFBQUFBJzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvck9kZH0gICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXREZXRhaWxlZEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgU0xBKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTTEEnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkVGFibGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U0xBfS0+e1R5cGV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDYWxlbmRhcicpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NMQX0tPntDYWxlbmRhck5hbWV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRmlyc3QgUmVzcG9uc2UgVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtTTEF9LT57Rmlyc3RSZXNwb25zZVRpbWV9ICkKICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdVcGRhdGUgVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NMQX0tPntVcGRhdGVUaW1lfSApIC4gJyAnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTb2x1dGlvbiBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U0xBfS0+e1NvbHV0aW9uVGltZX0gKQogICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ21pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMnKQogICAgICAgICAgICAgICAgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJFBhcmFte1NMQX0tPntNaW5UaW1lQmV0d2VlbkluY2lkZW50c30sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnbWludXRlcycpLAogICAgICAgIH0sCiAgICBdOwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93cyA9IEB7JFRhYmxlfTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDEyMDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDM5MTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVpvb20ucG0gLSB0aGUgT1RSUzo6SVRTTSBTTEEgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVpvb20ucG0sdiAxLjYgMjAwOS8wNS8xOCAwOTo0ODozNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNMQVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NMQU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU0xBSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTTEFJRCIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNMQUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTTEFJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU0xBe1NMQUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiU0xBSUQgJFNMQUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIG5hbWUKICAgIGlmICggJFNMQXtDYWxlbmRhcn0gKSB7CiAgICAgICAgJFNMQXtDYWxlbmRhck5hbWV9ID0gIkNhbGVuZGFyICRTTEF7Q2FsZW5kYXJ9IC0gIgogICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAiVGltZVpvbmU6OkNhbGVuZGFyIiAuICRTTEF7Q2FsZW5kYXJ9IC4gIk5hbWUiICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU0xBe0NhbGVuZGFyTmFtZX0gPSAnQ2FsZW5kYXIgRGVmYXVsdCc7CiAgICB9CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBTTEFJRCA9PiAkU2VsZi0+e1NMQUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU0xBICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU0xBe1NlcnZpY2VJRHN9ICYmIHJlZiAkU0xBe1NlcnZpY2VJRHN9IGVxICdBUlJBWScgJiYgQHsgJFNMQXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZUxpc3Q7CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBAeyAkU0xBe1NlcnZpY2VJRHN9IH0gKSB7CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgc2VydmljZSB0byBoYXNoCiAgICAgICAgICAgICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9IFwlU2VydmljZTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICk7CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICAgICAgc29ydCB7ICRTZXJ2aWNlTGlzdHskYX0tPntOYW1lfSBjbXAgJFNlcnZpY2VMaXN0eyRifS0+e05hbWV9IH0KICAgICAgICAgICAga2V5cyAlU2VydmljZUxpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSB9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0tPntDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICAgICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNMQXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFNMQXsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRTTEF7ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNMQVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVNMQSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNU2VydmljZU1lbnVHZW5lcmljLnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDg6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgU2VydmljZU9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTZXJ2aWNlIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkR3JvdXBzUm8KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cFJvfQogICAgICAgIHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3CiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXB9CiAgICAgICAgfHwgW107CgogICAgIyBzZXQgYWNjZXNzCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntBY3Rpb259ICYmICggQHskR3JvdXBzUm99IHx8IEB7JEdyb3Vwc1J3fSApICkgewoKICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAkQWNjZXNzID0gMDsKCiAgICAgICAgIyBmaW5kIHJlYWQgb25seSBncm91cHMKICAgICAgICBST0dST1VQOgogICAgICAgIGZvciBteSAkUm9Hcm91cCAoIEB7JEdyb3Vwc1JvfSApIHsKCiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn07CiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBST0dST1VQOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIHJlYWQgd3JpdGUgZ3JvdXBzCiAgICAgICAgUldHUk9VUDoKICAgICAgICBmb3IgbXkgJFJ3R3JvdXAgKCBAeyRHcm91cHNSd30gKSB7CgogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1NlcnZpY2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnVMaW5rLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNU2VydmljZU1lbnVMaW5rLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDg6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUxpbms7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgU2VydmljZU9iamVjdCBMaW5rT2JqZWN0IFVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTZXJ2aWNlIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkR3JvdXBzUncKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cH0KICAgICAgICB8fCBbXTsKCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgQHskR3JvdXBzUnd9ICkgewoKICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAkQWNjZXNzID0gMDsKCiAgICAgICAgIyBmaW5kIHJlYWQgd3JpdGUgZ3JvdXBzCiAgICAgICAgUldHUk9VUDoKICAgICAgICBmb3IgbXkgJFJ3R3JvdXAgKCBAeyRHcm91cHNSd30gKSB7CgogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgY2hlY2sgaWYgc2VydmljZXMgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyIG9iamVjdHMKICAgIG15ICVQb3NzaWJsZU9iamVjdHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5Qb3NzaWJsZU9iamVjdHNMaXN0KAogICAgICAgIE9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBkb24ndCBzaG93IGxpbmsgbWVudSBpdGVtIGlmIHRoZXJlIGFyZSBubyBsaW5rYWJsZSBvYmplY3RzCiAgICByZXR1cm4gaWYgISVQb3NzaWJsZU9iamVjdHM7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1NlcnZpY2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU0xBTWVudUdlbmVyaWMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01TTEFNZW51R2VuZXJpYy5wbSx2IDEuMiAyMDA5LzA1LzE4IDA5OjQ4OjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU0xBTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgU0xBT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NMQX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU0xBIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkR3JvdXBzUm8KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cFJvfQogICAgICAgIHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3CiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXB9CiAgICAgICAgfHwgW107CgogICAgIyBzZXQgYWNjZXNzCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntBY3Rpb259ICYmICggQHskR3JvdXBzUm99IHx8IEB7JEdyb3Vwc1J3fSApICkgewoKICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAkQWNjZXNzID0gMDsKCiAgICAgICAgIyBmaW5kIHJlYWQgb25seSBncm91cHMKICAgICAgICBST0dST1VQOgogICAgICAgIGZvciBteSAkUm9Hcm91cCAoIEB7JEdyb3Vwc1JvfSApIHsKCiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn07CiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBST0dST1VQOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIHJlYWQgd3JpdGUgZ3JvdXBzCiAgICAgICAgUldHUk9VUDoKICAgICAgICBmb3IgbXkgJFJ3R3JvdXAgKCBAeyRHcm91cHNSd30gKSB7CgogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1NMQX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0U2VydmljZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdFNlcnZpY2UucG0sdiAxLjcgMjAwOS8xMC8xNCAxOToyNjozMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RTZXJ2aWNlIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGxpbmsgb2JqZWN0IChzZXJ2aWNlKQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0U2VydmljZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBFbmNvZGVPYmplY3QKICAgICAgICBRdWV1ZU9iamVjdCBHcm91cE9iamVjdCBQYXJhbU9iamVjdCBUaW1lT2JqZWN0IExhbmd1YWdlT2JqZWN0IFVzZXJMYW5ndWFnZSBVc2VySUQpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGRlZmluZSBuZWVkZWQgdmFyaWFibGVzCiAgICAkU2VsZi0+e09iamVjdERhdGF9ID0gewogICAgICAgIE9iamVjdCAgID0+ICdTZXJ2aWNlJywKICAgICAgICBSZWFsbmFtZSA9PiAnU2VydmljZScsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICBAQmxvY2tEYXRhID0gKAogICAgICAgIE9iamVjdCAgICA9PiAnU2VydmljZScsCiAgICAgICAgQmxvY2tuYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnU2VydmljZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NyaXRpY2FsaXR5JywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnSW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1NlcnZpY2UgQmxhJywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgPT4gJ0FjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbSZTZXJ2aWNlSUQ9MTIzJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ090aGVyJywKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGUgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnSGlnaCcsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA4LTAxLTAxIDEyOjEyOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+IDMyMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnU2VydmljZSBCbGEnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICA9PiAnQWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tJlNlcnZpY2VJRD0zMjEnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnT3RoZXInLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdMb3cnLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwNy0wMi0wMiAyMjoxMjowMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRMaW5rTGlzdHskU2VydmljZUlEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskU2VydmljZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0CiAgICBteSBASXRlbUxpc3Q7CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoCiAgICAgICAgc29ydCB7IGxjICRMaW5rTGlzdHskYX17RGF0YX0tPntOYW1lfSBjbXAgbGMgJExpbmtMaXN0eyRifXtEYXRhfS0+e05hbWV9IH0KICAgICAgICBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBleHRyYWN0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICRTZXJ2aWNlID0gJExpbmtMaXN0eyRTZXJ2aWNlSUR9e0RhdGF9OwoKICAgICAgICBteSBASXRlbUNvbHVtbnMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0N1ckluY2lTaWduYWwnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAkU2VydmljZS0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICRTZXJ2aWNlLT57Q3VySW5jaVN0YXRlVHlwZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFNlcnZpY2UtPntOYW1lfSwKICAgICAgICAgICAgICAgIExpbmsgICAgICA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbSZTZXJ2aWNlSUQ9JyAuICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFNlcnZpY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICRTZXJ2aWNlLT57Q3JpdGljYWxpdHl9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFNlcnZpY2UtPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXEBJdGVtQ29sdW1uczsKICAgIH0KCiAgICByZXR1cm4gaWYgIUBJdGVtTGlzdDsKCiAgICAjIGRlZmluZSB0aGUgYmxvY2sgZGF0YQogICAgbXkgJUJsb2NrID0gKAogICAgICAgIE9iamVjdCAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICBCbG9ja25hbWUgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnU2VydmljZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NyaXRpY2FsaXR5JywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gXEBJdGVtTGlzdCwKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2UgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1M6VGhlIHNlcnZpY1suLl0nLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NlcnZpY2U6IFRoZSBzZXJ2aWNlIG5hbWUnLAogICAgICAgICAgICAgICAgICAgIENzcyAgICAgPT4gJ3N0eWxlPSJ0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaCInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdTOk5hbWUgb2Ygc2VydmljWy4uXScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnU2VydmljZTogTmFtZSBvZiBzZXJ2aWNlIDInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdTOlNlcnZpY2UgbmFtWy4uXScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnU2VydmljZTogU2VydmljZSBuYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgJUxpbmtPdXRwdXREYXRhID0gJExpbmtPYmplY3QtPlRhYmxlQ3JlYXRlU2ltcGxlKAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZVNpbXBsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBteSBASXRlbUxpc3Q7CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICAgICAgICAgIHNvcnQgewogICAgICAgICAgICAgICAgICAgIGxjICREaXJlY3Rpb25MaXN0LT57JGF9LT57TmFtZVNob3J0fSBjbXAgbGMgJERpcmVjdGlvbkxpc3QtPnskYn0tPntOYW1lU2hvcnR9CiAgICAgICAgICAgICAgICB9IGtleXMgJXskRGlyZWN0aW9uTGlzdH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRTZXJ2aWNlID0gJERpcmVjdGlvbkxpc3QtPnskU2VydmljZUlEfTsKCiAgICAgICAgICAgICAgICAjIGRlZmluZSBpdGVtIGRhdGEKICAgICAgICAgICAgICAgIG15ICVJdGVtID0gKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gIlM6JFNlcnZpY2UtPntOYW1lU2hvcnR9IiwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICJTZXJ2aWNlOiAkU2VydmljZS0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tJlNlcnZpY2VJRD0nIC4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcJUl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGl0ZW0gbGlzdCB0byBsaW5rIG91dHB1dCBkYXRhCiAgICAgICAgICAgICRMaW5rT3V0cHV0RGF0YXsgJExpbmtUeXBlIC4gJzo6JyAuICREaXJlY3Rpb24gfS0+e1NlcnZpY2V9ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWl0ZW0gQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDb250ZW50RGF0YSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgcmV0dXJuIGlmICRDb250ZW50LT57VHlwZX0gbmUgJ0N1ckluY2lTaWduYWwnOwoKICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgdW5rbm93biAgICAgPT4gJ2dyYXlsZWQnLAogICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgKTsKCiAgICAjIGludmVzdGlnYXRlIGN1cnJlbnQgaW5jaWRlbnQgc2lnbmFsCiAgICAkQ29udGVudC0+e0N1ckluY2lTdGF0ZVR5cGV9IHx8PSAndW5rbm93bic7CiAgICBteSAkQ3VySW5jaVNpZ25hbCA9ICRJbmNpU2lnbmFsc3sgJENvbnRlbnQtPntDdXJJbmNpU3RhdGVUeXBlfSB9OwogICAgJEN1ckluY2lTaWduYWwgfHw9ICRJbmNpU2lnbmFsc3t1bmtub3dufTsKCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJzxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiAnCiAgICAgICAgICAgIC4gJ3RpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEN1ckluY2lTaWduYWwsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSA9PiAkQ29udGVudC0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWxlY3RhYmxlT2JqZWN0TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlbGVjdGFibGUgb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAnU2VydmljZScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gJExpbmtPYmplY3QtPlNlbGVjdGFibGVPYmplY3RMaXN0KAogICAgICAgIFNlbGVjdGVkID0+ICRJZGVudGlmaWVyLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlbGVjdGFibGVPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdGVkOwogICAgaWYgKCAkUGFyYW17U2VsZWN0ZWR9ICYmICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgIH0KCiAgICAjIG9iamVjdCBzZWxlY3QgbGlzdAogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFNlbGVjdGVkLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0U2VsZWN0TGlzdDsKfQoKPWl0ZW0gU2VhcmNoT3B0aW9uTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlYXJjaCBvcHRpb25zCgpSZXR1cm4KCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gJExpbmtPYmplY3QtPlNlYXJjaE9wdGlvbkxpc3QoKTsKCj1jdXQKCnN1YiBTZWFyY2hPcHRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZWFyY2ggb3B0aW9uIGxpc3QKICAgIG15IEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnTmFtZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb3Jta2V5CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKICAgICAgICAkUm93LT57Rm9ybUtleX0gPSAnU0VBUkNIOjonIC4gJFJvdy0+e0tleX07CiAgICB9CgogICAgIyBhZGQgZm9ybSBkYXRhIGFuZCBpbnB1dCBzdHJpbmcKICAgIFJPVzoKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewoKICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUm93LT57Rm9ybUtleX0gKTsKCiAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lucHV0VGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTGlua09iamVjdCcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBST1c7CiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hPcHRpb25MaXN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS43ICQgJERhdGU6IDIwMDkvMTAvMTQgMTk6MjY6MzAgJAoKPWN1dAo=
IyAtLQojIEFkbWluSVRTTUNJUEFsbG9jYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JVFNNQ0lQQWxsb2NhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLmR0bCx2IDEuOSAyMDEwLzA2LzAxIDE2OjA0OjM1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNyaXRpY2FsaXR5IDwtPiBJbXBhY3QgPC0+IFByaW9yaXR5In0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ0lQQWxsb2NhdGUiPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQcmlvcml0eSBhbGxvY2F0aW9uIn06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOkNJUEFsbG9jYXRlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5EZXNjcmlwdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyIkRGF0YXsiT2JqZWN0VHlwZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249ImNlbnRlciI+JFRleHR7IiREYXRheyJPYmplY3RPcHRpb24ifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5EZXNjcmlwdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5Db250ZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249ImNlbnRlciI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkNJUEFsbG9jYXRlUm93Q29sdW1uQ29udGVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDSVBBbGxvY2F0ZVJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFkbWluU2VydmljZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU2VydmljZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TZXJ2aWNlLmR0bCx2IDEuMyAyMDA5LzEwLzA5IDE2OjM2OjI4IHViIEV4cCAkCiMgJE9sZElkOiBBZG1pblNlcnZpY2UuZHRsLHYgMS44LjIuMSAyMDA5LzEwLzAxIDE0OjEyOjQ1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZXJ2aWNlIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VydmljZUVkaXQiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlcnZpY2VJRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JFRleHR7IkFkZCBhIG5ldyBTZXJ2aWNlLiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsidmFsaWQifS8kVGV4dHsiaW52YWxpZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJMZXZlbFNwYWNlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VydmljZUVkaXQmU2VydmljZUlEPSRRRGF0YXsiU2VydmljZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZUVkaXQgLS0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXJ2aWNlU2F2ZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iJFFEYXRheyJTZXJ2aWNlSUQifSIvPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkVkaXQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lU2hvcnQifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1Yi1TZXJ2aWNlIG9mIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFyZW50T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDcml0aWNhbGl0eU9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIHNpemU9IjYwIiBtYXhsZW5ndGg9IjE1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0S2V5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlNlbGVjdGVkSUQifSIgc2l6ZT0iMzAiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOklucHV0S2V5IC0tPgo8IS0tIGR0bDpibG9jazpJbnB1dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IkRlc2MifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlNlbGVjdGVkSUQifSIgc2l6ZT0iMzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnB1dCAtLT4KPCEtLSBkdGw6YmxvY2s6VGV4dEFyZWEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9Ojxici8+PGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2k+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiByb3dzPSIkUURhdGF7IlJvd3MifSIgY29scz0iJFFEYXRheyJDb2xzIn0iPiRRRGF0YXsiU2VsZWN0ZWRJRCJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZXh0QXJlYSAtLT4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9Ojxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IkRlc2MifSJ9KTwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHR5cGU9ImZpbGUiIHNpemU9IjMwIiBjbGFzcz0iZml4ZWQiLz48YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIj4kUURhdGF7IkZpbGVuYW1lIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXBsb2FkIC0tPgo8IS0tIGR0bDpibG9jazpQYXNzd29yZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiIgc2l6ZT0iMzAiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlRWRpdCAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEFkbWluU0xBLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5TTEEKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluU0xBLmR0bCx2IDEuNSAyMDA5LzEwLzA5IDE2OjM2OjI4IHViIEV4cCAkCiMgJE9sZElkOiBBZG1pblNMQS5kdGwsdiAxLjEzLjIuMSAyMDA5LzEwLzAxIDE0OjEyOjQ0IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTTEEgTWFuYWdlbWVudCJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIHdpZHRoPSIzMCUiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTTEFFZGl0Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWRkIFNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgU0xBLiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7IlNMQSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TTEFFZGl0JlNMQUlEPSRRRGF0YXsiU0xBSUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4kVGV4dHsiJFFEYXRheyJWYWxpZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBRWRpdCAtLT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNMQVNhdmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNMQUlEIiB2YWx1ZT0iJFFEYXRheyJTTEFJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYWxlbmRhciJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNhbGVuZGFyT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFc2NhbGF0aW9uIC0gRmlyc3QgUmVzcG9uc2UgVGltZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIwID0gbm8gZXNjYWxhdGlvbiJ9IC0gMjQgJFRleHR7ImhvdXJzIn0gPSAxNDQwICRUZXh0eyJtaW51dGVzIn0gLSAkVGV4dHsiT25seSBidXNpbmVzcyBob3VycyBhcmUgY291bnRlZC4ifSk8L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGaXJzdFJlc3BvbnNlVGltZSIgdmFsdWU9IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWUifSIgc2l6ZT0iOCIgbWF4bGVuZ3RoPSIxMCIvPiAkVGV4dHsibWludXRlcyJ9ICggJFRleHR7Ik5vdGlmeSBieSJ9ICAkRGF0YXsiRmlyc3RSZXNwb25zZU5vdGlmeU9wdGlvblN0cmcifSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXNjYWxhdGlvbiAtIFVwZGF0ZSBUaW1lIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IjAgPSBubyBlc2NhbGF0aW9uIn0gLSAyNCAkVGV4dHsiaG91cnMifSA9IDE0NDAgJFRleHR7Im1pbnV0ZXMifSAtICRUZXh0eyJPbmx5IGJ1c2luZXNzIGhvdXJzIGFyZSBjb3VudGVkLiJ9KTwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlVwZGF0ZVRpbWUiIHZhbHVlPSIkUURhdGF7IlVwZGF0ZVRpbWUifSIgc2l6ZT0iOCIgbWF4bGVuZ3RoPSIxMCIvPiAkVGV4dHsibWludXRlcyJ9ICggJFRleHR7Ik5vdGlmeSBieSJ9ICAkRGF0YXsiVXBkYXRlTm90aWZ5T3B0aW9uU3RyZyJ9ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFc2NhbGF0aW9uIC0gU29sdXRpb24gVGltZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIwID0gbm8gZXNjYWxhdGlvbiJ9IC0gMjQgJFRleHR7ImhvdXJzIn0gPSAxNDQwICRUZXh0eyJtaW51dGVzIn0gLSAkVGV4dHsiT25seSBidXNpbmVzcyBob3VycyBhcmUgY291bnRlZC4ifSk8L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTb2x1dGlvblRpbWUiIHZhbHVlPSIkUURhdGF7IlNvbHV0aW9uVGltZSJ9IiBzaXplPSI4IiBtYXhsZW5ndGg9IjEwIi8+ICRUZXh0eyJtaW51dGVzIn0gKCAkVGV4dHsiTm90aWZ5IGJ5In0gICREYXRheyJTb2x1dGlvbk5vdGlmeU9wdGlvblN0cmcifSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMifSAoJFRleHR7Im1pbnV0ZXMifSk6IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJNaW5UaW1lQmV0d2VlbkluY2lkZW50cyIgdmFsdWU9IiRRRGF0YXsiTWluVGltZUJldHdlZW5JbmNpZGVudHMifSIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbGlkT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIxNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEFJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpJbnB1dEtleSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIHNpemU9IjMwIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnB1dEtleSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9Ojxici8+PGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2k+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIHNpemU9IjMwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSIkUURhdGF7Ik5hbWUifSIgcm93cz0iJFFEYXRheyJSb3dzIn0iIGNvbHM9IiRRRGF0YXsiQ29scyJ9Ij4kUURhdGF7IlNlbGVjdGVkSUQifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGV4dEFyZWEgLS0+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTo8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6VXBsb2FkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIi8+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFzc3dvcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIiIHNpemU9IjMwIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQYXNzd29yZCAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBSXRlbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6U0xBRWRpdCAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEFnZW50SVRTTVNlcnZpY2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TZXJ2aWNlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TZXJ2aWNlLmR0bCx2IDEuNSAyMDEwLzAzLzE4IDE1OjA2OjM5IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJPdmVydmlldyJ9OiAkVGV4dHsiU2VydmljZSJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDaGFuZ2VkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0ifSIgYWx0PSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSJ9Ij4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkxldmVsU3BhY2UifQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tJlNlcnZpY2VJRD0kUURhdGF7IlNlcnZpY2VJRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Um93IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEFnZW50SVRTTVNlcnZpY2VQcmludC5kdGwgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2VQcmludC5kdGwsdiAxLjIgMjAwOS8wNS8xOCAwOTo0ODo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJTZXJ2aWNlLUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAlIj4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjQwJSI+JFFEYXRheyJOYW1lU2hvcnQifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iMzAlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXJyZW50IEluY2lkZW50IFN0YXRlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ3JlYXRlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDcmVhdGVCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNyZWF0ZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDaGFuZ2VCeVVzZXJMb2dpbiJ9ICgkUURhdGF7IkNoYW5nZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ2hhbmdlQnlVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50dmFsdWUiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXNzb2NpYXRlZFNMQXMgLS0+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgJFRleHR7IkFzc29jaWF0ZWQgU0xBcyJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6QXNzb2NpYXRlZFNMQXNSb3cgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXNzb2NpYXRlZFNMQXNSb3cgLS0+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkFzc29jaWF0ZWRTTEFzIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogIDx0cj4KICAgIDx0ZD4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPg==
IyAtLQojIEFnZW50SVRTTVNlcnZpY2Vab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNU2VydmljZVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2Vab29tLmR0bCx2IDEuNSAyMDA5LzA4LzE4IDIyOjIwOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifTogJFRleHR7IlNlcnZpY2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPjwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6SG9yaXpvbnRhbFJ1bGVyIC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CjwhLS0gZHRsOmJsb2NrOkhvcml6b250YWxSdWxlciAtLT4KICAgICAgPGJyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CiAgICAgICAgICAgICAgICAgIDxiPjxpPiRUZXh0eyJBc3NvY2lhdGVkIFNMQXMifTwvaT48L2I+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDaGFuZ2VkIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQVJvdyAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVNMQVpvb20mU0xBSUQ9JFFEYXRheyJTTEFJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEFSb3cgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVDb21wbGV4IC0tPgogICAgICA8dGFibGUgd2lkdGg9Ijk4JSIgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJDdXJyZW50IEluY2lkZW50IFN0YXRlIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJJbmNpU3RhdGUifSJ9IiwiMjUifSZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVNMQS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTVNMQQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU0xBLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDA5OjQ4OjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJPdmVydmlldyJ9OiAkVGV4dHsiU0xBIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVNMQVpvb20mU0xBSUQ9JFFEYXRheyJTTEFJRCJ9Ij4KICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEFnZW50SVRTTVNMQVByaW50LmR0bCAtIHByb3ZpZGVzIEhUTUwgcHJpbnQgdmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU0xBUHJpbnQuZHRsLHYgMS4yIDIwMDkvMDUvMTggMDk6NDg6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRUZXh0eyJTTEEifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJTTEEtSW5mbyJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzMCUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzMCUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDcmVhdGVCeVVzZXJMb2dpbiJ9ICgkUURhdGF7IkNyZWF0ZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ3JlYXRlQnlVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNoYW5nZUJ5VXNlckxvZ2luIn0gKCRRRGF0YXsiQ2hhbmdlQnlVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDaGFuZ2VCeVVzZXJMYXN0bmFtZSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogIDx0cj4KICAgIDx0ZD4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhbGVuZGFyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDYWxlbmRhck5hbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWUifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlVwZGF0ZSBUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlVwZGF0ZVRpbWUifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU29sdXRpb25UaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTWluVGltZUJldHdlZW5JbmNpZGVudHMifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPg==
IyAtLQojIEFnZW50SVRTTVNMQVpvb20uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TTEFab29tCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TTEFab29tLmR0bCx2IDEuNCAyMDA5LzA4LzE4IDIyOjIwOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifTogJFRleHR7IlNMQSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDYWxlbmRhck5hbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVXBkYXRlVGltZSJ9ICRUZXh0eyJtaW51dGVzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU29sdXRpb24gVGltZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU29sdXRpb25UaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgPGhyIHNpemU9IjIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CiAgICAgICAgICAgICAgICAgIDxiPjxpPiRUZXh0eyJBc3NvY2lhdGVkIFNlcnZpY2VzIn08L2k+PC9iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlUm93IC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJJbmNpU3RhdGUifSJ9In0iIGFsdD0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0ifSI+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tJlNlcnZpY2VJRD0kUURhdGF7IlNlcnZpY2VJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiB3aWR0aD0iMTUwIj4kVGltZUxvbmd7IiRRRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2VSb3cgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIFJpY2hUZXh0RWRpdG9ySVRTTS5kdGwgLSBwcm92aWRlcyBSaWNoIFRleHQgRWRpdG9yCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBSaWNoVGV4dEVkaXRvcklUU00uZHRsLHYgMS40IDIwMTAvMDUvMjYgMTc6MDg6MzIgdWIgRXhwICQKIyAkT2xkSWQ6IFJpY2hUZXh0RWRpdG9yLmR0bCx2IDEuMjAuMi4xMSAyMDEwLzA1LzI2IDEyOjQ2OjMxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIGxvYWQganMKPHNjcmlwdCBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpKYXZhU2NyaXB0UGF0aCJ9ZmNrZWRpdG9yLTIuNi40LjEvZmNrZWRpdG9yLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLy8gdXBkYXRlIGJvZHkgd2l0aCBjdXJyZW50IHJpY2ggdGV4dCBjb250ZW50CiMgLS0tCiMgSVRTTQojIC0tLQojZnVuY3Rpb24gUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpIHsKIyAgICBGQ0tlZGl0b3JBUEkuR2V0SW5zdGFuY2UoJ1JpY2hUZXh0JykuVXBkYXRlTGlua2VkRmllbGQoKTsKZnVuY3Rpb24gUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCggRmllbGRuYW1lICkgewogICAgRkNLZWRpdG9yQVBJLkdldEluc3RhbmNlKCBGaWVsZG5hbWUgKS5VcGRhdGVMaW5rZWRGaWVsZCgpOwojIC0tLQp9CgovLyBzZXQgZm9jdXMgdG8gcmljaCB0ZXh0IGVkaXRvcgojIC0tLQojIElUU00KIyAtLS0KI2Z1bmN0aW9uIFJpY2hUZXh0Rm9jdXMoKSB7CiMgICAgRkNLZWRpdG9yQVBJLkdldEluc3RhbmNlKCdSaWNoVGV4dCcpLkZvY3VzKCk7CmZ1bmN0aW9uIFJpY2hUZXh0Rm9jdXMoIEZpZWxkbmFtZSApIHsKICAgIEZDS2VkaXRvckFQSS5HZXRJbnN0YW5jZSggRmllbGRuYW1lICkuRm9jdXMoKTsKIyAtLS0KfQoKLy8gY2xlYW51cCByZWFsIGJvZHkKLy8gSWYgdGhlIGJvZHkgb25seSBjb250YWlucyB3aGl0ZXNwYWNlIG9yIGh0bWwgdGFncyBidXQgbm8gdGV4dCwKLy8gcmVzZXQgaXQgdG8gJycuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZnJvbnRlbmQgYW5kIGJhY2tlbmQKLy8gY29udGVudCBjaGVja3MgdG8gd29yayBwcm9wZXJseS4KZnVuY3Rpb24gUmljaFRleHRDbGVhbnVwKCkgewojIC0tLQojIElUU00KIyAtLS0KIyAgICB2YXIgRWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdSaWNoVGV4dCcpOwogICAgZm9yICggdmFyIGkgPSAxOyBpIDw9IDY7IGkrKyApIHsKICAgICAgICB2YXIgRWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdSaWNoVGV4dCcgKyBpKTsKIyAtLS0KICAgIGlmIChFbGVtKSB7CiAgICAgICAgdmFyIFN0cmlwcGVkQ29udGVudCA9IEVsZW0udmFsdWUucmVwbGFjZSgvXHMrfCZuYnNwO3w8XC8/XHcrXHM/XC8/Pi9nLCAnJyk7CiAgICAgICAgaWYgKFN0cmlwcGVkQ29udGVudC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICBFbGVtLnZhbHVlID0gJyc7CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIH0KIyAtLS0KfQoKIyAtLS0KIyBJVFNNCiMgLS0tCiNmdW5jdGlvbiBJbml0UmljaFRleHQoKSB7CiMgICAgdmFyIG9GQ0tlZGl0b3IgPSBuZXcgRkNLZWRpdG9yKCAnUmljaFRleHQnICk7CmZ1bmN0aW9uIEluaXRSaWNoVGV4dElUU00oIEZpZWxkbmFtZSApIHsKICAgIHZhciBvRkNLZWRpdG9yID0gbmV3IEZDS2VkaXRvciggRmllbGRuYW1lICk7CiMgLS0tCiAgICBvRkNLZWRpdG9yLkhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJENvbmZpZ3siRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0In0nIHx8IDMyMDsKICAgIG9GQ0tlZGl0b3IuV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICckQ29uZmlneyJGcm9udGVuZDo6UmljaFRleHRXaWR0aCJ9JyB8fCA2MjA7CiAgICBvRkNLZWRpdG9yLkJhc2VQYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn0vZmNrZWRpdG9yLTIuNi40LjEvJzsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJGb3JjZVBhc3RlQXNQbGFpblRleHQiXSAgICA9IGZhbHNlOwogICAgb0ZDS2VkaXRvci5Db25maWdbIkVkaXRvckFyZWFTdHlsZXMiXSAgICAgICAgID0gJ2JvZHkgeyAkQ29uZmlneyJGcm9udGVuZDo6UmljaFRleHQ6OkRlZmF1bHRDU1MifSB9JzsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJBdXRvRGV0ZWN0TGFuZ3VhZ2UiXSAgICAgICA9IGZhbHNlOwoKICAgIC8vIEZpeCBmb3IgYnVnIzUzODMgLSBsYW5ndWFnZSBzdHJpbmdzIHN1Y2ggYXMgcHRfQlIgc2hvdWxkIGJlIHJlZm9ybWF0dGVkIGFzIHB0LWJyOgogICAgb0ZDS2VkaXRvci5Db25maWdbIkRlZmF1bHRMYW5ndWFnZSJdICAgICAgICAgID0gU3RyaW5nKCckRW52eyJVc2VyTGFuZ3VhZ2UifScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsICItIik7CgogICAgb0ZDS2VkaXRvci5Db25maWdbIkltYWdlVXBsb2FkVVJMIl0gICAgICAgICAgID0gJyRFbnZ7IkJhc2VsaW5rIn0nOwogICAgb0ZDS2VkaXRvci5Db25maWdbIkZpcmVmb3hTcGVsbENoZWNrZXIiXSAgICAgID0gdHJ1ZTsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJCcm93c2VyQ29udGV4dE1lbnUiXSAgICAgICA9IHRydWU7CiAgICBvRkNLZWRpdG9yLkNvbmZpZ1siU3BlbGxDaGVja2VyIl0gICAgICAgICAgICAgPSAnU3BlbGxlclBhZ2VzJzsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJTcGVsbGVyUGFnZXNTZXJ2ZXJTY3JpcHQiXSA9ICckRW52eyJCYXNlbGluayJ9JzsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJGb250U2l6ZXMiXSAgICAgICAgICAgICAgICA9ICc4cHg7MTBweDsxMnB4OzE2cHg7MThweDsyMHB4OzIycHg7MjRweDsyNnB4OzI4cHg7MzBweDsnOwogICAgb0ZDS2VkaXRvci5Db25maWdbIkVudGVyTW9kZSJdICAgICAgICAgICAgICAgID0gJ2JyJzsKICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJTaGlmdEVudGVyTW9kZSJdICAgICAgICAgICA9ICdicic7CiAgICBvRkNLZWRpdG9yLkNvbmZpZ1siTGlua1VwbG9hZCJdICAgICAgICAgICAgICAgPSBmYWxzZTsKCiAgICBpZiAoICckRW52eyJUZXh0RGlyZWN0aW9uIn0nICkgewogICAgICAgIG9GQ0tlZGl0b3IuQ29uZmlnWyJDb250ZW50TGFuZ0RpcmVjdGlvbiJdID0gJyRFbnZ7IlRleHREaXJlY3Rpb24ifSc7CiAgICB9CgogICAgdmFyIFRvb2xiYXJTZXQgPSAnJzsKICAgIGlmICggZG9jdW1lbnQuY29tcG9zZSAmJiBkb2N1bWVudC5jb21wb3NlLkZvcm1JRCApIHsKICAgICAgICBvRkNLZWRpdG9yLkNvbmZpZ1siQWN0aW9uIl0gPSAnUGljdHVyZVVwbG9hZCc7CiAgICAgICAgb0ZDS2VkaXRvci5Db25maWdbIkZvcm1JRCJdID0gZG9jdW1lbnQuY29tcG9zZS5Gb3JtSUQudmFsdWU7CiAgICAgICAgVG9vbGJhclNldCA9ICdGdWxsJzsKICAgICAgICBpZiAoICckRW52eyJCcm93c2VyU3BlbGxDaGVja2VySW5saW5lIn0nICkgewogICAgICAgICAgICBUb29sYmFyU2V0ID0gJ0Z1bGxTcGVsbCc7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgVG9vbGJhclNldCA9ICdTaW1wbGUnOwogICAgICAgIGlmICggJyRFbnZ7IkJyb3dzZXJTcGVsbENoZWNrZXJJbmxpbmUifScgKSB7CiAgICAgICAgICAgIFRvb2xiYXJTZXQgPSAnU2ltcGxlU3BlbGwnOwogICAgICAgIH0KICAgIH0KICAgIG9GQ0tlZGl0b3IuVG9vbGJhclNldCA9IFRvb2xiYXJTZXQ7CgogICAgb0ZDS2VkaXRvci5SZXBsYWNlVGV4dGFyZWEoKTsKfQoKLy8gcHJlc2VydmUgb2xkIHdpbmRvdyBvbmxvYWQgZXZlbnQKdmFyIE9sZE9uTG9hZCA9IHdpbmRvdy5vbmxvYWQ7CndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0eXBlb2YgT2xkT25Mb2FkID09ICdmdW5jdGlvbicpIHsKICAgICAgICBPbGRPbkxvYWQoKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgSW5pdFJpY2hUZXh0KCk7CiAgICBmb3IgKCB2YXIgaSA9IDE7IGkgPD0gNjsgaSsrICkgewogICAgICAgIGlmICggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1JpY2hUZXh0JyArIGkpICkgewogICAgICAgICAgICB2YXIgbXlFZGl0b3IgPSBJbml0UmljaFRleHRJVFNNKCdSaWNoVGV4dCcgKyBpKTsKICAgICAgICB9CiAgICB9CiMgLS0tCn0KCmZ1bmN0aW9uIEZDS2VkaXRvcl9PbkNvbXBsZXRlKCBlZGl0b3JJbnN0YW5jZSApIHsKICAgIC8vIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9kZXYuZmNrZWRpdG9yLm5ldC90aWNrZXQvMzA1MwogICAgLy8gc2VlIGFsc28gaHR0cDovL3d3dy5mY2tlZGl0b3IubmV0L2ZvcnVtcy92aWV3dG9waWMucGhwP2Y9NiZ0PTEzMjIyCiAgICB2YXIgZmNrX2lmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdSaWNoVGV4dF9fX0ZyYW1lJyk7CiAgICBpZiAoIGZja19pZnJhbWUgJiYgZmNrX2lmcmFtZS5jb250ZW50RG9jdW1lbnQgKSB7CiAgICAgICAgdmFyIGZja19lZGl0aW5nX2FyZWEgPSBmY2tfaWZyYW1lLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneEVkaXRpbmdBcmVhJyk7CiAgICAgICAgZmNrX2VkaXRpbmdfYXJlYS5zdHlsZS5oZWlnaHQgPSAnMTAwLjElJzsKICAgICAgICBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZmNrX2VkaXRpbmdfYXJlYS5zdHlsZS5oZWlnaHQgPSAnMTAwJScKICAgICAgICB9LCAxMDAgKTsKICAgIH0KCiAgICAvLyBjbGVhbnVwIGhpZGRlbiBib2R5IGZpZWxkIGFmdGVyIHVwZGF0ZSB3aXRoIGNvbnRlbnQgb2YgcmljaCB0ZXh0CiAgICBlZGl0b3JJbnN0YW5jZS5FdmVudHMuQXR0YWNoRXZlbnQoICdPbkFmdGVyTGlua2VkRmllbGRVcGRhdGUnLCBSaWNoVGV4dENsZWFudXAgKTsKfQo8L3NjcmlwdD4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRXZlbnRIYW5kbGVyLnBtIC0gZ2xvYmFsIG9iamVjdCBldmVudHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEV2ZW50SGFuZGxlci5wbSx2IDEuMiAyMDEwLzAyLzA0IDEzOjE5OjEzIHViIEV4cCAkCiMgJE9sZElkOiBFdmVudEhhbmRsZXIucG0sdiAxLjQgMjAwOS8xMi8wOCAxNjoyMzo0NiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlciAtIGV2ZW50IGhhbmRsZXIgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBFdmVudEhhbmRsZXJJbml0KCkKCnVzZSB2YXJzIHF3KEBJU0EpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKcHVzaCBASVNBLCAnS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcic7CgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCgogICAgICAgICMgbmFtZSBvZiBjb25maWd1cmVkIGV2ZW50IG1vZHVsZXMKICAgICAgICBDb25maWcgICAgID0+ICdFeGFtcGxlOjpFdmVudE1vZHVsZScsCgogICAgICAgICMgY3VycmVudCBvYmplY3QsICRTZWxmLCB1c2VkIGluIGV2ZW50cyBhcyAiRXhhbXBsZU9iamVjdCIKICAgICAgICBCYXNlT2JqZWN0ID0+ICdFeGFtcGxlT2JqZWN0JywKCiAgICAgICAgIyBzZXJ2ZWQgZGVmYXVsdCBvYmplY3RzIGluIGFueSBldmVudCBiYWNrZW5kCiAgICAgICAgT2JqZWN0cyAgICA9PiB7CiAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgICAgIFhaWSAgICAgICAgPT4gJFhZWiwKICAgICAgICB9LAogICAgKTsKCmUuIGcuCgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnICAgICA9PiAnVGlja2V0OjpFdmVudE1vZHVsZScsCiAgICAgICAgQmFzZU9iamVjdCA9PiAnVGlja2V0T2JqZWN0JywKICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgVXNlck9iamVjdCAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgICAgIEdyb3VwT2JqZWN0ID0+ICRHcm91cE9iamVjdCwKICAgICAgICB9LAogICAgKTsKCkV4YW1wbGUgWE1MIGNvbmZpZzoKCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJFeGFtcGxlOjpFdmVudE1vZHVsZSMjIzk5LUVzY2FsYXRpb25JbmRleCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkV4YW1wbGUgZXZlbnQgbW9kdWxlIHVwZGF0ZXMgdGhlIGV4YW1wbGUgZXNjYWxhdGlvbiBpbmRleC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXhhbXBsZSBFdmVudCBNb2R1bCBha3R1YWxpc2llcnQgZGVuIEV4YW1wbGUgRXNrYWxhdGlvbnMtSW5kZXguPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RXhhbXBsZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4YW1wbGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6RXhhbXBsZTo6RXZlbnQ6OkV4YW1wbGVFc2NhbGF0aW9uSW5kZXg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oRXhhbXBsZVNMQVVwZGF0ZXxFeGFtcGxlUXVldWVVcGRhdGV8RXhhbXBsZVN0YXRlVXBkYXRlfEV4YW1wbGVDcmVhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb21lT3B0aW9uIj5Tb21lIE9wdGlvbiBhY2Nlc3NhYmxlIHZpYSAkUGFyYW17Q29uZmlnfS0+e1NvbWVPcHRpb259IGluIFJ1bigpIG9mIGV2ZW50IG1vZHVsZS48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4oMHwxKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCj1jdXQKIyAtLS0KIyBJVFNNCiMgLS0tCj1pdGVtIEV2ZW50SGFuZGxlckluaXQoKQoKdXNlIHZhcnMgcXcoQElTQSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwpwdXNoIEBJU0EsICdLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyJzsKCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKCiAgICAgICAgIyBuYW1lIG9mIGNvbmZpZ3VyZWQgZXZlbnQgbW9kdWxlcwogICAgICAgIENvbmZpZyAgICAgPT4gJ0lUU006OkV2ZW50TW9kdWxlJywKCiAgICAgICAgIyBjdXJyZW50IG9iamVjdCwgJFNlbGYsIHVzZWQgaW4gZXZlbnRzIGFzICJFeGFtcGxlT2JqZWN0IgogICAgICAgIEJhc2VPYmplY3QgPT4gJ0V4YW1wbGVPYmplY3QnLAoKICAgICAgICAjIHNlcnZlZCBkZWZhdWx0IG9iamVjdHMgaW4gYW55IGV2ZW50IGJhY2tlbmQKICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkVXNlck9iamVjdCwKICAgICAgICAgICAgWFpZICAgICAgICA9PiAkWFlaLAogICAgICAgIH0sCiAgICApOwoKZS4gZy4KCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgICAgID0+ICdJVFNNOjpFdmVudE1vZHVsZScsCiAgICAgICAgQmFzZU9iamVjdCA9PiAnQ2hhbmdlT2JqZWN0JywKICAgICAgICBPYmplY3RzICAgID0+IHt9LAogICAgKTsKCkV4YW1wbGUgWE1MIGNvbmZpZzoKCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNOjpFdmVudE1vZHVsZSMjIzAxLUhpc3RvcnlBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB1cGRhdGVzIHRoZSBoaXN0b3J5IGZvciBDaGFuZ2UgYW5kIFdvcmtPcmRlciBvYmplY3RzLi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SVRTTSBFdmVudCBNb2R1bCBha3R1YWxpc2llcnQgZGllIEhpc3Rvcnkgdm9uIENoYW5nZSB1bmQgV29ya09yZGVyIE9iamVrdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlVXBkYXRlfFdvcmtPcmRlclVwZGF0ZXxDaGFuZ2VBZGR8V29ya09yZGVyQWRkKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU29tZU9wdGlvbiI+U29tZSBPcHRpb24gYWNjZXNzYWJsZSB2aWEgJFBhcmFte0NvbmZpZ30tPntTb21lT3B0aW9ufSBpbiBSdW4oKSBvZiBldmVudCBtb2R1bGUuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+KDB8MSk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNOjpFdmVudE1vZHVsZSMjIzAyLUhpc3RvcnlBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB1cGRhdGVzIHRoZSBDb25maWdJdGVtIEhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgYWt0dWFsaXNpZXJ0IENvbmZpZ0l0ZW0gSGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01FdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQ6OkV2ZW50OjpIaXN0b3J5QWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENvbmZpZ0l0ZW1VcGRhdGV8Q29uZmlnSXRlbUFkZCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvbWVPcHRpb24iPlNvbWUgT3B0aW9uIGFjY2Vzc2FibGUgdmlhICRQYXJhbXtDb25maWd9LT57U29tZU9wdGlvbn0gaW4gUnVuKCkgb2YgZXZlbnQgbW9kdWxlLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPigwfDEpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKPWN1dAojIC0tLQoKc3ViIEV2ZW50SGFuZGxlckluaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0V2ZW50SGFuZGxlckluaXR9ID0gXCVQYXJhbTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRXZlbnRIYW5kbGVyKCkKCmNhbGwgZXZlbnQgaGFuZGxlciwgcmV0dXJucyB0cnVlIGlmIGl0J3MgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5CgogICAgJEV2ZW50SGFuZGxlci0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdUaWNrZXRTdGF0ZVVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKIyAtLS0KIyBJVFNNCiMgLS0tCj1pdGVtIEV2ZW50SGFuZGxlcigpCgpjYWxsIGV2ZW50IGhhbmRsZXIsIHJldHVybnMgdHJ1ZSBpZiBpdCdzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseQoKICAgICRFdmVudEhhbmRsZXItPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAojIC0tLQoKc3ViIEV2ZW50SGFuZGxlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KERhdGEgRXZlbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWd1cmVkIG1vZHVsZXMKICAgIG15ICRNb2R1bGVzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRTZWxmLT57RXZlbnRIYW5kbGVySW5pdH0tPntDb25maWd9ICk7CgogICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm8gb25lCiAgICByZXR1cm4gMSBpZiAhJE1vZHVsZXM7CgogICAgIyByZW1lbWJlciBldmVudHMgb25seSBvbiBub3JtYWwgbW9kZQogICAgaWYgKCAhJFNlbGYtPntFdmVudEhhbmRsZXJUcmFuc2FjdGlvbn0gKSB7CiAgICAgICAgcHVzaCBAeyAkU2VsZi0+e0V2ZW50SGFuZGxlclBpcGV9IH0sIFwlUGFyYW07CiAgICB9CgogICAgIyBsb2FkIG1vZHVsZXMgYW5kIGV4ZWN1dGUKICAgIE1PRFVMRToKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZXN9ICkgewoKICAgICAgICAjIGV4ZWN1dGUgb25seSBpZiBjb25maWd1cmVkIChyZWdleHAgaW4gRXZlbnQgb2YgY29uZmlnIGlzIHBvc3NpYmxlKQogICAgICAgIGlmICggISRNb2R1bGVzLT57JE1vZHVsZX0tPntFdmVudH0gfHwgJFBhcmFte0V2ZW50fSA9fiAvJE1vZHVsZXMtPnskTW9kdWxlfS0+e0V2ZW50fS8gKSB7CgogICAgICAgICAgICAjIG5leHQgaWYgd2UgYXJlIG5vdCBpbiB0cmFuc2FjdGlvbiBtb2RlLCBidXQgbW9kdWxlIGlzIGluIHRyYW5zYWN0aW9uCiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkUGFyYW17VHJhbnNhY3Rpb259ICYmICRNb2R1bGVzLT57JE1vZHVsZX0tPntUcmFuc2FjdGlvbn07CgogICAgICAgICAgICAjIG5leHQgaWYgd2UgYXJlIGluIHRyYW5zYWN0aW9uIG1vZGUsIGJ1dCBtb2R1bGUgaXMgbm90IGluIHRyYW5zYWN0aW9uCiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICRQYXJhbXtUcmFuc2FjdGlvbn0gJiYgISRNb2R1bGVzLT57JE1vZHVsZX0tPntUcmFuc2FjdGlvbn07CgogICAgICAgICAgICAjIGxvYWQgZXZlbnQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTW9kdWxlcy0+eyRNb2R1bGV9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgIyBnZXQgYWxsIGRlZmF1bHQgb2JqZWN0cyBpZiBnaXZlbgogICAgICAgICAgICBteSAkT2JqZWN0UmVmID0gJFNlbGYtPntFdmVudEhhbmRsZXJJbml0fS0+e09iamVjdHN9OwogICAgICAgICAgICBteSAlT2JqZWN0czsKICAgICAgICAgICAgaWYgKCRPYmplY3RSZWYpIHsKICAgICAgICAgICAgICAgICVPYmplY3RzID0gJXskT2JqZWN0UmVmfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBleGVjdXRlIGV2ZW50IGJhY2tlbmQKICAgICAgICAgICAgbXkgJEdlbmVyaWMgPSAkTW9kdWxlcy0+eyRNb2R1bGV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJU9iamVjdHMsCiAgICAgICAgICAgICAgICAkU2VsZi0+e0V2ZW50SGFuZGxlckluaXR9LT57QmFzZU9iamVjdH0gPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbXBhdGFibGUgdG8gb2xkCiAgICAgICAgICAgICMgT1RSUyAzLng6IFJFTU9WRSBNRQogICAgICAgICAgICBpZiAoICRQYXJhbXtEYXRhfSApIHsKICAgICAgICAgICAgICAgICVQYXJhbSA9ICggJVBhcmFtLCAleyAkUGFyYW17RGF0YX0gfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2VuZXJpYy0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNb2R1bGVzLT57JE1vZHVsZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBFdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpCgpjYWxsIGFsbCB0cmFuc2FjdGlvbiBiYWNrZW5kcyBmb3IgYWxsIHRyaWdnZXJlZCBldmVudHMgdGlsbCBub3cKCiAgICAkRXZlbnRIYW5kbGVyLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKdXN1YWxseSBpdCdzIGRvbmUgaW4gREVTVFJPWSBvZiBFeGFtcGxlT2JqZWN0IChlLiBnLiBLZXJuZWw6OlN5c3RlbTo6RXhhbXBsZU9iamVjdCkKCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9OwoKPWN1dAoKc3ViIEV2ZW50SGFuZGxlclRyYW5zYWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZW1lbWJlciwgd2UgYXJlIG9uIGRlc3RvcnkgbW9kZSwgZG8gbm90IGV4ZWN1dGUgbmV3IGV2ZW50cwogICAgJFNlbGYtPntFdmVudEhhbmRsZXJUcmFuc2FjdGlvbn0gPSAxOwoKICAgICMgZXhlY3V0ZSBldmVudHMgb24gZW5kIG9mIHRyYW5zYWN0aW9uCiAgICBpZiAoICRTZWxmLT57RXZlbnRIYW5kbGVyUGlwZX0gKSB7CiAgICAgICAgZm9yIG15ICRQYXJhbXMgKCBAeyAkU2VsZi0+e0V2ZW50SGFuZGxlclBpcGV9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRQYXJhbXN9LAogICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGV2ZW50IHBpcGUKICAgICAgICAkU2VsZi0+e0V2ZW50SGFuZGxlclBpcGV9ID0gdW5kZWY7CiAgICB9CgogICAgIyByZXNldCB0cmFuc2FjdGlvbiBtb2RlCiAgICAkU2VsZi0+e0V2ZW50SGFuZGxlclRyYW5zYWN0aW9ufSA9IDA7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMC8wMi8wNCAxMzoxOToxMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9TZXJ2aWNlLnBtIC0gdG8gbGluayBzZXJ2aWNlIG9iamVjdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNlcnZpY2UucG0sdiAxLjcgMjAwOS8wOC8xOCAyMjoyMDo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0IFRpbWVPYmplY3QgTGlua09iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBMaW5rTGlzdFdpdGhEYXRhKCkKCmZpbGwgdXAgdGhlIGxpbmsgbGlzdCB3aXRoIGRhdGEKCiAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0QmFja2VuZC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBMaW5rTGlzdCA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfSApIHsKCiAgICAgICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgc2VydmljZSBjYW4gbm90IGdldAogICAgICAgICAgICAgICAgaWYgKCAhJVNlcnZpY2VEYXRhICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBTRVJWSUNFSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JFNlcnZpY2VJRH0gPSBcJVNlcnZpY2VEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiU2VydmljZTogU2VydmljZU5hbWUiLAogICAgICAgIExvbmcgICA9PiAiU2VydmljZTogUGFyZW50U2VydmljZTo6U2VydmljZU5hbWUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ1NlcnZpY2UnLAogICAgICAgIExvbmcgICA9PiAnU2VydmljZScsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISVTZXJ2aWNlOwoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICJTZXJ2aWNlICckU2VydmljZXtOYW1lU2hvcnR9JyIsCiAgICAgICAgTG9uZyAgID0+ICJTZXJ2aWNlICckU2VydmljZXtOYW1lfSciLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgYWRkIHdpbGRjYXJkcwogICAgbXkgJVNlYXJjaDsKICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntOYW1lfSApIHsKICAgICAgICAkU2VhcmNoe05hbWV9ID0gJyonIC4gJFBhcmFte1NlYXJjaFBhcmFtc30tPntOYW1lfSAuICcqJzsKICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgc2VydmljZXMKICAgIG15IEBTZXJ2aWNlSURzID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVNlYXJjaCgKICAgICAgICAleyAkUGFyYW17U2VhcmNoUGFyYW1zfSB9LAogICAgICAgICVTZWFyY2gsCiAgICAgICAgTGltaXQgID0+IDUwLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVNlYXJjaExpc3Q7CiAgICBTRVJWSUNFSUQ6CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VJRHMpIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAhJVNlcnZpY2VEYXRhOwoKICAgICAgICAjIGFkZCBzZXJ2aWNlIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRTZXJ2aWNlSUR9ID0gXCVTZXJ2aWNlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hMaXN0Owp9Cgo9aXRlbSBMaW5rQWRkUHJlKCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZFByZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTGlua0RlbGV0ZVBvc3QoKQoKbGluayBkZWxldGUgcG9zdCBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNJUEFsbG9jYXRlLnBtIC0gYWxsIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24gZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ0lQQWxsb2NhdGUucG0sdiAxLjE1IDIwMTAvMDIvMTggMTQ6MzI6NTkgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE1ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlIC0gY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENJUEFsbG9jYXRlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFsbG9jYXRlTGlzdCgpCgpyZXR1cm4gYSAyZCBoYXNoIHJlZmVyZW5jZSBvZiBhbGxvY2F0aW9ucwoKICAgIG15ICRMaXN0UmVmID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKQzwkTGlzdFJlZj4gaXMgc29tZXRoaW5nIGxpa2UKCiAgICAkTGlzdFJldCA9IHsKICAgICAgICAnNicgPT4gewogICAgICAgICAgICAnNCcgPT4gMiwKICAgICAgICAgICAgJzEnID0+IDEsCiAgICAgICAgICAgICczJyA9PiAyLAogICAgICAgIH0sCiAgICAgICAgJzgnID0+IHsKICAgICAgICAgICAgJzQnID0+IDQsCiAgICAgICAgICAgICcxJyA9PiAyLAogICAgICAgICAgICAnMycgPT4gMywKICAgICAgICB9LAogICAgfTsKCm1lYW5pbmcgdGhhdCB0aGUgQ3JpdGljYWxpdHlJRCAnNicgYW5kIHRoZSBJbmNpZGVudElEICc0JyBzdWdnZXN0IHRoZSBQcmlvcml0eUlEICcyJy4KCj1jdXQKCnN1YiBBbGxvY2F0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjcml0aWNhbGl0eV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCBGUk9NIGNpcF9hbGxvY2F0ZScsCiAgICApOwoKICAgICMgcmVzdWx0IGxpc3QKICAgIG15ICVBbGxvY2F0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbGxvY2F0ZURhdGF7ICRSb3dbMV0gfXsgJFJvd1swXSB9ID0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gXCVBbGxvY2F0ZURhdGE7Cn0KCj1pdGVtIEFsbG9jYXRlVXBkYXRlKCkKCnVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBvZiBjcml0aWNhbGl0eSwgaW1wYWN0IGFuZCBwcmlvcml0eQoKICAgIG15ICRUcnVlID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJERhdGFSZWYsICAjIDJEIGhhc2ggcmVmZXJlbmNlCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFsbG9jYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEFsbG9jYXRlRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWxsb2NhdGUgZGF0YSBpcyBhIGhhc2ggcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17QWxsb2NhdGVEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBbGxvY2F0ZURhdGEgbXVzdCBiZSBhIDJEIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBhbGxvY2F0ZSBkYXRhIGlzIGEgMkQgaGFzaCByZWZlcmVuY2UKICAgIElNUEFDVElEOgogICAgZm9yIG15ICRJbXBhY3RJRCAoIGtleXMgJXsgJFBhcmFte0FsbG9jYXRlRGF0YX0gfSApIHsKCiAgICAgICAgbmV4dCBJTVBBQ1RJRCBpZiByZWYgJFBhcmFte0FsbG9jYXRlRGF0YX0tPnskSW1wYWN0SUR9IGVxICdIQVNIJzsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBbGxvY2F0ZURhdGEgbXVzdCBiZSBhIDJEIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGFsbG9jYXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAnREVMRVRFIEZST00gY2lwX2FsbG9jYXRlJyApOwoKICAgICMgaW5zZXJ0IG5ldyBhbGxvY2F0aW9ucwogICAgZm9yIG15ICRJbXBhY3RJRCAoIGtleXMgJXsgJFBhcmFte0FsbG9jYXRlRGF0YX0gfSApIHsKCiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eUlEICgga2V5cyAleyAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0gfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBwcmlvcml0eQogICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdElEfS0+eyRDcml0aWNhbGl0eUlEfTsKCiAgICAgICAgICAgICMgaW5zZXJ0IG5ldyBhbGxvY2F0aW9uCiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2lwX2FsbG9jYXRlICcKICAgICAgICAgICAgICAgICAgICAuICcoY3JpdGljYWxpdHlfaWQsIGltcGFjdF9pZCwgcHJpb3JpdHlfaWQsICcKICAgICAgICAgICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAgICAgICAgIC4gJyg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkQ3JpdGljYWxpdHlJRCwgXCRJbXBhY3RJRCwgXCRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByaW9yaXR5QWxsb2NhdGlvbkdldCgpCgpyZXR1cm4gdGhlIHByaW9yaXR5IGlkIG9mIGEgY3JpdGljYWxpdHkgYW5kIGFuIGltcGFjdAoKICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAzMjEsCiAgICAgICAgSW1wYWN0SUQgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFByaW9yaXR5QWxsb2NhdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDcml0aWNhbGl0eUlEIEltcGFjdElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eSBpZCBmcm9tIGRiCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBwcmlvcml0eV9pZCBGUk9NIGNpcF9hbGxvY2F0ZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNyaXRpY2FsaXR5X2lkID0gPyBBTkQgaW1wYWN0X2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3JpdGljYWxpdHlJRH0sIFwkUGFyYW17SW1wYWN0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCByZXN1bHQKICAgIG15ICRQcmlvcml0eUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUHJpb3JpdHlJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRQcmlvcml0eUlEOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE1ICQgJERhdGU6IDIwMTAvMDIvMTggMTQ6MzI6NTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZS5wbSAtIGFsbCBzZXJ2aWNlIGZ1bmN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTZXJ2aWNlLnBtLHYgMS4xNSAyMDEwLzA0LzEzIDE3OjQwOjIwIHViIEV4cCAkCiMgJE9sZElkOiBTZXJ2aWNlLnBtLHYgMS4zOS4yLjEgMjAxMC8wNC8xMyAxNzozMTo0NSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiMgLS0tCgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIC0gc2VydmljZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHNlcnZpY2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKIyAtLS0KCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTZXJ2aWNlOjpQcmVmZXJlbmNlc01vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOjpQcmVmZXJlbmNlc0RCJzsKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fSA9ICRHZW5lcmF0b3JNb2R1bGUtPm5ldyglUGFyYW0pOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU2VydmljZUxpc3QoKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHNlcnZpY2VzCgogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLCAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdmFsaWQgcGFyYW0KICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkIEZST00gc2VydmljZScsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVNlcnZpY2VMaXN0OwogICAgbXkgJVNlcnZpY2VWYWxpZExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlTGlzdHsgJFJvd1swXSB9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRTZXJ2aWNlVmFsaWRMaXN0eyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiAlU2VydmljZUxpc3QgaWYgISRQYXJhbXtWYWxpZH07CgogICAgIyBnZXQgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIGR1cGxpY2F0ZSBzZXJ2aWNlIGxpc3QKICAgIG15ICVTZXJ2aWNlTGlzdFRtcCA9ICVTZXJ2aWNlTGlzdDsKCiAgICAjIGFkZCBzdWZmaXggZm9yIGNvcnJlY3Qgc29ydGluZwogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlTGlzdFRtcCApIHsKICAgICAgICAkU2VydmljZUxpc3RUbXB7JFNlcnZpY2VJRH0gLj0gJzo6JzsKICAgIH0KCiAgICBteSAlU2VydmljZUludmFsaWRMaXN0OwogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IHsgJFNlcnZpY2VMaXN0VG1weyRhfSBjbXAgJFNlcnZpY2VMaXN0VG1weyRifSB9IGtleXMgJVNlcnZpY2VMaXN0VG1wICkKICAgIHsKCiAgICAgICAgbXkgJFZhbGlkID0gc2NhbGFyIGdyZXAgeyAkXyBlcSAkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSB9IEBWYWxpZElEczsKCiAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgJFZhbGlkOwoKICAgICAgICAkU2VydmljZUludmFsaWRMaXN0eyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSA9IDE7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgIH0KCiAgICAjIGRlbGV0ZSBpbnZhbGlkIHNlcnZpY2VzIGFuZCBjaGlsZHMKICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgIElOVkFMSUROQU1FOgogICAgICAgIGZvciBteSAkSW52YWxpZE5hbWUgKCBrZXlzICVTZXJ2aWNlSW52YWxpZExpc3QgKSB7CgogICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSAkSW52YWxpZE5hbWUgOjogfXhtcyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICBsYXN0IElOVkFMSUROQU1FOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlU2VydmljZUxpc3Q7Cn0KCj1pdGVtIFNlcnZpY2VHZXQoKQoKcmV0dXJuIGEgc2VydmljZSBhcyBoYXNoCgpSZXR1cm4KICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9CiAgICAkU2VydmljZURhdGF7UGFyZW50SUR9CiAgICAkU2VydmljZURhdGF7TmFtZX0KICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9CiAgICAkU2VydmljZURhdGF7VmFsaWRJRH0KICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fQogICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9CiAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VydmljZURhdGF7VHlwZUlEfQogICAgJFNlcnZpY2VEYXRhe1R5cGV9CiAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0KICAgICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eX0KICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0KICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGV9CiAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0KIyAtLS0KCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNlcnZpY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgZnJvbSBkYgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAuICIsIHR5cGVfaWQsIGNyaXRpY2FsaXR5X2lkICIKIyAtLS0KICAgICAgICAgICAgLiAnRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZXJ2aWNlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gID0gJFJvd1swXTsKICAgICAgICAkU2VydmljZURhdGF7TmFtZX0gICAgICAgPSAkUm93WzFdOwogICAgICAgICRTZXJ2aWNlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NvbW1lbnR9ICAgID0gJFJvd1szXSB8fCAnJzsKICAgICAgICAkU2VydmljZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzRdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbNV07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzddOwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAkU2VydmljZURhdGF7VHlwZUlEfSAgICAgICAgPSAkUm93WzhdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eUlEfSA9ICRSb3dbOV07CiMgLS0tCiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlCiAgICBpZiAoICEkU2VydmljZURhdGF7U2VydmljZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggU2VydmljZUlEICgkUGFyYW17U2VydmljZUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnRpZAogICAgJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0gPSAkU2VydmljZURhdGF7TmFtZX07CiAgICBpZiAoICRTZXJ2aWNlRGF0YXtOYW1lfSA9fiAvXiguKik6OiguKz8pJC8gKSB7CiAgICAgICAgJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0gPSAkMjsKCiAgICAgICAgIyBsb29rdXAgcGFyZW50CiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICQxLAogICAgICAgICk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1BhcmVudElEfSA9ICRTZXJ2aWNlSUQ7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICApOwojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGdldCBzZXJ2aWNlIHR5cGUgbGlzdAogICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICApOwogICAgJFNlcnZpY2VEYXRhe1R5cGV9ID0gJFNlcnZpY2VUeXBlTGlzdC0+eyAkU2VydmljZURhdGF7VHlwZUlEfSB9IHx8ICcnOwoKICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICk7CiAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0gfSB8fCAnJzsKCiAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICdvcGVyYXRpb25hbCc7CgogICAgIyBnZXQgSVRTTSBtb2R1bGUgZGlyZWN0b3J5CiAgICBteSAkQ29uZmlnSXRlbU1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0ucG0nOwoKICAgICMgY2hlY2sgaWYgSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50IHBhY2thZ2UgaXMgaW5zdGFsbGVkCiAgICBpZiAoIC1lICRDb25maWdJdGVtTW9kdWxlICkgewoKICAgICAgICAjIGNoZWNrIGlmIGEgcHJlZmVyZW5jZSBzZXR0aW5nIGZvciBDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyBleGlzdHMKICAgICAgICBpZiAoICRQcmVmZXJlbmNlc3tDdXJJbmNpU3RhdGVUeXBlRnJvbUNJc30gKSB7CgogICAgICAgICAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBzZXJ2aWNlIHByZWZlcmVuY2VzICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycKICAgICAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9ID0gJFByZWZlcmVuY2Vze0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzfTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBwcmVmZXJlbmNlcyBzZXR0aW5nIGZvciBDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcwogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGluY2lkZW50IGxpbmsgdHlwZQogICAgICAgICAgICBteSAkTGlua1R5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZScpOwoKICAgICAgICAgICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICAgICAgICAgIG15ICVMaW5rZWRDb25maWdJdGVtSURzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgIE9iamVjdDEgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICBLZXkxICAgICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBPYmplY3QyICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgIFN0YXRlICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBlYWNoIGNvbmZpZyBpdGVtCiAgICAgICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGEgPSAkTGlua2VkQ29uZmlnSXRlbUlEc3skQ29uZmlnSXRlbUlEfTsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJEZXBsU3RhdGVUeXBlfSBuZSAncHJvZHVjdGl2ZSc7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnd2FybmluZycKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ3dhcm5pbmcnICkgewogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICd3YXJuaW5nJzsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgbXVzdCBiZSBzZXQgdG8gJ2luY2lkZW50JwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBDSXMgb2YgdGhlIHNlcnZpY2UKICAgICAgICAgICAgJFNlbGYtPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGludmVzdGlnYXRlIHRoZSBzdGF0ZSBvZiBhbGwgY2hpbGQgc2VydmljZXMKICAgIGlmICggJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IGVxICdvcGVyYXRpb25hbCcgKSB7CgogICAgICAgICMgY3JlYXRlIHRoZSB2YWxpZCBzdHJpbmcKICAgICAgICBteSAkVmFsaWRJRFN0cmluZyA9IGpvaW4gcXssIH0sICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpOwoKICAgICAgICAjIHByZXBhcmUgbmFtZQogICAgICAgIG15ICROYW1lID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgICAgICROYW1lID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTmFtZSwgJ0xpa2UnICk7CgogICAgICAgICMgZ2V0IGxpc3Qgb2YgYWxsIHZhbGlkIGNoaWxkcwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIHNlcnZpY2UgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgbmFtZSBMSUtFICciIC4gJE5hbWUgLiAiOjolJyAiCiAgICAgICAgICAgICAgICAuICJBTkQgdmFsaWRfaWQgSU4gKCIgLiAkVmFsaWRJRFN0cmluZyAuICIpIiwKICAgICAgICApOwoKICAgICAgICAjIGZpbmQgbGVuZ3RoIG9mIGNoaWxkcyBwcmVmaXgKICAgICAgICBteSAkUHJlZml4TGVuZ3RoID0gbGVuZ3RoICIkU2VydmljZURhdGF7TmFtZX06OiI7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15IEBDaGlsZElEczsKICAgICAgICBST1c6CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBjaGlsZCBwYXJ0CiAgICAgICAgICAgIG15ICRDaGlsZFBhcnQgPSBzdWJzdHIgJFJvd1sxXSwgJFByZWZpeExlbmd0aDsKCiAgICAgICAgICAgIG5leHQgUk9XIGlmICRDaGlsZFBhcnQgPX4gbXsgOjogfXhtczsKCiAgICAgICAgICAgIHB1c2ggQENoaWxkSURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgU0VSVklDRUlEOgogICAgICAgIGZvciBteSAkU2VydmljZUlEICggQENoaWxkSURzICkgewoKICAgICAgICAgICAgIyBnZXQgZGF0YSBvZiBjaGlsZCBzZXJ2aWNlCiAgICAgICAgICAgIG15ICVDaGlsZFNlcnZpY2VEYXRhID0gJFNlbGYtPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgU0VSVklDRUlEIGlmICRDaGlsZFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IGVxICdvcGVyYXRpb25hbCc7CgogICAgICAgICAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gPSAnd2FybmluZyc7CiAgICAgICAgICAgIGxhc3QgU0VSVklDRUlEOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSBkZWZhdWx0IGluY2lkZW50IHN0YXRlcwogICAgbXkgJURlZmF1bHRJbmNpU3RhdGVzID0gKAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ1dhcm5pbmcnLAogICAgICAgIGluY2lkZW50ICAgID0+ICdJbmNpZGVudCcsCiAgICApOwoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0IG9mIHRoaXMgdHlwZQogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgICA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVSZXZlcnNlSW5jaVN0YXRlTGlzdCA9IHJldmVyc2UgJXsgJEluY2lTdGF0ZUxpc3QgfTsKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0KICAgICAgICA9ICRSZXZlcnNlSW5jaVN0YXRlTGlzdHsgJERlZmF1bHRJbmNpU3RhdGVzeyAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gfSB9OwoKICAgICMgZmFsbGJhY2sgaWYgdGhlIGRlZmF1bHQgaW5jaWRlbnQgc3RhdGUgaXMgZGVhY3RpdmF0ZWQKICAgIGlmICggISRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0gKSB7CiAgICAgICAgbXkgQFNvcnRlZEluY2lMaXN0ID0gc29ydCBrZXlzICV7ICRJbmNpU3RhdGVMaXN0IH07CiAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZUlEfSA9ICRTb3J0ZWRJbmNpTGlzdFswXTsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkSW5jaVN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGV9ICAgICA9ICRJbmNpU3RhdGUtPntOYW1lfTsKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKIyAtLS0KCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlU2VydmljZURhdGEgPSAoICVTZXJ2aWNlRGF0YSwgJVByZWZlcmVuY2VzICk7CiAgICB9CgogICAgcmV0dXJuICVTZXJ2aWNlRGF0YTsKfQoKPWl0ZW0gU2VydmljZUxvb2t1cCgpCgpyZXR1cm4gYSBzZXJ2aWNlIG5hbWUgYW5kIGlkCgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgTmFtZSA9PiAnU2VydmljZTo6U3ViU2VydmljZScsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57JENhY2hlS2V5fTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICB9Cn0KCj1pdGVtIFNlcnZpY2VBZGQoKQoKYWRkIGEgc2VydmljZQoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIFR5cGVJRCAgICAgICAgPT4gMiwKICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgojIC0tLQojIElUU00KIyAtLS0KIyAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCBUeXBlSUQgQ3JpdGljYWxpdHlJRCkpIHsKIyAtLS0KICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgY29tbWVudAogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IC86Oi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwgKTsKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaW5kIGV4aXN0aW5nIHNlcnZpY2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRFeGlzdHMgPSAxOwogICAgfQoKICAgICMgYWRkIHNlcnZpY2UgdG8gZGF0YWJhc2UKICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5cJ3QgYWRkIHNlcnZpY2UhIFNlcnZpY2Ugd2l0aCBzYW1lIG5hbWUgYW5kIHBhcmVudCBhbHJlYWR5IGV4aXN0cy4nCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2UgJwojICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwojICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZSAnCiAgICAgICAgICAgIC4gJyhuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksICcKICAgICAgICAgICAgLiAndHlwZV9pZCwgY3JpdGljYWxpdHlfaWQpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgXSwKIyAtLS0KICAgICk7CgogICAgIyBnZXQgc2VydmljZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRTZXJ2aWNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OlNlcnZpY2VMb29rdXA6OklEOjonIC4gJFNlcnZpY2VJRCB9OwogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtGdWxsTmFtZX0gfTsKCiAgICByZXR1cm4gJFNlcnZpY2VJRDsKfQoKPWl0ZW0gU2VydmljZVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBzZXJ2aWNlCgogICAgbXkgJFRydWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVVwZGF0ZSgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFBhcmVudElEICA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgIENvbW1lbnQgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgID0+IDIsCiAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCBUeXBlSUQgQ3JpdGljYWxpdHlJRCkpIHsKIyAtLS0KICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBjb21tZW50CiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UgbmFtZQogICAgaWYgKCAkUGFyYW17TmFtZX0gPX4gLzo6LyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBzZXJ2aWNlISBJbnZhbGlkIFNlcnZpY2UgbmFtZSAnJFBhcmFte05hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9sZCBuYW1lIG9mIHNlcnZpY2UKICAgIG15ICRPbGRTZXJ2aWNlTmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sICk7CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6SUQ6OicgLiAkUGFyYW17U2VydmljZUlEfSB9OwogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRPbGRTZXJ2aWNlTmFtZSB9OwoKICAgICMgY3JlYXRlIGZ1bGwgbmFtZQogICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJhbXtOYW1lfTsKCiAgICAjIGdldCBwYXJlbnQgbmFtZQogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewoKICAgICAgICAjIGxvb2t1cCBzZXJ2aWNlCiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRQYXJlbnROYW1lKSB7CiAgICAgICAgICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyZW50TmFtZSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrLCBpZiBzZWxlY3RlZCBwYXJlbnQgd2FzIGEgY2hpbGQgb2YgdGhpcyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkUGFyYW17RnVsbE5hbWV9ID1+IC9eKFxRJE9sZFNlcnZpY2VOYW1lXEUpOjovICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IHVwZGF0ZSBzZXJ2aWNlISBJbnZhbGlkIHBhcmVudCB3YXMgc2VsZWN0ZWQuJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZmluZCBleGlzdHMgc2VydmljZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRFeGlzdHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJEV4aXN0cyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5cJ3QgdXBkYXRlIHNlcnZpY2UhIFNlcnZpY2Ugd2l0aCBzYW1lIG5hbWUgYW5kIHBhcmVudCBhbHJlYWR5IGV4aXN0cy4nCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CgogICAgfQoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgU1FMID0+ICdVUERBVEUgc2VydmljZSBTRVQgbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiMgICAgICAgICAgICAuICcgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyBXSEVSRSBpZCA9ID8nLAojICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgIFwkUGFyYW17RnVsbE5hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAojICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1NlcnZpY2VJRH0sCiMgICAgICAgIF0sCiAgICAgICAgU1FMID0+ICdVUERBVEUgc2VydmljZSBTRVQgbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJyBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/LCB0eXBlX2lkID0gPywgY3JpdGljYWxpdHlfaWQgPSA/JwogICAgICAgICAgICAuICcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUeXBlSUR9LCBcJFBhcmFte0NyaXRpY2FsaXR5SUR9LCBcJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgXSwKIyAtLS0KICAgICk7CgogICAgIyBmaW5kIGFsbCBjaGlsZHMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lIEZST00gc2VydmljZSBXSEVSRSBuYW1lIExJS0UgJyIKICAgICAgICAgICAgLiAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRPbGRTZXJ2aWNlTmFtZSwgJ0xpa2UnICkKICAgICAgICAgICAgLiAiOjolJyIsCiAgICApOwogICAgbXkgQENoaWxkczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUNoaWxkOwogICAgICAgICRDaGlsZHtTZXJ2aWNlSUR9ID0gJFJvd1swXTsKICAgICAgICAkQ2hpbGR7TmFtZX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgcHVzaCBAQ2hpbGRzLCBcJUNoaWxkOwogICAgfQoKICAgICMgdXBkYXRlIGNoaWxkcwogICAgZm9yIG15ICRDaGlsZCAoQENoaWxkcykgewogICAgICAgICRDaGlsZC0+e05hbWV9ID1+IHMvXihcUSRPbGRTZXJ2aWNlTmFtZVxFKTo6LyRQYXJhbXtGdWxsTmFtZX06Oi87CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGlsZC0+e05hbWV9LCBcJENoaWxkLT57U2VydmljZUlEfSBdLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU2VydmljZVNlYXJjaCgpCgpyZXR1cm4gc2VydmljZSBpZHMgYXMgYW4gYXJyYXkKCiAgICBteSBAU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVNlYXJjaCgKICAgICAgICBOYW1lICAgPT4gJ1NlcnZpY2UgTmFtZScsICMgKG9wdGlvbmFsKQogICAgICAgIExpbWl0ICA9PiAxMjIsICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwMAogICAgICAgIFVzZXJJRCA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSURzICAgICAgICA9PiAyLAogICAgICAgIENyaXRpY2FsaXR5SURzID0+IDEsCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgbGltaXQKICAgICRQYXJhbXtMaW1pdH0gfHw9IDEwMDA7CgogICAgIyBjcmVhdGUgc3FsIHF1ZXJ5CiAgICBteSAkU1FMCiAgICAgICAgPSAiU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSB2YWxpZF9pZCBJTiAoICR7XChqb2luICcsICcsICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpKX0gKSI7CgogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TmFtZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtOYW1lfSwgJ0xpa2UnICk7CgogICAgICAgICMgcmVwbGFjZSAqIHdpdGggJSBhbmQgY2xlYW4gdGhlIHN0cmluZwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyBcKisgfXslfXhtc2c7CiAgICAgICAgJFBhcmFte05hbWV9ID1+IHN7ICUrIH17JX14bXNnOwoKICAgICAgICAkU1FMIC49ICIgQU5EIG5hbWUgTElLRSAnJFBhcmFte05hbWV9JyAiOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgYWRkIHR5cGUgaWRzCiAgICBpZiAoICRQYXJhbXtUeXBlSURzfSAmJiByZWYgJFBhcmFte1R5cGVJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte1R5cGVJRHN9IH0gKSB7CiAgICAgICAgJFNRTCAuPSAiQU5EIHR5cGVfaWQgSU4gKCIgLiBqb2luKCcsICcsIEB7ICRQYXJhbXtUeXBlSURzfSB9KSAuICIpICI7CiAgICB9CiAgICAjIGFkZCBjcml0aWNhbGl0eSBpZHMKICAgIGlmICgkUGFyYW17Q3JpdGljYWxpdHlJRHN9ICYmIHJlZiAkUGFyYW17Q3JpdGljYWxpdHlJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte0NyaXRpY2FsaXR5SURzfSB9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBjcml0aWNhbGl0eV9pZCBJTiAoIiAuIGpvaW4oJywgJywgQHsgJFBhcmFte0NyaXRpY2FsaXR5SURzfSB9KSAuICIpICI7CiAgICB9CiMgLS0tCgogICAgJFNRTCAuPSAnIE9SREVSIEJZIG5hbWUnOwoKICAgICMgc2VhcmNoIHNlcnZpY2UgaW4gZGIKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAU2VydmljZUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIEBTZXJ2aWNlTGlzdDsKfQoKPWl0ZW0gQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoKQoKcmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXJ1c2VyL3NlcnZpY2UgbWVtYmVycwoKICAgIFNlcnZpY2VJRDogc2VydmljZSBpZAogICAgQ3VzdG9tZXJVc2VyTG9naW46IGN1c3RvbWVyIHVzZXIgbG9naW4KICAgIERlZmF1bHRTZXJ2aWNlczogYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBkZWZhdWx0IHNlcnZpY2VzCgogICAgUmVzdWx0OiBIQVNIIC0+IHJldHVybnMgYSBoYXNoIG9mIGtleSA9PiBzZXJ2aWNlIGlkLCB2YWx1ZSA9PiBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgTmFtZSAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgbmFtZXMKICAgICAgICAgICAgSUQgICAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgaWRzCgogICAgRXhhbXBsZSAoZ2V0IHNlcnZpY2VzIG9mIGN1c3RvbWVyIHVzZXIpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdCcsCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCiAgICApOwoKICAgIEV4YW1wbGUgKGdldCBjdXN0b21lciB1c2VyIG9mIHNlcnZpY2UpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJElELAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtSZXN1bHR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBSZXN1bHQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZXJ2aWNlSUQgb3IgQ3VzdG9tZXJVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0CiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtEZWZhdWx0U2VydmljZXN9ICkgewogICAgICAgICRQYXJhbXtEZWZhdWx0U2VydmljZXN9ID0gMTsKICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICk7CiAgICB9CiAgICBmb3IgKHF3KFNlcnZpY2VJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBrZXkKICAgIG15ICRDYWNoZUtleSA9ICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDo6JyAuICRQYXJhbXtSZXN1bHR9IC4gJzo6JzsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49ICdTZXJ2aWNlSUQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJ0N1c3RvbWVyVXNlckxvZ2luOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufTsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9IHx8ICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0ZvcmNlQ2FjaGV9ICkgewogICAgICAgICAgICAkUGFyYW17Q2FjaGVkfSA9ICRTZWxmLT57Rm9yY2VDYWNoZX07CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte0NhY2hlZH0gJiYgJFNlbGYtPnskQ2FjaGVLZXl9ICkgewogICAgICAgICAgICBpZiAoIHJlZiggJFNlbGYtPnskQ2FjaGVLZXl9ICkgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBAeyAkU2VsZi0+eyRDYWNoZUtleX0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiggJFNlbGYtPnskQ2FjaGVLZXl9ICkgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICV7ICRTZWxmLT57JENhY2hlS2V5fSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc3FsCiAgICBteSAlRGF0YTsKICAgIG15IEBOYW1lOwogICAgbXkgQElEOwogICAgbXkgJFNRTCA9ICdTRUxFQ1Qgc2N1LnNlcnZpY2VfaWQsIHNjdS5jdXN0b21lcl91c2VyX2xvZ2luLCBzLm5hbWUgJwogICAgICAgIC4gJyBGUk9NICcKICAgICAgICAuICcgc2VydmljZV9jdXN0b21lcl91c2VyIHNjdSwgc2VydmljZSBzJwogICAgICAgIC4gJyBXSEVSRSAnCiAgICAgICAgLiAiIHMudmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKSl9ICkgQU5EICIKICAgICAgICAuICcgcy5pZCA9IHNjdS5zZXJ2aWNlX2lkIEFORCAnOwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAiIHNjdS5zZXJ2aWNlX2lkID0gJFBhcmFte1NlcnZpY2VJRH0iOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRTUUwgLj0gIiBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiA9ICckUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59JyI7CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJEtleSAgID0gJyc7CiAgICAgICAgbXkgJFZhbHVlID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJEtleSAgID0gJFJvd1sxXTsKICAgICAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXkgICA9ICRSb3dbMF07CiAgICAgICAgICAgICRWYWx1ZSA9ICRSb3dbMl07CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHBlcm1pc3Npb25zCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkRGF0YXskS2V5fSApIHsKICAgICAgICAgICAgJERhdGF7JEtleX0gPSAkVmFsdWU7CiAgICAgICAgICAgIHB1c2ggQE5hbWUsICRWYWx1ZTsKICAgICAgICAgICAgcHVzaCBASUQsICAgJEtleTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gJiYgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gJiYgIWtleXMoJURhdGEpICkgewogICAgICAgICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICBwdXNoIEBOYW1lLCAkRGF0YXskS2V5fTsKICAgICAgICAgICAgcHVzaCBASUQsICAgJEtleTsKICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9ICYmICRQYXJhbXtSZXN1bHR9IGVxICdJRCcgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSB8fCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewoKICAgICAgICAgICAgIyBjYWNoZSByZXN1bHQKICAgICAgICAgICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gXEBJRDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBJRDsKICAgIH0KICAgIGlmICggJFBhcmFte1Jlc3VsdH0gJiYgJFBhcmFte1Jlc3VsdH0gZXEgJ05hbWUnICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gfHwgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKCiAgICAgICAgICAgICMgY2FjaGUgcmVzdWx0CiAgICAgICAgICAgICRTZWxmLT57JENhY2hlS2V5fSA9IFxATmFtZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBOYW1lOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSB8fCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewoKICAgICAgICAgICAgIyBjYWNoZSByZXN1bHQKICAgICAgICAgICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gXCVEYXRhOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJURhdGE7CiAgICB9Cn0KCj1pdGVtIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoKQoKdG8gYWRkIGEgbWVtYmVyIHRvIGEgc2VydmljZQoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICdUZXN0MScsCiAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gNiwKICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDdXN0b21lclVzZXJMb2dpbiBTZXJ2aWNlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgY3VzdG9tZXJfdXNlcl9sb2dpbiA9ID8gQU5EIHNlcnZpY2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgKTsKCiAgICAjIHJldHVybiBpZiByZWxhdGlvbiBpcyBub3QgYWN0aXZlCiAgICByZXR1cm4gaWYgISRQYXJhbXtBY3RpdmV9OwoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2VfY3VzdG9tZXJfdXNlciAnCiAgICAgICAgICAgIC4gJyhjdXN0b21lcl91c2VyX2xvZ2luLCBzZXJ2aWNlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtVc2VySUR9IF0KICAgICk7Cn0KCj1pdGVtIFNlcnZpY2VQcmVmZXJlbmNlc1NldCgpCgpzZXQgc2VydmljZSBwcmVmZXJlbmNlcwoKICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoQF8pOwp9Cgo9aXRlbSBTZXJ2aWNlUHJlZmVyZW5jZXNHZXQoKQoKZ2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVByZWZlcmVuY2VzR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVByZWZlcmVuY2VzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXJ2aWNlUHJlZmVyZW5jZXNHZXQoQF8pOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xNSAkICREYXRlOiAyMDEwLzA0LzEzIDE3OjQwOjIwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU0xBLnBtIC0gYWxsIHNsYSBmdW5jdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU0xBLnBtLHYgMS41IDIwMDkvMDcvMjEgMDA6MTI6MDggdWIgRXhwICQKIyAkT2xkSWQ6IFNMQS5wbSx2IDEuMzYgMjAwOS8wNy8yMSAwMDowOTowNCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTTEEgLSBzbGEgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBzbGEgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFNMQU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKIyAtLS0KCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTTEE6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OlNMQTo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoJVBhcmFtKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNMQUxpc3QoKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHNsYXMKCiAgICBteSAlU0xBTGlzdCA9ICRTTEFPYmplY3QtPlNMQUxpc3QoCiAgICAgICAgU2VydmljZUlEID0+IDEsICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZCAgICAgPT4gMCwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU0xBTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgYWRkIFNlcnZpY2VJRAogICAgbXkgJVNRTFRhYmxlOwogICAgJFNRTFRhYmxle3NsYX0gPSAnc2xhIHMnOwogICAgbXkgQFNRTFdoZXJlOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17U2VydmljZUlEfSwgJ0ludGVnZXInICk7CgogICAgICAgICRTUUxUYWJsZXtzZXJ2aWNlfSA9ICdzZXJ2aWNlX3NsYSByJzsKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgInMuaWQgPSByLnNsYV9pZCBBTkQgci5zZXJ2aWNlX2lkID0gJFBhcmFte1NlcnZpY2VJRH0iOwogICAgfQoKICAgICMgYWRkIHZhbGlkIHBhcnQKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKCiAgICAgICAgIyBjcmVhdGUgdGhlIHZhbGlkIGxpc3QKICAgICAgICBteSAkVmFsaWRJRHMgPSBqb2luICcsICcsICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgInMudmFsaWRfaWQgSU4gKCAkVmFsaWRJRHMgKSI7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRhYmxlIGFuZCB3aGVyZSBzdHJpbmdzCiAgICBteSAkVGFibGVTdHJpbmcgPSBqb2luIHF7LCB9LCB2YWx1ZXMgJVNRTFRhYmxlOwogICAgbXkgJFdoZXJlU3RyaW5nID0gQFNRTFdoZXJlID8gJyBXSEVSRSAnIC4gam9pbiBxeyBBTkQgfSwgQFNRTFdoZXJlIDogJyc7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHMuaWQsIHMubmFtZSBGUk9NICRUYWJsZVN0cmluZyAkV2hlcmVTdHJpbmciLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTTEFMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU0xBTGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gJVNMQUxpc3Q7Cn0KCj1pdGVtIFNMQUdldCgpCgpyZXR1cm4gYSBzbGEgYXMgaGFzaAoKUmV0dXJuCiAgICAkU0xBRGF0YXtTTEFJRH0KICAgICRTTEFEYXRhe1NlcnZpY2VJRHN9CiAgICAkU0xBRGF0YXtOYW1lfQogICAgJFNMQURhdGF7Q2FsZW5kYXJ9CiAgICAkU0xBRGF0YXtGaXJzdFJlc3BvbnNlVGltZX0KICAgICRTTEFEYXRhe0ZpcnN0UmVzcG9uc2VOb3RpZnl9CiAgICAkU0xBRGF0YXtVcGRhdGVUaW1lfQogICAgJFNMQURhdGF7VXBkYXRlTm90aWZ5fQogICAgJFNMQURhdGF7U29sdXRpb25UaW1lfQogICAgJFNMQURhdGF7U29sdXRpb25Ob3RpZnl9CiAgICAkU0xBRGF0YXtWYWxpZElEfQogICAgJFNMQURhdGF7Q29tbWVudH0KICAgICRTTEFEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU0xBRGF0YXtDcmVhdGVCeX0KICAgICRTTEFEYXRhe0NoYW5nZVRpbWV9CiAgICAkU0xBRGF0YXtDaGFuZ2VCeX0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU0xBRGF0YXtUeXBlSUR9CiAgICAkU0xBRGF0YXtUeXBlfQogICAgJFNMQURhdGF7TWluVGltZUJldHdlZW5JbmNpZGVudHN9CiMgLS0tCgogICAgbXkgJVNMQURhdGEgPSAkU0xBT2JqZWN0LT5TTEFHZXQoCiAgICAgICAgU0xBSUQgID0+IDEyMywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU0xBR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNMQUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJEFyZ3VtZW50ISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTTEFHZXQ6OicgLiAkUGFyYW17U0xBSUR9OwogICAgaWYgKCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgcmV0dXJuICV7ICRTZWxmLT57JENhY2hlS2V5fSB9OwogICAgfQoKICAgICMgZ2V0IHNsYSBmcm9tIGRiCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSwgY2FsZW5kYXJfbmFtZSwgZmlyc3RfcmVzcG9uc2VfdGltZSwgZmlyc3RfcmVzcG9uc2Vfbm90aWZ5LCAnCiAgICAgICAgICAgIC4gJ3VwZGF0ZV90aW1lLCB1cGRhdGVfbm90aWZ5LCBzb2x1dGlvbl90aW1lLCBzb2x1dGlvbl9ub3RpZnksICcKICAgICAgICAgICAgLiAndmFsaWRfaWQsIGNvbW1lbnRzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICcKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIC4gIiwgdHlwZV9pZCwgbWluX3RpbWVfYmV0X2luY2lkZW50cyAiCiMgLS0tCiAgICAgICAgICAgIC4gJ0ZST00gc2xhIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17U0xBSUR9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU0xBRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNMQURhdGF7U0xBSUR9ICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRTTEFEYXRhe05hbWV9ICAgICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkU0xBRGF0YXtDYWxlbmRhcn0gICAgICAgICAgICA9ICRSb3dbMl0gfHwgJyc7CiAgICAgICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZVRpbWV9ICAgPSAkUm93WzNdOwogICAgICAgICRTTEFEYXRhe0ZpcnN0UmVzcG9uc2VOb3RpZnl9ID0gJFJvd1s0XTsKICAgICAgICAkU0xBRGF0YXtVcGRhdGVUaW1lfSAgICAgICAgICA9ICRSb3dbNV07CiAgICAgICAgJFNMQURhdGF7VXBkYXRlTm90aWZ5fSAgICAgICAgPSAkUm93WzZdOwogICAgICAgICRTTEFEYXRhe1NvbHV0aW9uVGltZX0gICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkU0xBRGF0YXtTb2x1dGlvbk5vdGlmeX0gICAgICA9ICRSb3dbOF07CiAgICAgICAgJFNMQURhdGF7VmFsaWRJRH0gICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgICRTTEFEYXRhe0NvbW1lbnR9ICAgICAgICAgICAgID0gJFJvd1sxMF0gfHwgJyc7CiAgICAgICAgJFNMQURhdGF7Q3JlYXRlVGltZX0gICAgICAgICAgPSAkUm93WzExXTsKICAgICAgICAkU0xBRGF0YXtDcmVhdGVCeX0gICAgICAgICAgICA9ICRSb3dbMTJdOwogICAgICAgICRTTEFEYXRhe0NoYW5nZVRpbWV9ICAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgJFNMQURhdGF7Q2hhbmdlQnl9ICAgICAgICAgICAgPSAkUm93WzE0XTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgJFNMQURhdGF7VHlwZUlEfSAgICAgICAgICAgICAgICAgID0gJFJvd1sxNV07CiAgICAgICAgJFNMQURhdGF7TWluVGltZUJldHdlZW5JbmNpZGVudHN9ID0gJFJvd1sxNl0gfHwgMDsKIyAtLS0KICAgIH0KCiAgICAjIGNoZWNrIHNsYQogICAgaWYgKCAhJFNMQURhdGF7U0xBSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBTTEFJRCAoJFBhcmFte1NMQUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGdldCBzbGEgdHlwZSBsaXN0CiAgICBteSAkU0xBVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICApOwogICAgJFNMQURhdGF7VHlwZX0gPSAkU0xBVHlwZUxpc3QtPnsgJFNMQURhdGF7VHlwZUlEfSB9IHx8ICcnOwojIC0tLQoKICAgICMgZ2V0IGFsbCBzZXJ2aWNlIGlkcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHNlcnZpY2VfaWQgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzbGFfaWQgPSA/IE9SREVSIEJZIHNlcnZpY2VfaWQgQVNDJywKICAgICAgICBCaW5kID0+IFsgXCRTTEFEYXRhe1NMQUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBTZXJ2aWNlSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlSURzLCAkUm93WzBdOwogICAgfQoKICAgICMgYWRkIHRoZSBpZHMKICAgICRTTEFEYXRhe1NlcnZpY2VJRHN9ID0gXEBTZXJ2aWNlSURzOwoKICAgICMgZ2V0IHF1ZXVlIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U0xBUHJlZmVyZW5jZXNHZXQoIFNMQUlEID0+ICRQYXJhbXtTTEFJRH0gKTsKCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlU0xBRGF0YSA9ICggJVNMQURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gXCVTTEFEYXRhOwoKICAgIHJldHVybiAlU0xBRGF0YTsKfQoKPWl0ZW0gU0xBTG9va3VwKCkKCnJldHVybiB0aGUgbmFtZSBvciB0aGUgc2xhIGlkCgogICAgbXkgJFNMQU5hbWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoCiAgICAgICAgU0xBSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICBOYW1lID0+ICdTTEEgTmFtZScsCiAgICApOwoKPWN1dAoKc3ViIFNMQUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U0xBSUR9ICYmICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNMQUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTTEFJRH0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNMQUxvb2t1cDo6SUQ6OicgLiAkUGFyYW17U0xBSUR9OwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBzbGEgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NMQUlEfSwgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkTmFtZTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlCiAgICAgICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gJE5hbWU7CgogICAgICAgIHJldHVybiAkTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTTEFMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgaWYgKCBkZWZpbmVkICRTZWxmLT57JENhY2hlS2V5fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57JENhY2hlS2V5fTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzbGEgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkU0xBSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFNMQUlEID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUKICAgICAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSAkU0xBSUQ7CgogICAgICAgIHJldHVybiAkU0xBSUQ7CiAgICB9Cn0KCj1pdGVtIFNMQUFkZCgpCgphZGQgYSBzbGEKCiAgICBteSAkU0xBSUQgPSAkU0xBT2JqZWN0LT5TTEFBZGQoCiAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbIDEsIDUsIDcgXSwgICMgKG9wdGlvbmFsKQogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1NlcnZpY2UgTmFtZScsCiAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnQ2FsZW5kYXIxJywgICMgKG9wdGlvbmFsKQogICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMTIwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDYwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiBmaXJzdCByZXNwb25zZSBlc2NhbGF0aW9uIGlzIDYwJSByZWFjaGVkCiAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAxODAsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gODAsICAgICAgICAgICAjIChvcHRpb25hbCkgbm90aWZ5IGFnZW50IGlmIHVwZGF0ZSBlc2NhbGF0aW9uIGlzIDgwJSByZWFjaGVkCiAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA1ODAsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gODAsICAgICAgICAgICAjIChvcHRpb25hbCkgbm90aWZ5IGFnZW50IGlmIHNvbHV0aW9uIGVzY2FsYXRpb24gaXMgODAlIHJlYWNoZWQKICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgVHlwZUlEICAgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICBNaW5UaW1lQmV0d2VlbkluY2lkZW50cyA9PiAzNDQzLCAgIyAob3B0aW9uYWwpCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNMQUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiMgLS0tCiMgSVRTTQojIC0tLQojICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFZhbGlkSUQgVXNlcklEIFR5cGVJRCkpIHsKIyAtLS0KICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIGlkcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZXJ2aWNlSURzfSAmJiByZWYgJFBhcmFte1NlcnZpY2VJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZXJ2aWNlSURzIG5lZWQgdG8gYmUgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtTZXJ2aWNlSURzfSAgICAgICAgICB8fD0gW107CiAgICAkUGFyYW17Q2FsZW5kYXJ9ICAgICAgICAgICAgfHw9ICcnOwogICAgJFBhcmFte0NvbW1lbnR9ICAgICAgICAgICAgIHx8PSAnJzsKICAgICRQYXJhbXtGaXJzdFJlc3BvbnNlVGltZX0gICB8fD0gMDsKICAgICRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSB8fD0gMDsKICAgICRQYXJhbXtVcGRhdGVUaW1lfSAgICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtVcGRhdGVOb3RpZnl9ICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtTb2x1dGlvblRpbWV9ICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtTb2x1dGlvbk5vdGlmeX0gICAgICB8fD0gMDsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkUGFyYW17TWluVGltZUJldHdlZW5JbmNpZGVudHN9IHx8PSAwOwojIC0tLQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBzbGEncyB3aXRoIHRoZSBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzbGEgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IHNsYSwgaWYgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgYWRkIG5ldyBTTEEhICckUGFyYW17TmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgc2xhIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2xhICcKIyAgICAgICAgICAgIC4gJyhuYW1lLCBjYWxlbmRhcl9uYW1lLCBmaXJzdF9yZXNwb25zZV90aW1lLCBmaXJzdF9yZXNwb25zZV9ub3RpZnksICcKIyAgICAgICAgICAgIC4gJ3VwZGF0ZV90aW1lLCB1cGRhdGVfbm90aWZ5LCBzb2x1dGlvbl90aW1lLCBzb2x1dGlvbl9ub3RpZnksICcKIyAgICAgICAgICAgIC4gJ3ZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKIyAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFyfSwgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSwKIyAgICAgICAgICAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0sIFwkUGFyYW17VXBkYXRlVGltZX0sIFwkUGFyYW17VXBkYXRlTm90aWZ5fSwKIyAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiMgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKIyAgICAgICAgXSwKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNsYSAnCiAgICAgICAgICAgIC4gJyhuYW1lLCBjYWxlbmRhcl9uYW1lLCBmaXJzdF9yZXNwb25zZV90aW1lLCBmaXJzdF9yZXNwb25zZV9ub3RpZnksICcKICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUsIHVwZGF0ZV9ub3RpZnksIHNvbHV0aW9uX3RpbWUsIHNvbHV0aW9uX25vdGlmeSwgJwogICAgICAgICAgICAuICd2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksICcKICAgICAgICAgICAgLiAndHlwZV9pZCwgbWluX3RpbWVfYmV0X2luY2lkZW50cykgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPywgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFyfSwgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSwgXCRQYXJhbXtVcGRhdGVUaW1lfSwgXCRQYXJhbXtVcGRhdGVOb3RpZnl9LAogICAgICAgICAgICBcJFBhcmFte1NvbHV0aW9uVGltZX0sIFwkUGFyYW17U29sdXRpb25Ob3RpZnl9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUeXBlSUR9LCBcJFBhcmFte01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSwKICAgICAgICBdLAojIC0tLQogICAgKTsKCiAgICAjIGdldCBzbGEgaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNsYSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkU0xBSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTTEFJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjaGVjayBzbGEgaWQKICAgIGlmICggISRTTEFJRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgU0xBSUQgZm9yICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZW1vdmUgYWxsIGV4aXN0aW5nIGFsbG9jYXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkU0xBSUQgXSwKICAgICk7CgogICAgIyBhZGQgdGhlIG5ldyBhbGxvY2F0aW9ucwogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBAeyAkUGFyYW17U2VydmljZUlEc30gfSApIHsKCiAgICAgICAgIyBhZGQgb25lIGFsbG9jYXRpb24KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9zbGEgKHNlcnZpY2VfaWQsIHNsYV9pZCkgVkFMVUVTICg/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFNlcnZpY2VJRCwgXCRTTEFJRCBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTTEFJRDsKfQoKPWl0ZW0gU0xBVXBkYXRlKCkKCnVwZGF0ZSBhIGV4aXN0aW5nIHNsYQoKICAgIG15ICRUcnVlID0gJFNMQU9iamVjdC0+U0xBVXBkYXRlKAogICAgICAgIFNMQUlEICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgMSwgMiwgMyBdLCAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICdDYWxlbmRhcjEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAxMjAsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gNjAsICAgICAgICAgICAjIChvcHRpb25hbCkgbm90aWZ5IGFnZW50IGlmIGZpcnN0IHJlc3BvbnNlIGVzY2FsYXRpb24gaXMgNjAlIHJlYWNoZWQKICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDE4MCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA4MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgdXBkYXRlIGVzY2FsYXRpb24gaXMgODAlIHJlYWNoZWQKICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDU4MCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA4MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgc29sdXRpb24gZXNjYWxhdGlvbiBpcyA4MCUgcmVhY2hlZAogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzID0+IDM0NDMsICAjIChvcHRpb25hbCkKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgU0xBVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoU0xBSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNMQUlEIE5hbWUgVmFsaWRJRCBVc2VySUQgVHlwZUlEKSkgewojIC0tLQogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UgaWRzCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlcnZpY2VJRHN9ICYmIHJlZiAkUGFyYW17U2VydmljZUlEc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlcnZpY2VJRHMgbmVlZCB0byBiZSBhbiBhcnJheSByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte1NlcnZpY2VJRHN9ICAgICAgICAgIHx8PSBbXTsKICAgICRQYXJhbXtDYWxlbmRhcn0gICAgICAgICAgICB8fD0gJyc7CiAgICAkUGFyYW17Q29tbWVudH0gICAgICAgICAgICAgfHw9ICcnOwogICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSAgIHx8PSAwOwogICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9IHx8PSAwOwogICAgJFBhcmFte1VwZGF0ZVRpbWV9ICAgICAgICAgIHx8PSAwOwogICAgJFBhcmFte1VwZGF0ZU5vdGlmeX0gICAgICAgIHx8PSAwOwogICAgJFBhcmFte1NvbHV0aW9uVGltZX0gICAgICAgIHx8PSAwOwogICAgJFBhcmFte1NvbHV0aW9uTm90aWZ5fSAgICAgIHx8PSAwOwojIC0tLQojIElUU00KIyAtLS0KICAgICRQYXJhbXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30gfHw9IDA7CiMgLS0tCgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIHNsYSdzIHdpdGggdGhlIHNhbWUgbmFtZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2xhIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gIT0gJFBhcmFte1NMQUlEfSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgfQoKICAgICMgYWJvcnQgdXBkYXRlIG9mIHNsYSwgaWYgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCRVcGRhdGUpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBTTEEhICckUGFyYW17TmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U0xBR2V0OjonIC4gJFBhcmFte1NMQUlEfSB9OwogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U0xBTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9IH07CiAgICBkZWxldGUgJFNlbGYtPnsgJ0NhY2hlOjpTTEFMb29rdXA6OklEOjonIC4gJFBhcmFte1NMQUlEfSB9OwoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgU1FMID0+ICdVUERBVEUgc2xhIFNFVCBuYW1lID0gPywgY2FsZW5kYXJfbmFtZSA9ID8sICcKIyAgICAgICAgICAgIC4gJ2ZpcnN0X3Jlc3BvbnNlX3RpbWUgPSA/LCBmaXJzdF9yZXNwb25zZV9ub3RpZnkgPSA/LCAnCiMgICAgICAgICAgICAuICd1cGRhdGVfdGltZSA9ID8sIHVwZGF0ZV9ub3RpZnkgPSA/LCBzb2x1dGlvbl90aW1lID0gPywgc29sdXRpb25fbm90aWZ5ID0gPywgJwojICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwojICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFyfSwgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSwKIyAgICAgICAgICAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0sIFwkUGFyYW17VXBkYXRlVGltZX0sIFwkUGFyYW17VXBkYXRlTm90aWZ5fSwKIyAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiMgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17U0xBSUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnVVBEQVRFIHNsYSBTRVQgbmFtZSA9ID8sIGNhbGVuZGFyX25hbWUgPSA/LCAnCiAgICAgICAgICAgIC4gJ2ZpcnN0X3Jlc3BvbnNlX3RpbWUgPSA/LCBmaXJzdF9yZXNwb25zZV9ub3RpZnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3VwZGF0ZV90aW1lID0gPywgdXBkYXRlX25vdGlmeSA9ID8sIHNvbHV0aW9uX3RpbWUgPSA/LCBzb2x1dGlvbl9ub3RpZnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3R5cGVfaWQgPSA/LCBtaW5fdGltZV9iZXRfaW5jaWRlbnRzID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9LCBcJFBhcmFte1VwZGF0ZVRpbWV9LCBcJFBhcmFte1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUeXBlSUR9LCBcJFBhcmFte01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSwgXCRQYXJhbXtTTEFJRH0sCiAgICAgICAgXSwKIyAtLS0KICAgICk7CgogICAgIyByZW1vdmUgYWxsIGV4aXN0aW5nIGFsbG9jYXRpb25zCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzbGFfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTTEFJRH0sIF0KICAgICk7CgogICAgIyBhZGQgdGhlIG5ldyBhbGxvY2F0aW9ucwogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBAeyAkUGFyYW17U2VydmljZUlEc30gfSApIHsKCiAgICAgICAgIyBhZGQgb25lIGFsbG9jYXRpb24KICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX3NsYSAoc2VydmljZV9pZCwgc2xhX2lkKSBWQUxVRVMgKD8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlELCBcJFBhcmFte1NMQUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFNMQVByZWZlcmVuY2VzU2V0KCkKCnNldCBxdWV1ZSBwcmVmZXJlbmNlcwoKICAgICRTTEFPYmplY3QtPlNMQVByZWZlcmVuY2VzU2V0KAogICAgICAgIFNMQUlEID0+IDEyMywKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU0xBUHJlZmVyZW5jZXNTZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNMQVByZWZlcmVuY2VzU2V0KEBfKTsKfQoKPWl0ZW0gU0xBUHJlZmVyZW5jZXNHZXQoKQoKZ2V0IHF1ZXVlIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNMQU9iamVjdC0+U0xBUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgU0xBSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFNMQVByZWZlcmVuY2VzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TTEFQcmVmZXJlbmNlc0dldChAXyk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDoxMjowOCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMucG0gLSBhbGwgc3RhdHMgY29yZSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN0YXRzLnBtLHYgMS4zIDIwMTAvMDMvMDEgMTI6MTc6MjMgdWIgRXhwICQKIyAkT2xkSWQ6IFN0YXRzLnBtLHYgMS44MC4yLjEgMjAwOS8wOS8yOCAxMzoxMjozOSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgRGF0ZTo6UGNhbGMgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc3RhdHMgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDU1Y7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkQ1NWT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNTVi0+bmV3KAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRVc2VyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJFN0YXRzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN0YXRzLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgQ1NWT2JqZWN0ICAgID0+ICRDU1ZPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIEdyb3VwT2JqZWN0ICA9PiAkR3JvdXBPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgID0+ICRVc2VyT2JqZWN0LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggcmVmIHRvIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG9iamVjdHMgbGlzdCBmb3IgY29tcGxldGVuZXNzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoCiAgICAgICAgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VySUQgR3JvdXBPYmplY3QgVXNlck9iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QgQ1NWT2JqZWN0CiAgICAgICAgREJPYmplY3QgRW5jb2RlT2JqZWN0CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzdXBwbGVtZW50YXJ5IG9iamVjdHMKICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwoKICAgICMgdGVtcG9yYXJ5IGRpcmVjdG9yeQogICAgJFNlbGYtPntTdGF0c1RlbXBEaXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL3N0YXRzLyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdGF0c0FkZCgpCgphZGQgbmV3IHN0YXRzCgogICAgbXkgJFN0YXRJRCA9ICRTdGF0c09iamVjdC0+U3RhdHNBZGQoKTsKCj1jdXQKCnN1YiBTdGF0c0FkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRTdGF0SUQgPSAxOwoKICAgICMgZ2V0IG5ldyBTdGF0SUQKICAgIG15IEBLZXlzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKCBUeXBlID0+ICdTdGF0cycsICk7CiAgICBpZiAoQEtleXMpIHsKICAgICAgICBteSBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQEtleXM7CiAgICAgICAgJFN0YXRJRCA9ICRTb3J0S2V5c1stMV0gKyAxOwogICAgfQoKICAgICMgcmVxdWVzdGluZyBjdXJyZW50IHRpbWUgc3RhbXAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgIyBtZXRhIHRhZ3MKICAgIG15ICVNZXRhRGF0YSA9ICgpOwogICAgJE1ldGFEYXRhe0NyZWF0ZWR9WzBde0NvbnRlbnR9ICAgPSAkVGltZVN0YW1wOwogICAgJE1ldGFEYXRhe0NyZWF0ZWRCeX1bMF17Q29udGVudH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAkTWV0YURhdGF7Q2hhbmdlZH1bMF17Q29udGVudH0gICA9ICRUaW1lU3RhbXA7CiAgICAkTWV0YURhdGF7Q2hhbmdlZEJ5fVswXXtDb250ZW50fSA9ICRTZWxmLT57VXNlcklEfTsKICAgICRNZXRhRGF0YXtWYWxpZH1bMF17Q29udGVudH0gICAgID0gMTsKICAgICRNZXRhRGF0YXtTdGF0TnVtYmVyfVswXXtDb250ZW50fQogICAgICAgID0gJFN0YXRJRCArICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6U3RhdHNTdGFydE51bWJlcicpOwoKICAgICMgc3RhcnQgbmV3IHN0YXRzIHJlY29yZAogICAgbXkgQFhNTEhhc2g7ICAgICMgaXQncyBhbiBhcnJheSBidXQgdGhlIHdvcmRpbmcgaXMgaGFzaAogICAgJFhNTEhhc2hbMF17b3Ryc19zdGF0c31bMF0gPSBcJU1ldGFEYXRhOwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ1N0YXRzJywKICAgICAgICAgICAgS2V5ICAgICA9PiAkU3RhdElELAogICAgICAgICAgICBYTUxIYXNoID0+IFxAWE1MSGFzaCwKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU3RhdHNBZGQ6IENhbiBub3QgYWRkIGEgbmV3IFN0YXQhJywKICAgICAgICApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiAkU3RhdElEOwp9Cgo9aXRlbSBTdGF0c0dldCgpCgpnZXQgYSBoYXNoIHJlZiBvZiB0aGUgc3RhdHMgeW91IG5lZWQKCiAgICBteSAkSGFzaFJlZiA9ICRTdGF0c09iamVjdC0+U3RhdHNHZXQoCiAgICAgICAgU3RhdElEICAgICAgICAgICAgID0+ICcxMjMnLAogICAgICAgIE5vT2JqZWN0QXR0cmlidXRlcyA9PiAxLCAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWNlc3NhcnkgZGF0YQogICAgaWYgKCAhJFBhcmFte1N0YXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ1N0YXRzR2V0OiBOZWVkIFN0YXRJRCEnICk7CiAgICB9CgogICAgIyBnZXQgaGFzaCBmcm9tIHN0b3JhZ2UKICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAogICAgICAgIFR5cGUgPT4gJ1N0YXRzJywKICAgICAgICBLZXkgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgKTsKCiAgICBpZiAoICEkWE1MSGFzaFswXSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiU3RhdHNHZXQ6IENhblwndCBnZXQgU3RhdCEiICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVN0YXQgICAgPSAoKTsKICAgIG15ICRTdGF0WE1MID0gJFhNTEhhc2hbMF17b3Ryc19zdGF0c31bMV07CgogICAgIyBwcm9jZXNzIGFsbCBzdHJpbmdzCiAgICAkU3RhdHtTdGF0SUR9ID0gJFBhcmFte1N0YXRJRH07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoVGl0bGUgT2JqZWN0IEZpbGUgRGVzY3JpcHRpb24gU3VtUm93IFN1bUNvbCBTdGF0TnVtYmVyCiAgICAgICAgQ2FjaGUgU3RhdFR5cGUgVmFsaWQgT2JqZWN0TW9kdWxlIENyZWF0ZWRCeSBDaGFuZ2VkQnkgQ3JlYXRlZCBDaGFuZ2VkCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoIGRlZmluZWQgJFN0YXRYTUwtPnskS2V5fVsxXXtDb250ZW50fSApIHsKICAgICAgICAgICAgJFN0YXR7JEtleX0gPSAkU3RhdFhNTC0+eyRLZXl9WzFde0NvbnRlbnR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHByb2Nlc3MgYWxsIGFycmF5cwogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKHF3KFBlcm1pc3Npb24gRm9ybWF0IEdyYXBoU2l6ZSkpIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJFN0YXRYTUwtPnskS2V5fVsxXXtDb250ZW50fTsKCiAgICAgICAgJFN0YXR7JEtleX0gPSAoKTsKICAgICAgICBmb3IgbXkgJEluZGV4ICggMSAuLiAkI3sgJFN0YXRYTUwtPnskS2V5fSB9ICkgewogICAgICAgICAgICBwdXNoIEB7ICRTdGF0eyRLZXl9IH0sICRTdGF0WE1MLT57JEtleX1bJEluZGV4XS0+e0NvbnRlbnR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBvZiB0aGUgZHluYW1pYyBzdGF0cwogICAgIyAlQWxsb3dlZCBpcyB1c2VkIHRvIGF2b2lkIGRvdXBsZSBzZWxlY3Rpb24gaW4gZGlmZmVyZW50IGZvcm1zCiAgICBteSAlQWxsb3dlZCAgICAgPSAoKTsKICAgIG15ICVUaW1lQWxsb3dlZCA9ICgpOwogICAgbXkgJFRpbWVFbGVtZW50ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpUaW1lRWxlbWVudCcpIHx8ICdUaW1lJzsKICAgIHJldHVybiBcJVN0YXQgaWYgISRTdGF0e09iamVjdH07CgogICAgJFN0YXR7T2JqZWN0TmFtZX0gPSAkU2VsZi0+R2V0T2JqZWN0TmFtZSgKICAgICAgICBPYmplY3RNb2R1bGUgPT4gJFN0YXR7T2JqZWN0TW9kdWxlfSwKICAgICk7CgogICAgcmV0dXJuIFwlU3RhdCBpZiAkUGFyYW17Tm9PYmplY3RBdHRyaWJ1dGVzfTsKCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoVXNlQXNYdmFsdWUgVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uKSkgewoKICAgICAgICAjIEBTdGF0QXR0cmlidXRlc1NpbXBsaWZpZWQgZ2l2ZSB5b3UgYXJyYXlzIHdpdGhvdXQgdW5kZWYgYXJyYXkgZWxlbWVudHMKICAgICAgICBteSBAU3RhdEF0dHJpYnV0ZXNTaW1wbGlmaWVkID0gKCk7CgogICAgICAgICMgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBvYmplY3QKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT5HZXRTdGF0c09iamVjdEF0dHJpYnV0ZXMoCiAgICAgICAgICAgIE9iamVjdE1vZHVsZSA9PiAkU3RhdHtPYmplY3RNb2R1bGV9LAogICAgICAgICAgICBVc2UgICAgICAgICAgPT4gJEtleSwKICAgICAgICApOwoKICAgICAgICBuZXh0IEtFWSBpZiAhQE9iamVjdEF0dHJpYnV0ZXM7CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoQE9iamVjdEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkQXR0cmlidXRlLT57RWxlbWVudH07CiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZS0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRLZXkgZXEgJ1VzZUFzVmFsdWVTZXJpZXMnICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEFsbG93ZWR7JEVsZW1lbnR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRBbGxvd2VkeyRFbGVtZW50fSA9PSAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBbGxvd2VkeyRFbGVtZW50fSAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAkVGltZUFsbG93ZWR7JEVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBbGxvd2VkeyRFbGVtZW50fSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkS2V5IGVxICdVc2VBc1Jlc3RyaWN0aW9uJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lQWxsb3dlZHskRWxlbWVudH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRpbWVBbGxvd2VkeyRFbGVtZW50fSA9PSAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBbGxvd2VkeyRFbGVtZW50fSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkQWxsb3dlZHskRWxlbWVudH0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAkQWxsb3dlZHskRWxlbWVudH07CgogICAgICAgICAgICBpZiAoICRTdGF0WE1MLT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICBteSBAU3RhdEF0dHJpYnV0ZXMgPSBAeyAkU3RhdFhNTC0+eyRLZXl9IH07CiAgICAgICAgICAgICAgICBpZiAoICEkU3RhdEF0dHJpYnV0ZXNbMF0gKSB7CiAgICAgICAgICAgICAgICAgICAgc2hpZnQgQFN0YXRBdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUkVGOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWYgKEBTdGF0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEF0dHJpYnV0ZS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dHJpYnV0ZS0+e1RyYW5zbGF0aW9ufSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBuZXh0IFJFRgogICAgICAgICAgICAgICAgICAgICAgICBpZiAhKAogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAmJiAkUmVmLT57RWxlbWVudH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEVsZW1lbnQgZXEgJFJlZi0+e0VsZW1lbnR9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgaWYgc2VsZWN0ZWQgZWxlbWVudHMgZXhpdCwgYWRkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgU3RhdEF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICAkQXR0cmlidXRlLT57U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWYtPntGaXhlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRyaWJ1dGUtPntGaXhlZH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDEgLi4gJCN7ICRSZWYtPntTZWxlY3RlZFZhbHVlc30gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRBdHRyaWJ1dGUtPntTZWxlY3RlZFZhbHVlc30gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWYtPntTZWxlY3RlZFZhbHVlc31bJEluZGV4XS0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHN0ZXR0aW5ncyBmb3Igd29ya2luZyB3aXRoIHRpbWUgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICBmb3IgKAogICAgICAgICAgICAgICAgICAgICAgICBxdyhUaW1lU3RvcCBUaW1lU3RhcnQgVGltZVJlbGF0aXZlVW5pdAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lUmVsYXRpdmVDb3VudCBUaW1lU2NhbGVDb3VudAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVmLT57JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWYtPnskX30gJiYgKCAhJEF0dHJpYnV0ZS0+eyRffSB8fCAkUmVmLT57Rml4ZWR9ICkgKSB7CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQXR0cmlidXRlLT57JF99ID0gJFJlZi0+eyRffTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQWxsb3dlZHskRWxlbWVudH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFN0YXRBdHRyaWJ1dGVzU2ltcGxpZmllZCwgJEF0dHJpYnV0ZTsKCiAgICAgICAgfQogICAgICAgICRTdGF0eyRLZXl9ID0gXEBTdGF0QXR0cmlidXRlc1NpbXBsaWZpZWQ7CiAgICB9CgogICAgcmV0dXJuIFwlU3RhdDsKfQoKPWl0ZW0gU3RhdHNVcGRhdGUoKQoKdXBkYXRlIGEgc3RhdAoKICAgICRTdGF0c09iamVjdC0+U3RhdHNVcGRhdGUoCiAgICAgICAgU3RhdElEID0+ICcxMjMnLAogICAgICAgIEhhc2ggICA9PiBcJUhhc2gKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlY2xhcmF0aW9uIG9mIHRoZSBoYXNoCiAgICBteSAlU3RhdFhNTCA9ICgpOwoKICAgICMgY2hlY2sgbmVjZXNzYXJ5IGRhdGEKICAgIGlmICggISRQYXJhbXtTdGF0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdTdGF0c1VwZGF0ZTogTmVlZCBTdGF0SUQhJyApOwogICAgfQoKICAgICMgcmVxdWVzdGluZyBzdGF0cyByZWZlcmVuY2UKICAgIG15ICRTdGF0T2xkID0gJFNlbGYtPlN0YXRzR2V0KCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKICAgIGlmICggISRTdGF0T2xkICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiU3RhdHNVcGRkYXRlOiBDYW4ndCBnZXQgc3RhdHMsIHBlcmhhcHMgeW91IGhhdmUgYW4gaW52YWxpZCBzdGF0cyBpZCEgKFN0YXRzSUQgPT4gJFBhcmFte1N0YXRJRH0pIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyBkZWNsYXJlIHZhcmlhYmxlCiAgICBteSAkU3RhdE5ldyA9ICRQYXJhbXtIYXNofTsKCiAgICAjIGEgZGVsZXRlIGZ1bmN0aW9uIGNhbiBiZSB0aGUgYmV0dGVyIHNvbHV0aW9uCiAgICBmb3IgbXkgJEtleSAocXcoVXNlQXNYdmFsdWUgVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uKSkgewogICAgICAgIGZvciAoIEB7ICRTdGF0T2xkLT57JEtleX0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJF8tPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAkXyA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRvcHQgY2hhbmdlcwogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JFN0YXROZXd9ICkgewogICAgICAgICRTdGF0T2xkLT57JEtleX0gPSAkU3RhdE5ldy0+eyRLZXl9OwogICAgfQoKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyRTdGF0T2xkfSApIHsKICAgICAgICBpZiAoICRLZXkgZXEgJ1VzZUFzWHZhbHVlJyB8fCAkS2V5IGVxICdVc2VBc1ZhbHVlU2VyaWVzJyB8fCAkS2V5IGVxICdVc2VBc1Jlc3RyaWN0aW9uJyApIHsKICAgICAgICAgICAgbXkgJEluZGV4ID0gMDsKICAgICAgICAgICAgUkVGOgogICAgICAgICAgICBmb3IgbXkgJFJlZiAoIEB7ICRTdGF0T2xkLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUkVGIGlmICEkUmVmOwoKICAgICAgICAgICAgICAgICRJbmRleCsrOwogICAgICAgICAgICAgICAgJFN0YXRYTUx7JEtleX1bJEluZGV4XXtFbGVtZW50fSA9ICRSZWYtPntFbGVtZW50fTsKICAgICAgICAgICAgICAgICRTdGF0WE1MeyRLZXl9WyRJbmRleF17Rml4ZWR9ICAgPSAkUmVmLT57Rml4ZWR9OwogICAgICAgICAgICAgICAgbXkgJFN1YkluZGV4ID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkVmFsdWUgKCBAeyAkUmVmLT57U2VsZWN0ZWRWYWx1ZXN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN1YkluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgJFN0YXRYTUx7JEtleX1bJEluZGV4XXtTZWxlY3RlZFZhbHVlc31bJFN1YkluZGV4XXtDb250ZW50fSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHN0ZXR0aW5ncyBmb3Igd29ya2luZyB3aXRoIHRpbWUgZWxlbWVudHMKICAgICAgICAgICAgICAgIGZvciAocXcoVGltZVN0b3AgVGltZVN0YXJ0IFRpbWVSZWxhdGl2ZVVuaXQgVGltZVJlbGF0aXZlQ291bnQgVGltZVNjYWxlQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVmLT57JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU3RhdFhNTHskS2V5fVskSW5kZXhdeyRffSA9ICRSZWYtPnskX307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmKCAkU3RhdE9sZC0+eyRLZXl9ICkgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCN7ICRTdGF0T2xkLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICRTdGF0WE1MeyRLZXl9WyRJbmRleF17Q29udGVudH0gPSAkU3RhdE9sZC0+eyRLZXl9WyRJbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkU3RhdE9sZC0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFN0YXRYTUx7JEtleX1bMV17Q29udGVudH0gPSAkU3RhdE9sZC0+eyRLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbWV0YSB0YWdzCiAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgJFN0YXRYTUx7Q2hhbmdlZH1bMV17Q29udGVudH0gICA9ICRUaW1lU3RhbXA7CiAgICAkU3RhdFhNTHtDaGFuZ2VkQnl9WzFde0NvbnRlbnR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICMgcGxlYXNlIGRvbid0IGNoYW5nZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBYTUxIYXNoRGVsZXRlIGFuZCBYTUxIYXNoQWRkCiAgICAjIGludG8gdGhlIG5ldyBmdW5jdGlvbiBYTUxIYXNoVXBkYXRlLCB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuCiAgICAjIFBlcmhhcHMgdGhlcmUgYXJlIGludHJpY2FjaWVzIGJlY2F1c2Ugb2YgdGhlICdBcnJheVswXSA9IHVuZGVmJyBkZWZpbml0aW9uCgogICAgIyBkZWxldGUgdGhlIG9sZCByZWNvcmQKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoRGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdTdGF0cycsCiAgICAgICAgICAgIEtleSAgPT4gJFBhcmFte1N0YXRJRH0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRzVXBkZGF0ZTogQ2FuJ3QgZGVsZXRlIFhNTEhhc2ghIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT5fRGVsZXRlQ2FjaGUoIFN0YXRJRCA9PiAkUGFyYW17U3RhdElEfSApOwoKICAgIG15IEBBcnJheSA9ICgpOwogICAgJEFycmF5WzBde290cnNfc3RhdHN9WzBdID0gXCVTdGF0WE1MOwoKICAgICMgYWRkIHRoZSByZXZpc2VkIHJlY29yZAogICAgaWYgKAogICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKICAgICAgICAgICAgVHlwZSAgICA9PiAnU3RhdHMnLAogICAgICAgICAgICBLZXkgICAgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgICAgICAgICBYTUxIYXNoID0+IFxAQXJyYXkKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlN0YXRzVXBkZGF0ZTogQ2FuJ3QgYWRkIFhNTEhhc2ghIiApOwoKICAgIHJldHVybiAwOwp9Cgo9aXRlbSBTdGF0c0RlbGV0ZSgpCgpkZWxldGUgYSBzdGF0cwoKICAgICRTdGF0c09iamVjdC0+U3RhdHNEZWxldGUoU3RhdElEID0+ICcxMjMnKTsKCj1jdXQKCnN1YiBTdGF0c0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVjZXNzYXJ5IGRhdGEKICAgIGlmICggISRQYXJhbXtTdGF0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJTdGF0c0RlbGV0ZTogTmVlZCBTdGF0SUQhIiApOwogICAgfQoKICAgICMgZGVsZXRlIHRoZSByZWNvcmQKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiAgICAgICAgVHlwZSA9PiAnU3RhdHMnLAogICAgICAgIEtleSAgPT4gJFBhcmFte1N0YXRJRH0sCiAgICApOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0c0RlbGV0ZTogQ2FuJ3QgZGVsZXRlIFhNTEhhc2ghIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+X0RlbGV0ZUNhY2hlKCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKCiAgICAjIGdldCBsaXN0IG9mIGluc3RhbGxlZCBzdGF0cyBmaWxlcwogICAgbXkgQFN0YXRzRmlsZUxpc3QgPSBnbG9iICRTZWxmLT57U3RhdHNUZW1wRGlyfSAuICcqLnhtbC5pbnN0YWxsZWQnOwoKICAgICMgZGVsZXRlIHRoZSAuaW5zdGFsbGVkIGZpbGUgaW4gdGVtcCBkaXIKICAgIEZJTEU6CiAgICBmb3IgbXkgJEZpbGUgKCBzb3J0IEBTdGF0c0ZpbGVMaXN0ICkgewoKICAgICAgICAjIHJlYWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJFN0YXRzSURSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEZpbGUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBGSUxFIGlmICEkU3RhdHNJRFJlZjsKICAgICAgICBuZXh0IEZJTEUgaWYgcmVmICRTdGF0c0lEUmVmIG5lICdTQ0FMQVInOwogICAgICAgIG5leHQgRklMRSBpZiAhJHskU3RhdHNJRFJlZn07CgogICAgICAgIG5leHQgRklMRSBpZiAkeyRTdGF0c0lEUmVmfSBuZSAkUGFyYW17U3RhdElEfTsKCiAgICAgICAgIyBkZWxldGUgLmluc3RhbGxlZCBmaWxlCiAgICAgICAgJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZURlbGV0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEZpbGUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCBsb2cgbWVzc2FnZQogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkRlbGV0ZSBzdGF0cyAoU3RhdHNJRCA9ICRQYXJhbXtTdGF0SUR9KSIsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBHZXRTdGF0c0xpc3QoKQoKbGlzdHMgYWxsIHN0YXRzIGlkJ3MKCiAgICBteSAkQXJyYXlSZWYgPSAkU3RhdHNPYmplY3QtPkdldFN0YXRzTGlzdCgKICAgICAgICBPcmRlckJ5ICAgPT4gJ0lEJyB8fCAnVGl0bGUnIHx8ICdPYmplY3QnLCAjIG9wdGlvbmFsCiAgICAgICAgRGlyZWN0aW9uID0+ICdBU0MnIHx8ICdERVNDJywgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBHZXRTdGF0c0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAU2VhcmNoUmVzdWx0ID0gKCk7CiAgICBpZiAoICEoIEBTZWFyY2hSZXN1bHQgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hTZWFyY2goIFR5cGUgPT4gJ1N0YXRzJyApICkgKSB7CiAgICAgICAgJFNlbGYtPl9BdXRvbWF0aWNTYW1wbGVJbXBvcnQoKTsKICAgICAgICByZXR1cm4gKCkgaWYgISggQFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFNlYXJjaCggVHlwZSA9PiAnU3RhdHMnICkgKTsKICAgIH0KCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgQEdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICk7CgogICAgJFBhcmFte09yZGVyQnl9IHx8PSAnSUQnOwoKICAgICMgYSBzb2x1dGlvbiB3aXRoIG1vcmUgcGVyZm9ybWFuY2UgaXMgdXNlZnVsCiAgICBteSAlUmVzdWx0SGFzaCA9ICgpOwogICAgZm9yIG15ICRTdGF0SUQgKEBTZWFyY2hSZXN1bHQpIHsKICAgICAgICBteSAkU3RhdCA9ICRTZWxmLT5TdGF0c0dldCgKICAgICAgICAgICAgU3RhdElEICAgICAgICAgICAgID0+ICRTdGF0SUQsCiAgICAgICAgICAgIE5vT2JqZWN0QXR0cmlidXRlcyA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFVzZXJQZXJtaXNzaW9uID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57QWNjZXNzUnd9IHx8ICRTZWxmLT57VXNlcklEfSA9PSAxICkgewogICAgICAgICAgICAkVXNlclBlcm1pc3Npb24gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyB0aGVzZSBmdW5jdGlvbiBpcyBzaW1pbGFyIGxpa2Ugb3RoZXIgZnVuY3Rpb24gaW4gdGhlIGNvZGUgcGVyaGFwcyB3ZSBzaG91bGQKICAgICAgICAjIG1lcmdlIHRoZW0KICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBlbHNpZiAoICRTdGF0LT57VmFsaWR9ICkgewogICAgICAgICAgICBNQVJLRToKICAgICAgICAgICAgZm9yIG15ICRHcm91cElEICggQHsgJFN0YXQtPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHcm91cElEID09ICRVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgTUFSS0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFVzZXJQZXJtaXNzaW9uID09IDEgKSB7CgogICAgICAgICAgICAjIG9yZGVyIGJ5IHRpdGxlCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnl9IGVxICdUaXRsZScgKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0SGFzaHskU3RhdElEfSA9ICRTdGF0LT57VGl0bGV9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9yZGVyIGJ5IG9iamVjdAogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5fSBlcSAnT2JqZWN0JyApIHsKICAgICAgICAgICAgICAgICRSZXN1bHRIYXNoeyRTdGF0SUR9ID0gJFN0YXQtPntPYmplY3R9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9yZGVyIGJ5IGlkCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlc3VsdEhhc2h7JFN0YXRJRH0gPSBpbnQgJFN0YXRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15IEBTb3J0QXJyYXkgPSAoKTsKICAgIGlmICggJFBhcmFte09yZGVyQnl9IGVxICdJRCcgKSB7CiAgICAgICAgQFNvcnRBcnJheSA9IHNvcnQgeyAkUmVzdWx0SGFzaHskYX0gPD0+ICRSZXN1bHRIYXNoeyRifSB9IGtleXMgJVJlc3VsdEhhc2g7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAU29ydEFycmF5ID0gc29ydCB7ICRSZXN1bHRIYXNoeyRhfSBjbXAgJFJlc3VsdEhhc2h7JGJ9IH0ga2V5cyAlUmVzdWx0SGFzaDsKICAgIH0KICAgIGlmICggJFBhcmFte0RpcmVjdGlvbn0gJiYgJFBhcmFte0RpcmVjdGlvbn0gZXEgJ0RFU0MnICkgewogICAgICAgIEBTb3J0QXJyYXkgPSByZXZlcnNlIEBTb3J0QXJyYXk7CiAgICB9CgogICAgcmV0dXJuIFxAU29ydEFycmF5Owp9Cgo9aXRlbSBTdW1CdWlsZCgpCgpidWlsZCBzdW0gaW4geCBvci9hbmQgeSBheGlzCgogICAgJFN0YXRBcnJheSA9ICRTdGF0c09iamVjdC0+U3VtQnVpbGQoCiAgICAgICAgQXJyYXkgPT4gXEBSZXN1bHQsCiAgICAgICAgU3VtUm93ID0+IDEsCiAgICAgICAgU3VtQ29sID0+IDAsCiAgICApOwoKPWN1dAoKc3ViIFN1bUJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQERhdGEgPSBAeyAkUGFyYW17QXJyYXl9IH07CgogICAgIyBhZGQgc3VtIHkKICAgIGlmICggJFBhcmFte1N1bVJvd30gKSB7CiAgICAgICAgcHVzaCBAeyAkRGF0YVsxXSB9LCAnU3VtJzsKICAgICAgICBmb3IgbXkgJEluZGV4MSAoIDIgLi4gJCNEYXRhICkgewogICAgICAgICAgICBteSAkU3VtID0gMDsKICAgICAgICAgICAgZm9yIG15ICRJbmRleDIgKCAxIC4uICQjeyAkRGF0YVskSW5kZXgxXSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YVskSW5kZXgxXVskSW5kZXgyXSA9fiBte14tP1xkKyhcLlxkKyk/JH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN1bSArPSAkRGF0YVskSW5kZXgxXVskSW5kZXgyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEB7ICREYXRhWyRJbmRleDFdIH0sICRTdW07CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHN1bSB4CiAgICBpZiAoICRQYXJhbXtTdW1Db2x9ICkgewogICAgICAgIG15IEBTdW1Sb3cgPSAoKTsKICAgICAgICAkU3VtUm93WzBdID0gJ1N1bSc7CiAgICAgICAgZm9yIG15ICRJbmRleDEgKCAyIC4uICQjRGF0YSApIHsKICAgICAgICAgICAgZm9yIG15ICRJbmRleDIgKCAxIC4uICQjeyAkRGF0YVskSW5kZXgxXSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YVskSW5kZXgxXVskSW5kZXgyXSA9fiBte14tP1xkKyhcLlxkKyk/JH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN1bVJvd1skSW5kZXgyXSArPSAkRGF0YVskSW5kZXgxXVskSW5kZXgyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwdXNoIEBEYXRhLCBcQFN1bVJvdzsKICAgIH0KICAgIHJldHVybiBcQERhdGE7Cn0KCiM9aXRlbSBfR2VuZXJhdGVTdGF0aWNTdGF0cygpCiMKIyAgICB0YWtlIHRoZSBzdGF0IGNvbmZpZ3VyYXRpb24gYW5kIGdldCB0aGUgc3RhdCB0YWJsZQojCiMgICAgbXkgQFN0YXRBcnJheSA9ICRTdGF0c09iamVjdC0+X0dlbmVyYXRlU3RhdGljU3RhdHMoCiMgICAgICAgIE9iamVjdE1vZHVsZSAgICAgPT4gJFN0YXQtPntPYmplY3RNb2R1bGV9LAojICAgICAgICBHZXRQYXJhbSAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiMgICAgICAgIFRpdGxlICAgICAgICAgICAgPT4gJFN0YXQtPntUaXRsZX0sCiMgICAgICAgIFN0YXRJRCAgICAgICAgICAgPT4gJFN0YXQtPntTdGF0SUR9LAojICAgICAgICBDYWNoZSAgICAgICAgICAgID0+ICRTdGF0LT57Q2FjaGV9LAojICAgICk7CiMKIz1jdXQKCnN1YiBfR2VuZXJhdGVTdGF0aWNTdGF0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgTkVFRDoKICAgIGZvciBteSAkTmVlZCAocXcoT2JqZWN0TW9kdWxlIEdldFBhcmFtIFRpdGxlIFN0YXRJRCkpIHsKICAgICAgICBuZXh0IE5FRUQgaWYgJFBhcmFteyROZWVkfTsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIl9HZW5lcmF0ZVN0YXRpY1N0YXRzOiBOZWVkICROZWVkISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgc3RhdGljIG1vZHVsCiAgICBteSAkT2JqZWN0TW9kdWxlID0gJFBhcmFte09iamVjdE1vZHVsZX07CiAgICAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRPYmplY3RNb2R1bGUpOwogICAgbXkgJFN0YXRPYmplY3QgPSAkT2JqZWN0TW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgbXkgQFJlc3VsdCAgID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAleyAkUGFyYW17R2V0UGFyYW19IH07CgogICAgIyB1c2UgcmVzdWx0IGNhY2hlIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggJFBhcmFte0NhY2hlfSApIHsKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+X0NyZWF0ZVN0YXRpY1Jlc3VsdENhY2hlRmlsZW5hbWUoCiAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgIFN0YXRJRCAgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgICAgICk7CgogICAgICAgIEBSZXN1bHQgPSAkU2VsZi0+X0dldFJlc3VsdENhY2hlKCBGaWxlbmFtZSA9PiAkRmlsZW5hbWUgKTsKICAgIH0KCiAgICAjIHRyeSB0byBnZXQgZGF0YSBpZiBub3RpbmcgaXMgdGhlcmUKICAgIGlmICggIUBSZXN1bHQgKSB7CgogICAgICAgICMgcnVuIHN0YXRzIGZ1bmN0aW9uCiAgICAgICAgQFJlc3VsdCA9ICRTdGF0T2JqZWN0LT5SdW4oCiAgICAgICAgICAgICVHZXRQYXJhbSwKCiAgICAgICAgICAgICMgdGhlc2UgdHdvIGxpbmVzIGFyZSByZXF1aXJlbWVudHMgb2YgbWUsIHBlcmhhcHMgdGhpcwogICAgICAgICAgICAjIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBmb3IgZm9ybWVyIHN0YXRpYyBzdGF0cwogICAgICAgICAgICBGb3JtYXQgPT4gJFBhcmFte0Zvcm1hdH1bMF0sCiAgICAgICAgICAgIE1vZHVsZSA9PiAkUGFyYW17T2JqZWN0TW9kdWxlfSwKICAgICAgICApOwoKICAgICAgICAjIHdyaXRlIGNhY2hlIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoICRQYXJhbXtDYWNoZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT5fV3JpdGVSZXN1bHRDYWNoZSgKICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTdGF0SUQgICA9PiAkUGFyYW17U3RhdElEfSwKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAUmVzdWx0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICRSZXN1bHRbMF1bMF0gPSAkUGFyYW17VGl0bGV9IC4gIiAiIC4gJFJlc3VsdFswXVswXTsKCiAgICByZXR1cm4gQFJlc3VsdDsKfQoKIz1pdGVtIF9HZW5lcmF0ZUR5bmFtaWNTdGF0cygpCiMKIyAgICB0YWtlIHRoZSBzdGF0IGNvbmZpZ3VyYXRpb24gYW5kIGdldCB0aGUgc3RhdCB0YWJsZQojCiMgICAgbXkgQFN0YXRBcnJheSA9ICRTdGF0c09iamVjdC0+X0dlbmVyYXRlRHluYW1pY1N0YXRzKAojICAgICAgICBPYmplY3RNb2R1bGUgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OlRpY2tldCcsCiMgICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiMgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gXFVzZUFzWHZhbHVlRWxlbWVudHMsCiMgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gXFVzZUFzVmFsdWVTZXJpZXNFbGVtZW50cywKIyAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiBcVXNlQXNSZXN0cmljdGlvbkVsZW1lbnRzLAojICAgICAgICBUaXRsZSAgICAgICAgICAgID0+ICdUaWNrZXRTdGF0JywKIyAgICAgICAgU3RhdElEICAgICAgICAgICA9PiAxMjMsCiMgICAgICAgIENhY2hlICAgICAgICAgICAgPT4gMSwgICAgICAjIG9wdGlvbmFsCiMgICAgKTsKIwojPWN1dAoKIyBzZWFyY2ggZm9yIGEgYmV0dGVyIHdheSB0byBjYWNoZSBzdGF0cyAoc2VlIGxpbmVzIGJlZm9yZSBTdGF0SUQgYW5kIENhY2hlKQoKc3ViIF9HZW5lcmF0ZUR5bmFtaWNTdGF0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBIZWFkZXJMaW5lICAgICA9ICgpOwogICAgbXkgJFRpdGxlVGltZVN0YXJ0ID0gJyc7CiAgICBteSAkVGl0bGVUaW1lU3RvcCAgPSAnJzsKCiAgICBORUVEOgogICAgZm9yIG15ICROZWVkIChxdyhPYmplY3RNb2R1bGUgVXNlQXNYdmFsdWUgVXNlQXNWYWx1ZVNlcmllcyBUaXRsZSBPYmplY3QgU3RhdElEKSkgewogICAgICAgIG5leHQgTkVFRCBpZiAkUGFyYW17JE5lZWR9OwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiX0dlbmVyYXRlRHluYW1pY1N0YXRzOiBOZWVkICROZWVkISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluY2x1ZGUgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdAogICAgbXkgJE9iamVjdE1vZHVsZSA9ICRQYXJhbXtPYmplY3RNb2R1bGV9OwogICAgJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkT2JqZWN0TW9kdWxlKTsKICAgIG15ICRTdGF0T2JqZWN0ID0gJE9iamVjdE1vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZ2V0IHRoZSBzZWxlY3RlZCB2YWx1ZXMKICAgICMgcGVyaGFwcyBpIGNhbiBzcGxpdCB0aGUgU3RhdEdldCBmdW5jdGlvbiB0byBtYWtlIHRoaXMgbmVlZGxlc3MKICAgICMgUHJvYmxlbSwgaSBuZWVkIHRoZSBibG9jayBpbmZvcm1hdGlvbgogICAgbXkgJU5ld1BhcmFtID0gKCk7CgogICAgJE5ld1BhcmFte1RpdGxlfSAgICAgICAgPSAkUGFyYW17VGl0bGV9OwogICAgJE5ld1BhcmFte09iamVjdH0gICAgICAgPSAkUGFyYW17T2JqZWN0fTsKICAgICROZXdQYXJhbXtPYmplY3RNb2R1bGV9ID0gJFBhcmFte09iamVjdE1vZHVsZX07CgogICAgIyBzZWFyY2ggZm9yIGEgYmV0dGVyIHdheSB0byBjYWNoZSBzdGF0cyAoU3RhdElEIGFuZCBDYWNoZSkKICAgICROZXdQYXJhbXtTdGF0SUR9ID0gJFBhcmFte1N0YXRJRH07CiAgICAkTmV3UGFyYW17Q2FjaGV9ICA9ICRQYXJhbXtDYWNoZX07CiAgICBmb3IgbXkgJFVzZSAocXcoVXNlQXNSZXN0cmljdGlvbiBVc2VBc1h2YWx1ZSBVc2VBc1ZhbHVlU2VyaWVzKSkgewogICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXskVXNlfSB9OwogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50IChAQXJyYXkpIHsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudC0+e1NlbGVjdGVkfTsKCiAgICAgICAgICAgIGRlbGV0ZSAkRWxlbWVudC0+e1NlbGVjdGVkfTsKICAgICAgICAgICAgZGVsZXRlICRFbGVtZW50LT57Rml4ZWR9OwogICAgICAgICAgICBpZiAoICRFbGVtZW50LT57QmxvY2t9IGVxICdUaW1lJyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkRWxlbWVudC0+e1RpbWVQZXJpb2RGb3JtYXR9OwogICAgICAgICAgICAgICAgaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJENvdW50ID0gJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVDb3VudH0gPyAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZUNvdW50fSA6IDE7CgogICAgICAgICAgICAgICAgICAgICMgLTEgYmVjYXVzZSB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgbm90IGNvdW50ZWQKICAgICAgICAgICAgICAgICAgICAkQ291bnQgLT0gMTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9IGVxICdZZWFyJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICREICkgPSBBZGRfRGVsdGFfWU1EKCAkWSwgJE0sICRELCAtMSwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiLCAkWSwgMTIsIDMxLCAyMywgNTksIDU5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgLSRDb3VudCwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksIDEsIDEsIDAsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9IGVxICdNb250aCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgMCwgLTEsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRZLCAkTSwgRGF5c19pbl9Nb250aCggJFksICRNICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMywgNTksIDU5CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgMCwgLSRDb3VudCwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAxLCAwLCAwLCAwICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICREICkgPSBBZGRfRGVsdGFfWU1EKCAkWSwgJE0sICRELCAwLCAwLCAtMSApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiLCAkWSwgJE0sICRELCAyMywgNTksIDU5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgMCwgMCwgLSRDb3VudCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgMCwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57VGltZVJlbGF0aXZlVW5pdH0gZXEgJ0hvdXInICkgewogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgLTEsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgJGgsIDU5LCA1OSApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgLSRDb3VudCwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgJGgsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9IGVxICdNaW51dGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgMCwgLTEsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgJGgsICRtLCA1OSApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgMCwgLSRDb3VudCwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkaCwgJG0sIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9IGVxICdTZWNvbmQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgMCwgMCwgLTEgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgJGgsICRtLCAkcyApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUyggJFksICRNLCAkRCwgJGgsICRtLCAkcywgMCwgMCwgMCwgLSRDb3VudCApOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgJGgsICRtLCAkcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVDb3VudH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkVGl0bGVUaW1lU3RhcnQgPSAkRWxlbWVudC0+e1RpbWVTdGFydH07CiAgICAgICAgICAgICAgICAkVGl0bGVUaW1lU3RvcCAgPSAkRWxlbWVudC0+e1RpbWVTdG9wfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTZWxlY3QgQWxsIGZ1bmN0aW9uIG5lZWRlZCBmcm9tIG1rU3RhdHMucGwgYW5kIGZpeGVkIHZhbHVlcyBvZiB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgZWxzaWYgKCAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICBteSBAVmFsdWVzID0ga2V5cyggJXsgJEVsZW1lbnQtPntWYWx1ZXN9IH0gKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9ID0gXEBWYWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAeyAkTmV3UGFyYW17JFVzZX0gfSwgJEVsZW1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICVQYXJhbSA9ICVOZXdQYXJhbTsKCiAgICAjIGdldCBhbGwgcmVzdHJpY3Rpb25zIGZvciB0aGUgc2VhcmNoCiAgICBteSAlUmVzdHJpY3Rpb25BdHRyaWJ1dGUgPSAoKTsKICAgIGZvciBteSAkUmVzdHJpY3Rpb25QYXJ0ICggQHsgJFBhcmFte1VzZUFzUmVzdHJpY3Rpb259IH0gKSB7CiAgICAgICAgbXkgJEVsZW1lbnQgPSAkUmVzdHJpY3Rpb25QYXJ0LT57RWxlbWVudH07CiAgICAgICAgaWYgKCAkUmVzdHJpY3Rpb25QYXJ0LT57QmxvY2t9IGVxICdJbnB1dEZpZWxkJyApIHsKICAgICAgICAgICAgJFJlc3RyaWN0aW9uQXR0cmlidXRleyRFbGVtZW50fSA9ICRSZXN0cmljdGlvblBhcnQtPntTZWxlY3RlZFZhbHVlc31bMF07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlc3RyaWN0aW9uUGFydC0+e0Jsb2NrfSBlcSAnU2VsZWN0RmllbGQnICkgewogICAgICAgICAgICAkUmVzdHJpY3Rpb25BdHRyaWJ1dGV7JEVsZW1lbnR9ID0gJFJlc3RyaWN0aW9uUGFydC0+e1NlbGVjdGVkVmFsdWVzfVswXTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVzdHJpY3Rpb25QYXJ0LT57QmxvY2t9IGVxICdUaW1lJyApIHsKICAgICAgICAgICAgJFJlc3RyaWN0aW9uQXR0cmlidXRleyAkUmVzdHJpY3Rpb25QYXJ0LT57VmFsdWVzfXtUaW1lU3RvcH0gfQogICAgICAgICAgICAgICAgPSAkUmVzdHJpY3Rpb25QYXJ0LT57VGltZVN0b3B9OwogICAgICAgICAgICAkUmVzdHJpY3Rpb25BdHRyaWJ1dGV7ICRSZXN0cmljdGlvblBhcnQtPntWYWx1ZXN9e1RpbWVTdGFydH0gfQogICAgICAgICAgICAgICAgPSAkUmVzdHJpY3Rpb25QYXJ0LT57VGltZVN0YXJ0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN0cmljdGlvbkF0dHJpYnV0ZXskRWxlbWVudH0gPSAkUmVzdHJpY3Rpb25QYXJ0LT57U2VsZWN0ZWRWYWx1ZXN9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgc2VsZWN0ZWQgWHZhbHVlCiAgICBteSAkWHZhbHVlID0ge307CiAgICBteSAoCiAgICAgICAgJFZTWWVhciwgICAgICRWU01vbnRoLCAgICAgJFZTRGF5LCAgICAgJFZTSG91ciwgICAgICRWU01pbnV0ZSwgICAgICRWU1NlY29uZCwKICAgICAgICAkVlNTdG9wWWVhciwgJFZTU3RvcE1vbnRoLCAkVlNTdG9wRGF5LCAkVlNTdG9wSG91ciwgJFZTU3RvcE1pbnV0ZSwgJFZTU3RvcFNlY29uZAogICAgKTsKICAgIG15ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZSA9IDA7CiAgICBteSAkQ291bnQgICAgICAgICAgICAgICAgICAgPSAwOwogICAgbXkgJE1vbnRoQXJyYXlSZWYgICAgICAgICAgID0gX01vbnRoQXJyYXkoKTsKCiAgICBteSAkRWxlbWVudCA9ICRQYXJhbXtVc2VBc1h2YWx1ZX1bMF07CiAgICBpZiAoICRFbGVtZW50LT57QmxvY2t9IGVxICdUaW1lJyApIHsKICAgICAgICBteSAoCiAgICAgICAgICAgICRZZWFyLCAgICRNb250aCwgICAkRGF5LCAgICRIb3VyLCAgICRNaW51dGUsICAgJFNlY29uZCwKICAgICAgICAgICAgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQKICAgICAgICApOwogICAgICAgIGlmICggJEVsZW1lbnQtPntUaW1lU3RhcnR9ID1+IG17XihcZFxkXGRcZCktKFxkXGQpLShcZFxkKVxzKFxkXGQpOihcZFxkKTooXGRcZCkkfWl4ICkgewogICAgICAgICAgICAkWWVhciAgID0gJFZTWWVhciAgID0gJDE7CiAgICAgICAgICAgICRNb250aCAgPSAkVlNNb250aCAgPSBpbnQgJDI7CiAgICAgICAgICAgICREYXkgICAgPSAkVlNEYXkgICAgPSBpbnQgJDM7CiAgICAgICAgICAgICRIb3VyICAgPSAkVlNIb3VyICAgPSBpbnQgJDQ7CiAgICAgICAgICAgICRNaW51dGUgPSAkVlNNaW51dGUgPSBpbnQgJDU7CiAgICAgICAgICAgICRTZWNvbmQgPSAkVlNTZWNvbmQgPSBpbnQgJDY7CiAgICAgICAgfQoKICAgICAgICAkVGltZUFic29sdXRTdG9wVW5peFRpbWUKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRFbGVtZW50LT57J1RpbWVTdG9wJ30gKTsKICAgICAgICBteSAkVGltZVN0YXJ0ID0gMDsKICAgICAgICBteSAkVGltZVN0b3AgID0gMDsKCiAgICAgICAgJENvdW50ID0gJEVsZW1lbnQtPntUaW1lU2NhbGVDb3VudH0gPyAkRWxlbWVudC0+e1RpbWVTY2FsZUNvdW50fSA6IDE7CgogICAgICAgICMgaW4gdGhlc2UgY29uc3RlbGxhdGlvbiAkQ291bnQgPiAxIGlzIG5vdCB1c2VmdWwhIQogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFte1VzZUFzVmFsdWVTZXJpZXN9WzBde0Jsb2NrfQogICAgICAgICAgICAmJiAkUGFyYW17VXNlQXNWYWx1ZVNlcmllc31bMF17QmxvY2t9IGVxICdUaW1lJwogICAgICAgICAgICAmJiAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnRGF5JwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQ291bnQgPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnTWludXRlJyApIHsKICAgICAgICAgICAgJFNlY29uZCA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0hvdXInICkgewogICAgICAgICAgICAkU2Vjb25kID0gMDsKICAgICAgICAgICAgJE1pbnV0ZSA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgICRTZWNvbmQgPSAwOwogICAgICAgICAgICAkTWludXRlID0gMDsKICAgICAgICAgICAgJEhvdXIgICA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01vbnRoJyApIHsKICAgICAgICAgICAgJFNlY29uZCA9IDA7CiAgICAgICAgICAgICRNaW51dGUgPSAwOwogICAgICAgICAgICAkSG91ciAgID0gMDsKICAgICAgICAgICAgJERheSAgICA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ1llYXInICkgewogICAgICAgICAgICAkU2Vjb25kID0gMDsKICAgICAgICAgICAgJE1pbnV0ZSA9IDA7CiAgICAgICAgICAgICRIb3VyICAgPSAwOwogICAgICAgICAgICAkRGF5ICAgID0gMTsKICAgICAgICAgICAgJE1vbnRoICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIEZJWE1FIFRpbWVoZWFkZXIgenVzYW1tZW5iYXVlbgogICAgICAgIHdoaWxlICgKICAgICAgICAgICAgISRUaW1lU3RvcAogICAgICAgICAgICB8fCAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgIDwgJFRpbWVBYnNvbHV0U3RvcFVuaXhUaW1lCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRUaW1lU3RhcnQgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwKICAgICAgICAgICAgICAgICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ1NlY29uZCcgKSB7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICRDb3VudCAtIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBASGVhZGVyTGluZSwKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAiJTAyZDolMDJkOiUwMmQtJTAyZDolMDJkOiUwMmQiLAogICAgICAgICAgICAgICAgICAgICAgICAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdNaW51dGUnICkgewogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkWWVhciwgJE1vbnRoLCAkRGF5LCAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgMCwgMCwgJENvdW50LAogICAgICAgICAgICAgICAgICAgIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQEhlYWRlckxpbmUsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgIiUwMmQ6JTAyZDolMDJkLSUwMmQ6JTAyZDolMDJkIiwKICAgICAgICAgICAgICAgICAgICAgICAgJEhvdXIsICRNaW51dGUsICRTZWNvbmQsICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnSG91cicgKSB7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAwLCAkQ291bnQsIDAsCiAgICAgICAgICAgICAgICAgICAgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBASGVhZGVyTGluZSwKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAiJTAyZDolMDJkOiUwMmQtJTAyZDolMDJkOiUwMmQiLAogICAgICAgICAgICAgICAgICAgICAgICAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdEYXknICkgewogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkWWVhciwgJE1vbnRoLCAkRGF5LCAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgJENvdW50LCAwLCAwLAogICAgICAgICAgICAgICAgICAgIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICREb3cgPSBEYXlfb2ZfV2VlayggJFllYXIsICRNb250aCwgJERheSApOwogICAgICAgICAgICAgICAgJERvdyA9IERheV9vZl9XZWVrX0FiYnJldmlhdGlvbigkRG93KTsKICAgICAgICAgICAgICAgIGlmICggJFRvRGF5IGVxICREYXkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgIiREb3cgJERheSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDJkLiUwMmQuJTA0ZCAtICUwMmQuJTAyZC4lMDRkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXksICRNb250aCwgJFllYXIsICRUb0RheSwgJFRvTW9udGgsICRUb1llYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01vbnRoJyApIHsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSApID0gQWRkX0RlbHRhX1lNRCggJFllYXIsICRNb250aCwgJERheSwgMCwgJENvdW50LCAwICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFRvTW9udGggZXEgJE1vbnRoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEhlYWRlckxpbmUsICIkTW9udGhBcnJheVJlZi0+WyRNb250aF0gJE1vbnRoIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMmQuJTAyZC4lMDRkIC0gJTAyZC4lMDJkLiUwNGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERheSwgJE1vbnRoLCAkWWVhciwgJFRvRGF5LCAkVG9Nb250aCwgJFRvWWVhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnWWVhcicgKSB7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXkgKSA9IEFkZF9EZWx0YV9ZTUQoICRZZWFyLCAkTW9udGgsICREYXksICRDb3VudCwgMCwgMCApOwogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRUb1llYXIgZXEgJFllYXIgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgJFllYXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDJkLiUwMmQuJTA0ZCAtICUwMmQuJTAyZC4lMDRkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXksICRNb250aCwgJFllYXIsICRUb0RheSwgJFRvTW9udGgsICRUb1llYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICggJFllYXIsICRNb250aCwgJERheSwgJEhvdXIsICRNaW51dGUsICRTZWNvbmQgKQogICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpbWVTdG9wID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsCiAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQHsgJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfSB9LAogICAgICAgICAgICAgICAgeyBUaW1lU3RhcnQgPT4gJFRpbWVTdGFydCwgVGltZVN0b3AgPT4gJFRpbWVTdG9wIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRklYTUUgRU5ERSBUaW1lSGVhZGVyIHp1c2FtbWVuYmFlbgoKICAgICAgICAkWHZhbHVlLT57QmxvY2t9ICA9ICdUaW1lJzsKICAgICAgICAkWHZhbHVlLT57VmFsdWVzfSA9ICRFbGVtZW50LT57VmFsdWVzfTsKICAgIH0KCiAgICAjIGlmIEJsb2NrIGVxdWFsIE11bHRpU2VsZWN0RmllbGQsIFNlbGVjdGZpZWxkCiAgICBlbHNlIHsKICAgICAgICAkWHZhbHVlID0gJEVsZW1lbnQ7CgogICAgICAgICMgYnVpbGQgdGhlIGhlYWRlcmxpbmUKCiAgICAgICAgZm9yIG15ICRWYWx1ZW5hbWUgKCBAeyAkWHZhbHVlLT57U2VsZWN0ZWRWYWx1ZXN9IH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlckxpbmUsICRYdmFsdWUtPntWYWx1ZXN9eyRWYWx1ZW5hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgdmFsdWUgc2VyaWVzCiAgICBteSAlVmFsdWVTZXJpZXMgICA9ICgpOwogICAgbXkgQEFycmF5U2VsZWN0ZWQgPSAoKTsKICAgIG15ICRDb2x1bW5OYW1lICAgID0gJyc7CgogICAgIyBnaXZlIG1lIGFsbCBwb3NzaWxiZSBlbGVtZW50cyBmb3IgVmFsdWUgU2VyaWVzCiAgICBSRUYxOgogICAgZm9yIG15ICRSZWYxICggQHsgJFBhcmFte1VzZUFzVmFsdWVTZXJpZXN9IH0gKSB7CgogICAgICAgICMgYWxsIGVsZW1lbnRzIHdoaWNoIGFyZSBzaG93biB3aXRoIG11bHRpc2VsZWN0ZmllbGRzCiAgICAgICAgaWYgKCAkUmVmMS0+e0Jsb2NrfSBuZSAnVGltZScgKSB7CiAgICAgICAgICAgIG15ICVTZWxlY3RlZFZhbHVlcyA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJFJlZjIgKCBAeyAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfSB9ICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVzeyRSZWYyfSA9ICRSZWYxLT57VmFsdWVzfXskUmVmMn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBBcnJheVNlbGVjdGVkLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgPT4gXCVTZWxlY3RlZFZhbHVlcywKICAgICAgICAgICAgICAgICAgICBFbGVtZW50ID0+ICRSZWYxLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkUmVmMS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIEJsb2NrICAgPT4gJFJlZjEtPntCbG9ja30sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgUkVGMTsKICAgICAgICB9CgogICAgICAgICMgdGltZXNjYWxlIGVsZW1lbnRzIG5lZWQgYSBzcGVjaWFsIGhhbmRsaW5nCiAgICAgICAgQEhlYWRlckxpbmUgPSAoKTsKCiAgICAgICAgIyB0aGVzZSBhbGwgbWFrZXMgb25seSBzZW5zZSwgaWYgdGhlIGNvdW50IG9mIHhheGlzIGlzIDEKICAgICAgICBpZiAoICRSZWYxLT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdZZWFyJyApIHsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSApIHsKICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTIgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgIiRNb250aEFycmF5UmVmLT5bJF9dICRfIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoIG15ICRNb250aCA9IDE7ICRNb250aCA8IDEyOyAkTW9udGggKz0gJENvdW50ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAiJE1vbnRoQXJyYXlSZWYtPlskTW9udGhdIC0gJE1vbnRoQXJyYXlSZWYtPlskTW9udGggKyAkQ291bnQgLSAxXSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRWU1NlY29uZCAgID0gMDsKICAgICAgICAgICAgJFZTTWludXRlICAgPSAwOwogICAgICAgICAgICAkVlNIb3VyICAgICA9IDA7CiAgICAgICAgICAgICRWU0RheSAgICAgID0gMTsKICAgICAgICAgICAgJFZTTW9udGggICAgPSAxOwogICAgICAgICAgICAkQ29sdW1uTmFtZSA9ICdZZWFyJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnTW9udGgnICkgewoKICAgICAgICAgICAgJENvdW50ID0gMTsKICAgICAgICAgICAgZm9yICggMSAuLiAzMSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEhlYWRlckxpbmUsICRfOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRWU01pbnV0ZSAgID0gMDsKICAgICAgICAgICAgJFZTSG91ciAgICAgPSAwOwogICAgICAgICAgICAkVlNEYXkgICAgICA9IDE7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ01vbnRoJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgZm9yICggbXkgJEhvdXIgPSAwOyAkSG91ciA8IDI0OyAkSG91ciArPSAkQ291bnQgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCBzcHJpbnRmKCAiJTAyZDowMDowMC0lMDJkOjU5OjU5IiwgJEhvdXIsICRIb3VyICsgJENvdW50IC0gMSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRWU1NlY29uZCAgID0gMDsKICAgICAgICAgICAgJFZTTWludXRlICAgPSAwOwogICAgICAgICAgICAkVlNIb3VyICAgICA9IDA7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ0RheSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0hvdXInICkgewogICAgICAgICAgICBmb3IgKCBteSAkTWludXRlID0gMDsgJE1pbnV0ZSA8IDYwOyAkTWludXRlICs9ICRDb3VudCApIHsKICAgICAgICAgICAgICAgIG15ICRUaW1lID0gJ21pbiAnIC4gJE1pbnV0ZSAuICcgLSAnIC4gKCAkTWludXRlICsgJENvdW50ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAkVGltZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRWU01pbnV0ZSAgID0gMDsKICAgICAgICAgICAgJENvbHVtbk5hbWUgPSAnSG91cic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01pbnV0ZScgKSB7CiAgICAgICAgICAgIGlmICggJENvdW50ID09IDEgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAwIC4uIDU5ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lID0gJ3NlYyAnIC4gJF87CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgJFRpbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKCBteSAkU2Vjb25kID0gMDsgJFNlY29uZCA8IDYwOyAkU2Vjb25kICs9ICRDb3VudCApIHsKICAgICAgICAgICAgICAgICAgICBteSAkVGltZSA9ICdzZWMgJyAuICRTZWNvbmQgLiAnLScgLiAoICRTZWNvbmQgKyAkQ291bnQgKTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAkVGltZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ01pbnV0ZSc7CiAgICAgICAgfQoKICAgICAgICBteSAkVGltZVN0YXJ0ICAgICA9IDA7CiAgICAgICAgbXkgJFRpbWVTdG9wICAgICAgPSAwOwogICAgICAgIG15ICRNb250aEFycmF5UmVmID0gX01vbnRoQXJyYXkoKTsKCiAgICAgICAgJENvdW50ID0gMTsKCiAgICAgICAgIyBHZW5lcmF0ZSB0aGUgdGltZSB2YWx1ZSBzZXJpZXMKICAgICAgICBteSAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICk7CgogICAgICAgIGlmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ1llYXInICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0ID0gc3ByaW50ZiggIiUwNGQtMDEtMDEgMDA6MDA6MDAiLCAkVlNZZWFyICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXkgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFZTWWVhciwgJFZTTW9udGgsICRWU0RheSwgJENvdW50LCAwLCAwICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaW1lU3RvcCA9IHNwcmludGYoICIlMDRkLTEyLTMxIDIzOjU5OjU5IiwgJFRvWWVhciApOwoKICAgICAgICAgICAgICAgICRWYWx1ZVNlcmllc3skVlNZZWFyfSA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01vbnRoJyApIHsKICAgICAgICAgICAgd2hpbGUgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkVGltZVN0b3AgKQogICAgICAgICAgICAgICAgPCAkVGltZUFic29sdXRTdG9wVW5peFRpbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpbWVTdGFydCA9IHNwcmludGYoICIlMDRkLSUwMmQtMDEgMDA6MDA6MDAiLCAkVlNZZWFyLCAkVlNNb250aCApOwogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5ICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksIDAsICRDb3VudCwgMCApOwogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUsICRWU1NlY29uZCwgMCwKICAgICAgICAgICAgICAgICAgICAwLCAwLCAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGltZVN0b3AgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgMjM6NTk6NTkiLCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5ICk7CgogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgaWYgKCRDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICAgICAkVmFsdWVTZXJpZXN7CiAgICAgICAgICAgICAgICAgICAgJFZTWWVhciAuICctJwogICAgICAgICAgICAgICAgICAgICAgICAuIHNwcmludGYoICIlMDJkIiwgJFZTTW9udGggKSAuICcgJwogICAgICAgICAgICAgICAgICAgICAgICAuICRNb250aEFycmF5UmVmLT5bJFZTTW9udGhdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgID0gewogICAgICAgICAgICAgICAgICAgICRSZWYxLT57VmFsdWVzfXtUaW1lU3RvcH0gID0+ICRUaW1lU3RvcCwKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0YXJ0fSA9PiAkVGltZVN0YXJ0CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgIHdoaWxlICgKICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpbWVTdG9wICkKICAgICAgICAgICAgICAgIDwgJFRpbWVBYnNvbHV0U3RvcFVuaXhUaW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaW1lU3RhcnQgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5ICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLAogICAgICAgICAgICAgICAgICAgICRDb3VudCwgMCwgMCwgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpbWVTdG9wID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5IiwgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSApOwoKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIGlmICgkQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzeyBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5ICkgfSA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0hvdXInICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDowMDowMCIsICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIgKTsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoCiAgICAgICAgICAgICAgICAgICAgJFZTWWVhciwgJFZTTW9udGgsICRWU0RheSwgJFZTSG91ciwgJFZTTWludXRlLCAkVlNTZWNvbmQsIDAsCiAgICAgICAgICAgICAgICAgICAgJENvdW50LCAwLCAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGltZVN0b3AKICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOjU5OjU5IiwgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciApOwogICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOjAwOjAwIC0gJTAyZDo1OTo1OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRUb0hvdXIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRSZWYxLT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdNaW51dGUnICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsICRDb3VudCwgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpbWVTdG9wID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjU5IiwKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVmFsdWVTZXJpZXN7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCAtICUwMmQ6JTAyZDo1OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFRvSG91ciwgJFRvTWludXRlCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgPSB7CiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdG9wfSAgPT4gJFRpbWVTdG9wLAogICAgICAgICAgICAgICAgICAgICRSZWYxLT57VmFsdWVzfXtUaW1lU3RhcnR9ID0+ICRUaW1lU3RhcnQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgKCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUsICRWU1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCwgMCwKICAgICAgICAgICAgICAgICAgICAwLCAwLCAxCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CgogICAgIyBtZXJnZSB0aGUgYXJyYXkgaWYgdHdvIGVsZW1lbnRzIGZvciB0aGUgdmFsdWVzZXJpZXMgYXJlIGF2aWFsYWJsZQogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRBcnJheVNlbGVjdGVkWzBde1ZhbHVlc30gfSApIHsKICAgICAgICBteSAkVmFsdWUwOwogICAgICAgIGlmICggJEFycmF5U2VsZWN0ZWRbMF17QmxvY2t9IGVxICdTZWxlY3RGaWVsZCcgKSB7CiAgICAgICAgICAgICRWYWx1ZTAgPSAkS2V5OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcnJheVNlbGVjdGVkWzBde0Jsb2NrfSBlcSAnTXVsdGlTZWxlY3RGaWVsZCcgKSB7CiAgICAgICAgICAgICRWYWx1ZTAgPSBbJEtleV07CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkQXJyYXlTZWxlY3RlZFsxXSApIHsKICAgICAgICAgICAgJFZhbHVlU2VyaWVzeyAkQXJyYXlTZWxlY3RlZFswXXtWYWx1ZXN9eyRLZXl9IH0KICAgICAgICAgICAgICAgID0geyAkQXJyYXlTZWxlY3RlZFswXXtFbGVtZW50fSA9PiAkVmFsdWUwIH07CiAgICAgICAgICAgIG5leHQgS0VZOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRTdWJLZXkgKCBrZXlzICV7ICRBcnJheVNlbGVjdGVkWzFde1ZhbHVlc30gfSApIHsKICAgICAgICAgICAgbXkgJFZhbHVlMTsKICAgICAgICAgICAgaWYgKCAkQXJyYXlTZWxlY3RlZFsxXXtCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZTEgPSAkU3ViS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFycmF5U2VsZWN0ZWRbMV17QmxvY2t9IGVxICdNdWx0aVNlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZTEgPSBbJFN1YktleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFZhbHVlU2VyaWVzewogICAgICAgICAgICAgICAgJEFycmF5U2VsZWN0ZWRbMF17VmFsdWVzfXskS2V5fSAuICcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXJyYXlTZWxlY3RlZFsxXXtWYWx1ZXN9eyRTdWJLZXl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICA9IHsKICAgICAgICAgICAgICAgICRBcnJheVNlbGVjdGVkWzBde0VsZW1lbnR9ID0+ICRWYWx1ZTAsCiAgICAgICAgICAgICAgICAkQXJyYXlTZWxlY3RlZFsxXXtFbGVtZW50fSA9PiAkVmFsdWUxCiAgICAgICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIFVzZSB0aGlzIGlmIG5vIHZhbHVlc2VyaWVzIGF2YWlsYWJsZQogICAgaWYgKCAhJVZhbHVlU2VyaWVzICkgewogICAgICAgICRWYWx1ZVNlcmllc3sgJFBhcmFte09iamVjdH0gLiAncycgfSA9IHVuZGVmOwogICAgfQoKICAgICMgZ2V0IHRoZSBmaXJzdCBjb2x1bW4gbmFtZSBpbiB0aGUgaGVhZGVybGluZQogICAgaWYgKCRDb2x1bW5OYW1lKSB7CiAgICAgICAgdW5zaGlmdCBASGVhZGVyTGluZSwgJENvbHVtbk5hbWU7CiAgICB9CiAgICBlbHNpZiAoICRBcnJheVNlbGVjdGVkWzFdICkgewogICAgICAgIHVuc2hpZnQoIEBIZWFkZXJMaW5lLCAkQXJyYXlTZWxlY3RlZFswXXtOYW1lfSAuICcgLSAnIC4gJEFycmF5U2VsZWN0ZWRbMV17TmFtZX0gKTsKICAgIH0KICAgIGVsc2lmICggJEFycmF5U2VsZWN0ZWRbMF0gKSB7CiAgICAgICAgdW5zaGlmdCggQEhlYWRlckxpbmUsICRBcnJheVNlbGVjdGVkWzBde05hbWV9IHx8ICcnICk7CiAgICB9CgogICAgIyBwdXNoIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50cyBpbiB0aGUgU3RhdHNBcnJheQogICAgbXkgJFRpdGxlID0gJFBhcmFte1RpdGxlfTsKICAgIGlmICggJFRpdGxlVGltZVN0YXJ0ICYmICRUaXRsZVRpbWVTdG9wICkgewogICAgICAgICRUaXRsZSAuPSAiICRUaXRsZVRpbWVTdGFydC0kVGl0bGVUaW1lU3RvcCI7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNhY2hlIHN0cmluZwogICAgbXkgJENhY2hlU3RyaW5nID0gJFNlbGYtPl9HZXRDYWNoZVN0cmluZyglUGFyYW0pOwoKICAgICMgdGFrZSB0aGUgY2FjaGUgdmFsdWUgaWYgY29uZmlndXJlZCBhbmQgYXZhaWxhYmxlCiAgICBpZiAoICRQYXJhbXtDYWNoZX0gKSB7CiAgICAgICAgbXkgQFN0YXRBcnJheSA9ICRTZWxmLT5fR2V0UmVzdWx0Q2FjaGUoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICdTdGF0cycgLiAkUGFyYW17U3RhdElEfSAuICctJyAuICRDYWNoZVN0cmluZyAuICcuY2FjaGUnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBAU3RhdEFycmF5IGlmIEBTdGF0QXJyYXk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRhYmxlIHN0cnVjdHVyZQogICAgbXkgJVRhYmxlU3RydWN0dXJlID0gKCk7CiAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAlVmFsdWVTZXJpZXMgKSB7CiAgICAgICAgbXkgQENlbGxzID0gKCk7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHsgJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfSB9ICkgeyAgICAjIGdldCBlYWNoIGNlbGwKICAgICAgICAgICAgJFZhbHVlU2VyaWVzeyRSb3d9IHx8PSB7fTsKICAgICAgICAgICAgbXkgJUF0dHJpYnV0ZXMgPSAoICV7ICRWYWx1ZVNlcmllc3skUm93fSB9LCAlUmVzdHJpY3Rpb25BdHRyaWJ1dGUgKTsKCiAgICAgICAgICAgICMgdGhlIGZvbGxvd2luZyBpcyBuZWNlc3NhcnkgaWYgYXMgeC1heGlzIGFuZCBhcyB2YWx1ZS1zZXJpZXMgdGltZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICRYdmFsdWUtPntCbG9ja30gZXEgJ1RpbWUnICkgewogICAgICAgICAgICAgICAgbXkgJFRpbWVTdGFydCA9ICRYdmFsdWUtPntWYWx1ZXN9e1RpbWVTdGFydH07CiAgICAgICAgICAgICAgICBteSAkVGltZVN0b3AgID0gJFh2YWx1ZS0+e1ZhbHVlc317VGltZVN0b3B9OwogICAgICAgICAgICAgICAgaWYgKCAkVmFsdWVTZXJpZXN7JFJvd317JFRpbWVTdG9wfSAmJiAkVmFsdWVTZXJpZXN7JFJvd317JFRpbWVTdGFydH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRDZWxsLT57VGltZVN0b3B9ICkKICAgICAgICAgICAgICAgICAgICAgICAgPiAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVmFsdWVTZXJpZXN7JFJvd317JFRpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJENlbGwtPntUaW1lU3RhcnR9ICkKICAgICAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVmFsdWVTZXJpZXN7JFJvd317JFRpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVzeyRUaW1lU3RvcH0gID0gJENlbGwtPntUaW1lU3RvcH07CiAgICAgICAgICAgICAgICAkQXR0cmlidXRlc3skVGltZVN0YXJ0fSA9ICRDZWxsLT57VGltZVN0YXJ0fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRYdmFsdWUtPntCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVzeyAkWHZhbHVlLT57RWxlbWVudH0gfSA9ICRDZWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZXN7ICRYdmFsdWUtPntFbGVtZW50fSB9ID0gWyRDZWxsXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBDZWxscywgXCVBdHRyaWJ1dGVzOwogICAgICAgIH0KICAgICAgICAkVGFibGVTdHJ1Y3R1cmV7JFJvd30gPSBcQENlbGxzOwogICAgfQoKICAgIG15IEBEYXRhQXJyYXkgPSAoKTsKICAgIGlmICggJFN0YXRPYmplY3QtPmNhbignR2V0U3RhdFRhYmxlJykgKSB7CgogICAgICAgICMgZ2V0IHRoZSB3aG9sZSBzdGF0cyB0YWJsZQogICAgICAgIEBEYXRhQXJyYXkgPSAkU3RhdE9iamVjdC0+R2V0U3RhdFRhYmxlKAogICAgICAgICAgICBWYWx1ZVNlcmllcyAgICA9PiAkUGFyYW17VXNlQXNWYWx1ZVNlcmllc30sICAgICNcJVZhbHVlU2VyaWVzLAogICAgICAgICAgICBYVmFsdWUgICAgICAgICA9PiAkWHZhbHVlLAogICAgICAgICAgICBSZXN0cmljdGlvbnMgICA9PiBcJVJlc3RyaWN0aW9uQXR0cmlidXRlLAogICAgICAgICAgICBUYWJsZVN0cnVjdHVyZSA9PiBcJVRhYmxlU3RydWN0dXJlLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAlVGFibGVTdHJ1Y3R1cmUgKSB7CiAgICAgICAgICAgIG15IEBSZXN1bHRSb3cgPSAoJFJvdyk7CiAgICAgICAgICAgIGZvciBteSAkQ2VsbCAoIEB7ICRUYWJsZVN0cnVjdHVyZXskUm93fSB9ICkgewogICAgICAgICAgICAgICAgbXkgJFF1YW50aXR5ID0gJFN0YXRPYmplY3QtPkdldFN0YXRFbGVtZW50KCAleyRDZWxsfSApOwogICAgICAgICAgICAgICAgcHVzaCBAUmVzdWx0Um93LCAkUXVhbnRpdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBARGF0YUFycmF5LCBcQFJlc3VsdFJvdzsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHVwIGVtcHR5IGFycmF5IGVsZW1lbnRzLCBlLmcgbW9udGggYXMgdmFsdWUgc2VyaWVzIChGZWJydWFyeSBoYXMgMjggZGF5IGFuZCBKYW51YXIgMzEpCiAgICBmb3IgbXkgJFJvdyAoQERhdGFBcnJheSkgewogICAgICAgIGZvciBteSAkSW5kZXggKCAxIC4uICQjSGVhZGVyTGluZSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUm93LT5bJEluZGV4XSApIHsKICAgICAgICAgICAgICAgICRSb3ctPlskSW5kZXhdID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSRU1BUks6IGl0IGNvdWxkIGJlIGFsc28gdXNlZnVsIHRvIHVzZSB0aGUgaW5kaXZpdWFsIHNvcnQgaWYgZGlmaW5lZAogICAgIyBzbyB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uCiAgICBpZiAoICRTdGF0T2JqZWN0LT5jYW4oJ0dldEhlYWRlckxpbmUnKSApIHsKICAgICAgICBteSAkSGVhZGVyUmVmID0gJFN0YXRPYmplY3QtPkdldEhlYWRlckxpbmUoCiAgICAgICAgICAgIFhWYWx1ZSA9PiAkWHZhbHVlLAogICAgICAgICk7CgogICAgICAgIGlmICgkSGVhZGVyUmVmKSB7CiAgICAgICAgICAgIEBIZWFkZXJMaW5lID0gQHskSGVhZGVyUmVmfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFN0YXRBcnJheSA9ICggWyRUaXRsZV0sIFxASGVhZGVyTGluZSwgQERhdGFBcnJheSApOwoKICAgIHJldHVybiBAU3RhdEFycmF5IGlmICEkUGFyYW17Q2FjaGV9OwoKICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIGNhY2hlIHRoaXMgcmVzdWx0CiAgICAjIGdldCB0aGUgY3VycmVudCB0aW1lCiAgICBpZiAoICEkVGl0bGVUaW1lU3RhcnQgfHwgISRUaXRsZVRpbWVTdG9wICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2FjaGU6IFN0YXRJRCAkUGFyYW17U3RhdElEfSBoYXZlIG5vIHRpbWUgcGVyaW9kLCBzbyB5b3UgY2FuJ3QgY2FjaGUgdGhlIHN0YXQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybiBAU3RhdEFycmF5OwogICAgfQoKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaXRsZVRpbWVTdG9wICkKICAgICAgICA+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBjYWNoZSBTdGF0SUQgJFBhcmFte1N0YXRJRH06IFRoZSBzZWxlY3RlZCBlbmQgdGltZSBpcyBpbiB0aGUgZnV0dXJlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQFN0YXRBcnJheTsKICAgIH0KCiAgICAjIHdyaXRlIHRoZSBzdGF0cyBjYWNoZQogICAgJFNlbGYtPl9TZXRSZXN1bHRDYWNoZSgKICAgICAgICBGaWxlbmFtZSA9PiAnU3RhdHMnIC4gJFBhcmFte1N0YXRJRH0gLiAnLScgLiAkQ2FjaGVTdHJpbmcgLiAnLmNhY2hlJywKICAgICAgICBSZXN1bHQgICA9PiBcQFN0YXRBcnJheSwKICAgICk7CiAgICByZXR1cm4gQFN0YXRBcnJheTsKfQoKPWl0ZW0gR2VuZXJhdGVHcmFwaCgpCgptYWtlIGdyYXBoIGZyb20gcmVzdWx0IGFycmF5CgogICAgbXkgJEdyYXBoID0gJFN0YXRzT2JqZWN0LT5HZW5lcmF0ZUdyYXBoKAogICAgICAgIEFycmF5ICAgICAgICA9PiBcQFN0YXRBcnJheSwKICAgICAgICBHcmFwaFNpemUgICAgPT4gJzgwMHg2MDAnLAogICAgICAgIEhlYWRBcnJheVJlZiA9PiAkSGVhZEFycmF5UmVmLAogICAgICAgIFRpdGxlICAgICAgICA9PiAnQWxsIFRpY2tldHMgb2YgdGhlIG1vbnRoJywKICAgICAgICBGb3JtYXQgICAgICAgPT4gJ0dEOjpHcmFwaDo6bGluZXMnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmF0ZUdyYXBoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBuZWVkIHBhcmFtcyBhcmUgYXZhaWxhYmxlCiAgICBmb3IgKHF3KEFycmF5IEdyYXBoU2l6ZSBIZWFkQXJyYXlSZWYgVGl0bGUgRm9ybWF0KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJHZW5lcmF0ZUdyYXBoOiBOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAU3RhdEFycmF5ICAgID0gQHsgJFBhcmFte0FycmF5fSB9OwogICAgbXkgJEhlYWRBcnJheVJlZiA9ICRQYXJhbXtIZWFkQXJyYXlSZWZ9OwogICAgbXkgJEdEQmFja2VuZCAgICA9ICRQYXJhbXtGb3JtYXR9OwoKICAgICMgZGVsZXRlIFN1bUNvbCBhbmQgU3VtUm93IGlmIHByZXNlbnQKICAgIGlmICggJFN0YXRBcnJheVstMV1bMF0gZXEgJ1N1bScgKSB7CiAgICAgICAgcG9wIEBTdGF0QXJyYXk7CiAgICB9CiAgICBpZiAoICRIZWFkQXJyYXlSZWYtPlstMV0gZXEgJ1N1bScgKSB7CiAgICAgICAgcG9wIEB7JEhlYWRBcnJheVJlZn07CiAgICAgICAgZm9yIG15ICRSb3cgKEBTdGF0QXJyYXkpIHsKICAgICAgICAgICAgcG9wIEB7JFJvd307CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBnZCBtb2R1bGVzCiAgICBmb3IgbXkgJE1vZHVsZSAoICdHRCcsICdHRDo6R3JhcGgnLCAkR0RCYWNrZW5kICkgewogICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHZW5lcmF0ZUdyYXBoOiBOZWVkICRNb2R1bGUhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIGZpcnN0IHkveCBwb3NpdGlvbgogICAgbXkgJFhMYWJsZSA9IHNoaWZ0IEB7JEhlYWRBcnJheVJlZn07CgogICAgIyBnZXQgZmlyc3QgY29sIGZvciBsZWdlbmQKICAgIG15IEBZTGluZSA9ICgpOwogICAgZm9yIG15ICRUbXAgKEBTdGF0QXJyYXkpIHsKICAgICAgICBwdXNoIEBZTGluZSwgJFRtcC0+WzBdOwogICAgICAgIHNoaWZ0IEB7JFRtcH07CiAgICB9CgogICAgIyBidWlsZCBwbG90IGRhdGEKICAgIG15IEBQRGF0YSA9ICggJEhlYWRBcnJheVJlZiwgQFN0YXRBcnJheSApOwogICAgbXkgKCAkWFNpemUsICRZU2l6ZSApID0gc3BsaXQoIG17eH14LCAkUGFyYW17R3JhcGhTaXplfSApOwogICAgbXkgJGdyYXBoID0gJEdEQmFja2VuZC0+bmV3KCAkWFNpemUgfHwgNTUwLCAkWVNpemUgfHwgMzUwICk7CiAgICAkZ3JhcGgtPnNldCgKICAgICAgICB4X2xhYmVsID0+ICRYTGFibGUsCgogICAgICAgICMgICAgICAgIHlfbGFiZWwgPT4gJ1lMYWJsZScsCiAgICAgICAgdGl0bGUgPT4gJFBhcmFte1RpdGxlfSwKCiAgICAgICAgIyAgICAgICAgeV9tYXhfdmFsdWUgPT4gMjAsCiAgICAgICAgIyAgICAgICAgeV90aWNrX251bWJlciA9PiAxNiwKICAgICAgICAjICAgICAgICB5X2xhYmVsX3NraXAgPT4gNCwKICAgICAgICAjICAgICAgICB4X3RpY2tfbnVtYmVyID0+IDgsCiAgICAgICAgdF9tYXJnaW4gICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6dF9tYXJnaW4iKSAgICB8fCAxMCwKICAgICAgICBiX21hcmdpbiAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjpiX21hcmdpbiIpICAgIHx8IDEwLAogICAgICAgIGxfbWFyZ2luICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6R3JhcGg6OmxfbWFyZ2luIikgICAgfHwgMTAsCiAgICAgICAgcl9tYXJnaW4gICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6cl9tYXJnaW4iKSAgICB8fCAyMCwKICAgICAgICBiZ2NsciAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjpiZ2NsciIpICAgICAgIHx8ICd3aGl0ZScsCiAgICAgICAgdHJhbnNwYXJlbnQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6dHJhbnNwYXJlbnQiKSB8fCAwLAogICAgICAgIGludGVybGFjZWQgID0+IDEsCiAgICAgICAgZmdjbHIgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6ZmdjbHIiKSAgICAgICB8fCAnYmxhY2snLAogICAgICAgIGJveGNsciAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6R3JhcGg6OmJveGNsciIpICAgICAgfHwgJ3doaXRlJywKICAgICAgICBhY2NlbnRjbHIgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjphY2NlbnRjbHIiKSAgIHx8ICdibGFjaycsCiAgICAgICAgc2hhZG93Y2xyICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6c2hhZG93Y2xyIikgICB8fCAnYmxhY2snLAogICAgICAgIGxlZ2VuZGNsciAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6R3JhcGg6OmxlZ2VuZGNsciIpICAgfHwgJ2JsYWNrJywKICAgICAgICB0ZXh0Y2xyICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjp0ZXh0Y2xyIikgICAgIHx8ICdibGFjaycsCiAgICAgICAgZGNscnMgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6ZGNscnMiKQogICAgICAgICAgICB8fCBbCiAgICAgICAgICAgIHF3KHJlZCBncmVlbiBibHVlIHllbGxvdyBibGFjayBwdXJwbGUgb3JhbmdlIHBpbmsgbWFyaW5lIGN5YW4gbGdyYXkgbGJsdWUgbHllbGxvdyBsZ3JlZW4gbHJlZCBscHVycGxlIGxvcmFuZ2UgbGJyb3duKQogICAgICAgICAgICBdLAogICAgICAgIHhfdGlja19vZmZzZXQgICAgICAgPT4gMCwKICAgICAgICB4X2xhYmVsX3Bvc2l0aW9uICAgID0+IDEgLyAyLAogICAgICAgIHlfbGFiZWxfcG9zaXRpb24gICAgPT4gMSAvIDIsCiAgICAgICAgeF9sYWJlbHNfdmVydGljYWwgICA9PiAzMSwKICAgICAgICBsaW5lX3dpZHRoICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6R3JhcGg6OmxpbmVfd2lkdGgiKSB8fCAxLAogICAgICAgIGxlZ2VuZF9wbGFjZW1lbnQgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6bGVnZW5kX3BsYWNlbWVudCIpIHx8ICdCQycsCiAgICAgICAgbGVnZW5kX3NwYWNpbmcgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjpsZWdlbmRfc3BhY2luZyIpIHx8IDQsCiAgICAgICAgbGVnZW5kX21hcmtlcl93aWR0aCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiU3RhdHM6OkdyYXBoOjpsZWdlbmRfbWFya2VyX3dpZHRoIikKICAgICAgICAgICAgfHwgMTIsCiAgICAgICAgbGVnZW5kX21hcmtlcl9oZWlnaHQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlN0YXRzOjpHcmFwaDo6bGVnZW5kX21hcmtlcl9oZWlnaHQiKQogICAgICAgICAgICB8fCA4LAogICAgKTsKCiAgICAjIHNldCBsZWdlbmQgKHktbGluZSkKICAgIGlmICggJFBhcmFte0Zvcm1hdH0gbmUgJ0dEOjpHcmFwaDo6cGllJyApIHsKICAgICAgICAkZ3JhcGgtPnNldF9sZWdlbmQoQFlMaW5lKTsKICAgIH0KCiAgICAjIHBsb3QgZ3JhcGgKICAgIG15ICRFeHQgPSAnJzsKICAgIGlmICggISRncmFwaC0+Y2FuKCdwbmcnKSApIHsKICAgICAgICAkRXh0ID0gJ3BuZyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRXh0ID0gJGdyYXBoLT5leHBvcnRfZm9ybWF0OwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3Qgd3JpdGUgcG5nISBXcml0ZTogJEV4dCIsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRDb250ZW50ID0gZXZhbCB7ICRncmFwaC0+cGxvdCggXEBQRGF0YSApLT4kRXh0KCkgfTsKICAgIHJldHVybiAkQ29udGVudDsKfQoKPWl0ZW0gQ29tcGxldGVuZXNzQ2hlY2soKQoKICAgIG15IEBOb3RpZnkgPSAkU3RhdHNPYmplY3QtPkNvbXBsZXRlbmVzc0NoZWNrKAogICAgICAgIFN0YXREYXRhID0+IFwlU3RhdERhdGEsCiAgICAgICAgU2VjdGlvbiA9PiAnQWxsJyB8fCAnU3BlY2lmaWNhdGlvbicgfHwgJ1ZhbHVlU2VyaWVzJyB8fCAnUmVzdHJpY3Rpb25zIHx8IFhheGlzJwogICAgKTsKCj1jdXQKCnN1YiBDb21wbGV0ZW5lc3NDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBOb3RpZnkgICAgICAgICA9ICgpOwogICAgbXkgQE5vdGlmeVNlbGVjdGVkID0gKCk7CiAgICBteSBASW5kZXhBcnJheSAgICAgPSAoKTsKCiAgICAkTm90aWZ5WzBdID0gewogICAgICAgIEluZm8gICAgID0+ICdQbGVhc2UgZmlsbCBvdXQgdGhlIHJlcXVpcmVkIGZpZWxkcyEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzFdID0gewogICAgICAgIEluZm8gICAgID0+ICdQbGVhc2Ugc2VsZWN0IGEgZmlsZSEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzJdID0gewogICAgICAgIEluZm8gICAgID0+ICdQbGVhc2Ugc2VsZWN0IGFuIG9iamVjdCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzNdID0gewogICAgICAgIEluZm8gICAgID0+ICdQbGVhc2Ugc2VsZWN0IGEgZ3JhcGggc2l6ZSEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzRdID0gewogICAgICAgIEluZm8gICAgID0+ICdQbGVhc2Ugc2VsZWN0IG9uZSBlbGVtZW50IGZvciB0aGUgWC1heGlzIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbNl0gPSB7CiAgICAgICAgSW5mbyA9PgogICAgICAgICAgICAnUGxlYXNlIHNlbGVjdCBvbmx5IG9uZSBlbGVtZW50IG9yIHR1cm4gb2YgdGhlIGJ1dHRvbiBcJ0ZpeGVkXCcgd2hlcmUgdGhlIHNlbGVjdCBmaWVsZCBpcyBtYXJrZWQhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVs3XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnSWYgeW91IHVzZSBhIGNoZWNrYm94IHlvdSBoYXZlIHRvIHNlbGVjdCBzb21lIGF0dHJpYnV0ZXMgb2YgdGhlIHNlbGVjdCBmaWVsZCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzhdID0gewogICAgICAgIEluZm8gPT4KICAgICAgICAgICAgJ1BsZWFzZSBpbnNlcnQgYSB2YWx1ZSBpbiB0aGUgc2VsZWN0ZWQgaW5wdXQgZmllbGQgb3IgdHVybiBvZmYgdGhlIFwnRml4ZWRcJyBjaGVja2JveCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzldID0gewogICAgICAgIEluZm8gICAgID0+ICdUaGUgc2VsZWN0ZWQgZW5kIHRpbWUgaXMgYmVmb3JlIHRoZSBzdGFydCB0aW1lIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbMTBdID0gewogICAgICAgIEluZm8gICAgID0+ICdZb3UgaGF2ZSB0byBzZWxlY3Qgb25lIG9yIG1vcmUgYXR0cmlidXRlcyBmcm9tIHRoZSBzZWxlY3QgZmllbGQhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxMV0gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ1RoZSBzZWxlY3RlZCBEYXRlIGlzblwndCB2YWxpZCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzEyXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBvbmx5IG9uZSBvciB0d28gZWxlbWVudHMgdmlhIHRoZSBjaGVja2JveCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzEzXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnSWYgeW91IHVzZSBhIHRpbWUgc2NhbGUgZWxlbWVudCB5b3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBlbGVtZW50IScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbMTRdID0gewogICAgICAgIEluZm8gICAgID0+ICdZb3UgaGF2ZSBhbiBlcnJvciBpbiB5b3VyIHRpbWUgc2VsZWN0aW9uIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbMTVdID0gewogICAgICAgIEluZm8gICAgID0+ICdZb3VyIHJlcG9ydGluZyB0aW1lIGludGVydmFsIGlzIHRvIHNtYWxsLCBwbGVhc2UgdXNlIGEgbGFyZ2VyIHRpbWUgc2NhbGUhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxNl0gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ1RoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHlvdXIgdGltZSBzY2FsZSBzZWxlY3Rpb24uIFBsZWFzZSBjaGVjayBpdCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzE3XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnWW91IGhhdmUgdG8gc2VsZWN0IGEgdGltZSBzY2FsZSBsaWtlIGRheSBvciBtb250aCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CgogICAgIyBjaGVjayBpZiBuZWVkIHBhcmFtcyBhcmUgYXZhaWxhYmxlCiAgICBORUVEOgogICAgZm9yIG15ICROZWVkIChxdyhTdGF0RGF0YSBTZWN0aW9uKSkgewogICAgICAgIG5leHQgTkVFRCBpZiAkUGFyYW17JE5lZWR9OwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29tcGxldGVuZXNzQ2hlY2s6IE5lZWQgJE5lZWQiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJVN0YXREYXRhID0gJXsgJFBhcmFte1N0YXREYXRhfSB9OwogICAgaWYgKCAkUGFyYW17U2VjdGlvbn0gZXEgJ1NwZWNpZmljYXRpb24nIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApIHsKICAgICAgICBmb3IgKHF3KFRpdGxlIERlc2NyaXB0aW9uIFN0YXRUeXBlIFBlcm1pc3Npb24gRm9ybWF0IE9iamVjdE1vZHVsZSkpIHsKICAgICAgICAgICAgaWYgKCAhJFN0YXREYXRheyRffSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDA7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFN0YXREYXRhe1N0YXRUeXBlfSAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdzdGF0aWMnICYmICEkU3RhdERhdGF7RmlsZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDE7CiAgICAgICAgfQogICAgICAgIGlmICggJFN0YXREYXRhe1N0YXRUeXBlfSAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJyAmJiAhJFN0YXREYXRhe09iamVjdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDI7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtTdGF0RGF0YX17R3JhcGhTaXplfSAmJiAkUGFyYW17U3RhdERhdGF9e0Zvcm1hdH0gKSB7CiAgICAgICAgICAgIGZvciAoIEB7ICRTdGF0RGF0YXtGb3JtYXR9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRfID1+IG17XkdEOjpHcmFwaFwuKn14ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDM7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGZvciBmb3JtIGNhbGxzCiAgICBpZiAoICRTdGF0RGF0YXtTdGF0VHlwZX0gJiYgJFN0YXREYXRhe1N0YXRUeXBlfSBlcSAnZHluYW1pYycgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAoICRQYXJhbXtTZWN0aW9ufSBlcSAnWGF4aXMnIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApCiAgICAgICAgICAgICYmICRTdGF0RGF0YXtTdGF0VHlwZX0gZXEgJ2R5bmFtaWMnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRGbGFnID0gMDsKICAgICAgICAgICAgWFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJFh2YWx1ZSAoIEB7ICRTdGF0RGF0YXtVc2VBc1h2YWx1ZX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgWFZBTFVFIGlmICEkWHZhbHVlLT57U2VsZWN0ZWR9OwoKICAgICAgICAgICAgICAgIGlmICggJFh2YWx1ZS0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkWHZhbHVlLT57VGltZVN0YXJ0fSAmJiAkWHZhbHVlLT57VGltZVN0b3B9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFh2YWx1ZS0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVTdG9wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFh2YWx1ZS0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGltZVN0YXJ0IHx8ICEkVGltZVN0b3AgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFRpbWVTdGFydCA+ICRUaW1lU3RvcCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFhWQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkWHZhbHVlLT57VGltZVJlbGF0aXZlVW5pdH0gfHwgISRYdmFsdWUtPntUaW1lUmVsYXRpdmVDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfVswXSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFh2YWx1ZS0+e0ZpeGVkfSAmJiAkI3sgJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfSB9ID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEZsYWcgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgKCAkUGFyYW17U2VjdGlvbn0gZXEgJ1ZhbHVlU2VyaWVzJyB8fCAkUGFyYW17U2VjdGlvbn0gZXEgJ0FsbCcgKQogICAgICAgICAgICAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIG15ICRGbGFnICAgID0gMDsKICAgICAgICAgICAgVkFMVUVTRVJJRVM6CiAgICAgICAgICAgIGZvciBteSAkVmFsdWVTZXJpZXMgKCBAeyAkU3RhdERhdGF7VXNlQXNWYWx1ZVNlcmllc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUVTRVJJRVMgaWYgISRWYWx1ZVNlcmllcy0+e1NlbGVjdGVkfTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzLT57QmxvY2t9IGVxICdUaW1lJwogICAgICAgICAgICAgICAgICAgIHx8ICRWYWx1ZVNlcmllcy0+e0Jsb2NrfSBlcSAnVGltZUV4dGVuZGVkJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZVNlcmllcy0+e0ZpeGVkfSAmJiAkI3sgJFZhbHVlU2VyaWVzLT57U2VsZWN0ZWRWYWx1ZXN9IH0gPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA2OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkVmFsdWVTZXJpZXMtPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRGbGFnID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENvdW50ZXIgPiAxICYmICRGbGFnICkgewogICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnRlciA+IDIgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgICggJFBhcmFte1NlY3Rpb259IGVxICdSZXN0cmljdGlvbnMnIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApCiAgICAgICAgICAgICYmICRTdGF0RGF0YXtTdGF0VHlwZX0gZXEgJ2R5bmFtaWMnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIFJFU1RSSUNUSU9OOgogICAgICAgICAgICBmb3IgbXkgJFJlc3RyaWN0aW9uICggQHsgJFN0YXREYXRhe1VzZUFzUmVzdHJpY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFJFU1RSSUNUSU9OIGlmICEkUmVzdHJpY3Rpb24tPntTZWxlY3RlZH07CgogICAgICAgICAgICAgICAgaWYgKCAkUmVzdHJpY3Rpb24tPntCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXN0cmljdGlvbi0+e0ZpeGVkfSAmJiAkI3sgJFJlc3RyaWN0aW9uLT57U2VsZWN0ZWRWYWx1ZXN9IH0gPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA2OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFJFU1RSSUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkUmVzdHJpY3Rpb24tPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDc7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICRSZXN0cmljdGlvbi0+e0Jsb2NrfSBlcSAnSW5wdXRGaWVsZCcKICAgICAgICAgICAgICAgICAgICAmJiAhJFJlc3RyaWN0aW9uLT57U2VsZWN0ZWRWYWx1ZXN9WzBdCiAgICAgICAgICAgICAgICAgICAgJiYgJFJlc3RyaWN0aW9uLT57Rml4ZWR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDg7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBSRVNUUklDVElPTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkUmVzdHJpY3Rpb24tPntCbG9ja30gZXEgJ1RpbWUnCiAgICAgICAgICAgICAgICAgICAgfHwgJFJlc3RyaWN0aW9uLT57QmxvY2t9IGVxICdUaW1lRXh0ZW5kZWQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlc3RyaWN0aW9uLT57VGltZVN0YXJ0fSAmJiAkUmVzdHJpY3Rpb24tPntUaW1lU3RvcH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUaW1lU3RhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVzdHJpY3Rpb24tPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUaW1lU3RvcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZXN0cmljdGlvbi0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGltZVN0YXJ0IHx8ICEkVGltZVN0b3AgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVGltZVN0YXJ0ID4gJFRpbWVTdG9wICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhJFJlc3RyaWN0aW9uLT57VGltZVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRSZXN0cmljdGlvbi0+e1RpbWVSZWxhdGl2ZUNvdW50fQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA5OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFJFU1RSSUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgdGltZXBlcmlvZCBpcyB0byBiaWcgb3IgdGhlIHRpbWUgc2NhbGUgdG8gc21hbGwKICAgICAgICAjIHVzZWQgb25seSBmb3IgZml4ZWQgdGltZSB2YWx1ZXMKICAgICAgICAjIHJlbWFyayB0aW1lIGZ1bmN0aW9ucyBzaG91bGQgYmUgZXhwb3J0ZXQgaW4gZXh0ZXJuYWwgZnVuY3Rpb25zICh0cikKICAgICAgICBpZiAoICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJyApIHsKICAgICAgICAgICAgbXkgJFN0YXQgPSAkU2VsZi0+U3RhdHNHZXQoIFN0YXRJRCA9PiAkU3RhdERhdGF7U3RhdElEfSApOwoKICAgICAgICAgICAgWFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJFh2YWx1ZSAoIEB7ICRTdGF0LT57VXNlQXNYdmFsdWV9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFhWQUxVRQogICAgICAgICAgICAgICAgICAgIGlmICEoICRYdmFsdWUtPntTZWxlY3RlZH0gJiYgJFh2YWx1ZS0+e0ZpeGVkfSAmJiAkWHZhbHVlLT57QmxvY2t9IGVxICdUaW1lJyApOwoKICAgICAgICAgICAgICAgIG15ICRGbGFnID0gMTsKICAgICAgICAgICAgICAgIFZBTFVFU0VSSUVTOgogICAgICAgICAgICAgICAgZm9yIG15ICRWYWx1ZVNlcmllcyAoIEB7ICRTdGF0LT57VXNlQXNWYWx1ZVNlcmllc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZVNlcmllcy0+e1NlbGVjdGVkfSAmJiAkVmFsdWVTZXJpZXMtPntCbG9ja30gZXEgJ1RpbWUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRmxhZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUVTRVJJRVM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFIGlmICEkRmxhZzsKCiAgICAgICAgICAgICAgICBteSAkU2NhbGVQZXJpb2QgPSAwOwogICAgICAgICAgICAgICAgbXkgJFRpbWVQZXJpb2QgID0gMDsKCiAgICAgICAgICAgICAgICBteSAkQ291bnQgPSAkWHZhbHVlLT57VGltZVNjYWxlQ291bnR9ID8gJFh2YWx1ZS0+e1RpbWVTY2FsZUNvdW50fSA6IDE7CgogICAgICAgICAgICAgICAgbXkgJVRpbWVJblNlY29uZHMgPSAoCiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDMxNTM2MDAwLCAgICAjIDYwICogNjAgKiA2MCAqIDM2NQogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAyNTkyMDAwLCAgICAgIyA2MCAqIDYwICogMjQgKiAzMAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiA4NjQwMCwgICAgICAgIyA2MCAqIDYwICogMjQKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMzYwMCwgICAgICAgICMgNjAgKiA2MAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA2MCwKICAgICAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNjYWxlUGVyaW9kID0gJFRpbWVJblNlY29uZHN7ICRYdmFsdWUtPntTZWxlY3RlZFZhbHVlc31bMF0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICEkU2NhbGVQZXJpb2QgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTc7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkWHZhbHVlLT57VGltZVN0b3B9ICYmICRYdmFsdWUtPntUaW1lU3RhcnR9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lUGVyaW9kCiAgICAgICAgICAgICAgICAgICAgICAgID0gKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRYdmFsdWUtPntUaW1lU3RvcH0gKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIC0gKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRYdmFsdWUtPntUaW1lU3RhcnR9ICkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaW1lUGVyaW9kID0gJFRpbWVJblNlY29uZHN7ICRYdmFsdWUtPntUaW1lUmVsYXRpdmVVbml0fSB9CiAgICAgICAgICAgICAgICAgICAgICAgICogJFh2YWx1ZS0+e1RpbWVSZWxhdGl2ZUNvdW50fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkTWF4QXR0ciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6TWF4WGF4aXNBdHRyaWJ1dGVzJykgfHwgMTAwMDsKICAgICAgICAgICAgICAgIGlmICggJFRpbWVQZXJpb2QgLyAoICRTY2FsZVBlcmlvZCAqICRDb3VudCApID4gJE1heEF0dHIgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IgKEBJbmRleEFycmF5KSB7CiAgICAgICAgcHVzaCBATm90aWZ5U2VsZWN0ZWQsICROb3RpZnlbJF9dOwogICAgfQoKICAgIHJldHVybiBATm90aWZ5U2VsZWN0ZWQ7Cgp9Cgo9aXRlbSBHZXRTdGF0c09iamVjdEF0dHJpYnV0ZXMoKQoKR2V0IGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIG9iamVjdCBpbiBkZXBlbmRlbmNlIG9mIHRoZSB1c2UKCiAgICBteSAlT2JqZWN0QXR0cmlidXRlcyA9ICRTdGF0c09iamVjdC0+R2V0U3RhdHNPYmplY3RBdHRyaWJ1dGVzKAogICAgICAgIE9iamVjdE1vZHVsZSA9PiAnVGlja2V0JywKICAgICAgICBVc2UgICAgICAgICAgPT4gJ1VzZUFzWHZhbHVlJyB8fCAnVXNlQXNWYWx1ZVNlcmllcycgfHwgJ1VzZUFzUmVzdHJpY3Rpb24nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRTdGF0c09iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgpOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIChxdyhPYmplY3RNb2R1bGUgVXNlKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHZXRTdGF0c09iamVjdEF0dHJpYnV0ZXM6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBtb2R1bGUKICAgIG15ICRPYmplY3RNb2R1bGUgPSAkUGFyYW17T2JqZWN0TW9kdWxlfTsKICAgICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE9iamVjdE1vZHVsZSk7CiAgICBteSAkU3RhdE9iamVjdCA9ICRPYmplY3RNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGxvYWQgYXR0cmlidXRlcwogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXNSYXcgPSAkU3RhdE9iamVjdC0+R2V0T2JqZWN0QXR0cmlidXRlcygpOwoKICAgICMgYnVpbGQgdGhlIG9iamVjdGF0dHJpYnV0ZSBhcnJheQogICAgZm9yIG15ICRIYXNoUmVmIChAT2JqZWN0QXR0cmlidXRlc1JhdykgewogICAgICAgIGlmICggJEhhc2hSZWYtPnsgJFBhcmFte1VzZX0gfSApIHsKICAgICAgICAgICAgZGVsZXRlICRIYXNoUmVmLT57VXNlQXNYdmFsdWV9OwogICAgICAgICAgICBkZWxldGUgJEhhc2hSZWYtPntVc2VBc1ZhbHVlU2VyaWVzfTsKICAgICAgICAgICAgZGVsZXRlICRIYXNoUmVmLT57VXNlQXNSZXN0cmljdGlvbn07CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCAkSGFzaFJlZjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBHZXRTdGF0aWNGaWxlcygpCgpHZXQgYWxsIHN0YXRpYyBmaWxlcwoKICAgIG15ICRGaWxlSGFzaCA9ICRTdGF0c09iamVjdC0+R2V0U3RhdGljRmlsZXMoCiAgICAgICAgT25seVVudXNlZEZpbGVzID0+IDEgfCAwLCAjIG9wdGlvbmFsIGRlZmF1bHQgMAogICAgKTsKCj1jdXQKCnN1YiBHZXRTdGF0aWNGaWxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVGaWxlbGlzdCA9ICgpOwoKICAgIG15ICREaXJlY3RvcnkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgaWYgKCAkRGlyZWN0b3J5ICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJERpcmVjdG9yeSAuPSAnLyc7CiAgICB9CiAgICAkRGlyZWN0b3J5IC49ICdLZXJuZWwvU3lzdGVtL1N0YXRzL1N0YXRpYy8nOwoKICAgIGlmICggIW9wZW5kaXIoIERJUiwgJERpcmVjdG9yeSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBvcGVuIERpcmVjdG9yeTogJERpcmVjdG9yeSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKCk7CiAgICB9CgogICAgbXkgJVN0YXRpY0ZpbGVzID0gKCk7CgogICAgaWYgKCAkUGFyYW17T25seVVudXNlZEZpbGVzfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIFN0YXRzIGZyb20gdGhlIGRiCiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5HZXRTdGF0c0xpc3QoKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSZXN1bHQgKSB7CiAgICAgICAgICAgIGZvciBteSAkU3RhdElEICggQHskUmVzdWx0fSApIHsKICAgICAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPlN0YXRzR2V0KCBTdGF0SUQgPT4gJFN0YXRJRCApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2l0Y2ggb25lIGFyZSBzdGF0aWMgc3RhdGlzdGljcwogICAgICAgICAgICAgICAgaWYgKCAkRGF0YS0+e0ZpbGV9ICYmICREYXRhLT57U3RhdFR5cGV9IGVxICdzdGF0aWMnICkgewogICAgICAgICAgICAgICAgICAgICRTdGF0aWNGaWxlc3sgJERhdGEtPntGaWxlfSB9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJlYWQgZmlsZXMKICAgIHdoaWxlICggZGVmaW5lZCggbXkgJEZpbGVuYW1lID0gcmVhZGRpciBESVIgKSApIHsKICAgICAgICBuZXh0IGlmICRGaWxlbmFtZSBlcSAnLic7CiAgICAgICAgbmV4dCBpZiAkRmlsZW5hbWUgZXEgJy4uJzsKICAgICAgICBpZiAoICRGaWxlbmFtZSA9fiBte14oLiopXC5wbSR9eCApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkU3RhdGljRmlsZXN7JDF9ICkgewogICAgICAgICAgICAgICAgJEZpbGVsaXN0eyQxfSA9ICQxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xvc2VkaXIoRElSKTsKCiAgICByZXR1cm4gXCVGaWxlbGlzdDsKfQoKPWl0ZW0gR2V0RHluYW1pY0ZpbGVzKCkKCkdldCBhbGwgc3RhdGljIG9iamVjdHMKCiAgICBteSAkRmlsZUhhc2ggPSAkU3RhdHNPYmplY3QtPkdldER5bmFtaWNGaWxlcygpOwoKPWN1dAoKc3ViIEdldER5bmFtaWNGaWxlcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVGaWxlbGlzdCA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbicpIH07CiAgICBPQkpFQ1Q6CiAgICBmb3IgbXkgJE9iamVjdCAoIGtleXMgJUZpbGVsaXN0ICkgewogICAgICAgIGlmICggISRGaWxlbGlzdHskT2JqZWN0fSApIHsKICAgICAgICAgICAgZGVsZXRlICRGaWxlbGlzdHskT2JqZWN0fTsKICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgfQogICAgICAgICRGaWxlbGlzdHskT2JqZWN0fSA9ICRTZWxmLT5HZXRPYmplY3ROYW1lKAogICAgICAgICAgICBPYmplY3RNb2R1bGUgPT4gJEZpbGVsaXN0eyRPYmplY3R9e01vZHVsZX0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBpZiAhJUZpbGVsaXN0OwoKICAgIHJldHVybiBcJUZpbGVsaXN0Owp9Cgo9aXRlbSBHZXRPYmplY3ROYW1lKCkKCkdldCB0aGUgbmFtZSBvZiBhIGR5bmFtaWMgb2JqZWN0CgogICAgbXkgJE9iamVjdE5hbWUgPSAkU3RhdHNPYmplY3QtPkdldE9iamVjdE5hbWUoCiAgICAgICAgT2JqZWN0TW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OlRpY2tldExpc3QnLAogICAgKTsKCj1jdXQKCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkTW9kdWxlID0gJFBhcmFte09iamVjdE1vZHVsZX07CgogICAgIyBjaGVjayBpZiBpdCBpcyBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+eydDYWNoZTo6T2JqZWN0TW9kdWxlJ317JE1vZHVsZX0gaWYgJFNlbGYtPnsnQ2FjaGU6Ok9iamVjdE5hbWUnfXskTW9kdWxlfTsKCiAgICAjIGxvYWQgbW9kdWxlLCByZXR1cm4gaWYgbW9kdWxlIGRvZXMgbm90IGV4aXN0CiAgICAjICh0aGlzIGlzIGltcG9ydGFudCB3aGVuIHN0YXRzIGFyZSB1bmluc3RhbGxlZCwgc2VlIGFsc28gYnVnIyA0MjY5KQogICAgcmV0dXJuIGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpOwoKICAgICMgZ2V0IG5hbWUKICAgIG15ICRTdGF0T2JqZWN0ID0gJE1vZHVsZS0+bmV3KCAleyRTZWxmfSApOwogICAgbXkgJE5hbWUgICAgICAgPSAkU3RhdE9iamVjdC0+R2V0T2JqZWN0TmFtZSgpOwoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPnsnQ2FjaGU6Ok9iamVjdE1vZHVsZSd9eyRNb2R1bGV9ID0gJE5hbWU7CgogICAgcmV0dXJuICROYW1lOwp9Cgo9aXRlbSBPYmplY3RGaWxlQ2hlY2soKQoKY2hlY2sgcmVhZGFibGUgb2JqZWN0IGZpbGUKCiAgICBteSAkT2JqZWN0RmlsZUNoZWNrID0gJFN0YXRzT2JqZWN0LT5PYmplY3RGaWxlQ2hlY2soCiAgICAgICAgVHlwZSA9PiAnc3RhdGljJywKICAgICAgICBOYW1lID0+ICdOZXdUaWNrZXRzJywKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RmlsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERpcmVjdG9yeSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBpZiAoICREaXJlY3RvcnkgIX4gbXteLipcLyR9eCApIHsKICAgICAgICAkRGlyZWN0b3J5IC49ICcvJzsKICAgIH0KICAgIGlmICggJFBhcmFte1R5cGV9IGVxICdzdGF0aWMnICkgewogICAgICAgICREaXJlY3RvcnkgLj0gJ0tlcm5lbC9TeXN0ZW0vU3RhdHMvU3RhdGljLycgLiAkUGFyYW17TmFtZX0gLiAnLnBtJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1R5cGV9IGVxICdkeW5hbWljJyApIHsKICAgICAgICAkRGlyZWN0b3J5IC49ICdLZXJuZWwvU3lzdGVtL1N0YXRzL0R5bmFtaWMvJyAuICRQYXJhbXtOYW1lfSAuICcucG0nOwogICAgfQoKICAgIHJldHVybiAxIGlmIC1yICREaXJlY3Rvcnk7CiAgICByZXR1cm4gMDsKfQoKc3ViIF9Xcml0ZVJlc3VsdENhY2hlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIGNhY2hlIHRoaXMgcmVzdWx0CiAgICAjIGdldCB0aGUgY3VycmVudCB0aW1lCiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKQogICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwgKTsKCiAgICAjIGlmIGdldCBwYXJhbXMgaW4gZnV0dXJlIGRvIG5vdCBjYWNoZQogICAgaWYgKCAkR2V0UGFyYW17WWVhcn0gJiYgJEdldFBhcmFte01vbnRofSApIHsKICAgICAgICByZXR1cm4gaWYgJEdldFBhcmFte1llYXJ9ID4gJFk7CiAgICAgICAgcmV0dXJuIGlmICRHZXRQYXJhbXtZZWFyfSA9PSAkWSAmJiAkR2V0UGFyYW17TW9udGh9ID4gJE07CiAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmICRHZXRQYXJhbXtZZWFyfSA9PSAkWQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte01vbnRofSA9PSAkTQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0RheX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtEYXl9ID49ICREOwogICAgfQoKICAgICMgd3JpdGUgY2FjaGUgZmlsZQogICAgbXkgJEZpbGVuYW1lID0gJFNlbGYtPl9DcmVhdGVTdGF0aWNSZXN1bHRDYWNoZUZpbGVuYW1lKAogICAgICAgIEdldFBhcmFtID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgU3RhdElEICAgPT4gJFBhcmFte1N0YXRJRH0sCiAgICApOwoKICAgICRTZWxmLT5fU2V0UmVzdWx0Q2FjaGUoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgICAgIFJlc3VsdCAgID0+ICRQYXJhbXtEYXRhfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiM9aXRlbSBfQ3JlYXRlU3RhdGljUmVzdWx0Q2FjaGVGaWxlbmFtZSgpCiMKI2NyZWF0ZSBhIGZpbGVuYW1lIG91dCBvZiB0aGUgR2V0UGFyYW0gaW5mb3JtYXRpb24gYW5kIHRoZSBzdGF0IGlkCiMKIyAgICBteSAkRmlsZW5hbWUgPSAkU3RhdHNPYmplY3QtPl9DcmVhdGVTdGF0aWNSZXN1bHRDYWNoZUZpbGVuYW1lKAojICAgICAgICBHZXRQYXJhbSA9PiB7CiMgICAgICAgICAgICBZZWFyICA9PiAyMDA4LAojICAgICAgICAgICAgTW9udGggPT4gMywKIyAgICAgICAgICAgIERheSAgID0+IDUKIyAgICAgICAgfSwKIyAgICAgICAgU3RhdElEICAgPT4gJFBhcmFte1N0YXRJRH0sCiMgICAgKTsKIwojPWN1dAoKc3ViIF9DcmVhdGVTdGF0aWNSZXN1bHRDYWNoZUZpbGVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZFBhcmFtIChxdyggU3RhdElEIEdldFBhcmFtICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZFBhcmFtfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIl9DcmVhdGVTdGF0aWNSZXN1bHRDYWNoZUZpbGVuYW1lOiBOZWVkICROZWVkZWRQYXJhbSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEdldFBhcmFtUmVmID0gJFBhcmFte0dldFBhcmFtfTsKCiAgICAjIGZvcm1hdCBtb250aCBhbmQgZGF5IHBhcmFtcwogICAgZm9yIChxdyhNb250aCBEYXkpKSB7CiAgICAgICAgaWYgKCAkR2V0UGFyYW1SZWYtPnskX30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbVJlZi0+eyRffSA9IHNwcmludGYoICIlMDJkIiwgJEdldFBhcmFtUmVmLT57JF99ICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRLZXkgPSAnJzsKICAgIGlmICggJEdldFBhcmFtUmVmLT57WWVhcn0gKSB7CiAgICAgICAgJEtleSAuPSAkR2V0UGFyYW1SZWYtPntZZWFyfTsKICAgIH0KICAgIGlmICggJEdldFBhcmFtUmVmLT57TW9udGh9ICkgewogICAgICAgICRLZXkgLj0gIi0kR2V0UGFyYW1SZWYtPntNb250aH0iOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW1SZWYtPntEYXl9ICkgewogICAgICAgICRLZXkgLj0gIi0kR2V0UGFyYW1SZWYtPntEYXl9IjsKICAgIH0KCiAgICBteSAkTUQ1S2V5ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICRLZXksCiAgICAgICAgVHlwZSAgICAgPT4gJ21kNScsCiAgICApOwoKICAgIHJldHVybiAnU3RhdHMnIC4gJFBhcmFte1N0YXRJRH0gLiAnLScgLiAkTUQ1S2V5IC4gJy5jYWNoZSc7Cn0KCiM9aXRlbSBfU2V0UmVzdWx0Q2FjaGUoKQojCiN3cml0ZSB0aGUgcmVzdWx0IGFycmF5IGFzIGNhY2hlIGluIHRoZSBmaWxlc3lzdGVtCiMKIyAgICAkU3RhdHNPYmplY3QtPl9TZXRSZXN1bHRDYWNoZSgKIyAgICAgICAgRmlsZW5hbWUgPT4gJ1N0YXRzJyAuICRQYXJhbXtTdGF0SUR9IC4gJy0nIC4gJE1ENUtleSAuICcuY2FjaGUnLAojICAgICAgICBSZXN1bHQgICA9PiAkUGFyYW17RGF0YX0sCiMgICAgKTsKIwojPWN1dAoKc3ViIF9TZXRSZXN1bHRDYWNoZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIG15ICROZWVkZWRQYXJhbSAocXcoIEZpbGVuYW1lIFJlc3VsdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZFBhcmFtfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIl9TZXRSZXN1bHRDYWNoZTogTmVlZCAkTmVlZGVkUGFyYW0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY29udmVydCB0aGUgcmVzdWx0IGFycmF5IGludG8gYSBjc3Ygc3RyaW5nCiAgICBteSAkQ1NWU3RyaW5nID0gJFNlbGYtPntDU1ZPYmplY3R9LT5BcnJheTJDU1YoIERhdGEgPT4gJFBhcmFte1Jlc3VsdH0sICk7CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dCggXCRDU1ZTdHJpbmcgKTsKCiAgICAjIHdyaXRlIHRoZSBjc3Ygc3RyaW5nIGludG8gdGhlIGZpbGVzeXN0ZW0KICAgIG15ICRGaWxlaGFuZGxlOwogICAgbXkgJFBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGVtcERpcicpOwogICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJz4nLCAiJFBhdGgvJFBhcmFte0ZpbGVuYW1lfSIgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB3cml0ZTogJFBhdGgvJFBhcmFte0ZpbGVuYW1lfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJpbm1vZGUgJEZpbGVoYW5kbGU7CiAgICBwcmludCAkRmlsZWhhbmRsZSAkQ1NWU3RyaW5nOwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgcmV0dXJuIDE7Cn0KCiM9aXRlbSBfR2V0UmVzdWx0Q2FjaGUoKQojCiNnZXQgdGhlIHJlc3VsdCBhcnJheSBjYWNoZSBvdXQgb2YgdGhlIGZpbGVzeXN0ZW0KIwojICAgIG15IEBSZXN1bHQgPSAkU3RhdHNPYmplY3QtPl9HZXRSZXN1bHRDYWNoZSgKIyAgICAgICAgRmlsZW5hbWUgPT4gJ1N0YXRzJyAuICRQYXJhbXtTdGF0SUR9IC4gJy0nIC4gJE1ENUtleSAuICcuY2FjaGUnLAojICAgICk7CiMKIz1jdXQKCnN1YiBfR2V0UmVzdWx0Q2FjaGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtGaWxlbmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdfR2V0UmVzdWx0Q2FjaGU6IE5lZWQgRmlsZW5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUGF0aCAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKICAgIG15ICRDU1ZTdHJpbmcgPSAnJzsKICAgIGlmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAiJFBhdGgvJFBhcmFte0ZpbGVuYW1lfSIgKSB7CiAgICAgICAgYmlubW9kZSAkRmlsZWhhbmRsZTsKICAgICAgICB3aGlsZSAoPCRGaWxlaGFuZGxlPikgewogICAgICAgICAgICAkQ1NWU3RyaW5nIC49ICRfOwogICAgICAgIH0KICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZSggXCRDU1ZTdHJpbmcgKTsKICAgIH0KCiAgICBteSAkUmVzdWx0UmVmID0gJFNlbGYtPntDU1ZPYmplY3R9LT5DU1YyQXJyYXkoCiAgICAgICAgU3RyaW5nICAgID0+ICRDU1ZTdHJpbmcsCiAgICAgICAgU2VwYXJhdG9yID0+ICc7JywKICAgICAgICBRdW90ZSAgICAgPT4gJyInLAogICAgKTsKCiAgICByZXR1cm4gQHskUmVzdWx0UmVmfTsKfQoKc3ViIF9EZWxldGVDYWNoZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKCiAgICBpZiAoICRQYXRoICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJFBhdGggLj0gJy8nOwogICAgfQoKICAgIG15IEBGaWxlcyA9IGdsb2IgJFBhdGggLiAnU3RhdHMnIC4gJFBhcmFte1N0YXRJRH0gLiAnLSouY2FjaGUnOwoKICAgIGZvciBteSAkRmlsZSAoQEZpbGVzKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEV4cG9ydCgpCgpnZXQgY29udGVudCBmcm9tIHN0YXRzIGZvciBleHBvcnQKCiAgICBteSAkRXhwb3J0RmlsZSA9ICRTdGF0c09iamVjdC0+RXhwb3J0KAogICAgICAgIFN0YXRJRCA9PiAnMTIzJywKICAgICAgICBFeHBvcnRTdGF0TnVtYmVyID0+IDEgfHwgMCwgIyBvcHRpb25hbCwgb25seSB1c2VmdWwgbW92ZSBzdGF0aXN0aWNzIGZyb20gdGhlIHRlc3Qgc3lzdGVtIHRvIHRoZSBwcm9kdWN0aXZlIHN5c3RlbQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRmlsZSA9ICgpOwoKICAgIGlmICggISRQYXJhbXtTdGF0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0OiBOZWVkIFN0YXRJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hHZXQoCiAgICAgICAgVHlwZSA9PiAnU3RhdHMnLAoKICAgICAgICAjQ2FjaGUgPT4gMCwKICAgICAgICBLZXkgPT4gJFBhcmFte1N0YXRJRH0KICAgICk7CgogICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPlN0cmluZ0FuZFRpbWVzdGFtcDJGaWxlbmFtZSgKICAgICAgICBTdHJpbmcgPT4gJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtUaXRsZX1bMV17Q29udGVudH0sCiAgICApOwogICAgJEZpbGV7RmlsZW5hbWV9IC49ICcueG1sJzsKCiAgICAjIHNldHRpbmdzIGZvciBzdGF0aWMgZmlsZXMKICAgIGlmICgKICAgICAgICAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde1N0YXRUeXBlfVsxXXtDb250ZW50fQogICAgICAgICYmICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17U3RhdFR5cGV9WzFde0NvbnRlbnR9IGVxICdzdGF0aWMnCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRGaWxlTG9jYXRpb24gPSAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde09iamVjdE1vZHVsZX1bMV17Q29udGVudH07CiAgICAgICAgJEZpbGVMb2NhdGlvbiA9fiBzezo6fXtcL314ZzsKICAgICAgICAkRmlsZUxvY2F0aW9uIC49ICcucG0nOwogICAgICAgIG15ICRGaWxlICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiLyRGaWxlTG9jYXRpb24iOwogICAgICAgIG15ICRGaWxlQ29udGVudCA9ICcnOwoKICAgICAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIG9yIGRpZSAiQ2FuJ3Qgb3BlbjogJEZpbGU6ICQhIjsKCiAgICAgICAgIyBzZXQgYmluIG1vZGUKICAgICAgICBiaW5tb2RlICRGaWxlaGFuZGxlOwogICAgICAgIHdoaWxlICg8JEZpbGVoYW5kbGU+KSB7CiAgICAgICAgICAgICRGaWxlQ29udGVudCAuPSAkXzsKICAgICAgICB9CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlKCBcJEZpbGVDb250ZW50ICk7CiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtGaWxlfQogICAgICAgICAgICA9ICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17Q29udGVudH07CiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtDb250ZW50fSAgICA9IGVuY29kZV9iYXNlNjQoICRGaWxlQ29udGVudCwgJycgKTsKICAgICAgICAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0xvY2F0aW9ufSAgID0gJEZpbGVMb2NhdGlvbjsKICAgICAgICAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde1Blcm1pc3Npb259ID0gJzY0NCc7CiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtFbmNvZGV9ICAgICA9ICdCYXNlNjQnOwogICAgfQoKICAgICMgZGVsZXRlIGNyZWF0ZSBhbmQgY2hhbmdlIGRhdGEKICAgIGRlbGV0ZSggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtDaGFuZ2VkfSApOwogICAgZGVsZXRlKCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0NoYW5nZWRCeX0gKTsKICAgIGRlbGV0ZSggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtDcmVhdGVkfSApOwogICAgZGVsZXRlKCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0NyZWF0ZWRCeX0gKTsKICAgIGRlbGV0ZSggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtTdGF0SUR9ICk7CiAgICBpZiAoICEkUGFyYW17RXhwb3J0U3RhdE51bWJlcn0gKSB7CiAgICAgICAgZGVsZXRlKCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde1N0YXROdW1iZXJ9ICk7CiAgICB9CgogICAgIyB3cmFwcGVyIHRvIGNoYW5nZSBpZHMgaW4gdXNlZCBzcGVsbGluZwogICAgIyB3cmFwIHBlcm1pc3Npb25zCiAgICBmb3IgbXkgJElEICggQHsgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtQZXJtaXNzaW9ufSB9ICkgewogICAgICAgIGlmICgkSUQpIHsKICAgICAgICAgICAgbXkgJUdyb3VwID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwR2V0KCBJRCA9PiAoICRJRC0+e0NvbnRlbnR9ICkgKTsKICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkR3JvdXB7TmFtZX07CiAgICAgICAgfQogICAgfQoKICAgICMgd3JhcCBvYmplY3QgZGVwZW5kZW5kIGlkcwogICAgaWYgKCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde09iamVjdH1bMV17Q29udGVudH0gKSB7CgogICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICBteSAkT2JqZWN0TW9kdWxlID0gJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3RNb2R1bGV9WzFde0NvbnRlbnR9OwogICAgICAgICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE9iamVjdE1vZHVsZSk7CiAgICAgICAgbXkgJFN0YXRPYmplY3QgPSAkT2JqZWN0TW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICMgbG9hZCBhdHRyaWJ1dGVzCiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXQogICAgICAgICAgICA9ICRTdGF0T2JqZWN0LT5FeHBvcnRXcmFwcGVyKCAleyAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFdIH0gKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgaGFzaCB0byBzdHJpbmcKICAgICRGaWxle0NvbnRlbnR9ID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoMlhNTChAWE1MSGFzaCk7CgogICAgcmV0dXJuIFwlRmlsZTsKfQoKPWl0ZW0gSW1wb3J0KCkKCmltcG9ydCBhIHN0YXRzIGZyb20geG1sIGZpbGUKCiAgICBteSAkU3RhdElEID0gJFN0YXRzT2JqZWN0LT5JbXBvcnQoCiAgICAgICAgQ29udGVudCA9PiAkVXBsb2FkU3R1ZmZ7Q29udGVudH0sCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTdGF0SUQgPSAxOwoKICAgIGlmICggISRQYXJhbXtDb250ZW50fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9ydDogTmVlZCBDb250ZW50ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKCBTdHJpbmcgPT4gJFBhcmFte0NvbnRlbnR9ICk7CgogICAgaWYgKCAhJFhNTEhhc2hbMF0gKSB7CiAgICAgICAgc2hpZnQgQFhNTEhhc2g7CiAgICB9CgogICAgIyBHZXQgbmV3IFN0YXRJRAogICAgbXkgQEtleXMgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hTZWFyY2goIFR5cGUgPT4gJ1N0YXRzJywgKTsKCiAgICAjIGNoZWNrIGlmIHRoZSByZXF1aXJlZCBlbGVtZW50cyBhcmUgYXZhaWxhYmxlCiAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgIHF3KCBEZXNjcmlwdGlvbiBGb3JtYXQgT2JqZWN0IE9iamVjdE1vZHVsZSBQZXJtaXNzaW9uIFN0YXRUeXBlIFN1bUNvbCBTdW1Sb3cgVGl0bGUgVmFsaWQpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggIWRlZmluZWQgJFhNTEhhc2hbMF17b3Ryc19zdGF0c31bMV17JEVsZW1lbnR9WzFde0NvbnRlbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIkltcG9ydDogQ2FuJ3QgaW1wb3J0IFN0YXQsIGJlY2F1c2UgdGhlIHJlcXVpcmVkIGVsZW1lbnQgJEVsZW1lbnQgaXMgbm90IGF2YWlsYWJsZSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpZi1jbGF1c2UgaWYgYSBzdGF0LXhtbCBpbmNsdWRlcyBhIFN0YXROdW1iZXIKICAgIGlmICggJFhNTEhhc2hbMF17b3Ryc19zdGF0c31bMV17U3RhdE51bWJlcn0gKSB7CiAgICAgICAgbXkgJFhNTFN0YXRzSUQgPSAkWE1MSGFzaFswXXtvdHJzX3N0YXRzfVsxXXtTdGF0TnVtYmVyfVsxXXtDb250ZW50fQogICAgICAgICAgICAtICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6U3RhdHNTdGFydE51bWJlciIpOwogICAgICAgIGZvciBteSAkS2V5IChAS2V5cykgewogICAgICAgICAgICBpZiAoICRLZXkgZXEgJFhNTFN0YXRzSUQgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkltcG9ydDogQ2FuJ3QgaW1wb3J0IFN0YXROdW1iZXIgJEtleSwgYmVjYXVzZSB0aGlzIFN0YXROdW1iZXIgaXMgYWxyZWFkeSB1c2VkISIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFN0YXRJRCA9ICRYTUxTdGF0c0lEOwogICAgfQoKICAgICMgaWYgbm8gc3RhdHMgbnVtYmVyIGF2YWlsYWJsZSB1c2UgdGhpcyBmdW5jdGlvbgogICAgZWxzZSB7CiAgICAgICAgbXkgQFNvcnRLZXlzID0gc29ydCB7ICRhIDw9PiAkYiB9IEBLZXlzOwogICAgICAgIGlmIChAU29ydEtleXMpIHsKICAgICAgICAgICAgJFN0YXRJRCA9ICRTb3J0S2V5c1stMV0gKyAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aW1lCiAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwoKICAgICMgbWV0YSB0YWdzCiAgICAkWE1MSGFzaFswXXtvdHJzX3N0YXRzfVsxXXtDcmVhdGVkfVsxXXtDb250ZW50fSAgID0gJFRpbWVTdGFtcDsKICAgICRYTUxIYXNoWzBde290cnNfc3RhdHN9WzFde0NyZWF0ZWRCeX1bMV17Q29udGVudH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAkWE1MSGFzaFswXXtvdHJzX3N0YXRzfVsxXXtDaGFuZ2VkfVsxXXtDb250ZW50fSAgID0gJFRpbWVTdGFtcDsKICAgICRYTUxIYXNoWzBde290cnNfc3RhdHN9WzFde0NoYW5nZWRCeX1bMV17Q29udGVudH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAkWE1MSGFzaFswXXtvdHJzX3N0YXRzfVsxXXtTdGF0TnVtYmVyfVsxXXtDb250ZW50fQogICAgICAgID0gJFN0YXRJRCArICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJTdGF0czo6U3RhdHNTdGFydE51bWJlciIpOwoKICAgIG15ICREeW5hbWljRmlsZXMgPSAkU2VsZi0+R2V0RHluYW1pY0ZpbGVzKCk7CgogICAgIyBCZWNhdXNlIHNvbWUgeG1sLXBhcnNlciBpbnNlcnQgXG4gaW5zdGVhZCBvZiA8ZXhhbXBsZT48ZXhhbXBsZT4KICAgIGlmICggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3R9WzFde0NvbnRlbnR9ICkgewogICAgICAgICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17T2JqZWN0fVsxXXtDb250ZW50fSA9fiBze1xufXt9eDsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3R9WzFde0NvbnRlbnR9CiAgICAgICAgJiYgISREeW5hbWljRmlsZXMtPnsgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3R9WzFde0NvbnRlbnR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJJbXBvcnQ6IE9iamVjdCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde09iamVjdH1bMV17Q29udGVudH0gZG9lc24ndCBleGlzdHMhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtTdGF0VHlwZX1bMV17Q29udGVudH0KICAgICAgICAmJiAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde1N0YXRUeXBlfVsxXXtDb250ZW50fSBlcSAnc3RhdGljJwogICAgICAgICkKICAgIHsKICAgICAgICBteSAkRmlsZUxvY2F0aW9uID0gJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3RNb2R1bGV9WzFde0NvbnRlbnR9OwogICAgICAgICRGaWxlTG9jYXRpb24gPX4gc3s6On17XC99Z3g7CiAgICAgICAgJEZpbGVMb2NhdGlvbiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnLycgLiAkRmlsZUxvY2F0aW9uIC4gJy5wbSc7CgogICAgICAgICMgd3JpdGUgZmlsZQogICAgICAgIGlmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4nLCAkRmlsZUxvY2F0aW9uICkgewogICAgICAgICAgICBwcmludCBTVERFUlIKICAgICAgICAgICAgICAgICJOb3RpY2U6IEluc3RhbGwgJEZpbGVMb2NhdGlvbiAoJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtQZXJtaXNzaW9ufSkhXG4iOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0VuY29kZX0KICAgICAgICAgICAgICAgICYmICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17RW5jb2RlfSBlcSAnQmFzZTY0JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgPSBkZWNvZGVfYmFzZTY0KCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0NvbnRlbnR9ICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dCgKICAgICAgICAgICAgICAgICAgICBcJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtDb250ZW50fQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYmluIG1vZGUKICAgICAgICAgICAgYmlubW9kZSAkRmlsZWhhbmRsZTsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGUgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtDb250ZW50fTsKICAgICAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgICAgICAgICAjIHNldCBwZXJtaXNzaW9uCiAgICAgICAgICAgIGlmICggbGVuZ3RoKCAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde1Blcm1pc3Npb259ICkgPT0gMyApIHsKICAgICAgICAgICAgICAgICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17UGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICA9ICIwJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtQZXJtaXNzaW9ufSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2htb2QoIG9jdCggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtQZXJtaXNzaW9ufSApLCAkRmlsZUxvY2F0aW9uICk7CiAgICAgICAgICAgICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtGaWxlfVsxXXtGaWxlfTsKICAgICAgICAgICAgZGVsZXRlICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17RmlsZX07CiAgICAgICAgICAgIGRlbGV0ZSAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0xvY2F0aW9ufTsKICAgICAgICAgICAgZGVsZXRlICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17RmlsZX1bMV17UGVybWlzc2lvbn07CiAgICAgICAgICAgIGRlbGV0ZSAkWE1MSGFzaFswXS0+e290cnNfc3RhdHN9WzFde0ZpbGV9WzFde0VuY29kZX07CiAgICAgICAgfQogICAgfQoKICAgICMgd3JhcHBlciB0byBjaGFuZ2UgdXNlZCBzcGVsbGluZyBpbiBpZHMKICAgICMgd3JhcCBwZXJtaXNzaW9ucwogICAgbXkgJUdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExpc3QoIFZhbGlkID0+IDEgKTsKCiAgICBOQU1FOgogICAgZm9yIG15ICROYW1lICggQHsgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtQZXJtaXNzaW9ufSB9ICkgewogICAgICAgIG5leHQgTkFNRSBpZiAhJE5hbWU7CgogICAgICAgIG15ICRGbGFnID0gMTsKICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJElEICgga2V5cyAlR3JvdXBzICkgewogICAgICAgICAgICBpZiAoICRHcm91cHN7JElEfSBlcSAkTmFtZS0+e0NvbnRlbnR9ICkgewogICAgICAgICAgICAgICAgJE5hbWUtPntDb250ZW50fSA9ICRJRDsKICAgICAgICAgICAgICAgICRGbGFnID0gMDsKICAgICAgICAgICAgICAgIGxhc3QgSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbXBvcnQ6IENhbicgZmluZCB0aGUgcGVybWlzc2lvbiAoZ3JvdXApICROYW1lLT57Q29udGVudH0hIgogICAgICAgICAgICApOwogICAgICAgICAgICAkTmFtZSA9IHVuZGVmOwogICAgICAgIH0KICAgIH0KCiAgICAjIHdyYXAgb2JqZWN0IGRlcGVuZGVuZCBpZHMKICAgIGlmICggJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXXtPYmplY3R9WzFde0NvbnRlbnR9ICkgewoKICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgbXkgJE9iamVjdE1vZHVsZSA9ICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV17T2JqZWN0TW9kdWxlfVsxXXtDb250ZW50fTsKICAgICAgICAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRPYmplY3RNb2R1bGUpOwogICAgICAgIG15ICRTdGF0T2JqZWN0ID0gJE9iamVjdE1vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAjIGxvYWQgYXR0cmlidXRlcwogICAgICAgICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c31bMV0KICAgICAgICAgICAgPSAkU3RhdE9iamVjdC0+SW1wb3J0V3JhcHBlciggJXsgJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfVsxXSB9ICk7CiAgICB9CgogICAgIyBuZXcKICAgIHJldHVybiAwIGlmICEkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiAgICAgICAgVHlwZSAgICA9PiAnU3RhdHMnLAogICAgICAgIEtleSAgICAgPT4gJFN0YXRJRCwKICAgICAgICBYTUxIYXNoID0+IFxAWE1MSGFzaCwKICAgICk7CgogICAgcmV0dXJuICRTdGF0SUQ7Cn0KCj1pdGVtIEdldFBhcmFtcygpCgogICAgZ2V0IGFsbCBlZGl0IHBhcmFtcyBmcm9tIHN0YXRzIGZvciB2aWV3CgogICAgbXkgJFBhcmFtcyA9ICRTdGF0c09iamVjdC0+R2V0UGFyYW1zKFN0YXRJRCA9PiAnMTIzJyk7Cgo9Y3V0CgpzdWIgR2V0UGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgpOwoKICAgIGlmICggISRQYXJhbXtTdGF0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiR2V0UGFyYW1zOiBOZWVkIFN0YXRJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN0YXQgPSAkU2VsZi0+U3RhdHNHZXQoIFN0YXRJRCA9PiAkUGFyYW17U3RhdElEfSApOwoKICAgICMgc3RhdGljCiAgICAjIGRvbid0IHJlbW92ZSB0aGlzIGlmIGNsYXVzZSwgYmVjYXVzZSBpcyByZXF1aXJlZCBmb3IgbWtTdGF0cy5wbAogICAgaWYgKCAkU3RhdC0+e1N0YXRUeXBlfSBlcSAnc3RhdGljJyApIHsKCiAgICAgICAgIyBsb2FkIHN0YXRpYyBtb2R1bAogICAgICAgIG15ICRPYmplY3RNb2R1bGUgPSAkU3RhdC0+e09iamVjdE1vZHVsZX07CiAgICAgICAgJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkT2JqZWN0TW9kdWxlKTsKICAgICAgICBteSAkU3RhdE9iamVjdCA9ICRPYmplY3RNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgQFBhcmFtcyA9ICRTdGF0T2JqZWN0LT5QYXJhbSgpOwogICAgfQogICAgcmV0dXJuIFxAUGFyYW1zOwp9Cgo9aXRlbSBTdGF0c1J1bigpCgogICAgcnVuIGEgc3RhdHMuLi4KCiAgICBteSAkU3RhdEFycmF5ID0gJFN0YXRzT2JqZWN0LT5TdGF0c1J1bigKICAgICAgICBTdGF0SUQgPT4gJzEyMycsCiAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIE5FRUQ6CiAgICBmb3IgbXkgJE5lZWQgKHF3KFN0YXRJRCBHZXRQYXJhbSkpIHsKICAgICAgICBuZXh0IE5FRUQgaWYgJFBhcmFteyROZWVkfTsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRzUnVuOiBOZWVkICROZWVkISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVzZSB0aGUgbWlycm9yIGRiIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpEU04nKSApIHsKICAgICAgICBteSAkRXh0cmFEYXRhYmFzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICBNYWluT2JqZWN0ICAgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRTZWxmLT57RW5jb2RlT2JqZWN0fSwKICAgICAgICAgICAgRGF0YWJhc2VEU04gID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6RFNOJyksCiAgICAgICAgICAgIERhdGFiYXNlVXNlciA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ29yZTo6TWlycm9yREI6OlVzZXInKSwKICAgICAgICAgICAgRGF0YWJhc2VQdyAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6UGFzc3dvcmQnKSwKICAgICAgICApOwogICAgICAgIGlmICggISRFeHRyYURhdGFiYXNlT2JqZWN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlcmUgaXMgbm8gTWlycm9EQiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEV4dHJhRGF0YWJhc2VPYmplY3Q7CiAgICB9CgogICAgbXkgJFN0YXQgICAgID0gJFNlbGYtPlN0YXRzR2V0KCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtHZXRQYXJhbX0gfTsKICAgIG15IEBSZXN1bHQgICA9ICgpOwoKICAgICMgZ2V0IGRhdGEgaWYgaXQgaXMgYSBzdGF0aWMgc3RhdHMKICAgIGlmICggJFN0YXQtPntTdGF0VHlwZX0gZXEgJ3N0YXRpYycgKSB7CiAgICAgICAgQFJlc3VsdCA9ICRTZWxmLT5fR2VuZXJhdGVTdGF0aWNTdGF0cygKICAgICAgICAgICAgT2JqZWN0TW9kdWxlID0+ICRTdGF0LT57T2JqZWN0TW9kdWxlfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkU3RhdC0+e1RpdGxlfSwKICAgICAgICAgICAgU3RhdElEICAgICAgID0+ICRTdGF0LT57U3RhdElEfSwKICAgICAgICAgICAgQ2FjaGUgICAgICAgID0+ICRTdGF0LT57Q2FjaGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGF0YSBpZiBpdCBpcyBhIGR5bmF5bWljIHN0YXRzCiAgICBlbHNpZiAoICRTdGF0LT57U3RhdFR5cGV9IGVxICdkeW5hbWljJyApIHsKICAgICAgICBAUmVzdWx0ID0gJFNlbGYtPl9HZW5lcmF0ZUR5bmFtaWNTdGF0cygKICAgICAgICAgICAgT2JqZWN0TW9kdWxlICAgICA9PiAkU3RhdC0+e09iamVjdE1vZHVsZX0sCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJFN0YXQtPntPYmplY3R9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+ICRHZXRQYXJhbXtVc2VBc1h2YWx1ZX0sCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gJEdldFBhcmFte1VzZUFzVmFsdWVTZXJpZXN9LAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+ICRHZXRQYXJhbXtVc2VBc1Jlc3RyaWN0aW9ufSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICA9PiAkU3RhdC0+e1RpdGxlfSwKICAgICAgICAgICAgU3RhdElEICAgICAgICAgICA9PiAkU3RhdC0+e1N0YXRJRH0sCiAgICAgICAgICAgIENhY2hlICAgICAgICAgICAgPT4gJFN0YXQtPntDYWNoZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHN1bSBpbiByb3cgb3IgY29sCiAgICBpZiAoICggJFN0YXQtPntTdW1Sb3d9IHx8ICRTdGF0LT57U3VtQ29sfSApICYmICRTdGF0LT57Rm9ybWF0fSAhfiBte15HRDo6R3JhcGhcLip9eCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlN1bUJ1aWxkKAogICAgICAgICAgICBBcnJheSAgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFN1bVJvdyA9PiAkU3RhdC0+e1N1bVJvd30sCiAgICAgICAgICAgIFN1bUNvbCA9PiAkU3RhdC0+e1N1bUNvbH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcQFJlc3VsdDsKfQoKPWl0ZW0gU3RyaW5nQW5kVGltZXN0YW1wMkZpbGVuYW1lKCkKCmJ1aWxkcyBhIGZpbGVuYW1lIHdpdGggYSBzdHJpbmcgYW5kIGEgdGltZXN0YW1wLgooc3BhY2Ugd2lsbCBiZSByZXBsYWNlZCB3aXRoIF8gYW5kIC0gZS5nLiBUaXRsZS1vZi1GaWxlXzIwMDYtMTItMzFfMTEtNTkpCgogICAgbXkgJEZpbGVuYW1lID0gJFN0YXRzT2JqZWN0LT5TdHJpbmdBbmRUaW1lc3RhbXAyRmlsZW5hbWUoU3RyaW5nID0+ICdUaXRsZScpOwoKPWN1dAoKc3ViIFN0cmluZ0FuZFRpbWVzdGFtcDJGaWxlbmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtTdHJpbmd9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU3RyaW5nQW5kVGltZXN0YW1wMkZpbGVuYW1lOiBOZWVkIFN0cmluZyEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CgogICAgJFBhcmFte1N0cmluZ30gPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgRmlsZW5hbWUgPT4gJFBhcmFte1N0cmluZ30sCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICBteSAkRmlsZW5hbWUgPSAkUGFyYW17U3RyaW5nfSAuICdfJyAuICIkWS0kTS0kRCIgLiAnXycgLiAiJGgtJG0iOwoKICAgIHJldHVybiAkRmlsZW5hbWU7Cn0KCnN1YiBfTW9udGhBcnJheSB7CiAgICBteSBATW9udGhBcnJheQogICAgICAgID0gKAogICAgICAgICcnLCAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnLAogICAgICAgICk7CgogICAgcmV0dXJuIFxATW9udGhBcnJheTsKfQoKPWl0ZW0gU3RhdE51bWJlcjJTdGF0SUQoKQoKaW5zZXJ0IHRoZSBzdGF0IG51bWJlciBnZXQgdGhlIHN0YXQgaWQKCiAgICBteSAkU3RhdElEID0gJFN0YXRzT2JqZWN0LT5TdGF0TnVtYmVyMlN0YXRJRCgKICAgICAgICBTdGF0TnVtYmVyID0+IDExMjEyCiAgICApOwoKPWN1dAoKc3ViIFN0YXROdW1iZXIyU3RhdElEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1N0YXROdW1iZXJ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU3RhdE51bWJlcjJTdGF0SUQ6IE5lZWQgU3RhdE51bWJlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBLZXkgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hTZWFyY2goCiAgICAgICAgVHlwZSA9PiAnU3RhdHMnLAogICAgICAgIFdoYXQgPT4gWyB7ICJbJV17J290cnNfc3RhdHMnfVslXXsnU3RhdE51bWJlcid9WyVdeydDb250ZW50J30iID0+ICRQYXJhbXtTdGF0TnVtYmVyfSwgfSwgXSwKICAgICk7CiAgICBpZiAoIEBLZXkgJiYgJCNLZXkgPCAxICkgewogICAgICAgIHJldHVybiAkS2V5WzBdOwogICAgfQoKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1N0YXROdW1iZXIgaW52YWxpZCEnLAogICAgKTsKICAgIHJldHVybiAwOwp9CgpzdWIgX0F1dG9tYXRpY1NhbXBsZUltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYW5ndWFnZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdExhbmd1YWdlJyk7CiAgICBteSAkRGlyZWN0b3J5ID0gJFNlbGYtPntTdGF0c1RlbXBEaXJ9OwoKICAgIGlmICggIW9wZW5kaXIoIERJUkUsICREaXJlY3RvcnkgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3Qgb3BlbiBEaXJlY3Rvcnk6ICREaXJlY3RvcnkiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgc3RhdHMgaW4gdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgYXZhaWxhYmxlLCBpZiBub3QgdXNlIGVuCiAgICBteSAkRmxhZyA9IDA7CiAgICB3aGlsZSAoIGRlZmluZWQoIG15ICRGaWxlbmFtZSA9IHJlYWRkaXIgRElSRSApICkgewogICAgICAgIGlmICggJEZpbGVuYW1lID1+IG17Xi4qXC4kTGFuZ3VhZ2VcLnhtbCR9eCApIHsKICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXdpbmRkaXIoRElSRSk7CiAgICBpZiAoICEkRmxhZyApIHsKICAgICAgICAkTGFuZ3VhZ2UgPSAnZW4nOwogICAgfQoKICAgIHdoaWxlICggZGVmaW5lZCggbXkgJEZpbGVuYW1lID0gcmVhZGRpciBESVJFICkgKSB7CiAgICAgICAgaWYgKCAkRmlsZW5hbWUgPX4gbXteLipcLiRMYW5ndWFnZVwueG1sJH14ICkgewoKICAgICAgICAgICAgIyBjaGVjayBmaWxlc2l6ZQogICAgICAgICAgICAjICAgICAgICAgICAgbXkgJEZpbGVzaXplID0gLXMgJERpcmVjdG9yeS4kRmlsZW5hbWU7CiAgICAgICAgICAgICMgICAgICAgICAgICBpZiAoJEZpbGVzaXplID4gJE1heEZpbGVzaXplKSB7CiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgcHJpbnQgIkZpbGU6ICRGaWxlbmFtZSB0byBiaWchIG1heC4gJE1heEZpbGVzaXplIGJ5dGUgYWxsb3dlZC5cbiI7CiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgJENvbW1vbk9iamVjdHtMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGZpbGUgaW1wb3J0ZWQ6ICREaXJlY3RvcnkuJEZpbGVuYW1lIiwKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAjICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICMgICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlYWQgZmlsZQogICAgICAgICAgICBteSAkRmlsZWhhbmRsZTsKICAgICAgICAgICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJzwnLCAkRGlyZWN0b3J5IC4gJEZpbGVuYW1lICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBvcGVuIEZpbGU6ICIgLiAkRGlyZWN0b3J5IC4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGNsb3NlZGlyKERJUkUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgICAgICB3aGlsZSAoPCRGaWxlaGFuZGxlPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgICAgICAgICBteSAkU3RhdElEID0gJFNlbGYtPkltcG9ydCggQ29udGVudCA9PiAkQ29udGVudCwgKTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZWRpcihESVJFKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU3RhdHNJbnN0YWxsKCkKCmluc3RhbGxzIHN0YXRzCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAnRkFRJywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0luc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgcHJlZml4CiAgICAkUGFyYW17RmlsZVByZWZpeH0gPSAkUGFyYW17RmlsZVByZWZpeH0gPyAkUGFyYW17RmlsZVByZWZpeH0gLiAnLScgOiAnJzsKCiAgICAjIHN0YXJ0IEF1dG9tYXRpY1NhbXBsZUltcG9ydCBpZiBubyBzdGF0cyBhcmUgaW5zdGFsbGVkCiAgICAkU2VsZi0+R2V0U3RhdHNMaXN0KCk7CgogICAgIyBjbGVhbnVwIHN0YXRzCiAgICAkU2VsZi0+U3RhdHNDbGVhblVwKCk7CgogICAgIyBnZXQgbGlzdCBvZiBzdGF0cyBmaWxlcwogICAgbXkgQFN0YXRzRmlsZUxpc3QgPSBnbG9iICRTZWxmLT57U3RhdHNUZW1wRGlyfSAuICRQYXJhbXtGaWxlUHJlZml4fSAuICcqLnhtbCc7CgogICAgIyBpbXBvcnQgdGhlIHN0YXRzCiAgICBteSAkSW5zdGFsbGVkUG9zdGZpeCA9ICcuaW5zdGFsbGVkJzsKICAgIEZJTEU6CiAgICBmb3IgbXkgJEZpbGUgKCBzb3J0IEBTdGF0c0ZpbGVMaXN0ICkgewoKICAgICAgICBuZXh0IEZJTEUgaWYgIS1mICRGaWxlOwogICAgICAgIG5leHQgRklMRSBpZiAtZSAkRmlsZSAuICRJbnN0YWxsZWRQb3N0Zml4OwoKICAgICAgICAjIHJlYWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJFhNTENvbnRlbnRSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEZpbGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBpbXBvcnQgc3RhdAogICAgICAgIG15ICRTdGF0SUQgPSAkU2VsZi0+SW1wb3J0KAogICAgICAgICAgICBDb250ZW50ID0+ICR7JFhNTENvbnRlbnRSZWZ9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRklMRSBpZiAhJFN0YXRJRDsKCiAgICAgICAgIyB3cml0ZSBpbnN0YWxsZWQgZmlsZSB3aXRoIHN0YXQgaWQKICAgICAgICAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlV3JpdGUoCiAgICAgICAgICAgIENvbnRlbnQgID0+IFwkU3RhdElELAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkRmlsZSAuICRJbnN0YWxsZWRQb3N0Zml4LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFN0YXRzVW5pbnN0YWxsKCkKCnVuaW5zdGFsbHMgc3RhdHMKCiAgICBteSAkUmVzdWx0ID0gJFN0YXRzT2JqZWN0LT5TdGF0c1VuaW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICdGQVEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwcmVwYXJlIHByZWZpeAogICAgJFBhcmFte0ZpbGVQcmVmaXh9ID0gJFBhcmFte0ZpbGVQcmVmaXh9ID8gJFBhcmFte0ZpbGVQcmVmaXh9IC4gJy0nIDogJyc7CgogICAgIyBnZXQgbGlzdCBvZiBpbnN0YWxsZWQgc3RhdHMgZmlsZXMKICAgIG15IEBTdGF0c0ZpbGVMaXN0ID0gZ2xvYiAkU2VsZi0+e1N0YXRzVGVtcERpcn0gLiAkUGFyYW17RmlsZVByZWZpeH0gLiAnKi54bWwuaW5zdGFsbGVkJzsKCiAgICAjIGRlbGV0ZSB0aGUgc3RhdHMKICAgIGZvciBteSAkRmlsZSAoIHNvcnQgQFN0YXRzRmlsZUxpc3QgKSB7CgogICAgICAgICMgcmVhZCBmaWxlIGNvbnRlbnQKICAgICAgICBteSAkU3RhdHNJRFJlZiA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkRmlsZSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBzdGF0cwogICAgICAgICRTZWxmLT5TdGF0c0RlbGV0ZSgKICAgICAgICAgICAgU3RhdElEID0+ICR7JFN0YXRzSURSZWZ9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjbGVhbnVwIHN0YXRzCiAgICAkU2VsZi0+U3RhdHNDbGVhblVwKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFN0YXRzQ2xlYW5VcCgpCgpyZW1vdmVkIHN0YXRzIHdpdGggbm90IGV4aXN0aW5nIGJhY2tlbmQgZmlsZQoKICAgIG15ICRSZXN1bHQgPSAkU3RhdHNPYmplY3QtPlN0YXRzQ2xlYW5VcCgpOwoKPWN1dAoKc3ViIFN0YXRzQ2xlYW5VcCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgc3RhdHMKICAgIG15ICRMaXN0UmVmID0gJFNlbGYtPkdldFN0YXRzTGlzdCgpOwoKICAgIHJldHVybiBpZiAhJExpc3RSZWY7CiAgICByZXR1cm4gaWYgcmVmICRMaXN0UmVmIG5lICdBUlJBWSc7CgogICAgU1RBVFNJRDoKICAgIGZvciBteSAkU3RhdHNJRCAoIEB7JExpc3RSZWZ9ICkgewoKICAgICAgICAjIGdldCBzdGF0cwogICAgICAgIG15ICRIYXNoUmVmID0gJFNlbGYtPlN0YXRzR2V0KAogICAgICAgICAgICBTdGF0SUQgICAgICAgICAgICAgPT4gJFN0YXRzSUQsCiAgICAgICAgICAgIE5vT2JqZWN0QXR0cmlidXRlcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVFNJRCBpZiAkSGFzaFJlZgogICAgICAgICAgICAgICAgJiYgcmVmICRIYXNoUmVmIGVxICdIQVNIJwogICAgICAgICAgICAgICAgJiYgJEhhc2hSZWYtPntPYmplY3RNb2R1bGV9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSGFzaFJlZi0+e09iamVjdE1vZHVsZX0gKTsKCiAgICAgICAgIyBkZWxldGUgc3RhdHMKICAgICAgICAkU2VsZi0+U3RhdHNEZWxldGUoIFN0YXRJRCA9PiAkU3RhdHNJRCApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojID1pdGVtIF9HZXRDYWNoZVN0cmluZygpCiMKIyByZXR1cm4gdGhlIGNhY2hlIHN0cmluZwojCiMgICAgIG15ICRSZXN1bHQgPSAkU3RhdHNPYmplY3QtPl9HZXRDYWNoZVN0cmluZygKIyAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gJFVzZUFzWHZhbHVlUmVmCiMgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+ICRVc2VBc1ZhbHVlU2VyaWVzUmVmLAojICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAkVXNlQXNSZXN0cmljdGlvblJlZiwKIyAgICAgKTsKIwojID1jdXQKCnN1YiBfR2V0Q2FjaGVTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDYWNoZVN0cmluZyA9ICcnOwoKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1h2YWx1ZSBVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24pKSB7CiAgICAgICAgVVNFUkVGOgogICAgICAgIGZvciBteSAkVXNlUmVmICggQHsgJFBhcmFteyRVc2V9IH0gKSB7CiAgICAgICAgICAgICRDYWNoZVN0cmluZyAuPSAnX18nIC4gJFVzZVJlZi0+e05hbWV9IC4gJ18nOwogICAgICAgICAgICBpZiAoICRVc2VSZWYtPntTZWxlY3RlZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAkQ2FjaGVTdHJpbmcgLj0gam9pbiggJ18nLCBzb3J0IEB7ICRVc2VSZWYtPntTZWxlY3RlZFZhbHVlc30gfSApCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVXNlUmVmLT57VGltZVN0YXJ0fSAmJiAkVXNlUmVmLT57VGltZVN0b3B9ICkgewogICAgICAgICAgICAgICAgJENhY2hlU3RyaW5nIC49ICRVc2VSZWYtPntUaW1lU3RhcnR9IC4gJy0nIC4gJFVzZVJlZi0+e1RpbWVTdG9wfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkTUQ1S2V5ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICRDYWNoZVN0cmluZywKICAgICAgICBUeXBlICAgICA9PiAnbWQ1JywKICAgICk7CgogICAgcmV0dXJuICRNRDVLZXk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAxMC8wMy8wMSAxMjoxNzoyMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVmlydHVhbEZTLnBtIC0gYWxsIHZpcnR1YWwgZnMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBWaXJ0dWFsRlMucG0sdiAxLjQgMjAxMC8wMi8wNCAxMzoxNzowNiB1YiBFeHAgJAojICRPbGRJZDogVmlydHVhbEZTLnBtLHYgMS40IDIwMTAvMDIvMDMgMTQ6NTE6MDMgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMgLSB2aXJ0dWFsIGZzIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdmlydHVhbCBmcyBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVmlydHVhbEZTT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICAkU2VsZi0+e0JhY2tlbmREZWZhdWx0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWaXJ0dWFsRlM6OkJhY2tlbmQnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTOjpEQic7CiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkU2VsZi0+e0JhY2tlbmREZWZhdWx0fSApICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgICRTZWxmLT57QmFja2VuZH0tPnsgJFNlbGYtPntCYWNrZW5kRGVmYXVsdH0gfSA9ICRTZWxmLT57QmFja2VuZERlZmF1bHR9LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJlYWQoKQoKcmVhZCBhIGZpbGUgZnJvbSB2aXJ0dWFsIGZpbGUgc3lzdGVtCgogICAgbXkgJUZpbGUgPSAkVmlydHVhbEZTT2JqZWN0LT5SZWFkKAogICAgICAgIEZpbGVuYW1lID0+ICcvc29tZS9uYW1lLnR4dCcsCiAgICAgICAgTW9kZSAgICAgPT4gJ3V0ZjgnLAoKICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgRGlzYWJsZVdhcm5pbmdzID0+IDEsCiAgICApOwoKcmV0dXJucwoKICAgIENvbnRlbnQgID0+ICRDb250ZW50U0NBTEFSLAoKICAgICMgcHJlZmVyZW5jZXMgZGF0YQogICAgUHJlZmVyZW5jZXMgPT4gewoKICAgICAgICAjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbHkKICAgICAgICBGaWxlc2l6ZSAgICAgICAgICAgPT4gJzEyLjQgS0J5dGVzJywKICAgICAgICBGaWxlc2l6ZVJhdyAgICAgICAgPT4gMTIzNDUsCgogICAgICAgICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50VHlwZSAgICAgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIENvbnRlbnRJRCAgICAgICAgICA9PiAnPHNvbWVfaWRAZXhhbXBsZS5jb20+JywKICAgICAgICBDb250ZW50QWx0ZXJuYXRpdmUgPT4gMSwKICAgICAgICBTb21lQ3VzdG9tUGFyYW1zICAgPT4gJ3dpdGggb3VyIG93biB2YWx1ZScsCiAgICB9LAoKPWN1dAoKc3ViIFJlYWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhGaWxlbmFtZSBNb2RlKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cAogICAgbXkgKCAkRmlsZUlELCAkQmFja2VuZEtleSwgJEJhY2tlbmQgKSA9ICRTZWxmLT5fRmlsZUxvb2t1cCggJFBhcmFte0ZpbGVuYW1lfSApOwogICAgaWYgKCAhJEJhY2tlbmRLZXkgKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0Rpc2FibGVXYXJuaW5nc30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGZpbGUgJyRQYXJhbXtGaWxlbmFtZX0nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzOwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBwcmVmZXJlbmNlc19rZXksIHByZWZlcmVuY2VzX3ZhbHVlIEZST00gJwogICAgICAgICAgICAuICd2aXJ0dWFsX2ZzX3ByZWZlcmVuY2VzIFdIRVJFIHZpcnR1YWxfZnNfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRGaWxlSUQgXSwKICAgICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQcmVmZXJlbmNlc3sgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZCAoaWYgbm90IGRlZmF1bHQpCiAgICBpZiAoICEkU2VsZi0+e0JhY2tlbmR9LT57JEJhY2tlbmR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkQmFja2VuZCk7CiAgICAgICAgJFNlbGYtPntCYWNrZW5kfS0+eyRCYWNrZW5kfSA9ICRCYWNrZW5kLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0JhY2tlbmR9LT57JEJhY2tlbmR9OwogICAgfQoKICAgICMgZ2V0IGZpbGUKICAgIG15ICRDb250ZW50ID0gJFNlbGYtPntCYWNrZW5kfS0+eyRCYWNrZW5kfS0+UmVhZCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQmFja2VuZEtleSA9PiAkQmFja2VuZEtleSwKICAgICk7CiAgICByZXR1cm4gaWYgISRDb250ZW50OwoKICAgIHJldHVybiAoCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gXCVQcmVmZXJlbmNlcywKICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICk7Cn0KCj1pdGVtIFdyaXRlKCkKCndyaXRlIGEgZmlsZSB0byB2aXJ0dWFsIGZpbGUgc3lzdGVtCgogICAgbXkgJFN1Y2Nlc3MgPSAkVmlydHVhbEZTT2JqZWN0LT5Xcml0ZSgKICAgICAgICBDb250ZW50ICA9PiBcJENvbnRlbnQsCiAgICAgICAgRmlsZW5hbWUgPT4gJ1NvbWVGaWxlTmFtZS50eHQnLAogICAgICAgIE1vZGUgICAgID0+ICdiaW5hcnknICAgICAgICAgICAgIyAoYmluYXJ5fHV0ZjgpCgogICAgICAgICMgb3B0aW9uYWwsIHByZWZlcmVuY2VzIGRhdGEKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIENvbnRlbnRJRCAgICAgICAgICA9PiAnPHNvbWVfaWRAZXhhbXBsZS5jb20+JywKICAgICAgICAgICAgQ29udGVudEFsdGVybmF0aXZlID0+IDEsCiAgICAgICAgICAgIFNvbWVDdXN0b21QYXJhbXMgICA9PiAnd2l0aCBvdXIgb3duIHZhbHVlJywKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBXcml0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEZpbGVuYW1lIENvbnRlbnQgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb29rdXAKICAgIG15ICgkRmlsZUlEKSA9ICRTZWxmLT5fRmlsZUxvb2t1cCggJFBhcmFte0ZpbGVuYW1lfSApOwogICAgaWYgKCRGaWxlSUQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpbGUgYWxyZWFkeSBleGlzdHMgJyRQYXJhbXtGaWxlbmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gdmlydHVhbF9mcyAoZmlsZW5hbWUsIGJhY2tlbmRfa2V5LCBiYWNrZW5kLCBjcmVhdGVfdGltZSknCiAgICAgICAgICAgIC4gJyBWQUxVRVMgKCA/LCBcJ1RNUFwnLCA/LCBjdXJyZW50X3RpbWVzdGFtcCknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0ZpbGVuYW1lfSwgXCRTZWxmLT57QmFja2VuZERlZmF1bHR9IF0sCiAgICApOwogICAgKCRGaWxlSUQpID0gJFNlbGYtPl9GaWxlTG9va3VwKCAkUGFyYW17RmlsZW5hbWV9ICk7CiAgICBpZiAoICEkRmlsZUlEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIHN0b3JlICckUGFyYW17RmlsZW5hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2l6ZSBjYWxjdWxhdGlvbgogICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+e0ZpbGVzaXplUmF3fSA9IGJ5dGVzOjpsZW5ndGgoICR7ICRQYXJhbXtDb250ZW50fSB9ICk7CiAgICBteSAkRmlsZXNpemUgPSAkUGFyYW17UHJlZmVyZW5jZXN9LT57RmlsZXNpemVSYXd9OwogICAgaWYgKCAkRmlsZXNpemUgPiAoIDEwMjQgKiAxMDI0ICkgKSB7CiAgICAgICAgJEZpbGVzaXplID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoICRGaWxlc2l6ZSAvICggMTAyNCAqIDEwMjQgKSApOwogICAgfQogICAgZWxzaWYgKCAkRmlsZXNpemUgPiAxMDI0ICkgewogICAgICAgICRGaWxlc2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCAkRmlsZXNpemUgLyAxMDI0ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRmlsZXNpemUgPSAkRmlsZXNpemUgLiAnIEJ5dGVzJzsKICAgIH0KICAgICRQYXJhbXtQcmVmZXJlbmNlc30tPntGaWxlc2l6ZX0gPSAkRmlsZXNpemU7CgogICAgIyBpbnNlcnQgcHJlZmVyZW5jZXMKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtQcmVmZXJlbmNlc30gfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyB2aXJ0dWFsX2ZzX3ByZWZlcmVuY2VzICcKICAgICAgICAgICAgICAgIC4gJyh2aXJ0dWFsX2ZzX2lkLCBwcmVmZXJlbmNlc19rZXksIHByZWZlcmVuY2VzX3ZhbHVlKSBWQUxVRVMgKCA/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEZpbGVJRCwgXCRLZXksIFwkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgZmlsZQogICAgbXkgJEJhY2tlbmRLZXkgPSAkU2VsZi0+e0JhY2tlbmR9LT57ICRTZWxmLT57QmFja2VuZERlZmF1bHR9IH0tPldyaXRlKCVQYXJhbSk7CiAgICByZXR1cm4gaWYgISRCYWNrZW5kS2V5OwoKICAgICMgdXBkYXRlIGJhY2tlbmQga2V5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSB2aXJ0dWFsX2ZzIFNFVCBiYWNrZW5kX2tleSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRCYWNrZW5kS2V5LCBcJEZpbGVJRCBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVsZXRlKCkKCmRlbGV0ZSBhIGZpbGUgZnJvbSB2aXJ0dWFsIGZpbGUgc3lzdGVtCgogICAgbXkgJFN1Y2Nlc3MgPSAkVmlydHVhbEZTT2JqZWN0LT5EZWxldGUoCiAgICAgICAgRmlsZW5hbWUgPT4gJ1NvbWVGaWxlTmFtZS50eHQnLAoKICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgRGlzYWJsZVdhcm5pbmdzID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEZpbGVuYW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cAogICAgbXkgKCAkRmlsZUlELCAkQmFja2VuZEtleSwgJEJhY2tlbmQgKSA9ICRTZWxmLT5fRmlsZUxvb2t1cCggJFBhcmFte0ZpbGVuYW1lfSApOwogICAgaWYgKCAhJEZpbGVJRCApIHsKICAgICAgICBpZiAoICEkUGFyYW17RGlzYWJsZVdhcm5pbmdzfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggZmlsZSAnJFBhcmFte0ZpbGVuYW1lfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kIChpZiBub3QgZGVmYXVsdCkKICAgIGlmICggISRTZWxmLT57QmFja2VuZH0tPnskQmFja2VuZH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRCYWNrZW5kKTsKICAgICAgICAkU2VsZi0+e0JhY2tlbmR9LT57JEJhY2tlbmR9ID0gJEJhY2tlbmQtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57QmFja2VuZH0tPnskQmFja2VuZH07CiAgICB9CgogICAgIyBkZWxldGUgcHJlZmVyZW5jZXMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHZpcnR1YWxfZnNfcHJlZmVyZW5jZXMgV0hFUkUgdmlydHVhbF9mc19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJEZpbGVJRCBdLAogICAgKTsKCiAgICAjIGRlbGV0ZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gdmlydHVhbF9mcyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJEZpbGVJRCBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBmaWxlCiAgICByZXR1cm4gJFNlbGYtPntCYWNrZW5kfS0+eyRCYWNrZW5kfS0+RGVsZXRlKAogICAgICAgICVQYXJhbSwKICAgICAgICBCYWNrZW5kS2V5ID0+ICRCYWNrZW5kS2V5LAogICAgKTsKfQojIC0tLQojIElUU00gQ2hhbmdlTWFuYWdlbWVudAojIC0tLQo9aXRlbSBTZWFyY2goKQoKU2VhcmNoIGZvciBmaWxlcyBpbiB2aXJ0dWFsIGZpbGUgc3lzdGVtLiBJbiBjb250cmFzdCB0byBGaW5kKCksIHlvdSBkbwpub3QgbmVlZCB0byBrbm93IHRoZSBmaWxlbmFtZS4gWW91IGNhbiBzZWFyY2ggZm9yIGZpbGVzIGJhc2VkIG9uIHZpcnR1YWwgZnMKcHJlZmVyZW5jZXMuIFRoZSBzZWFyY2ggaW4gdGhlIHByZWZlcmVuY2VzIGlzIGxvZ2ljYWxseSBPUiBjb25uZWN0ZWQuCgpTdHJpbmcgc2VhcmNoIHBhcmFtZXRlcnMgYXJlIHF1ZXJpZWQgd2l0aCB3aWxkY2FyZCBiZWhhdmlvci4KVGhlIGludGVnZXIgc2VhcmNoIHBhcmFtZXRlciwgdGhhdCB1cyBDPEZpbGVJRD4sIGhhcyBubyB3aWxkY2FyZCBiZWhhdmlvci4KClRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBJRCBhcyB0aGUga2V5IGFuZCB0aGUgZmlsZW5hbWUgaXMgdGhlIHZhbHVlLgoKICAgICMgc2VhcmNoIGZvciBhbGwgdGV4dC9wbGFpbiBmaWxlcwogICAgbXkgJUZpbGVzID0gJFZpcnR1YWxGU09iamVjdC0+U2VhcmNoKAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIH0KICAgICk7CgppcwoKICAxMjMgPT4gJy9zb21lL2ZpbGUudHh0JywKICAyMyAgPT4gJy9teS5wZGYnLAoKPWN1dAoKc3ViIFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXQgbGVhc3Qgb25lIGNyaXRlcmlhIG11c3QgYmUgZ2l2ZW4KICAgIGlmICggISBrZXlzICVQYXJhbSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0F0IGxlYXN0IG9uZSBzZWFyY2ggY3JpdGVyaW9uIG11c3QgYmUgZ2l2ZW4nLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFsbCB3aGVyZSBjb25kaXRpb25zCiAgICBteSBAV2hlcmU7CiAgICBteSBAQmluZDsKCiAgICAjIFdlIGhhdmUgdG8gam9pbiB0aGUgcHJlZmVyZW5jZXMgdGFibGUgd2hlbiB0aGUgc2VhcmNoIGlzCiAgICAjIGJhc2VkIG9uIGVudHJpZXMgaW4gcHJlZmVyZW5jZXMuCiAgICBteSAkSm9pbkNsYXVzZSA9ICcnOwogICAgbXkgJEdyb3VwQnlDbGF1c2UgPSAnJzsKICAgIGlmICggJFBhcmFte1ByZWZlcmVuY2VzfSApIHsKICAgICAgICAkSm9pbkNsYXVzZSAgICA9ICdJTk5FUiBKT0lOIHZpcnR1YWxfZnNfcHJlZmVyZW5jZXMgdmZwIE9OIHZmcC52aXJ0dWFsX2ZzX2lkID0gdmYuaWQgJzsKICAgICAgICAkR3JvdXBCeUNsYXVzZSA9ICdHUk9VUCBCWSB2Zi5pZCwgdmYuZmlsZW5hbWUnOwoKICAgICAgICAjIHB1c2ggc2VhcmNoIGNyaXRlcmlhIHRvIHdoZXJlIGNsYXVzZQogICAgICAgIG15IEBQcmVmZXJlbmNlc1doZXJlOwogICAgICAgIGZvciBteSAkQ29sdW1uICgga2V5cyAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH0gKSB7CiAgICAgICAgICAgIG15ICRMaWtlQ29sdW1uID0gJENvbHVtbjsKICAgICAgICAgICAgJExpa2VDb2x1bW4gPX4gcy9cKi8lL2c7CiAgICAgICAgICAgICRMaWtlQ29sdW1uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTGlrZUNvbHVtbiwgJ0xpa2UnICk7CgogICAgICAgICAgICBteSAkTGlrZVZhbHVlID0gJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRDb2x1bW59OwogICAgICAgICAgICAkTGlrZVZhbHVlID1+IHMvXCovJS9nOwogICAgICAgICAgICAkTGlrZVZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTGlrZVZhbHVlLCAnTGlrZScgKTsKCiAgICAgICAgICAgIHB1c2ggQFByZWZlcmVuY2VzV2hlcmUsCiAgICAgICAgICAgICAgICAiKCB2ZnAucHJlZmVyZW5jZXNfa2V5IExJS0UgJyRDb2x1bW4nIEFORCBwcmVmZXJlbmNlc192YWx1ZSBMSUtFICckTGlrZVZhbHVlJyApIjsKICAgICAgICB9CgogICAgICAgIG15ICRQcmVmZXJlbmNlc1doZXJlU3RyaW5nID0gam9pbiAnIE9SICcsIEBQcmVmZXJlbmNlc1doZXJlOwogICAgICAgIHB1c2ggQFdoZXJlLCAnICggJyAuICRQcmVmZXJlbmNlc1doZXJlU3RyaW5nIC4gJyApICc7CgogICAgICAgICMgZGVsZXRlIHByZWZlcmVuY2VzCiAgICAgICAgZGVsZXRlICRQYXJhbXtQcmVmZXJlbmNlc307CiAgICB9CgogICAgIyBtYXAgcGFyYW0ga2V5cyB0byBjb2x1bW4gbWFwcwogICAgbXkgJVN0cmluZ1BhcmFtMkNvbHVtbiA9ICgKICAgICAgICBGaWxlbmFtZSA9PiAnZmlsZW5hbWUnLAogICAgICAgIEJhY2tlbmQgID0+ICdiYWNrZW5kJywKICAgICk7CgogICAgbXkgJUludGVnZXJQYXJhbTJDb2x1bW4gPSAoCiAgICAgICAgRmlsZUlEICAgPT4gJ2lkJywKICAgICk7CgogICAgIyBwdXNoIGFsbCByZW1haW5pbmcgcGFyYW1ldGVycyB0byB3aGVyZSBjbGF1c2UKICAgIGZvciBteSAkQ29sdW1uICgga2V5cyAlUGFyYW0gKSB7CgogICAgICAgICMgU1FMIGZvciB0aGUgc3RyaW5nIHNlYXJjaCBwYXJhbWV0ZXJzCiAgICAgICAgaWYgKCAkU3RyaW5nUGFyYW0yQ29sdW1ueyRDb2x1bW59ICkgewogICAgICAgICAgICBteSAkTGlrZSA9ICRQYXJhbXskQ29sdW1ufTsKICAgICAgICAgICAgJExpa2UgPX4gcy9cKi8lL2c7CiAgICAgICAgICAgICRMaWtlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTGlrZSwgJ0xpa2UnICk7CgogICAgICAgICAgICBteSAkQ29sdW1uTmFtZSA9ICRTdHJpbmdQYXJhbTJDb2x1bW57JENvbHVtbn07CgogICAgICAgICAgICBwdXNoIEBXaGVyZSwgInZmLiRDb2x1bW5OYW1lIExJS0UgJyRMaWtlJyI7CiAgICAgICAgfQoKICAgICAgICAjIFNRTCBmb3IgdGhlIGludGVnZXIgc2VhcmNoIHBhcmFtZXRlcnMKICAgICAgICBlbHNpZiAoICRJbnRlZ2VyUGFyYW0yQ29sdW1ueyRDb2x1bW59ICkgewogICAgICAgICAgICBteSAkQ29sdW1uTmFtZSA9ICRJbnRlZ2VyUGFyYW0yQ29sdW1ueyRDb2x1bW59OwogICAgICAgICAgICBwdXNoIEBXaGVyZSwgInZmLiRDb2x1bW5OYW1lID0gPyI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JENvbHVtbn07CiAgICAgICAgfQoKICAgICAgICAjIGFsbCBvdGhlciBzZWFyY2ggcGFyYW1ldGVycyBhcmUgaWdub3JlZAogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICB9CiAgICB9CgogICAgIyBqb2luIHRoZSB3aGVyZSBjb25kaXRpb25zCiAgICBteSAkV2hlcmVDbGF1c2UgPSBqb2luICcgQU5EICcsIEBXaGVyZTsKCiAgICAjIGRvIHRoZSBzZWFyY2gKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgdmYuaWQsIHZmLmZpbGVuYW1lICcKICAgICAgICAgICAgLiAiRlJPTSB2aXJ0dWFsX2ZzIHZmICRKb2luQ2xhdXNlICIKICAgICAgICAgICAgLiAiV0hFUkUgJFdoZXJlQ2xhdXNlICRHcm91cEJ5Q2xhdXNlIiwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJUZpbGVzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRmlsZXN7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuICVGaWxlczsKfQojIC0tLQoKPWl0ZW0gRmluZCgpCgpmaW5kIGZpbGVzIGluIHZpcnR1YWwgZmlsZSBzeXN0ZW0KCiAgICBteSBATGlzdCA9ICRWaXJ0dWFsRlNPYmplY3QtPkZpbmQoCiAgICAgICAgRmlsZW5hbWUgPT4gJ3NvbWVfd2hhdC8qLnR4dCcsCiAgICApOwoKPWN1dAoKc3ViIEZpbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhGaWxlbmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHNlYXJjaAogICAgbXkgJExpa2UgPSAkUGFyYW17RmlsZW5hbWV9OwogICAgJExpa2UgPX4gcy9cKi8lL2c7CiAgICAkTGlrZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJExpa2UsICdMaWtlJyApOwoKICAgICMgc2VhcmNoCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGZpbGVuYW1lIEZST00gdmlydHVhbF9mcyBXSEVSRSBmaWxlbmFtZSBMSUtFICckTGlrZSciLAogICAgKTsKICAgIG15IEBMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBMaXN0LCAkUm93WzBdOwogICAgfQogICAgcmV0dXJuIEBMaXN0Owp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0ZpbGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJEZpbGVuYW1lICkgPSBAXzsKCiAgICAjIGxvb2t1cAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQsIGJhY2tlbmRfa2V5LCBiYWNrZW5kIEZST00gdmlydHVhbF9mcyBXSEVSRSBmaWxlbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJEZpbGVuYW1lIF0sCiAgICApOwogICAgbXkgJEZpbGVJRDsKICAgIG15ICRCYWNrZW5kS2V5OwogICAgbXkgJEJhY2tlbmQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRGaWxlSUQgICAgID0gJFJvd1swXTsKICAgICAgICAkQmFja2VuZEtleSA9ICRSb3dbMV07CiAgICAgICAgJEJhY2tlbmQgICAgPSAkUm93WzJdOwogICAgfQogICAgcmV0dXJuICggJEZpbGVJRCwgJEJhY2tlbmRLZXksICRCYWNrZW5kICk7Cn0KCj1lbmQgSW50ZXJuYWw6Cgo9Y3V0CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMTAvMDIvMDQgMTM6MTc6MDYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVmlydHVhbEZTL0RCLnBtIC0gYWxsIHZpcnR1YWwgZnMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEQi5wbSx2IDEuMSAyMDA5LzEyLzE0IDE0OjI3OjQzIHJlYiBFeHAgJAojICRPbGRJZDogREIucG0sdiAxLjIgMjAwOS8xMi8xMCAxMTo1OTo1NCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUzo6REI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBNSU1FOjpCYXNlNjQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjb25maWcgKG5vdCB1c2VkIHJpZ2h0IG5vdykKICAgICRTZWxmLT57Q29tcHJlc3N9ID0gMDsKICAgICRTZWxmLT57Q3J5cHR9ICAgID0gMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSZWFkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQmFja2VuZEtleSBNb2RlKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9ICRTZWxmLT5fQmFja2VuZEtleVBhcnNlKCVQYXJhbSk7CgogICAgbXkgJEVuY29kZSA9IDE7CiAgICBpZiAoIGxjICRQYXJhbXtNb2RlfSBlcSAnYmluYXJ5JyApIHsKICAgICAgICAkRW5jb2RlID0gMDsKICAgIH0KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgID0+ICdTRUxFQ1QgY29udGVudCBGUk9NIHZpcnR1YWxfZnNfZGIgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICAgPT4gWyBcJEF0dHJpYnV0ZXMtPntGaWxlSUR9IF0sCiAgICAgICAgRW5jb2RlID0+IFskRW5jb2RlXSwKICAgICk7CiAgICBteSAkQ29udGVudDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBlLiBnLiBhIHBvc3RncmVzcWwgYmFja2VuZCEhIQogICAgICAgIGlmICggISRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykgKSB7CiAgICAgICAgICAgICRDb250ZW50ID0gZGVjb2RlX2Jhc2U2NCggJFJvd1swXSApOwogICAgICAgICAgICBpZiAoJEVuY29kZSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGUoIFwkQ29udGVudCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29udGVudCA9ICRSb3dbMF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlmICEkQ29udGVudDsKCiAgICAjIHVuY29tcHJlc3MgKGluIGNhc2UpCiAgICBpZiAoICRBdHRyaWJ1dGVzLT57Q29tcHJlc3N9ICkgewoKICAgICAgICAjICRDb250ZW50ID0gLi4uCiAgICB9CgogICAgIyBkZWNyeXB0IChpbiBjYXNlKQogICAgaWYgKCAkQXR0cmlidXRlcy0+e0NyeXB0fSApIHsKCiAgICAgICAgIyAkQ29udGVudCA9IC4uLgogICAgfQoKICAgIHJldHVybiBcJENvbnRlbnQ7Cn0KCnN1YiBXcml0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KENvbnRlbnQgRmlsZW5hbWUgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEV4aXN0cyA9ICRTZWxmLT5fRmlsZUxvb2t1cCggJFBhcmFte0ZpbGVuYW1lfSApOwogICAgcmV0dXJuIGlmICRFeGlzdHM7CgogICAgIyBjb21wcmVzcyAoaW4gY2FzZSkKICAgIGlmICggJFNlbGYtPntDb21wcmVzc30gKSB7CgogICAgICAgICMgJFBhcmFte0NvbnRlbnR9ID0gLi4uCiAgICB9CgogICAgIyBjcnlwdCAoaW4gY2FzZSkKICAgIGlmICggJFNlbGYtPntDcnlwdH0gKSB7CgogICAgICAgICMgJFBhcmFte0NvbnRlbnR9ID0gLi4uCiAgICB9CgogICAgIyBlbmNvZGUgYXR0YWNobWVudCBpZiBpdCdzIGEgcG9zdGdyZXNxbCBiYWNrZW5kISEhCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+R2V0RGF0YWJhc2VGdW5jdGlvbignRGlyZWN0QmxvYicpICkgewogICAgICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlT3V0cHV0KCAkUGFyYW17Q29udGVudH0gKTsKICAgICAgICBteSAkQ29udGVudCA9IGVuY29kZV9iYXNlNjQoICR7ICRQYXJhbXtDb250ZW50fSB9ICk7CiAgICAgICAgJFBhcmFte0NvbnRlbnR9ID0gXCRDb250ZW50OwogICAgfQoKICAgIG15ICRFbmNvZGUgPSAxOwogICAgaWYgKCBsYyAkUGFyYW17TW9kZX0gZXEgJ2JpbmFyeScgKSB7CiAgICAgICAgJEVuY29kZSA9IDA7CiAgICB9CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHZpcnR1YWxfZnNfZGIgKGZpbGVuYW1lLCBjb250ZW50LCBjcmVhdGVfdGltZSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCApJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtGaWxlbmFtZX0sICRQYXJhbXtDb250ZW50fSBdLAogICAgKTsKCiAgICBteSAkRmlsZUlEID0gJFNlbGYtPl9GaWxlTG9va3VwKCAkUGFyYW17RmlsZW5hbWV9ICk7CiAgICByZXR1cm4gaWYgISRGaWxlSUQ7CgogICAgbXkgJEJhY2tlbmRLZXkgPSAkU2VsZi0+X0JhY2tlbmRLZXlHZW5lcmF0ZSgKICAgICAgICBGaWxlSUQgICA9PiAkRmlsZUlELAogICAgICAgIENvbXByZXNzID0+ICRTZWxmLT57Q29tcHJlc3N9LAogICAgICAgIENyeXB0ICAgID0+ICRTZWxmLT57Q3J5cHR9LAogICAgICAgIE1vZGUgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICBWZXJzaW9uICA9PiAkVkVSU0lPTiwKICAgICk7CgogICAgcmV0dXJuICRCYWNrZW5kS2V5Owp9CgpzdWIgRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQmFja2VuZEtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkU2VsZi0+X0JhY2tlbmRLZXlQYXJzZSglUGFyYW0pOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHZpcnR1YWxfZnNfZGIgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRBdHRyaWJ1dGVzLT57RmlsZUlEfSBdLAogICAgKTsKICAgIHJldHVybiAxOwp9CgpzdWIgX0ZpbGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJEZpbGVuYW1lICkgPSBAXzsKCiAgICAjIGxvb2t1cAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSB2aXJ0dWFsX2ZzX2RiIFdIRVJFIGZpbGVuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkRmlsZW5hbWUgXSwKICAgICk7CiAgICBteSAkRmlsZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRmlsZUlEID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkRmlsZUlEOwp9CgpzdWIgX0JhY2tlbmRLZXlHZW5lcmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRCYWNrZW5kS2V5ID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJEJhY2tlbmRLZXkgLj0gIiRLZXk9JFBhcmFteyRLZXl9OyI7CiAgICB9CiAgICByZXR1cm4gJEJhY2tlbmRLZXk7Cn0KCnN1YiBfQmFja2VuZEtleVBhcnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQmFja2VuZEtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUF0dHJpYnV0ZXM7CiAgICBteSBAUGFpcnMgPSBzcGxpdCAvOy8sICRQYXJhbXtCYWNrZW5kS2V5fTsKICAgIGZvciBteSAkUGFpciAoQFBhaXJzKSB7CiAgICAgICAgbXkgKCAkS2V5LCAkVmFsdWUgKSA9IHNwbGl0IC89LywgJFBhaXI7CiAgICAgICAgJEF0dHJpYnV0ZXN7JEtleX0gPSAkVmFsdWU7CiAgICB9CiAgICByZXR1cm4gXCVBdHRyaWJ1dGVzOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVmlydHVhbEZTL0ZTLnBtIC0gYWxsIHZpcnR1YWwgZnMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGUy5wbSx2IDEuMSAyMDA5LzEyLzE0IDE0OjI3OjQzIHJlYiBFeHAgJAojICRPbGRJZDogRlMucG0sdiAxLjIgMjAwOS8xMi8xMCAxMTo1OTo1NCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUzo6RlM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBGaWxlOjpQYXRoOwp1c2UgRmlsZTo6QmFzZW5hbWU7CgojIHRvIGdldCBpdCB3cml0YWJsZSBmb3IgdGhlIG90cnMgZ3JvdXAgKGp1c3QgaW4gY2FzZSkKdW1hc2sgMDAyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZGlyCiAgICAkU2VsZi0+e0RhdGFEaXJ9ICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL3ZpcnR1YWxmcyc7CiAgICAkU2VsZi0+e1Blcm1pc3Npb259ID0gJzY2NCc7CgogICAgIyBjaGVjayBmcyB3cml0ZSBwZXJtaXNzaW9ucyEKICAgIG15ICRQYXRoID0gIiRTZWxmLT57RGF0YURpcn0vY2hlY2tfcGVybWlzc2lvbnMuJCQiOwogICAgaWYgKCAtZCAkUGF0aCApIHsKICAgICAgICBGaWxlOjpQYXRoOjpybXRyZWUoIFskUGF0aF0gKSB8fCBkaWUgIkNhbid0IHJlbW92ZSAkUGF0aDogJCFcbiI7CiAgICB9CiAgICBpZiAoIG1rZGlyKCAiJFNlbGYtPntEYXRhRGlyfS9jaGVja19wZXJtaXNzaW9uc18kJCIsIDAyMiApICkgewogICAgICAgIGlmICggIXJtZGlyKCIkU2VsZi0+e0RhdGFEaXJ9L2NoZWNrX3Blcm1pc3Npb25zXyQkIikgKSB7CiAgICAgICAgICAgIGRpZSAiQ2FuJ3QgcmVtb3ZlICRTZWxmLT57RGF0YURpcn0vY2hlY2tfcGVybWlzc2lvbnNfJCQ6ICQhXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoIEZpbGU6OlBhdGg6Om1rcGF0aCggWyRQYXRoXSwgMCwgMDc3NSApICkgewogICAgICAgICAgICBGaWxlOjpQYXRoOjpybXRyZWUoIFskUGF0aF0gKSB8fCBkaWUgIkNhbid0IHJlbW92ZSAkUGF0aDogJCFcbiI7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRhdGEgZGlyCiAgICBpZiAoICEtZCAkU2VsZi0+e0RhdGFEaXJ9ICkgewogICAgICAgIG1rZGlyICRTZWxmLT57RGF0YURpcn0gfHwgZGllICQhOwogICAgfQoKICAgICMgY29uZmlnIChub3QgdXNlZCByaWdodCBub3cpCiAgICAkU2VsZi0+e0NvbXByZXNzfSA9IDA7CiAgICAkU2VsZi0+e0NyeXB0fSAgICA9IDA7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUmVhZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEJhY2tlbmRLZXkgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkU2VsZi0+X0JhY2tlbmRLZXlQYXJzZSglUGFyYW0pOwoKICAgIG15ICRDb250ZW50ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRTZWxmLT57RGF0YURpcn0gLiAkQXR0cmlidXRlcy0+e0RhdGFEaXJ9LAogICAgICAgIEZpbGVuYW1lICA9PiAkQXR0cmlidXRlcy0+e0ZpbGVuYW1lfSwKICAgICAgICBNb2RlICAgICAgPT4gJFBhcmFte01vZGV9LAogICAgKTsKCiAgICAjIHVuY29tcHJlc3MgKGluIGNhc2UpCiAgICBpZiAoICRBdHRyaWJ1dGVzLT57Q29tcHJlc3N9ICkgewoKICAgICAgICAjICRDb250ZW50ID0gLi4uCiAgICB9CgogICAgIyBkZWNyeXB0IChpbiBjYXNlKQogICAgaWYgKCAkQXR0cmlidXRlcy0+e0NyeXB0fSApIHsKCiAgICAgICAgIyAkQ29udGVudCA9IC4uLgogICAgfQoKICAgIHJldHVybiBpZiAhJENvbnRlbnQ7CiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCnN1YiBXcml0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KENvbnRlbnQgRmlsZW5hbWUgTW9kZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjb21wcmVzcyAoaW4gY2FzZSkKICAgIGlmICggJFNlbGYtPntDb21wcmVzc30gKSB7CgogICAgICAgICMgJFBhcmFte0NvbnRlbnR9ID0gLi4uCiAgICB9CgogICAgIyBjcnlwdCAoaW4gY2FzZSkKICAgIGlmICggJFNlbGYtPntDcnlwdH0gKSB7CgogICAgICAgICMgJFBhcmFte0NvbnRlbnR9ID0gLi4uCiAgICB9CgogICAgbXkgJE1ENSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVuYW1lQ2xlYW5VcCgKICAgICAgICBGaWxlbmFtZSA9PiAkUGFyYW17RmlsZW5hbWV9LAogICAgICAgIFR5cGUgICAgID0+ICdNRDUnLAogICAgKTsKCiAgICBteSAkRGF0YURpciA9ICcnOwogICAgbXkgQERpcnMgPSAkU2VsZi0+X1NwbGl0RGlyKCBGaWxlbmFtZSA9PiAkTUQ1ICk7CiAgICBmb3IgbXkgJERpciAoQERpcnMpIHsKICAgICAgICAkRGF0YURpciAuPSAnLycgLiAkRGlyOwogICAgICAgIG5leHQgaWYgLWUgJFNlbGYtPntEYXRhRGlyfSAuICREYXRhRGlyOwogICAgICAgIG5leHQgaWYgbWtkaXIgJFNlbGYtPntEYXRhRGlyfSAuICREYXRhRGlyOwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlICRTZWxmLT57RGF0YURpcn0kRGF0YURpcjogJCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd3JpdGUgYXJ0aWNsZSB0byBmcwogICAgbXkgJEZpbGVuYW1lID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVdyaXRlKAogICAgICAgIERpcmVjdG9yeSAgPT4gJFNlbGYtPntEYXRhRGlyfSAuICREYXRhRGlyLAogICAgICAgIEZpbGVuYW1lICAgPT4gJE1ENSwKICAgICAgICBNb2RlICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICBDb250ZW50ICAgID0+ICRQYXJhbXtDb250ZW50fSwKICAgICAgICBQZXJtaXNzaW9uID0+ICRTZWxmLT57UGVybWlzc2lvbn0sCiAgICApOwogICAgcmV0dXJuIGlmICEkRmlsZW5hbWU7CgogICAgbXkgJEJhY2tlbmRLZXkgPSAkU2VsZi0+X0JhY2tlbmRLZXlHZW5lcmF0ZSgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgRGF0YURpciAgPT4gJERhdGFEaXIsCiAgICAgICAgQ29tcHJlc3MgPT4gJFNlbGYtPntDb21wcmVzc30sCiAgICAgICAgQ3J5cHQgICAgPT4gJFNlbGYtPntDcnlwdH0sCiAgICAgICAgTW9kZSAgICAgPT4gJFBhcmFte01vZGV9LAogICAgICAgIFZlcnNpb24gID0+ICRWRVJTSU9OLAogICAgKTsKCiAgICByZXR1cm4gJEJhY2tlbmRLZXk7Cn0KCnN1YiBEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhCYWNrZW5kS2V5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9ICRTZWxmLT5fQmFja2VuZEtleVBhcnNlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVEZWxldGUoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRTZWxmLT57RGF0YURpcn0gLiAkQXR0cmlidXRlcy0+e0RhdGFEaXJ9LAogICAgICAgIEZpbGVuYW1lICA9PiAkQXR0cmlidXRlcy0+e0ZpbGVuYW1lfSwKICAgICk7Cn0KCnN1YiBfQmFja2VuZEtleUdlbmVyYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEJhY2tlbmRLZXkgPSAnJzsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkQmFja2VuZEtleSAuPSAiJEtleT0kUGFyYW17JEtleX07IjsKICAgIH0KICAgIHJldHVybiAkQmFja2VuZEtleTsKfQoKc3ViIF9CYWNrZW5kS2V5UGFyc2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhCYWNrZW5kS2V5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQXR0cmlidXRlczsKICAgIG15IEBQYWlycyA9IHNwbGl0IC87LywgJFBhcmFte0JhY2tlbmRLZXl9OwogICAgZm9yIG15ICRQYWlyIChAUGFpcnMpIHsKICAgICAgICBteSAoICRLZXksICRWYWx1ZSApID0gc3BsaXQgLz0vLCAkUGFpcjsKICAgICAgICAkQXR0cmlidXRlc3skS2V5fSA9ICRWYWx1ZTsKICAgIH0KICAgIHJldHVybiBcJUF0dHJpYnV0ZXM7Cn0KCnN1YiBfU3BsaXREaXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhGaWxlbmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQERpcjsKICAgICREaXJbMF0gPSBzdWJzdHIgJFBhcmFte0ZpbGVuYW1lfSwgMCwgMjsKICAgICREaXJbMV0gPSBzdWJzdHIgJFBhcmFte0ZpbGVuYW1lfSwgMiwgMjsKICAgIHJldHVybiAoICREaXJbMF0sICREaXJbMV0gKTsKfQoKMTsK
IyAtLQojIEN1c3RvbWVyVXNlclNlcnZpY2UudCAtIEN1c3RvbWVyVXNlclNlcnZpY2UgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEN1c3RvbWVyVXNlclNlcnZpY2UudCx2IDEuMyAyMDA5LzA2LzMwIDE0OjU1OjAyIHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclVzZXJTZXJ2aWNlLnQsdiAxLjUgMjAwOS8wMi8xNiAxMjo0MToxMiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwoKJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CgojIHNhdmUgYWxsIG9yaWdpbmFsIGRlZmF1bHQgc2VydmljZXMKbXkgQE9yaWdpbmFsRGVmYXVsdFNlcnZpY2VzID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKIyBkZWxldGUgYWxsIGRlZmF1bHQgc2VydmljZXMKZm9yIG15ICRTZXJ2aWNlSUQgKEBPcmlnaW5hbERlZmF1bHRTZXJ2aWNlcykgewogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cn0KCiMgYWRkIHNlcnZpY2UxCm15ICRTZXJ2aWNlUmFuZDEgPSAnU29tZVNlcnZpY2UnIC4gaW50KCByYW5kKDEwMDAwMDApICk7Cm15ICRTZXJ2aWNlSUQxICAgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICA9PiAkU2VydmljZVJhbmQxLAogICAgQ29tbWVudCA9PiAnU29tZSBDb21tZW50JywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlSUQxLAogICAgJ1NlcnZpY2VBZGQxKCknLAopOwoKIyBhZGQgc2VydmljZTIKbXkgJFNlcnZpY2VSYW5kMiA9ICdTb21lU2VydmljZScgLiBpbnQoIHJhbmQoMTAwMDAwMCkgKTsKbXkgJFNlcnZpY2VJRDIgICA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICRTZXJ2aWNlUmFuZDIsCiAgICBDb21tZW50ID0+ICdTb21lIENvbW1lbnQnLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KKTsKCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRDIsCiAgICAnU2VydmljZUFkZDIoKScsCik7CgpteSAkQ3VzdG9tZXJVc2VyMSA9ICdTb21lVXNlcicgLiBpbnQoIHJhbmQoMTAwMDAwMCkgKTsKbXkgJEN1c3RvbWVyVXNlcjIgPSAnU29tZVVzZXInIC4gaW50KCByYW5kKDEwMDAwMDApICk7CgojIGFsbG9jYXRpb24gdGVzdCAxCm15IEBBbGxvY2F0aW9uMSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAogICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjEsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMgpteSBAQWxsb2NhdGlvbjIgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjIsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QyKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMwpteSBAQWxsb2NhdGlvbjMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb24zLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MygpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDQKbXkgQEFsbG9jYXRpb240ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb240LAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NCgpJywKKTsKCiMgc2V0IGFsbG9jYXRpb24gMQokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgNQpteSBAQWxsb2NhdGlvbjUgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb241LAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDYKbXkgQEFsbG9jYXRpb242ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjZDb3VudCA9IEBBbGxvY2F0aW9uNjsKbXkgJEFsbG9jYXRpb242T2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uNkNvdW50IGVxIDEgJiYgJEFsbG9jYXRpb242WzBdIGVxICRTZXJ2aWNlSUQxICkgewogICAgJEFsbG9jYXRpb242T2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uNk9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NigpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDcKbXkgQEFsbG9jYXRpb243ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uNywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDcoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCA4Cm15IEBBbGxvY2F0aW9uOCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb244Q291bnQgPSBAQWxsb2NhdGlvbjg7Cm15ICRBbGxvY2F0aW9uOE9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjhDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uOFswXSBlcSAkU2VydmljZUlEMSApIHsKICAgICRBbGxvY2F0aW9uOE9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjhPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDgoKScsCik7CgojIHNldCBhbGxvY2F0aW9uIDIKJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRDIsCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDkKbXkgQEFsbG9jYXRpb245ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKbXkgJEFsbG9jYXRpb245Q291bnQgPSBAQWxsb2NhdGlvbjk7Cm15ICRBbGxvY2F0aW9uOU9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjlDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uOVswXSBlcSAkU2VydmljZUlEMiApIHsKICAgICRBbGxvY2F0aW9uOU9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjlPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDkoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxMApteSBAQWxsb2NhdGlvbjEwID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjEwQ291bnQgPSBAQWxsb2NhdGlvbjEwOwpteSAkQWxsb2NhdGlvbjEwT2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uMTBDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uMTBbMF0gZXEgJFNlcnZpY2VJRDIgKSB7CiAgICAkQWxsb2NhdGlvbjEwT2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uMTBPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDEwKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMTEKbXkgQEFsbG9jYXRpb24xMSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAogICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjExLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTEoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxMgpteSBAQWxsb2NhdGlvbjEyID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjEyQ291bnQgPSBAQWxsb2NhdGlvbjEyOwpteSAkQWxsb2NhdGlvbjEyT2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uMTJDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uMTJbMF0gZXEgJFNlcnZpY2VJRDEgKSB7CiAgICAkQWxsb2NhdGlvbjEyT2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uMTJPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDEyKCknLAopOwoKIyBzZXQgYWxsb2NhdGlvbiAzCiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQyLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxMwpteSBAQWxsb2NhdGlvbjEzID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKbXkgJEFsbG9jYXRpb24xM0NvdW50ID0gQEFsbG9jYXRpb24xMzsKbXkgJEFsbG9jYXRpb24xM09rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjEzQ291bnQgZXEgMSAmJiAkQWxsb2NhdGlvbjEzWzBdIGVxICRTZXJ2aWNlSUQyICkgewogICAgJEFsbG9jYXRpb24xM09rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjEzT2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxMygpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDE0Cm15IEBBbGxvY2F0aW9uMTQgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uMTRDb3VudCA9IEBBbGxvY2F0aW9uMTQ7Cm15ICRBbGxvY2F0aW9uMTRPayAgICA9IDA7CmlmICggJEFsbG9jYXRpb24xNENvdW50IGVxIDEgJiYgJEFsbG9jYXRpb24xNFswXSBlcSAkU2VydmljZUlEMiApIHsKICAgICRBbGxvY2F0aW9uMTRPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xNE9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTQoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxNQpteSBAQWxsb2NhdGlvbjE1ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKbXkgJEFsbG9jYXRpb24xNUNvdW50ID0gQEFsbG9jYXRpb24xNTsKbXkgJEFsbG9jYXRpb24xNU9rICAgID0gMDsKaWYgKAogICAgJEFsbG9jYXRpb24xNUNvdW50IGVxIDIgJiYgKAogICAgICAgICggJEFsbG9jYXRpb24xNVswXSBlcSAkU2VydmljZUlEMSAmJiAkQWxsb2NhdGlvbjE1WzFdIGVxICRTZXJ2aWNlSUQyICkgfHwKICAgICAgICAoICRBbGxvY2F0aW9uMTVbMF0gZXEgJFNlcnZpY2VJRDIgJiYgJEFsbG9jYXRpb24xNVsxXSBlcSAkU2VydmljZUlEMSApCiAgICApCiAgICApCnsKICAgICRBbGxvY2F0aW9uMTVPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xNU9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTUoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxNgpteSBAQWxsb2NhdGlvbjE2ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjE2Q291bnQgPSBAQWxsb2NhdGlvbjE2OwpteSAkQWxsb2NhdGlvbjE2T2sgICAgPSAwOwppZiAoCiAgICAkQWxsb2NhdGlvbjE2Q291bnQgZXEgMiAmJiAoCiAgICAgICAgKCAkQWxsb2NhdGlvbjE2WzBdIGVxICRTZXJ2aWNlSUQxICYmICRBbGxvY2F0aW9uMTZbMV0gZXEgJFNlcnZpY2VJRDIgKSB8fAogICAgICAgICggJEFsbG9jYXRpb24xNlswXSBlcSAkU2VydmljZUlEMiAmJiAkQWxsb2NhdGlvbjE2WzFdIGVxICRTZXJ2aWNlSUQxICkKICAgICkKICAgICkKewogICAgJEFsbG9jYXRpb24xNk9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjE2T2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxNigpJywKKTsKCiMgZGVsZXRlIGFsbCB0ZXN0IGFsbG9jYXRpb25zIHRvIGNsZWFuIHN5c3RlbQokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMiwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMiwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMiwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDAsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyByZXN0b3JlIGFsbCBvcmlnaW5hbCBkZWZhdWx0IHNlcnZpY2VzCmZvciBteSAkU2VydmljZUlEIChAT3JpZ2luYWxEZWZhdWx0U2VydmljZXMpIHsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwp9CgojIHNldCBzZXJ2aWNlMSBpbnZhbGlkCm15ICRTZXJ2aWNlVXBkYXRlMSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VVcGRhdGUoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRDEsCiAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VSYW5kMSwKICAgIFZhbGlkSUQgICA9PiAyLAogICAgVXNlcklEICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQopOwoKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZVVwZGF0ZTEsCiAgICAnU2VydmljZVVwZGF0ZTEoKScsCik7CgojIHNldCBzZXJ2aWNlMiBpbnZhbGlkCm15ICRTZXJ2aWNlVXBkYXRlMiA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VVcGRhdGUoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRDIsCiAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VSYW5kMiwKICAgIFZhbGlkSUQgICA9PiAyLAogICAgVXNlcklEICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQopOwoKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZVVwZGF0ZTIsCiAgICAnU2VydmljZVVwZGF0ZTIoKScsCik7CgoxOwo=
IyAtLQojIElUU01DSVBBbGxvY2F0ZS50IC0gY3JpdGljYWxpdHksIGltcGFjdCBwcmlvcml0eSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNJUEFsbG9jYXRlLnQsdiAxLjkgMjAxMC8wMi8xOCAxNDozMzozNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwoKJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoICV7JFNlbGZ9ICk7CgojIGdldCBjdXJyZW50IGFsbG9jYXRpb24gbGlzdCAoVXNlcklEIGlzIG5lZWRlZCkKbXkgJEFsbG9jYXRlRGF0YTEgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KCk7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKCAkQWxsb2NhdGVEYXRhMSwgJ0FsbG9jYXRlTGlzdCgpJyApOwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QKbXkgJEFsbG9jYXRlRGF0YTIgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPlRydWUoICRBbGxvY2F0ZURhdGEyLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJEhhc2hPSyA9IDE7CmlmICggcmVmICRBbGxvY2F0ZURhdGEyIG5lICdIQVNIJyApIHsKICAgICRIYXNoT0sgPSAwOwp9CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIDJkIGhhc2gKaWYgKCRIYXNoT0spIHsKCiAgICBJTVBBQ1RJRDoKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7JEFsbG9jYXRlRGF0YTJ9ICkgewoKICAgICAgICBpZiAoIHJlZiAkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkSGFzaE9LID0gMDsKICAgICAgICAgICAgbGFzdCBJTVBBQ1RJRDsKICAgICAgICB9CgogICAgICAgIENSSVRJQ0FMSVRZSUQ6CiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eUlEICgga2V5cyAleyAkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0gfSApIHsKCiAgICAgICAgICAgIGlmICggISRDcml0aWNhbGl0eUlEIHx8ICEkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAkSGFzaE9LID0gMDsKICAgICAgICAgICAgICAgIGxhc3QgSU1QQUNUSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2hlY2sgSGFzaE9LCiRTZWxmLT5UcnVlKCAkSGFzaE9LLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGNhbGwgUHJpb3JpdHlBbGxvY2F0aW9uR2V0KCkgZm9yIG9uZSBDcml0aWNhbGl0eS9JbXBhY3QgcGFpcgppZiAoJEhhc2hPSykgewoKICAgIG15ICgkSW1wYWN0SUQpID0ga2V5cyAleyRBbGxvY2F0ZURhdGEyfTsKCiAgICBpZiAoICRBbGxvY2F0ZURhdGEyLT57JEltcGFjdElEfSApIHsKICAgICAgICBteSAoJENyaXRpY2FsaXR5SUQpID0ga2V5cyAleyAkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0gfTsKCiAgICAgICAgbXkgJEV4cGVjdGVkUHJpb3JpdHlJRCA9ICRBbGxvY2F0ZURhdGEyLT57JEltcGFjdElEfS0+eyRDcml0aWNhbGl0eUlEfTsKICAgICAgICBteSAkUHJpb3JpdHlJRCAgICAgICAgID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkQ3JpdGljYWxpdHlJRCwKICAgICAgICAgICAgSW1wYWN0SUQgICAgICA9PiAkSW1wYWN0SUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRQcmlvcml0eUlELAogICAgICAgICAgICAkRXhwZWN0ZWRQcmlvcml0eUlELAogICAgICAgICAgICAnUHJpb3JpdHlBbGxvY2F0aW9uR2V0KCknLAogICAgICAgICk7CiAgICB9Cn0KCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJFN1Y2Nlc3MxID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKCAkU3VjY2VzczEsICdBbGxvY2F0ZVVwZGF0ZSgpJyApOwoKIyB1cGRhdGUgdGhlIGFsbG9jYXRpb24gaGFzaCAobm90IGFsbCBuZWVkZWQgYXJndW1lbnRzIGdpdmVuKQpteSAkU3VjY2VzczIgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVVcGRhdGUoCiAgICBBbGxvY2F0ZURhdGEgPT4gJEFsbG9jYXRlRGF0YTIsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKCAkU3VjY2VzczIsICdBbGxvY2F0ZVVwZGF0ZSgpJyApOwoKIyB1cGRhdGUgdGhlIGFsbG9jYXRpb24gaGFzaCAoYWxsb2NhdGlvbiBoYXNoKQpteSAkU3VjY2VzczMgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVVcGRhdGUoCiAgICBBbGxvY2F0ZURhdGEgPT4gewogICAgICAgIFRlc3QgID0+ICdhYWEnLAogICAgICAgIFRlc3QyID0+ICdiYmInLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSggJFN1Y2Nlc3MzLCAnQWxsb2NhdGVVcGRhdGUoKScgKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJFN1Y2Nlc3M0ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgQWxsb2NhdGVEYXRhID0+ICRBbGxvY2F0ZURhdGEyLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPlRydWUoICRTdWNjZXNzNCwgJ0FsbG9jYXRlVXBkYXRlKCknICk7CgoxOwo=
IyAtLQojIFNlcnZpY2UudCAtIFNlcnZpY2UgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNlcnZpY2UudCx2IDEuMiAyMDA5LzA2LzMwIDE0OjU1OjQ3IHViIEV4cCAkCiMgJE9sZElkOiBTZXJ2aWNlLnQsdiAxLjEwIDIwMDkvMDIvMTYgMTI6NDA6MjMgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgdXNlcnMKbXkgQFVzZXJJRHM7CnsKCiAgICAjIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgogICAgbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpIHx8IDE7CiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdTZXJ2aWNlJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LVNlcnZpY2UtJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1TZXJ2aWNlLScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gc2VydmljZSBuYW1lcwpteSBAU2VydmljZU5hbWU7CmZvciBteSAkQ291bnRlciAoIDEgLi4gMTEgKSB7CiAgICBwdXNoIEBTZXJ2aWNlTmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBnZXQgb3JpZ2luYWwgc2VydmljZSBsaXN0IGZvciBsYXRlciBjaGVja3MKbXkgJVNlcnZpY2VMaXN0T3JpZ2luYWwgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyBzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICMgdGhpcyBzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIFR5cGVJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkU2VydmljZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpcyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU2VydmljZU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpcyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICBUeXBlSUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlcnZpY2VOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAojIC0tLQoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICdUZXN0Q29tbWVudDInLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMywKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdENvbW1lbnQyJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAyLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChzZXJ2aWNlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiA0LAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDUsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiA0LAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDUsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2VydmljZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICdUZXN0Q29tbWVudDJVUERBVEUzJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUzJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnOjpVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICc6OlRlc3Q6OlVQREFURTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzJdIC4gJzo6VGVzdCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnOjpUZXN0JyAuICRTZXJ2aWNlTmFtZVsyXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsyXSAuICc6OlRlc3Q6OlRlc3QnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzJdIC4gJ1Rlc3Q6OicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFNlcnZpY2VOYW1lWzNdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAyLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbM10sCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbM10sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFNlcnZpY2VOYW1lWzNdIC4gIiBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbM10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzNdIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54nLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqknLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnINGgINGkIFRlc3RDb21tZW50NSDPoCDOqSBVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPniBVUERBVEUxJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqSBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBbdGVzdF0lKlxcJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICdbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1t0ZXN0XSUqXFwgJyAuICRTZXJ2aWNlTmFtZVs4XSAuICcgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICdbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1c2VkIGZvciB0aGUgZm9sbG93aW5nIHRlc3RzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzVdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzVdLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzVdLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAocGFyZW50IHNlcnZpY2UgY2hlY2spCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJ0xBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzVdIC4gJzo6JyAuICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHBhcmVudCBzZXJ2aWNlIGNoZWNrKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAiIFxuIFx0ICIgLiAkU2VydmljZU5hbWVbN10gLiAiIFxuIFx0ICIsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVs1XSAuICc6OicgLiAkU2VydmljZU5hbWVbNl0gLiAnOjonIC4gJFNlcnZpY2VOYW1lWzddLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzddLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChwYXJlbnQgc2VydmljZSBpZCBhbmQgcGFyZW50IGlkIGFyZSBpZGVudGljYWwpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJ0xBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs3XSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKG1vdmUgc2VydmljZSB0byB0aGUgaGlnaGVyc3QgbGV2ZWwpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs3XSAuICcgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVs3XSAuICcgVVBEQVRFMScsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChtb3ZlIHNlcnZpY2UgYmFjayB3aXRoIHRoZSBvbGQgcGFyZW50IHNlcnZpY2UpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJ0xBU1RMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURSgyKScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFNlcnZpY2VOYW1lWzVdIC4gJzo6JwogICAgICAgICAgICAgICAgLiAkU2VydmljZU5hbWVbNl0gLiAnOjonCiAgICAgICAgICAgICAgICAuICRTZXJ2aWNlTmFtZVs3XQogICAgICAgICAgICAgICAgLiAnIFVQREFURSgyKScsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURSgyKScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKbXkgJExhc3RBZGRlZFNlcnZpY2VJRDsKbXkgJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQ7Cm15ICRBZGRlZENvdW50ZXIgPSAwOwoKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewoKICAgIGlmICggJEl0ZW0tPntBZGR9ICkgewoKICAgICAgICAjIHByZXBhcmUgcGFyZW50IGlkCiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9IGVxICdMQVNUQURESUQnICkgewogICAgICAgICAgICAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gPSAkTGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RMQVNUQURESUQnICkgewogICAgICAgICAgICAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gPSAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBuZXcgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAleyAkSXRlbS0+e0FkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2Ugd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9IGVxICdMQVNUQURESUQnICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9ID0gJExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57QWRkR2V0fS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e0FkZEdldH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RMQVNUQURESUQnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9ID0gJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VBZGQoKSAtIFNlcnZpY2VJRDogJFNlcnZpY2VJRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlcnZpY2VJRCkgewoKICAgICAgICAgICAgICAgICMgbG9va3VwIHNlcnZpY2UgbmFtZQogICAgICAgICAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsb29rdXAgdGVzdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRoZSBzZXJ2aWNlIGlkCiAgICAgICAgICAgICAgICBteSAkU2VydmljZUlETmV3ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0ZXN0CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFNlcnZpY2VJRE5ldyB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkU2VydmljZUlEICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBzZXJ2aWNlIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRCA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkU2VydmljZUlEICAgICA9ICRTZXJ2aWNlSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGNvdW50ZXIKICAgICAgICAgICAgICAgICRBZGRlZENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VBZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2VydmljZQogICAgICAgIG15ICVTZXJ2aWNlR2V0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgc2VydmljZSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBzZXJ2aWNlCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNlcnZpY2VHZXR7JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUdldCgpIC0gJFNlcnZpY2VBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IHNlcnZpY2UgaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkU2VydmljZUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBTRVJWSUNFIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gZXEgJ0xBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEl0ZW0tPntVcGRhdGV9LT57UGFyZW50SUR9ICYmICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSBlcSAnTEFTVExBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSA9ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGVsZXRlICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzZXJ2aWNlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJExhc3RBZGRlZFNlcnZpY2VJRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2Ugd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlVXBkYXRlKCkgLSBTZXJ2aWNlSUQ6ICRMYXN0QWRkZWRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgcGFyZW50IGlkCiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9IGVxICdMQVNUQURESUQnICkgewogICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0gPSAkTGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfQogICAgICAgICAgICAmJiAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RMQVNUQURESUQnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfSA9ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICVTZXJ2aWNlR2V0MiA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkTGFzdEFkZGVkU2VydmljZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNlcnZpY2UgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFNlcnZpY2VBdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VydmljZUdldDJ7JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUdldCgpIC0gJFNlcnZpY2VBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBsb29rdXAgc2VydmljZSBuYW1lCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlR2V0MntTZXJ2aWNlSUR9LAogICAgICAgICk7CgogICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgJFNlcnZpY2VHZXQye05hbWV9IHx8ICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGhlIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlETmV3ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkU2VydmljZU5hbWUgfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0ZXN0CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VydmljZUlETmV3IHx8ICcnLAogICAgICAgICAgICAkU2VydmljZUdldDJ7U2VydmljZUlEfSB8fCAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUxvb2t1cCgpIC0gcmV2ZXJzZSBsb29rdXAiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgU2VydmljZUxpc3QgdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVTZXJ2aWNlTGlzdDEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7Cm15ICVTZXJ2aWNlTGlzdDFPcmcgPSAlU2VydmljZUxpc3RPcmlnaW5hbDsKClNFUlZJQ0VJRDoKZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlTGlzdDFPcmcgKSB7CgogICAgaWYgKCAkU2VydmljZUxpc3QxeyRTZXJ2aWNlSUR9ICYmICRTZXJ2aWNlTGlzdDFPcmd7JFNlcnZpY2VJRH0gZXEgJFNlcnZpY2VMaXN0MXskU2VydmljZUlEfSApIHsKICAgICAgICBkZWxldGUgJFNlcnZpY2VMaXN0MXskU2VydmljZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZXJ2aWNlTGlzdDF7RHVtbXl9ID0gMTsKICAgIH0KfQoKbXkgJFNlcnZpY2VMaXN0MUNvdW50ID0gc2NhbGFyIGtleXMgJVNlcnZpY2VMaXN0MTsKCiRTZWxmLT5JcygKICAgICRTZXJ2aWNlTGlzdDFDb3VudCB8fCAnJywKICAgICRBZGRlZENvdW50ZXIgICAgICB8fCAnJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VMaXN0IHRlc3QgMiAoY2hlY2sgY2FjaGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVTZXJ2aWNlTGlzdDIgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7CgpteSAkU2VydmljZUxpc3QyU2VydmljZUlEID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUFkZCgKICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzldLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KKTsKCm15ICVTZXJ2aWNlTGlzdDJiID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKU0VSVklDRUlEOgpmb3IgbXkgJFNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VMaXN0MiApIHsKCiAgICBpZiAoICRTZXJ2aWNlTGlzdDJieyRTZXJ2aWNlSUR9ICYmICRTZXJ2aWNlTGlzdDJ7JFNlcnZpY2VJRH0gZXEgJFNlcnZpY2VMaXN0MmJ7JFNlcnZpY2VJRH0gKSB7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdDJieyRTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlcnZpY2VMaXN0MmJ7RHVtbXl9ID0gMTsKICAgIH0KfQoKbXkgQFNlcnZpY2VMaXN0MklEcyAgID0ga2V5cyAlU2VydmljZUxpc3QyYjsKbXkgJFNlcnZpY2VMaXN0MkNvdW50ID0gc2NhbGFyIEBTZXJ2aWNlTGlzdDJJRHM7CgokU2VsZi0+SXMoCiAgICAkU2VydmljZUxpc3QyQ291bnQgfHwgJycsCiAgICAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUxpc3QoKSAtIGNoZWNrIG51bWJlciBvZiBzZXJ2aWNlcyIsCik7CgokU2VsZi0+SXMoCiAgICAkU2VydmljZUxpc3QySURzWzBdIHx8ICcnLAogICAgJFNlcnZpY2VMaXN0MlNlcnZpY2VJRCB8fCAnJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMaXN0KCkgLSBjaGVjayBpZCBvZiBsYXN0IHNlcnZpY2UiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VTZWFyY2ggdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBTZXJ2aWNlU2VhcmNoMVNlYXJjaCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VTZWFyY2goCiAgICBVc2VySUQgPT4gMSwKKTsKCm15ICVTZXJ2aWNlU2VhcmNoMUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKU0VSVklDRUlEOgpmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VTZWFyY2gxU2VhcmNoKSB7CgogICAgaWYgKCAkU2VydmljZVNlYXJjaDFMaXN0eyRTZXJ2aWNlSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU2VydmljZVNlYXJjaDFMaXN0eyRTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlcnZpY2VTZWFyY2gxTGlzdHtEdW1teX0gPSAxOwogICAgfQp9CgpteSAkU2VydmljZVNlYXJjaDFDb3VudCA9IHNjYWxhciBrZXlzICVTZXJ2aWNlU2VhcmNoMUxpc3Q7CgokU2VsZi0+SXMoCiAgICAkU2VydmljZVNlYXJjaDFDb3VudCwKICAgIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlU2VhcmNoKCkiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGFkZCBzb21lIG5lZWRlZCBzZXJ2aWNlcyBmb3IgbGF0ZXIgdGVzdHMKbXkgQFNlcnZpY2VOYW1lcyA9ICggJFNlcnZpY2VOYW1lWzEwXSAuICdOb3JtYWwnLCAkU2VydmljZU5hbWVbMTBdIC4gJ9SIINO0IM+qIM++JyApOwpteSAlU2VydmljZVNlYXJjaDJTZXJ2aWNlSUQ7CgpteSAkQ291bnRlcjEgPSAwOwpmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZU5hbWVzKSB7CgogICAgJFNlcnZpY2VTZWFyY2gyU2VydmljZUlEeyRDb3VudGVyMX0gPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICApOwoKICAgICRDb3VudGVyMSsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgU2VydmljZVNlYXJjaCB0ZXN0IDIgKGdlbmVyYWwgbmFtZSBjaGVja3MpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDb3VudGVyMiA9IDA7CmZvciBteSAkU2VydmljZU5hbWUgKEBTZXJ2aWNlTmFtZXMpIHsKCiAgICBteSBAUHJlcGFyZWROYW1lcyA9ICgKICAgICAgICAkU2VydmljZU5hbWUsCiAgICAgICAgJyonIC4gJFNlcnZpY2VOYW1lLAogICAgICAgICRTZXJ2aWNlTmFtZSAuICcqJywKICAgICAgICAnKicgLiAkU2VydmljZU5hbWUgLiAnKicsCiAgICAgICAgJyoqJyAuICRTZXJ2aWNlTmFtZSwKICAgICAgICAkU2VydmljZU5hbWUgLiAnKionLAogICAgICAgICcqKicgLiAkU2VydmljZU5hbWUgLiAnKionLAogICAgKTsKCiAgICBmb3IgbXkgJFByZXBhcmVkTmFtZSAoQFByZXBhcmVkTmFtZXMpIHsKCiAgICAgICAgbXkgQFNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVNlYXJjaCgKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VydmljZUxpc3RbMF0gfHwgJycsCiAgICAgICAgICAgICRTZXJ2aWNlU2VhcmNoMlNlcnZpY2VJRHskQ291bnRlcjJ9IHx8ICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlU2VhcmNoKCkgLSBnZW5lcmFsIG5hbWUgY2hlY2siLAogICAgICAgICk7CgogICAgICAgICRUZXN0Q291bnQrKzsKICAgIH0KCiAgICAkQ291bnRlcjIrKzsKfQoKMTsK
IyAtLQojIFNMQS50IC0gU0xBIHRlc3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTTEEudCx2IDEuMyAyMDA5LzA2LzMwIDE0OjU1OjIzIHViIEV4cCAkCiMgJE9sZElkOiBTTEEudCx2IDEuMTAgMjAwOS8wMi8xNiAxMjo0MToxMiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTTEE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1NMQU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgdXNlcnMKbXkgQFVzZXJJRHM7CnsKCiAgICAjIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgogICAgbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpIHx8IDE7CiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdTTEEnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtU0xBLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtU0xBLScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gc2VydmljZSBuYW1lcwpteSBAU0xBTmFtZTsKZm9yIG15ICRDb3VudGVyICggMSAuLiAxMCApIHsKICAgIHB1c2ggQFNMQU5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgY3JlYXRlIHNvbWUgdGVzdCBzZXJ2aWNlcwpteSBAU2VydmljZUlEczsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIGEgc2VydmljZQogICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VBZGQoCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QtU0xBJyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgKTsKCiAgICBwdXNoIEBTZXJ2aWNlSURzLCAkU2VydmljZUlEOwp9CgojIGdldCBvcmlnaW5hbCBzbGEgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzCm15ICVTTEFMaXN0T3JpZ2luYWwgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgc2xhIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHRoaXMgc2xhIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKIyAtLS0KCiAgICAjIHNlcnZpY2UgaWRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgc2VydmljZSBpZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgc2VydmljZSBpZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICAgICAgICA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNsYSBpcyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU0xBTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaWRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaWRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4ge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayB0aGUgcmV0dXJuZWQgc2VydmljZSBpZCBhcnJheSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAkU2VydmljZUlEc1swXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzFdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayB0aGUgc29ydGluZyBvZiB0aGUgcmV0dXJuZWQgc2VydmljZSBpZCBhcnJheSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMV0sICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMF0sICRTZXJ2aWNlSURzWzFdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMl0sCiAgICAgICAgICAgIENhbGVuZGFyICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyAkU2VydmljZUlEc1sxXSwgJFNlcnZpY2VJRHNbMl0sICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbM10sCiAgICAgICAgICAgIENhbGVuZGFyICAgPT4gJzEnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDEwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDIwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDMwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDQwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDUwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDYwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzBdLCAkU2VydmljZUlEc1sxXSwgJFNlcnZpY2VJRHNbMl0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVszXSwKICAgICAgICAgICAgQ2FsZW5kYXIgICA9PiAnMScsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMTAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMjAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMzAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gNjAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnVGVzdENvbW1lbnQyJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNsYSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNsYSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTInLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAyMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiA0MCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA1MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA2MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA3MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUyJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUyJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMjAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMzAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gNDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNjAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gNzAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMicsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2xhIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAkU2VydmljZUlEc1syXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAzMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA0MCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiA1MCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA2MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA3MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA4MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUzJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzJdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDMwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDQwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDUwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDYwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDcwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTMnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyAkU2VydmljZUlEc1swXSBdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICIgXHQgXG4gXHIgIiAuICRTTEFOYW1lWzRdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVs0XSwKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzFdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIiBcdCBcbiBcciAiIC4gJFNMQU5hbWVbNF0gLiAiIFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzFdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbNF0gLiAnIFVQREFURTEnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzVdIC4gJyDPkiDPoSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzVdIC4gJyDPkiDPoSDGqSDPnicsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAn0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMywKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbNV0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbNV0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqSBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnIFt0ZXN0XSUqXFwgJyAuICRTTEFOYW1lWzZdIC4gJyBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdbdGVzdF0lKlxcICcgLiAkU0xBTmFtZVs2XSAuICcgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnIFt0ZXN0XSUqXFwgJyAuICRTTEFOYW1lWzZdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgJyAuICRTTEFOYW1lWzZdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkU0xBSUQ7Cm15ICRBZGRlZENvdW50ZXIgPSAwOwoKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewoKICAgIGlmICggJEl0ZW0tPntBZGR9ICkgewoKICAgICAgICAjIGFkZCBuZXcgc2xhCiAgICAgICAgbXkgJFNMQUlEID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFBZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2xhIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTTEFJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUFkZCgpIC0gU0xBSUQ6ICRTTEFJRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNMQUlEKSB7CgogICAgICAgICAgICAgICAgIyBsb29rdXAgc2xhIG5hbWUKICAgICAgICAgICAgICAgIG15ICRTTEFOYW1lID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGxvb2t1cCB0ZXN0CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFNMQU5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRoZSBzbGEgaWQKICAgICAgICAgICAgICAgIG15ICRTTEFJRE5ldyA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNMQU5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGVzdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTTEFJRE5ldyB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkU0xBSUQgICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBTG9va3VwKCkgLSByZXZlcnNlIGxvb2t1cCIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3Qgc2xhIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkU0xBSUQgPSAkU0xBSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGNvdW50ZXIKICAgICAgICAgICAgICAgICRBZGRlZENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2xhIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2xhCiAgICAgICAgbXkgJVNMQUdldCA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAgICAgIyBjaGVjayBzbGEgZGF0YSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2xhCiAgICAgICAgZm9yIG15ICRTTEFBdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewoKICAgICAgICAgICAgIyBkdW1wIHRoZSBnaXZlbiBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgKCByZWYgJFNMQUdldHskU0xBQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRTTEFHZXR7JFNMQUF0dHJpYnV0ZX0gPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFNMQUdldHskU0xBQXR0cmlidXRlfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCByZWYgJEl0ZW0tPntBZGRHZXR9LT57JFNMQUF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskU0xBQXR0cmlidXRlfSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKAogICAgICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRTTEFBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNMQUdldHskU0xBQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRTTEFBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBR2V0KCkgLSAkU0xBQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBzbGEgaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkU0xBSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIFNFUlZJQ0UgSUQgR0lWRU4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHNsYQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIFNMQUlEID0+ICRMYXN0QWRkZWRTTEFJRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNsYSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQVVwZGF0ZSgpIC0gU0xBSUQ6ICRMYXN0QWRkZWRTTEFJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2xhIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJVNMQUdldDIgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgU0xBSUQgID0+ICRMYXN0QWRkZWRTTEFJRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzbGEgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFNMQUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntVcGRhdGVHZXR9IH0gKSB7CgogICAgICAgICAgICAjIGR1bXAgdGhlIGdpdmVuIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiAoIHJlZiAkU0xBR2V0MnskU0xBQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRTTEFHZXQyeyRTTEFBdHRyaWJ1dGV9ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRTTEFHZXQyeyRTTEFBdHRyaWJ1dGV9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIHN0cmluZwogICAgICAgICAgICBpZiAoIHJlZiAkSXRlbS0+e1VwZGF0ZUdldH0tPnskU0xBQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRTTEFBdHRyaWJ1dGV9ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoCiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFNMQUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU0xBR2V0MnskU0xBQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRTTEFBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBR2V0KCkgLSAkU0xBQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIHNsYSBuYW1lCiAgICAgICAgbXkgJFNMQU5hbWUgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxvb2t1cCgKICAgICAgICAgICAgU0xBSUQgPT4gJFNMQUdldDJ7U0xBSUR9LAogICAgICAgICk7CgogICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTTEFOYW1lIHx8ICcnLAogICAgICAgICAgICAkU0xBR2V0MntOYW1lfSB8fCAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGhlIHNsYSBpZAogICAgICAgIG15ICRTTEFJRE5ldyA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRTTEFOYW1lIHx8ICcnLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGVzdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNMQUlETmV3IHx8ICcnLAogICAgICAgICAgICAkU0xBR2V0MntTTEFJRH0gfHwgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUxvb2t1cCgpIC0gcmV2ZXJzZSBsb29rdXAiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgU0xBTGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJVNMQUxpc3QxID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgVmFsaWQgID0+IDAsCiAgICBVc2VySUQgPT4gMSwKKTsKbXkgJVNMQUxpc3QxT3JnID0gJVNMQUxpc3RPcmlnaW5hbDsKClNFUlZJQ0VJRDoKZm9yIG15ICRTTEFJRCAoIGtleXMgJVNMQUxpc3QxT3JnICkgewoKICAgIGlmICggJFNMQUxpc3QxeyRTTEFJRH0gJiYgJFNMQUxpc3QxT3JneyRTTEFJRH0gZXEgJFNMQUxpc3QxeyRTTEFJRH0gKSB7CiAgICAgICAgZGVsZXRlICRTTEFMaXN0MXskU0xBSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNMQUxpc3Qxe0R1bW15fSA9IDE7CiAgICB9Cn0KCm15ICRTTEFMaXN0MUNvdW50ID0gc2NhbGFyIGtleXMgJVNMQUxpc3QxOwoKJFNlbGYtPklzKAogICAgJFNMQUxpc3QxQ291bnQgfHwgJycsCiAgICAkQWRkZWRDb3VudGVyICB8fCAnJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUxpc3QoKSIsCik7CgoxOwo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAFEElEQVR42qyVe2xTZRjGn9Oe9vS+tuvaddeuG2MUt0E22IAxMExBN3UzwGSMzEsIzhg0RjHBRI2XP9QEVGRAohiFMCKMWyI4hpvIZZNsMjd62YVu67a2o7uWXs9pz/EPI3LRAYm//758yfO+eb7ne18e7qKyciMEAgEAEBaLbUdV1cZlAFD78lakpBjwoJC3H9TqWFV5efk7HE9hFkukxenpc54vLl4p4wkTSpYV5UtHRh1NDsdgE0EQ4DhuVmE+ACgUCixcmIe8gifrt7/92osmk2l5KBwtDIVZwpiemScQ8Be/ULNu5enGCxGXc/jknIwsuMec9xfW6xPit29/v8o95skjSHmafcgtTklJJEiSRDBEQx2rEYTDUbiczsCi/IIIx7Jys6XLcV8r5ucsrS1eUfJuStp89PQNIs2QBKGAhEQiQjhMIxAIYWDIhfWVVct8fnqZrdd+BMDFWTsmCAK9PV2XxLL4V/gCqSROo0KEYTE84kZb6+WpUCgqoCgxjyRJDDrcaG5pZusPfLWeYejxWYWlUhm/pmZLWVq6qVJISQVSiRh+P409uz/59uB3Xz7b0d7mzFlYtEYuk8HhcEOl0hA6rTYw6nT87rs5E/wvYZ5cHrOgZHXlcb3eIAFHgGU5KOQS0OHpHw2GVHcoNHNUKhH4GDoKuUwCDgQy5i56SyZTPn3LT5IERVF3dry6bFPB2cbjDkokz47XJ1NiSghljBxFRUU5hQWLx8rK1m7LzHwkl+NYsBwwODSIUye/3zU/p0Bss7S3sCyLNIMRScmpcLv/SQrZcLjuhEKh/LW8vLpaRJEKESWAiBJAFzc3a06G6Qg4Dv5AAOEwBZksCqFQiiG7reFK69nzO3d+gbq63WCYCHg83p1WAEBSckbFxKQ3wWa10HK5CFIJBZpmEAwGEQyFIBQKEBsrh31ggLVauzmVJrEUAEwmk4kkSQnLsmBZ9t4cj4+7HJcvnj7R12uxJ6ZmlyQn66DVKEFRfIjFQkRZFm3tZny+4+P6ftvFD58qfVwnFFIzmzfXXhgc9uizMtOFsTpDdefVtmaCIAAAxO1V4rSJJeuq3mzqtbbbjEajNsuUq/Z6Z6ItP5+2JKSYsi+1HNuWlZnUve/r+jNO1xgrogQ8hVzG6fU6Yu+eXT8crj9UabVdg9/vuysiPL5OpY6vBRAPIOuJZ7Y4CpeXnwdAyWSq6gMHG8xnz10ZvXDZwk1Phzma5jifL8KNjE5zZsuQ92hDi3nevOwVt6z4G47j/KGgrx2AD8D46HCfwznSdyYaZfppOtRlNM4tzl2wdIkxVY+evmH81Njsn5oOkBKplKAZUB0dnXT9oX0fAQjwZ/s9ESZsjUaZQQAor9hQUbyy9CWJVKaMRgl8s39/6wfvbV1iNlvZ/EWPFrlcN0AzrFCtjmOCAZ+HfND5Oj4+kT817U8Simbg9zPIz8slBx5bFc7JKWT9vgAmJr3wen3U9f6eNM/4mJLAQ7Cp5vVja0o3VExOeKCP18BoSIh4Jmb43dd6CUoshr2/Z3TnZ2/kANwk74E3AimIoZnovM6rrbRWq8TwiAuN51rJjqtmQq1WIOCbYuz2PmmsJqHgnsebDZZlGXP3lcNjrtGbKk3yKqMxETqdGgq5GNNeP35pafrj1LG9S4KBmzYAkYey4q9toy6OUerWejwjnRXrX/30el9Xh/Xaby0ikcTrueGow/9BjFL7HCWS5P/b3Z8DADulJ5doF3IEAAAAAElFTkSuQmCC
IyAtLQojIElUU01Db3JlLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db3JlLnBtLHYgMS4xNiAyMDA5LzEwLzA3IDEzOjI3OjMzIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKSVRTTUNvcmUucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29yZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUNvcmUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFhNTE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQcmlvcml0eU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGFuZ2UgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgSVRTTSBibHVlCiAgICAkU2VsZi0+X0JhY2tncm91bmRDb2xvckNoYW5nZSgKICAgICAgICBPbGRDb2xvciA9PiAnYmJkZGZmJywKICAgICAgICBOZXdDb2xvciA9PiAnMDAzMzk5JywKICAgICk7CgogICAgIyBzZXQgZGVmYXVsdCBDSVAgbWF0cml4CiAgICAkU2VsZi0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1zZXJ2aWNlCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLXNlcnZpY2UnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBTZXJ2aWNlIG1hc2sgYWNjZXNzIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJywKICAgICk7CgogICAgIyBmaWxsdXAgZW1wdHkgdHlwZV9pZCByb3dzIGluIHNlcnZpY2UgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3JpdGljYWxpdHlfaWQgcm93cyBpbiBzZXJ2aWNlIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U2VydmljZUNyaXRpY2FsaXR5SUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2xhIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U0xBVHlwZUlEKCk7CgogICAgIyBzZXQgcHJlZmVyZW5jZXMgZm9yIHNvbWUgR2VuZXJhbENhdGFsb2cgZW50cmllcwogICAgJFNlbGYtPl9TZXRQcmVmZXJlbmNlcygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSBJVFNNIGJsdWUKICAgICRTZWxmLT5fQmFja2dyb3VuZENvbG9yQ2hhbmdlKAogICAgICAgIE9sZENvbG9yID0+ICdiYmRkZmYnLAogICAgICAgIE5ld0NvbG9yID0+ICcwMDMzOTknLAogICAgKTsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLXNlcnZpY2UKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tc2VydmljZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIFNlcnZpY2UgbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGZpbGx1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2VydmljZSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVNlcnZpY2VUeXBlSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBjcml0aWNhbGl0eV9pZCByb3dzIGluIHNlcnZpY2UgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTZXJ2aWNlQ3JpdGljYWxpdHlJRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IHR5cGVfaWQgcm93cyBpbiBzbGEgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTTEFUeXBlSUQoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgQ0lQIG1hdHJpeAogICAgJFNlbGYtPl9DSVBEZWZhdWx0TWF0cml4U2V0KCk7CgogICAgIyBmaWxsdXAgZW1wdHkgdHlwZV9pZCByb3dzIGluIHNlcnZpY2UgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3JpdGljYWxpdHlfaWQgcm93cyBpbiBzZXJ2aWNlIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U2VydmljZUNyaXRpY2FsaXR5SUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2xhIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U0xBVHlwZUlEKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFja2dyb3VuZAogICAgJFNlbGYtPl9CYWNrZ3JvdW5kQ29sb3JDaGFuZ2UoCiAgICAgICAgT2xkQ29sb3IgPT4gJzAwMzM5OScsCiAgICAgICAgTmV3Q29sb3IgPT4gJ2JiZGRmZicsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSB0aGUgZ3JvdXAgaXRzbS1zZXJ2aWNlCiAgICAkU2VsZi0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICdpdHNtLXNlcnZpY2UnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1NldFByZWZlcmVuY2VzKCkKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRQcmVmZXJlbmNlcygpCgo9Y3V0CgpzdWIgX1NldFByZWZlcmVuY2VzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJU1hcCA9ICgKICAgICAgICBPcGVyYXRpb25hbCA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgIFdhcm5pbmcgICAgID0+ICd3YXJuaW5nJywKICAgICAgICBJbmNpZGVudCAgICA9PiAnaW5jaWRlbnQnLAogICAgKTsKCiAgICBOQU1FOgogICAgZm9yIG15ICROYW1lICgga2V5cyAlTWFwICkgewogICAgICAgIG15ICRJdGVtID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIE5hbWUgID0+ICROYW1lLAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBOQU1FIGlmICEkSXRlbTsKCiAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbS0+e0l0ZW1JRH0sCiAgICAgICAgICAgIEtleSAgICA9PiAnRnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgIFZhbHVlICA9PiAkTWFweyROYW1lfSwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBfQmFja2dyb3VuZENvbG9yQ2hhbmdlKCkKCmNoYW5nZSB0aGUgYmFja3JvdW5kIGNvbG9yCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQmFja2dyb3VuZENvbG9yQ2hhbmdlKAogICAgICAgIE9sZENvbG9yID0+ICdiYmRkZmYnLAogICAgICAgIE5ld0NvbG9yID0+ICcwMDMzOTknLAogICAgKTsKCj1jdXQKCnN1YiBfQmFja2dyb3VuZENvbG9yQ2hhbmdlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9sZENvbG9yIE5ld0NvbG9yKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSB0aGUgY3NzIGZpbGUKICAgIG15ICRDc3NGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2h0dHBkL2h0ZG9jcy9jc3MvU3RhbmRhcmQvYWdlbnQuY3NzJzsKCiAgICByZXR1cm4gMSBpZiAtZSAkQ3NzRmlsZSAuICcuc2F2ZSc7CgogICAgIyByZWFkIGZpbGUgY29udGVudAogICAgbXkgJENvbnRlbnQgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICBMb2NhdGlvbiAgICAgICAgPT4gJENzc0ZpbGUsCiAgICAgICAgTW9kZSAgICAgICAgICAgID0+ICdiaW5tb2RlJywKICAgICAgICBSZXN1bHQgICAgICAgICAgPT4gJ1NDQUxBUicsCiAgICAgICAgRGlzYWJsZVdhcm5pbmdzID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENvbnRlbnQ7CiAgICByZXR1cm4gaWYgcmVmICRDb250ZW50IG5lICdTQ0FMQVInOwogICAgcmV0dXJuIGlmICEkeyRDb250ZW50fTsKCiAgICAjIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yCiAgICAkeyRDb250ZW50fSA9fiBzewogICAgICAgIGJhY2tncm91bmQtY29sb3JcOlwjJFBhcmFte09sZENvbG9yfVw7CiAgICB9e2JhY2tncm91bmQtY29sb3JcOlwjJFBhcmFte05ld0NvbG9yfVw7fXhtczsKCiAgICAjIHdyaXRlIG5ldyBjb250ZW50IHRvIGZpbGUKICAgICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVXcml0ZSgKICAgICAgICBMb2NhdGlvbiA9PiAkQ3NzRmlsZSwKICAgICAgICBDb250ZW50ICA9PiAkQ29udGVudCwKICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ0lQRGVmYXVsdE1hdHJpeFNldCgpCgpzZXQgdGhlIGRlZmF1bHQgQ0lQIG1hdHJpeAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCj1jdXQKCnN1YiBfQ0lQRGVmYXVsdE1hdHJpeFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgYWxsb2NhdGlvbiBsaXN0CiAgICBteSAkTGlzdCA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJExpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRMaXN0IG5lICdIQVNIJzsKCiAgICAjIHNldCBubyBtYXRyaXggaWYgYWxyZWFkeSBkZWZpbmVkCiAgICByZXR1cm4gaWYgJXskTGlzdH07CgogICAgIyBkZWZpbmUgdGhlIGFsbG9jYXRpb25zCiAgICBteSAlQWxsb2NhdGlvbjsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnMSB2ZXJ5IGxvdyd9ICAgPSAnMSB2ZXJ5IGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzIgbG93J30gICAgICAgID0gJzEgdmVyeSBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eyczIG5vcm1hbCd9ICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzQgaGlnaCd9ICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnNSB2ZXJ5IGhpZ2gnfSAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnMSB2ZXJ5IGxvdyd9ICAgICAgICA9ICcxIHZlcnkgbG93JzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzIgbG93J30gICAgICAgICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnMyBub3JtYWwnfSAgICAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eyc0IGhpZ2gnfSAgICAgICAgICAgID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzUgdmVyeSBoaWdoJ30gICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzEgdmVyeSBsb3cnfSAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnMiBsb3cnfSAgICAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eyczIG5vcm1hbCd9ICAgICAgID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzQgaGlnaCd9ICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzUgdmVyeSBoaWdoJ30gICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eycxIHZlcnkgbG93J30gICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzIgbG93J30gICAgICAgICAgICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnMyBub3JtYWwnfSAgICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnNCBoaWdoJ30gICAgICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICAgID0gJzUgdmVyeSBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzEgdmVyeSBsb3cnfSAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnMiBsb3cnfSAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnMyBub3JtYWwnfSAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnNCBoaWdoJ30gICAgICA9ICc1IHZlcnkgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyc1IHZlcnkgaGlnaCd9ID0gJzUgdmVyeSBoaWdoJzsKCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwogICAgbXkgJUltcGFjdExpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbXBhY3RMaXN0fTsKCiAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICApOwogICAgbXkgJUNyaXRpY2FsaXR5TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JENyaXRpY2FsaXR5TGlzdH07CgogICAgIyBnZXQgcHJpb3JpdHkgbGlzdAogICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57UHJpb3JpdHlPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVByaW9yaXR5TGlzdFJldmVyc2UgPSByZXZlcnNlICVQcmlvcml0eUxpc3Q7CgogICAgIyBjcmVhdGUgdGhlIGFsbG9jYXRpb24gbWF0cml4CiAgICBteSAlQWxsb2NhdGlvbk1hdHJpeDsKICAgIElNUEFDVDoKICAgIGZvciBteSAkSW1wYWN0ICgga2V5cyAlQWxsb2NhdGlvbiApIHsKCiAgICAgICAgbmV4dCBJTVBBQ1QgaWYgISRJbXBhY3RMaXN0UmV2ZXJzZXskSW1wYWN0fTsKCiAgICAgICAgIyBleHRyYWN0IGltcGFjdCBpZAogICAgICAgIG15ICRJbXBhY3RJRCA9ICRJbXBhY3RMaXN0UmV2ZXJzZXskSW1wYWN0fTsKCiAgICAgICAgQ1JJVElDQUxJVFk6CiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eSAoIGtleXMgJXsgJEFsbG9jYXRpb257JEltcGFjdH0gfSApIHsKCiAgICAgICAgICAgIG5leHQgQ1JJVElDQUxJVFkgaWYgISRDcml0aWNhbGl0eUxpc3RSZXZlcnNleyRDcml0aWNhbGl0eX07CgogICAgICAgICAgICAjIGV4dHJhY3QgcHJpb3JpdHkKICAgICAgICAgICAgbXkgJFByaW9yaXR5ID0gJEFsbG9jYXRpb257JEltcGFjdH0tPnskQ3JpdGljYWxpdHl9OwoKICAgICAgICAgICAgbmV4dCBDUklUSUNBTElUWSBpZiAhJFByaW9yaXR5TGlzdFJldmVyc2V7JFByaW9yaXR5fTsKCiAgICAgICAgICAgICMgZXh0cmFjdCBjcml0aWNhbGl0eSBpZCBhbmQgcHJpb3JpdHkgaWQKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5SUQgPSAkQ3JpdGljYWxpdHlMaXN0UmV2ZXJzZXskQ3JpdGljYWxpdHl9OwogICAgICAgICAgICBteSAkUHJpb3JpdHlJRCAgICA9ICRQcmlvcml0eUxpc3RSZXZlcnNleyRQcmlvcml0eX07CgogICAgICAgICAgICAkQWxsb2NhdGlvbk1hdHJpeHskSW1wYWN0SUR9LT57JENyaXRpY2FsaXR5SUR9ID0gJFByaW9yaXR5SUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgc2F2ZSB0aGUgbWF0cml4CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVVcGRhdGUoCiAgICAgICAgQWxsb2NhdGVEYXRhID0+IFwlQWxsb2NhdGlvbk1hdHJpeCwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBncm91cCBkZXNjcmlwdGlvbi4nLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBjaGVjayBpZiBncm91cCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyByZWFjdGl2YXRlIHRoZSBncm91cAogICAgaWYgKCRHcm91cElEKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFjdGl2YXRlIGdyb3VwCiAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgYWRkIHRoZSBncm91cAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBDb21tZW50ID0+ICRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgbmV3IGdyb3VwIGlkCiAgICBteSAkTmV3R3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB1c2VyIHJvb3QgdG8gdGhlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgR0lEICAgICAgICA9PiAkTmV3R3JvdXBJRCwKICAgICAgICBVSUQgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCkKCmZpbGx1cCBlbXB0eSBlbnRyaWVzIGluIHRoZSB0eXBlX2lkIGNvbHVtbiBvZiB0aGUgc2VydmljZSB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5U2VydmljZVR5cGVJRCgpOwoKPWN1dAoKc3ViIF9GaWxsdXBFbXB0eVNlcnZpY2VUeXBlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlIHR5cGUgbGlzdAogICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICApOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggISRTZXJ2aWNlVHlwZUxpc3QgfHwgcmVmICRTZXJ2aWNlVHlwZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRTZXJ2aWNlVHlwZUxpc3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZmluZCBhbnkgaXRlbSBpbiBnZW5lcmFsIGNhdGFsb2cgY2xhc3MgSVRTTTo6U2VydmljZTo6VHlwZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc29ydCBpZHMKICAgIG15IEBTZXJ2aWNlVHlwZUtleUxpc3QgPSBzb3J0IGtleXMgJXskU2VydmljZVR5cGVMaXN0fTsKCiAgICAjIHVwZGF0ZSB0eXBlX2lkCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIHNlcnZpY2UgIgogICAgICAgICAgICAuICJTRVQgdHlwZV9pZCA9ICRTZXJ2aWNlVHlwZUtleUxpc3RbMF0gIgogICAgICAgICAgICAuICJXSEVSRSB0eXBlX2lkID0gMCBPUiB0eXBlX2lkIElTIE5VTEwiLAogICAgKTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5U2VydmljZUNyaXRpY2FsaXR5SUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGNyaXRpY2FsaXR5X2lkIGNvbHVtbiBvZiB0aGUgc2VydmljZSB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5U2VydmljZUNyaXRpY2FsaXR5SUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlTZXJ2aWNlQ3JpdGljYWxpdHlJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJENyaXRpY2FsaXR5TGlzdCB8fCByZWYgJENyaXRpY2FsaXR5TGlzdCBuZSAnSEFTSCcgfHwgISV7JENyaXRpY2FsaXR5TGlzdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmaW5kIGFueSBpdGVtIGluIGdlbmVyYWwgY2F0YWxvZyBjbGFzcyBJVFNNOjpDb3JlOjpDcml0aWNhbGl0eSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc29ydCBpZHMKICAgIG15IEBDcml0aWNhbGl0eUtleUxpc3QgPSBzb3J0IGtleXMgJXskQ3JpdGljYWxpdHlMaXN0fTsKCiAgICAjIHVwZGF0ZSBjcml0aWNhbGl0eV9pZAogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBzZXJ2aWNlICIKICAgICAgICAgICAgLiAiU0VUIGNyaXRpY2FsaXR5X2lkID0gJENyaXRpY2FsaXR5S2V5TGlzdFswXSAiCiAgICAgICAgICAgIC4gIldIRVJFIGNyaXRpY2FsaXR5X2lkID0gMCBPUiBjcml0aWNhbGl0eV9pZCBJUyBOVUxMIiwKICAgICk7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eVNMQVR5cGVJRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgdHlwZV9pZCBjb2x1bW4gb2YgdGhlIHNsYSB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5U0xBVHlwZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5U0xBVHlwZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhIHR5cGUgbGlzdAogICAgbXkgJFNMQVR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAogICAgKTsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBpZiAoICEkU0xBVHlwZUxpc3QgfHwgcmVmICRTTEFUeXBlTGlzdCBuZSAnSEFTSCcgfHwgISV7JFNMQVR5cGVMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgYW55IGl0ZW0gaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIElUU006OlNMQTo6VHlwZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc29ydCBpZHMKICAgIG15IEBTTEFUeXBlS2V5TGlzdCA9IHNvcnQga2V5cyAleyRTTEFUeXBlTGlzdH07CgogICAgIyB1cGRhdGUgdHlwZV9pZAogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBzbGEgIgogICAgICAgICAgICAuICJTRVQgdHlwZV9pZCA9ICRTTEFUeXBlS2V5TGlzdFswXSAiCiAgICAgICAgICAgIC4gIldIRVJFIHR5cGVfaWQgPSAwIE9SIHR5cGVfaWQgSVMgTlVMTCIsCiAgICApOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE2ICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6Mjc6MzMgJAoKPWN1dAo=
ITSM::Core::Criticality
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Operational
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Warning
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Incident
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
End User Service
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Front End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Back End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Management
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Reporting
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Operational
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Demonstration
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Project
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Training
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Underpinning Contract
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Availability
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Response Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Recovery Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Resolution Rate
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Transactions
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Errors
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Other
1
current_timestamp
1
current_timestamp
1